ceki        2002/10/16 06:48:31

  Modified:    src/java/org/apache/log4j/xml DOMConfigurator.java
  Log:
  Added support for configuring nested elements automatically by
  implicit rules. This means that DOMConfigurator can now deal with
  components which have special nested components, such as rolling
  appenders having strategies or SMTPAppender having a nested triggering
  event evaluator.
  
  Relatively powerful stuff that was also rather easy to implement.
  
  Revision  Changes    Path
  1.51      +135 -157  jakarta-log4j/src/java/org/apache/log4j/xml/DOMConfigurator.java
  
  Index: DOMConfigurator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/xml/DOMConfigurator.java,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- DOMConfigurator.java      9 Oct 2002 22:50:06 -0000       1.50
  +++ DOMConfigurator.java      16 Oct 2002 13:48:31 -0000      1.51
  @@ -58,6 +58,8 @@
      @since 0.8.3 */
   public class DOMConfigurator implements Configurator {
   
  +  static Logger logger = Logger.getLogger("LOG4J."+DOMConfigurator.class.getName());
  +
     static final String CONFIGURATION_TAG = "log4j:configuration";
     static final String OLD_CONFIGURATION_TAG = "configuration";
     static final String RENDERER_TAG      = "renderer";
  @@ -174,37 +176,33 @@
        Node currentNode = children.item(loop);
   
        /* We're only interested in Elements */
  -     if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
  -       Element currentElement = (Element)currentNode;
  +     if (!isElement(currentNode)) {
  +       continue;
  +     }
  +     
  +     Element currentElement = (Element)currentNode;
   
  -       // Parse appender parameters 
  -       if (currentElement.getTagName().equals(PARAM_TAG)) {
  -            setParameter(currentElement, propSetter);
  -       }
  -       // Set appender layout
  -       else if (currentElement.getTagName().equals(LAYOUT_TAG)) {
  -         appender.setLayout(parseLayout(currentElement));
  -       }
  -       // Add filters
  -       else if (currentElement.getTagName().equals(FILTER_TAG)) {
  -         parseFilters(currentElement, appender);
  -       }
  -       else if (currentElement.getTagName().equals(ERROR_HANDLER_TAG)) {
  -         parseErrorHandler(currentElement, appender);
  -       }
  -       else if (currentElement.getTagName().equals(APPENDER_REF_TAG)) {
  -         String refName = subst(currentElement.getAttribute(REF_ATTR));
  -         if(appender instanceof AppenderAttachable) {
  -           AppenderAttachable aa = (AppenderAttachable) appender;
  -           LogLog.debug("Attaching appender named ["+ refName+
  -                        "] to appender named ["+ appender.getName()+"].");
  -           aa.addAppender(findAppenderByReference(currentElement));
  -         } else {
  -           LogLog.error("Requesting attachment of appender named ["+
  -                        refName+ "] to appender named ["+ appender.getName()+
  -                "] which does not implement 
org.apache.log4j.spi.AppenderAttachable.");
  -         }
  +     // Parse appender parameters 
  +     if (currentElement.getTagName().equals(PARAM_TAG)) {
  +       setParameter(currentElement, propSetter);     
  +     } else if (currentElement.getTagName().equals(ERROR_HANDLER_TAG)) {
  +       parseErrorHandler(currentElement, appender);
  +     } else if (currentElement.getTagName().equals(APPENDER_REF_TAG)) {
  +       String refName = subst(currentElement.getAttribute(REF_ATTR));
  +       if(appender instanceof AppenderAttachable) {
  +         AppenderAttachable aa = (AppenderAttachable) appender;
  +         LogLog.debug("Attaching appender named ["+ refName+
  +                      "] to appender named ["+ appender.getName()+"].");
  +         aa.addAppender(findAppenderByReference(currentElement));
  +       } else {
  +         LogLog.error("Requesting attachment of appender named ["+
  +                      refName+ "] to appender named ["+ appender.getName()+
  +                      "] which does not implement 
org.apache.log4j.spi.AppenderAttachable.");
          }
  +     } else {
  +       logger.debug("Handling nested <"+ currentElement.getTagName() 
  +                          + "> for appender "+appender.getName());
  +       configureNestedComponent(propSetter, currentElement);     
        }
         }
         propSetter.activate();
  @@ -218,6 +216,89 @@
         return null;
       }
     }
  +  
  +  protected void configureNestedComponent(PropertySetter parentBean, Element 
nestedElement) {
  +    
  +    String nestedElementTagName = nestedElement.getTagName();
  +    
  +    int containmentType = parentBean.canContainComponent(nestedElementTagName);
  +    
  +    if(containmentType == PropertySetter.NOT_FOUND) {
  +      logger.warn("A component with tag name ["+nestedElementTagName
  +               +"] cannot be contained within an object of class ["
  +               + parentBean.getObjClass().getName()+"].");
  +      return; // nothing can be done
  +    }
  +    
  +    boolean debug = logger.isDebugEnabled();
  +
  +    String className = subst(nestedElement.getAttribute(CLASS_ATTR));
  +    if(debug)
  +      logger.debug("Will instantiate instance of class ["+className+']');    
  +    
  +    Object nestedComponent = null;
  +    try {
  +      nestedComponent = Loader.loadClass(className).newInstance();      
  +    } catch(Exception e) {
  +      logger.warn("Could not instantiate object of type ["+className+"].", e);
  +      return;
  +    } 
  +
  +    NodeList children        = nestedElement.getChildNodes();
  +    final int length         = children.getLength();
  +    PropertySetter nestedBean = new PropertySetter(nestedComponent); 
  +
  +    for (int loop = 0; loop < length; loop++) {
  +      Node currentNode = children.item(loop);
  +
  +      /* We're only interested in Elements */
  +      if (!isElement(currentNode)) {
  +     continue;
  +      }
  +
  +      Element currentElement = (Element)currentNode;
  +      if(hasParamTag(currentElement)) {
  +     if(debug) {
  +       logger.debug("Configuring parameter ["+currentElement.getAttribute("name")
  +                    + "] for <"+nestedElementTagName+">.");
  +     }
  +     setParameter(currentElement, nestedBean);
  +      } else {
  +     if(debug) {
  +       logger.debug("Configuring component "+nestedComponent+ " with tagged as <"
  +                    +currentElement.getTagName()+">.");
  +     }
  +     configureNestedComponent(nestedBean, currentElement);
  +      }
  +    }
  +    
  +    // Now let us attach the component
  +    switch(containmentType) {
  +    case PropertySetter.AS_PROPERTY:  
  +      parentBean.setComponent(nestedElementTagName, nestedComponent);
  +      break;
  +    case PropertySetter.AS_COLLECTION:  
  +      parentBean.addComponent(nestedElementTagName, nestedComponent);
  +      break;
  +    }
  +  }
  +
  +
  +  /**
  +   * Returns <code>true</code> if the node passed as parameter is an
  +   * Element, returns <code>false</code> otherwise.  
  +   * */
  +  protected boolean isElement(Node node) {
  +    return (node.getNodeType() == Node.ELEMENT_NODE);
  +  }
  +
  +  /**
  +   * Returns <code>true</code> if the element has the param tag,
  +   * returns false otherwise.
  +   * */
  +  protected boolean hasParamTag(Element element) {
  +    return element.getTagName().equals(PARAM_TAG);
  +  }
   
     /**
        Used internally to parse an {@link ErrorHandler} element.
  @@ -336,48 +417,10 @@
       }
     }
   
  -
  -  /**
  -     Used internally to parse the category factory element.
  -  */
  -  protected
  -  void parseCategoryFactory(Element factoryElement) {
  -    String className = subst(factoryElement.getAttribute(CLASS_ATTR));
  -
  -    if(EMPTY_STR.equals(className)) {
  -      LogLog.error("Category Factory tag " + CLASS_ATTR + " attribute not found.");
  -      LogLog.debug("No Category Factory configured.");
  -    }
  -    else {
  -      LogLog.debug("Desired category factory: ["+className+']');
  -      Object catFactory = OptionConverter.instantiateByClassName(className, 
  -                                                                 
LoggerFactory.class, 
  -                                                                 null);
  -      PropertySetter propSetter = new PropertySetter(catFactory);
  -
  -      Element  currentElement = null;
  -      Node     currentNode    = null;
  -      NodeList children       = factoryElement.getChildNodes();
  -      final int length        = children.getLength();
  -
  -      for (int loop=0; loop < length; loop++) {
  -        currentNode = children.item(loop);
  -     if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
  -       currentElement = (Element)currentNode;
  -       if (currentElement.getTagName().equals(PARAM_TAG)) {
  -         setParameter(currentElement, propSetter);
  -       }
  -     }
  -      }
  -    }
  -  }
  -
  -
     /**
        Used internally to parse the roor category element.
     */
  -  protected
  -  void parseRoot (Element rootElement) {
  +  protected void parseRoot (Element rootElement) {
       Logger root = repository.getRootLogger();
       // category configuration needs to be atomic
       synchronized(root) {    
  @@ -389,8 +432,7 @@
     /**
        Used internally to parse the children of a category element.
     */
  -  protected
  -  void parseChildrenOfLoggerElement(Element catElement,
  +  protected void parseChildrenOfLoggerElement(Element catElement,
                                      Logger cat, boolean isRoot) {
       
       PropertySetter propSetter = new PropertySetter(cat);
  @@ -434,44 +476,7 @@
       propSetter.activate();
     }
   
  -  /**
  -     Used internally to parse a layout element.
  -  */  
  -  protected
  -  Layout parseLayout (Element layout_element) {
  -    String className = subst(layout_element.getAttribute(CLASS_ATTR));
  -    LogLog.debug("Parsing layout of class: \""+className+"\"");               
  -    try {
  -      Object instance        = Loader.loadClass(className).newInstance();
  -      Layout layout          = (Layout)instance;
  -      PropertySetter propSetter = new PropertySetter(layout);
  -      
  -      NodeList params        = layout_element.getChildNodes();
  -      final int length       = params.getLength();
  -
  -      for (int loop = 0; loop < length; loop++) {
  -     Node currentNode = (Node)params.item(loop);
  -     if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
  -       Element currentElement = (Element) currentNode;
  -       String tagName = currentElement.getTagName();
  -       if(tagName.equals(PARAM_TAG)) {
  -            setParameter(currentElement, propSetter);
  -       }
  -     }
  -      }
  -      
  -      propSetter.activate();
  -      return layout;
  -    }
  -    catch (Exception oops) {
  -      LogLog.error("Could not create the Layout. Reported error follows.",
  -                oops);
  -      return null;
  -    }
  -  }
  -
  -  protected 
  -  void parseRenderer(Element element) {
  +  protected void parseRenderer(Element element) {
       String renderingClass = subst(element.getAttribute(RENDERING_CLASS_ATTR));
       String renderedClass = subst(element.getAttribute(RENDERED_CLASS_ATTR));
       if(repository instanceof RendererSupport) {
  @@ -483,8 +488,7 @@
     /**
        Used internally to parse a level  element.
     */
  -  protected
  -  void parseLevel(Element element, Logger logger, boolean isRoot) {
  +  protected void parseLevel(Element element, Logger logger, boolean isRoot) {
       String catName = logger.getName();
       if(isRoot) {
         catName = "root";
  @@ -522,8 +526,7 @@
       LogLog.debug(catName + " level set to " + logger.getLevel());    
     }
   
  -  protected
  -  void setParameter(Element elem, PropertySetter propSetter) {
  +  protected void setParameter(Element elem, PropertySetter propSetter) {
       String name = subst(elem.getAttribute(NAME_ATTR));
       String value = (elem.getAttribute(VALUE_ATTR));
       value = subst(OptionConverter.convertSpecialChars(value));
  @@ -536,9 +539,7 @@
        defined in the log4j.dtd. 
   
     */
  -  static
  -  public
  -  void configure (Element element) {
  +  static public void configure (Element element) {
       DOMConfigurator configurator = new DOMConfigurator();
       configurator.doConfigure(element,  LogManager.getLoggerRepository());
     }
  @@ -551,9 +552,7 @@
        @param configFilename A log4j configuration file in XML format.
   
     */
  -  static
  -  public
  -  void configureAndWatch(String configFilename) {
  +  static public void configureAndWatch(String configFilename) {
       configureAndWatch(configFilename, FileWatchdog.DEFAULT_DELAY);
     }
   
  @@ -568,16 +567,13 @@
         @param configFilename A log4j configuration file in XML format.
         @param delay The delay in milliseconds to wait between each check.
     */
  -  static
  -  public
  -  void configureAndWatch(String configFilename, long delay) {
  +  static public void configureAndWatch(String configFilename, long delay) {
       XMLWatchdog xdog = new XMLWatchdog(configFilename);
       xdog.setDelay(delay);
       xdog.start();
     }
   
  -  public
  -  void doConfigure(String filename, LoggerRepository repository) {
  +  public void doConfigure(String filename, LoggerRepository repository) {
       FileInputStream fis = null;
       try {
         fis = new FileInputStream(filename);
  @@ -596,8 +592,7 @@
     }
     
   
  -  public
  -  void doConfigure(URL url, LoggerRepository repository) {
  +  public void doConfigure(URL url, LoggerRepository repository) {
       try {
         doConfigure(url.openStream(), repository);
       } catch(IOException e) {
  @@ -610,8 +605,7 @@
        configuration file.
   
     */
  -  public
  -  void doConfigure(InputStream inputStream, LoggerRepository repository) 
  +  public void doConfigure(InputStream inputStream, LoggerRepository repository) 
                                             throws FactoryConfigurationError {
       doConfigure(new InputSource(inputStream), repository);
     }
  @@ -688,9 +682,7 @@
     
     /**
        A static version of {@link #doConfigure(String, LoggerRepository)}.  */
  -  static
  -  public
  -  void configure(String filename) throws FactoryConfigurationError {
  +  static public void configure(String filename) throws FactoryConfigurationError {
       new DOMConfigurator().doConfigure(filename, 
                                      LogManager.getLoggerRepository());
     }
  @@ -710,8 +702,7 @@
        href="doc-files/log4j.dtd">log4j.dtd</a>.
        
     */
  -  protected
  -  void parse(Element element) {
  +  protected void parse(Element element) {
   
       String rootElementName = element.getTagName();
   
  @@ -737,7 +728,6 @@
         LogLog.debug("Ignoring " + INTERNAL_DEBUG_ATTR + " attribute.");
       }
   
  -
       String confDebug = subst(element.getAttribute(CONFIG_DEBUG_ATTR));
       if(!confDebug.equals("") && !confDebug.equals("null")) {      
         LogLog.warn("The \""+CONFIG_DEBUG_ATTR+"\" attribute is deprecated.");
  @@ -768,36 +758,24 @@
   
       for (int loop = 0; loop < length; loop++) {
         currentNode = children.item(loop);
  -      if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
  -     currentElement = (Element) currentNode;
  -     tagName = currentElement.getTagName();
  -
  -     if (tagName.equals(CATEGORY_FACTORY_TAG)) {
  -       parseCategoryFactory(currentElement);
  -     }
  +      if (!isElement(currentNode)) {
  +     continue;
         }
  -    }
  -    
  -    for (int loop = 0; loop < length; loop++) {
  -      currentNode = children.item(loop);
  -      if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
  -     currentElement = (Element) currentNode;
  -     tagName = currentElement.getTagName();
  -
  -     if (tagName.equals(CATEGORY) || tagName.equals(LOGGER)) {
  -       parseCategory(currentElement);
  -     } else if (tagName.equals(ROOT_TAG)) {
  -       parseRoot(currentElement);
  -     } else if(tagName.equals(RENDERER_TAG)) {
  -       parseRenderer(currentElement);
  -     }
  +      currentElement = (Element) currentNode;
  +      tagName = currentElement.getTagName();
  +      
  +      if (tagName.equals(CATEGORY) || tagName.equals(LOGGER)) {
  +     parseCategory(currentElement);
  +      } else if (tagName.equals(ROOT_TAG)) {
  +     parseRoot(currentElement);
  +      } else if(tagName.equals(RENDERER_TAG)) {
  +     parseRenderer(currentElement);
         }
       }
     }
   
     
  -  protected
  -  String subst(String value) {
  +  protected String subst(String value) {
       try {
         return OptionConverter.substVars(value, props);
       } catch(IllegalArgumentException e) {
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to