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ülcü * */ 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]