Author: lgawron Date: Thu Feb 24 07:52:36 2005 New Revision: 155191 URL: http://svn.apache.org/viewcvs?view=rev&rev=155191 Log: no more if/else if on instruction creation
Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java?view=diff&r1=155190&r2=155191 ============================================================================== --- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java (original) +++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java Thu Feb 24 07:52:36 2005 @@ -15,6 +15,9 @@ */ package org.apache.cocoon.template.jxtg.script; +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.Map; import java.util.Stack; import org.apache.cocoon.template.jxtg.JXTemplateGenerator; @@ -40,25 +43,46 @@ Locator charLocation; StringBuffer charBuf; - final static String TEMPLATE = "template"; - final static String FOR_EACH = "forEach"; - final static String IF = "if"; - final static String CHOOSE = "choose"; - final static String WHEN = "when"; - final static String OTHERWISE = "otherwise"; - final static String OUT = "out"; - final static String IMPORT = "import"; - final static String SET = "set"; - final static String MACRO = "macro"; - final static String EVALBODY = "evalBody"; - final static String EVAL = "eval"; - final static String PARAMETER = "parameter"; - final static String FORMAT_NUMBER = "formatNumber"; - final static String FORMAT_DATE = "formatDate"; - final static String COMMENT = "comment"; + final static Map instructions = new HashMap(); + final static Class[] parametersClasses = new Class[] { StartElement.class, + Attributes.class, Stack.class }; public static final Locator NULL_LOCATOR = new LocatorImpl(); + static { + try { + registerInstruction("template", StartTemplate.class.getName()); + registerInstruction("forEach", StartForEach.class.getName()); + registerInstruction("if", StartIf.class.getName()); + registerInstruction("choose", StartChoose.class.getName()); + registerInstruction("when", StartWhen.class.getName()); + registerInstruction("otherwise", StartOtherwise.class.getName()); + registerInstruction("out", StartOut.class.getName()); + registerInstruction("import", StartImport.class.getName()); + registerInstruction("set", StartSet.class.getName()); + registerInstruction("macro", StartDefine.class.getName()); + registerInstruction("evalBody", StartEvalBody.class.getName()); + registerInstruction("eval", StartEval.class.getName()); + registerInstruction("parameter", StartParameter.class.getName()); + registerInstruction("formatNumber", StartFormatNumber.class + .getName()); + registerInstruction("formatDate", StartFormatDate.class.getName()); + registerInstruction("comment", StartComment.class.getName()); + } catch (Exception e) { + // we'll do something more professional with that when the configuration moves + // to the sitemap + e.printStackTrace(); + } + } + + public static void registerInstruction(String instructionName, + String className) throws ClassNotFoundException, SecurityException, + NoSuchMethodException { + Class clazz = Class.forName(className); + Constructor constructor = clazz.getConstructor(parametersClasses); + instructions.put(instructionName, constructor); + } + public Parser() { // EMPTY } @@ -106,7 +130,8 @@ throws SAXException { if (charBuf == null) { charBuf = new StringBuffer(length); - charLocation = locator != null ? new LocatorImpl(locator) : NULL_LOCATOR; + charLocation = locator != null ? new LocatorImpl(locator) + : NULL_LOCATOR; } charBuf.append(ch, start, length); } @@ -179,48 +204,26 @@ if (StringUtils.equals(attributeURI, JXTemplateGenerator.NS)) { getStartEvent().getTemplateProperties().put( elementAttributes.getLocalName(i), - JXTExpression.compileExpr(elementAttributes.getValue(i), null, - locator)); + JXTExpression.compileExpr( + elementAttributes.getValue(i), null, locator)); elementAttributes.removeAttribute(i--); } } StartElement startElement = new StartElement(locator, namespaceURI, localName, qname, elementAttributes); if (JXTemplateGenerator.NS.equals(namespaceURI)) { - if (localName.equals(FOR_EACH)) { - newEvent = new StartForEach(startElement, attrs, stack); - } else if (localName.equals(FORMAT_NUMBER)) { - newEvent = new StartFormatNumber(startElement, attrs, stack); - } else if (localName.equals(FORMAT_DATE)) { - newEvent = new StartFormatDate(startElement, attrs, stack); - } else if (localName.equals(CHOOSE)) { - newEvent = new StartChoose(startElement, attrs, stack); - } else if (localName.equals(WHEN)) { - newEvent = new StartWhen(startElement, attrs, stack); - } else if (localName.equals(OUT)) { - newEvent = new StartOut(startElement, attrs, stack); - } else if (localName.equals(OTHERWISE)) { - newEvent = new StartOtherwise(startElement, attrs, stack); - } else if (localName.equals(IF)) { - newEvent = new StartIf(startElement, attrs, stack); - } else if (localName.equals(MACRO)) { - newEvent = new StartDefine(startElement, attrs, stack); - } else if (localName.equals(PARAMETER)) { - newEvent = new StartParameter(startElement, attrs, stack); - } else if (localName.equals(EVALBODY)) { - newEvent = new StartEvalBody(startElement, attrs, stack); - } else if (localName.equals(EVAL)) { - newEvent = new StartEval(startElement, attrs, stack); - } else if (localName.equals(SET)) { - newEvent = new StartSet(startElement, attrs, stack); - } else if (localName.equals(IMPORT)) { - newEvent = new StartImport(startElement, attrs, stack); - } else if (localName.equals(TEMPLATE)) { - newEvent = new StartTemplate(startElement, attrs, stack); - } else if (localName.equals(COMMENT)) { - newEvent = new StartComment(startElement, attrs, stack); - } else { - throw new SAXParseException("unrecognized tag: " + localName, locator, null); + Constructor constructor = (Constructor) instructions.get(localName); + if (constructor == null) { + throw new SAXParseException("unrecognized tag: " + localName, + locator, null); + } + + Object[] arguments = new Object[] { startElement, attrs, stack }; + try { + newEvent = (Event) constructor.newInstance(arguments); + } catch (Exception e) { + throw new SAXParseException("error creating instruction: " + + localName, locator, e); } } else { newEvent = startElement; @@ -235,7 +238,7 @@ } public void comment(char ch[], int start, int length) throws SAXException { - //DO NOTHING + // DO NOTHING } public void endCDATA() throws SAXException { @@ -263,8 +266,3 @@ addEvent(new StartEntity(locator, name)); } } - - - - -