ceki        2003/09/10 09:28:19

  Modified:    src/java/org/apache/joran ExecutionContext.java
                        JoranParser.java Pattern.java
               src/java/org/apache/joran/action Action.java
  Added:       src/java/org/apache/joran/action ParamAction.java
                        AppenderAction.java ActionConst.java
                        AppenderRefAction.java
  Log:
  
  Joran starts doing more. It already handles errors better than DOMConfigurator.
  
  More actions to follow.
  
  Revision  Changes    Path
  1.2       +27 -0     jakarta-log4j/src/java/org/apache/joran/ExecutionContext.java
  
  Index: ExecutionContext.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/joran/ExecutionContext.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ExecutionContext.java     2 Sep 2003 18:36:29 -0000       1.1
  +++ ExecutionContext.java     10 Sep 2003 16:28:18 -0000      1.2
  @@ -49,10 +49,15 @@
   
   package org.apache.joran;
   
  +import java.util.HashMap;
   import java.util.List;
  +import java.util.Properties;
   import java.util.Stack;
   import java.util.Vector;
   
  +import org.apache.log4j.Logger;
  +import org.apache.log4j.helpers.OptionConverter;
  +
   
   /**
    *
  @@ -60,13 +65,20 @@
    *
    */
   public class ExecutionContext {
  +     final static Logger logger = Logger.getLogger(ExecutionContext.class);
  +
     Stack objectStack;
  +     HashMap objectMap;
  +     
        Vector errorList;
  +     Properties substProperties;
  +     
        JoranParser joranParser;
       
        public ExecutionContext(JoranParser joranParser) {
                this.joranParser = joranParser;
                objectStack = new Stack();
  +             objectMap = new HashMap(5);
                errorList = new Vector();
        }
        
  @@ -101,4 +113,19 @@
     public Object getObject(int i) {
                return objectStack.get(i);
     }
  + 
  +  public HashMap getObjectMap() {
  +    return objectMap;
  +  }
  +  
  +     public String subst(String value) {
  +             try {
  +                     return OptionConverter.substVars(value, substProperties);
  +             } catch (IllegalArgumentException e) {
  +                     logger.warn("Could not perform variable substitution for 
variable ["
  +                     +value+"]", e);
  +                     return value;
  +             }
  +     }
  +
   }
  
  
  
  1.4       +1 -1      jakarta-log4j/src/java/org/apache/joran/JoranParser.java
  
  Index: JoranParser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/joran/JoranParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JoranParser.java  2 Sep 2003 18:36:29 -0000       1.3
  +++ JoranParser.java  10 Sep 2003 16:28:18 -0000      1.4
  @@ -81,7 +81,7 @@
       loop(e, currentPattern);
     }
   
  -  void loop(Node n, Pattern currentPattern) {
  +  public void loop(Node n, Pattern currentPattern) {
       if (n == null) {
         return;
       }
  
  
  
  1.3       +1 -1      jakarta-log4j/src/java/org/apache/joran/Pattern.java
  
  Index: Pattern.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/joran/Pattern.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Pattern.java      25 Aug 2003 16:17:59 -0000      1.2
  +++ Pattern.java      10 Sep 2003 16:28:18 -0000      1.3
  @@ -60,7 +60,7 @@
       components = new ArrayList();
     }
   
  -  Pattern(String p) {
  +  public Pattern(String p) {
       this();
   
       if (p == null) {
  
  
  
  1.2       +2 -0      jakarta-log4j/src/java/org/apache/joran/action/Action.java
  
  Index: Action.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/joran/action/Action.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Action.java       2 Sep 2003 18:36:13 -0000       1.1
  +++ Action.java       10 Sep 2003 16:28:19 -0000      1.2
  @@ -50,6 +50,7 @@
   package org.apache.joran.action;
   
   import org.apache.joran.ExecutionContext;
  +import org.apache.log4j.helpers.OptionConverter;
   import org.w3c.dom.Element;
   
   
  @@ -88,4 +89,5 @@
        public String toString() {
          return this.getClass().getName();
        }
  +             
   }
  
  
  
  1.1                  jakarta-log4j/src/java/org/apache/joran/action/ParamAction.java
  
  Index: ParamAction.java
  ===================================================================
  package org.apache.joran.action;
  
  import org.apache.joran.ExecutionContext;
  
  import org.apache.log4j.Logger;
  import org.apache.log4j.config.PropertySetter;
  import org.apache.log4j.helpers.OptionConverter;
  import org.w3c.dom.Element;
  
  
  public class ParamAction extends Action {
  
    final static Logger logger = Logger.getLogger(ParamAction.class);
  
    static final Class[] ONE_STRING_PARAM = new Class[] { String.class };
  
    public void begin(ExecutionContext ec, Element element) {
      logger.info("begin called");
                Object o = ec.peekObject();
                PropertySetter propSetter = new PropertySetter(o);
                String name = element.getAttribute(ActionConst.NAME_ATTRIBUTE);
                String value = (element.getAttribute(ActionConst.VALUE_ATTRIBUTE));
                value = ec.subst(OptionConverter.convertSpecialChars(value));
                propSetter.setProperty(name, value);
    }
  
    public void end(ExecutionContext ec, Element e) {
    }
  
    public void finish(ExecutionContext ec) {
    }
  }
  
  
  
  1.1                  
jakarta-log4j/src/java/org/apache/joran/action/AppenderAction.java
  
  Index: AppenderAction.java
  ===================================================================
  package org.apache.joran.action;
  
  import org.apache.joran.ExecutionContext;
  import org.apache.log4j.Appender;
  import org.apache.log4j.Logger;
  import org.apache.log4j.helpers.Loader;
  import org.apache.log4j.spi.OptionHandler;
  import org.w3c.dom.Element;
  
  
  public class AppenderAction extends Action {
  
    final static Logger logger = Logger.getLogger(AppenderAction.class);
  
    static final Class[] ONE_STRING_PARAM = new Class[] { String.class };
  
    Logger logger2Attach = null;
  
    Appender appender;
    
    public void begin(ExecutionContext ec, Element appenderElement) {
  
      Object o = ec.peekObject();
  
      if (!(o instanceof Logger)) {
        logger.warn("Could not find a logger at the top of execution stack.");
        inError = true;
        ec.addError(
          "For element <level>, could not find a logger at the top of execution 
stack.");
        return;
      }
  
      logger2Attach = (Logger) o;
  
      String className =
        appenderElement.getAttribute(ActionConst.CLASS_ATTRIBUTE);
      logger.debug("Class name: [" + className + ']');
  
      try {
        Object instance = Loader.loadClass(className).newInstance();
        appender = (Appender) instance;
                        String appenderName = 
appenderElement.getAttribute(ActionConst.NAME_ATTRIBUTE);
                        if(appenderName == null) {
                                logger.warn("No appender name given for appender of 
type "+className
                                        +"].");
                        } else {
          appender.setName(appenderName);
                        }
        ec.pushObject(appender);
      } catch (Exception oops) {
        inError = true;
        logger.error(
          "Could not create an Appender. Reported error follows.", oops);
          ec.addError("Could not create appender of type "+className+"].");
      }
  
    }
  
    public void end(ExecutionContext ec, Element e) {
      if (inError)
        return;
                if(appender instanceof OptionHandler) {
                 ((OptionHandler)appender).activateOptions();
                }
    }
  
    public void finish(ExecutionContext ec) {
    }
  }
  
  
  
  1.1                  jakarta-log4j/src/java/org/apache/joran/action/ActionConst.java
  
  Index: ActionConst.java
  ===================================================================
  
  package org.apache.joran.action;
  
  /**
   *
   * This class contains costants used by other Actions.
   * 
   * @author Ceki G&uuml;lc&uuml;
   *
   */
  public abstract class ActionConst {
        
        public static final String APPENDER_TAG = "appender";
        public static final String REF_ATTRIBUTE = "ref";
        public static final String NAME_ATTRIBUTE = "name";
        public static final String VALUE_ATTRIBUTE = "value";
        public static final String CLASS_ATTRIBUTE = "class";
        
  
        static final String INHERITED = "INHERITED";
        static final String NULL = "NULL";
        static final String EMPTY_STR = "";
        
        public static final String APPENDER_BAG = "APPENDER_BAG";
        
  
  }
  
  
  
  1.1                  
jakarta-log4j/src/java/org/apache/joran/action/AppenderRefAction.java
  
  Index: AppenderRefAction.java
  ===================================================================
  package org.apache.joran.action;
  
  import java.util.HashMap;
  
  import org.apache.joran.ExecutionContext;
  import org.apache.joran.JoranParser;
  import org.apache.joran.Pattern;
  
  import org.apache.log4j.Appender;
  import org.apache.log4j.Logger;
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  import org.w3c.dom.Node;
  import org.w3c.dom.NodeList;
  
  
  
  public class AppenderRefAction extends Action {
  
    final static Logger logger = Logger.getLogger(AppenderRefAction.class);
    
    public void begin(ExecutionContext ec, Element appenderRef) {  
           logger.debug("begin called");
  
                 Object o = ec.peekObject();
                
                 if(!(o instanceof Logger)) {
                  logger.warn("Could not find a logger at the top of execution 
stack.");
                        inError = true; 
                        ec.addError("For element <appender-ref>, could not find a 
logger at the top of execution stack.");
                        return;
                }
                Logger l = (Logger) o;
                
                String appenderName = 
appenderRef.getAttribute(ActionConst.REF_ATTRIBUTE);
                if(appenderName == null) {
                        // print a meaningful error message and return
                        Node parentNode = appenderRef.getParentNode();
                        String errMsg = "Missing appender ref attribute in 
<appender-ref> tag.";
                        if(parentNode instanceof Element){
                                Element parentElement = (Element) parentNode;
                                String parentTag = parentElement.getTagName();
                                
                                if("logger".equals(parentTag)) {
                                        String loggerName = 
parentElement.getAttribute("name");
                                        errMsg = errMsg + " Within <"+parentTag+">"
                                         + " named ["+loggerName+"].";                 
          
                                } {
                                        errMsg = errMsg + " Within <"+parentTag+">";   
                 
                                }
                        }
                        parentNode.getAttributes();
                        logger.warn(errMsg);
                        inError = true; 
                        ec.addError(errMsg);
        return;
                }
                
                // let's get the appender
                getAppenderByRef(ec, appenderRef, appenderName);
                Appender appender = (Appender) ec.peekObject();
      
      if(appender == null) {
                        logger.warn("Could not find an appender named 
["+appenderName+"]");
                        inError = true; 
                        ec.addError("Could not find an appender named 
["+appenderName+"]");
  
      }
        
                //                      cat.addAppender(appender);
    }
  
  
    void getAppenderByRef(ExecutionContext ec, Element appenderRef, 
    String appenderName) {
  
        HashMap appenderBag = (HashMap) 
ec.getObjectMap().get(ActionConst.APPENDER_BAG);        
                Appender appender = (Appender) appenderBag.get(appenderName);
          if (appender != null) {
                ec.pushObject(appender);
                } else {
                        // find the right elenet with appender tag and name 
'appenderName'
                  Element root = appenderRef.getOwnerDocument().getDocumentElement();
                  Element targetElement = null;
                  NodeList nodeList = 
root.getElementsByTagName(ActionConst.APPENDER_TAG);
                  for(int i = 0; i < nodeList.getLength(); i++) {
                        Node n = nodeList.item(i);
                        if(n instanceof Element) {
                          Element e = (Element) n;
                          
if(appenderName.equals(e.getAttribute(ActionConst.NAME_ATTRIBUTE))) {
                                                targetElement = e; // we found the 
appender element we were looking for
                                break;
                          }
                        }
                  }
                  
                        if(targetElement == null) {
                                logger.warn("Could not find <appender> elemt named 
["+appenderName+"]");
                                inError = true; 
                                ec.addError("Could not find an <appender> element 
named ["
                                +appenderName+"]");
          return;
                        }
        
            JoranParser jp = ec.getJoranParser();
                  jp.loop(targetElement, new Pattern("-"));
          
          }
    }
  
    public void end(ExecutionContext ec, Element e) {
    }
  
    public void finish(ExecutionContext ec) {
    }
  }
  
  
  

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

Reply via email to