#region Apache License // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to you under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #endregion using System; using System.IO; using log4net.Layout; using log4net.Core; using log4net.Util; namespace SampleLayoutsApp.Layout { /// /// The ForwardingLayout forwards to a nested /// /// /// The ForwardingLayout base class is used by layouts that want /// to decorate other objects. /// public abstract class ForwardingLayout : ILayout, IOptionHandler { private ILayout m_nestedLayout; protected ForwardingLayout() { } public ILayout Layout { get { return m_nestedLayout; } set { m_nestedLayout = value; } } #region Implementation of IOptionHandler /// /// Activate component options /// /// /// /// This is part of the delayed object /// activation scheme. The method must /// be called on this object after the configuration properties have /// been set. Until is called this /// object is in an undefined state and must not be used. /// /// /// If any of the configuration properties are modified then /// must be called again. /// /// /// This method must be implemented by the subclass. /// /// public virtual void ActivateOptions() { IOptionHandler optionHandler = m_nestedLayout as IOptionHandler; if (optionHandler != null) { optionHandler.ActivateOptions(); } } #endregion #region Implementation of ILayout /// /// Implement this method to create your own layout format. /// /// The TextWriter to write the formatted event to /// The event to format /// /// /// This method is called by an appender to format /// the as text. /// /// virtual public void Format(TextWriter writer, LoggingEvent loggingEvent) { if (m_nestedLayout != null) { m_nestedLayout.Format(writer, loggingEvent); } } /// /// The content type output by this layout. /// /// The content type is "text/plain" /// /// /// The content type output by this layout. /// /// /// This base class uses the value "text/plain". /// To change this value a subclass must override this /// property. /// /// virtual public string ContentType { get { if (m_nestedLayout != null) { return m_nestedLayout.ContentType; } return "text/plain"; } } /// /// The header for the layout format. /// /// the layout header /// /// /// The Header text will be appended before any logging events /// are formatted and appended. /// /// virtual public string Header { get { if (m_nestedLayout != null) { return m_nestedLayout.Header; } return null; } } /// /// The footer for the layout format. /// /// the layout footer /// /// /// The Footer text will be appended after all the logging events /// have been formatted and appended. /// /// virtual public string Footer { get { if (m_nestedLayout != null) { return m_nestedLayout.Footer; } return null; } } /// /// Flag indicating if this layout handles exceptions /// /// false if this layout handles exceptions /// /// /// If this layout handles the exception object contained within /// , then the layout should return /// false. Otherwise, if the layout ignores the exception /// object, then the layout should return true. /// /// /// Set this value to override a this default setting. The default /// value is true, this layout does not handle the exception. /// /// virtual public bool IgnoresException { get { if (m_nestedLayout != null) { return m_nestedLayout.IgnoresException; } return true; } } #endregion } }