jai removed from license part 1
[mir.git] / source / mir / generator / tal / TALTemplateParser.java
index a03a4ed..9c06c61 100755 (executable)
-/*\r
- * Copyright (C) 2001, 2002 The Mir-coders group\r
- *\r
- * This file is part of Mir.\r
- *\r
- * Mir is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * Mir is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with Mir; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
- *\r
- * In addition, as a special exception, The Mir-coders gives permission to link\r
- * the code of this program with  any library licensed under the Apache Software License,\r
- * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library\r
- * (or with modified versions of the above that use the same license as the above),\r
- * and distribute linked combinations including the two.  You must obey the\r
- * GNU General Public License in all respects for all of the code used other than\r
- * the above mentioned libraries.  If you modify this file, you may extend this\r
- * exception to your version of the file, but you are not obligated to do so.\r
- * If you do not wish to do so, delete this exception statement from your version.\r
- */\r
-package mir.generator.tal;\r
-\r
-import java.io.InputStream;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import mir.generator.tal.interfaces.TALExpressionParser;\r
-import mir.util.HTMLRoutines;\r
-import mir.util.StringRoutines;\r
-import mir.util.XMLReader;\r
-import mir.util.XMLReader.AbstractSectionHandler;\r
-\r
-public class TALTemplateParser {\r
-  private int bal;\r
-  private static final String TAL_PREFIX = "tal";\r
-\r
-  public static TALTemplate parseString(String aData, TALExpressionParser aParser) throws TALExc, TALFailure {\r
-    try {\r
-      TALHandler handler = new TALHandler(aParser);\r
-      XMLReader reader = new XMLReader(false);\r
-\r
-      reader.parseString(aData, handler);\r
-\r
-      return new TALTemplate(aParser, handler.getNode());\r
-    }\r
-    catch (Throwable t) {\r
-      throw new TALFailure(t);\r
-    }\r
-  }\r
-\r
-  public static TALTemplate parseInputStream(InputStream anInputStream, TALExpressionParser aParser) throws TALExc, TALFailure {\r
-    try {\r
-      TALHandler handler = new TALHandler(aParser);\r
-      XMLReader reader = new XMLReader(false);\r
-\r
-      reader.parseInputStream(anInputStream, handler);\r
-\r
-      return new TALTemplate(aParser, handler.getNode());\r
-    }\r
-    catch (Throwable t) {\r
-      throw new TALFailure(t);\r
-    }\r
-  }\r
-\r
-  private static String normalizeXMLName(XMLReader.XMLName aName) {\r
-    String result = aName.getLocalName();\r
-    if (aName.getPrefix().length() > 0)\r
-      result = aName.getPrefix() + ":" + result;\r
-\r
-    return result;\r
-  }\r
-\r
-\r
-\r
-  private static final String CONDITION_ATTRIBUTE = "tal:condition";\r
-  private static final String REPEAT_ATTRIBUTE = "tal:repeat";\r
-  private static final String CONTENT_ATTRIBUTE = "tal:content";\r
-  private static final String ERROR_ATTRIBUTE = "tal:on-error";\r
-  private static final String REPLACE_ATTRIBUTE = "tal:replace";\r
-  private static final String DEFINITION_ATTRIBUTE = "tal:define";\r
-  private static final String ONERROR_ATTRIBUTE = "tal:onerror";\r
-  private static final String OMITTAG_ATTRIBUTE = "tal:omit-tag";\r
-  private static final String ATTRIBUTE_ATTRIBUTE = "tal:attributes";\r
-\r
-\r
-  protected static class TALHandler extends XMLReader.AbstractSectionHandler {\r
-    private TALTemplate.CompositeTemplateNode compositeNode;\r
-    private StringBuffer data;\r
-    private TALExpressionParser parser;\r
-    private TALTemplate.SmartTemplateNode smartNode;\r
-    private boolean smartTag;\r
-    private String currentTag;\r
-\r
-    public TALHandler(TALExpressionParser aParser) {\r
-      parser = aParser;\r
-      data = new StringBuffer();\r
-      compositeNode = new TALTemplate.CompositeTemplateNode();\r
-    }\r
-\r
-    private void flushData() {\r
-      if (data.length()!=0) {\r
-        compositeNode.appendSubNode(new TALTemplate.PlainTextTemplateNode(data.toString()));\r
-        data.delete(0, data.length());\r
-      }\r
-    }\r
-\r
-    public XMLReader.SectionHandler startElement(XMLReader.XMLName aTag, Map anAttributes) throws XMLReader.XMLReaderExc {\r
-      smartTag = false;\r
-\r
-      currentTag = normalizeXMLName(aTag);\r
-\r
-      smartTag = (aTag.getPrefix().equals(TAL_PREFIX));\r
-\r
-      Iterator i = anAttributes.keySet().iterator();\r
-\r
-      while (!smartTag && i.hasNext()) {\r
-        XMLReader.XMLName name = (XMLReader.XMLName) i.next();\r
-        smartTag = smartTag || (name.getPrefix().equals(TAL_PREFIX));\r
-      }\r
-\r
-      if (!smartTag) {\r
-        appendCode("<"+currentTag);\r
-        i = anAttributes.entrySet().iterator();\r
-\r
-        while (i.hasNext()) {\r
-          Map.Entry entry = (Map.Entry) i.next();\r
-\r
-          appendCode(" "+ normalizeXMLName((XMLReader.XMLName) entry.getKey()));\r
-          appendCode("=\"");\r
-          appendText((String) entry.getValue());\r
-          appendCode("\"");\r
-        }\r
-        appendCode(">");\r
-      }\r
-      else {\r
-        smartNode = new TALTemplate.SmartTemplateNode(currentTag);\r
-        if (aTag.getPrefix().equals(TAL_PREFIX))\r
-          smartNode.setOmitTag(parser.preparseTRUE());\r
-\r
-        i = anAttributes.entrySet().iterator();\r
-        while (i.hasNext()) {\r
-          Map.Entry entry = (Map.Entry) i.next();\r
-          XMLReader.XMLName name = (XMLReader.XMLName) entry.getKey();\r
-\r
-          if (!name.getPrefix().equals(TAL_PREFIX)) {\r
-            smartNode.addFixedAttribute(normalizeXMLName(name), (String) entry.getValue());\r
-          }\r
-          else {\r
-            if (name.getLocalName().equalsIgnoreCase(DEFINITION_ATTRIBUTE)) {\r
-              List definitions = StringRoutines.splitStringWithEscape((String) entry.getValue(), ';', '\\');\r
-\r
-              Iterator j = definitions.iterator(); {\r
-                List parts = StringRoutines.separateString((String) i.next(), " ");\r
-\r
-                if (parts.size()==2) {\r
-                  smartNode.addDefinition(parser.preparseReferenceExpression((String) parts.get(0)), parser.preparseExpression((String) parts.get(1)));\r
-                }\r
-              }\r
-            }\r
-            else if (name.getLocalName().equalsIgnoreCase(CONDITION_ATTRIBUTE)) {\r
-              smartNode.setCondition(parser.preparseBooleanExpression((String) entry.getValue()));\r
-            }\r
-            else if (name.getLocalName().equalsIgnoreCase(CONTENT_ATTRIBUTE)) {\r
-              smartNode.setContent(parser.preparseStringExpression((String) entry.getValue()));\r
-            }\r
-            else if (name.getLocalName().equalsIgnoreCase(ERROR_ATTRIBUTE)) {\r
-              smartNode.setError(parser.preparseStringExpression((String) entry.getValue()));\r
-            }\r
-            else if (name.getLocalName().equalsIgnoreCase(OMITTAG_ATTRIBUTE)) {\r
-              if (((String) entry.getValue()).trim().length()==0)\r
-                smartNode.setOmitTag(parser.preparseTRUE());\r
-              else\r
-                smartNode.setOmitTag(parser.preparseBooleanExpression((String) entry.getValue()));\r
-            }\r
-            else if (name.getLocalName().equalsIgnoreCase(REPLACE_ATTRIBUTE)) {\r
-              smartNode.setOmitTag(parser.preparseTRUE());\r
-              smartNode.setContent(parser.preparseStringExpression((String) entry.getValue()));\r
-            }\r
-            else if (name.getLocalName().equalsIgnoreCase(REPEAT_ATTRIBUTE)) {\r
-              List parts = StringRoutines.separateString((String) entry.getValue(), " ");\r
-\r
-              if (parts.size()==2) {\r
-                smartNode.setRepeat(parser.preparseReferenceExpression((String) parts.get(0)), parser.preparseExpression((String) parts.get(1)));\r
-              }\r
-            }\r
-            else if (name.getLocalName().equalsIgnoreCase(ATTRIBUTE_ATTRIBUTE)) {\r
-              List attributes = StringRoutines.splitStringWithEscape((String) entry.getValue(), ';', '\\');\r
-\r
-              Iterator j = attributes.iterator(); {\r
-                List parts = StringRoutines.separateString((String) i.next(), " ");\r
-\r
-                if (parts.size()==2) {\r
-                  smartNode.addModifiedAttribute((String) parts.get(0), parser.preparseExpression((String) parts.get(1)));\r
-                }\r
-              }\r
-            }\r
-          }\r
-        }\r
-      }\r
-\r
-      flushData();\r
-\r
-      return new TALHandler(parser);\r
-    };\r
-\r
-    public void endElement(XMLReader.SectionHandler aHandler) throws XMLReader.XMLReaderExc {\r
-      if (!smartTag) {\r
-        appendSubNode(((TALHandler) aHandler).getNode());\r
-        appendCode("</"+currentTag+">");\r
-      }\r
-      else {\r
-        smartNode.setBody(((TALHandler) aHandler).getNode());\r
-        appendSubNode(smartNode);\r
-        smartNode=null;\r
-      }\r
-    };\r
-\r
-    protected void appendSubNode(TALTemplate.TemplateNode aNode) {\r
-      compositeNode.appendSubNode(aNode);\r
-    }\r
-\r
-    protected void appendCode(String aCode) {\r
-      data.append(aCode);\r
-    }\r
-\r
-    protected void appendText(String aText) {\r
-      data.append(HTMLRoutines.encodeHTML(aText));\r
-    }\r
-\r
-    public void finishSection() throws XMLReader.XMLReaderExc {\r
-      flushData();\r
-    }\r
-\r
-    public TALTemplate.TemplateNode getNode() {\r
-      return compositeNode;\r
-    }\r
-\r
-    public void characters(String aCharacters) throws XMLReader.XMLReaderExc {\r
-      appendText(aCharacters);\r
-    }\r
-  }\r
-}\r
+/*
+ * Copyright (C) 2005 The Mir-coders group
+ *
+ * This file is part of Mir.
+ *
+ * Mir is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Mir is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mir; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * In addition, as a special exception, The Mir-coders gives permission to link
+ * the code of this program with  any library licensed under the Apache Software License.
+ * You must obey the GNU General Public License in all respects for all of the code used
+ * other than the above mentioned libraries.  If you modify this file, you may extend this
+ * exception to your version of the file, but you are not obligated to do so.
+ * If you do not wish to do so, delete this exception statement from your version.
+ */
+package mir.generator.tal;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import mir.generator.tal.interfaces.TALExpressionParser;
+import mir.generator.tal.template.CompositeTemplateNode;
+import mir.generator.tal.template.PlainTextTemplateNode;
+import mir.generator.tal.template.Template;
+import mir.generator.tal.template.TemplateNode;
+import mir.generator.tal.template.TemplateNodeLibrary;
+import mir.generator.tal.template.TemplateNodeLibraryRegistry;
+import mir.util.HTMLRoutines;
+import mir.util.xml.SectionHandler;
+import mir.util.xml.XMLName;
+import mir.util.xml.XMLParserEngine;
+import mir.util.xml.XMLParserExc;
+import mir.util.xml.XMLParserFailure;
+import mir.util.xml.XMLReaderTool;
+
+public class TALTemplateParser {
+  private TemplateNodeLibraryRegistry registry;
+
+  public TALTemplateParser(TemplateNodeLibraryRegistry aRegistry) {
+    registry = aRegistry;
+  }
+
+  public Template parse(String aData, TALExpressionParser aParser) throws TALExc, TALFailure {
+    return parse(new StringReader(aData), aParser);
+  }
+
+  public Template parse(File aFile, TALExpressionParser aParser) throws TALExc, TALFailure {
+    try {
+      return parse(new BufferedInputStream(new FileInputStream(aFile), 1024*128), aParser);
+    }
+    catch (FileNotFoundException e) {
+      throw new TALFailure(e);
+    }
+  }
+  public Template parse(InputStream anInputStream, TALExpressionParser aParser) throws TALExc, TALFailure {
+    return parse(new InputStreamReader(anInputStream), aParser);
+  }
+
+  public Template parse(Reader aReader, TALExpressionParser aParser) throws TALExc, TALFailure {
+    Map templateContext = new HashMap();
+    TALHandler handler = new TALHandler(aParser, templateContext);
+
+    try {
+      XMLParserEngine.getInstance().parse("html", aReader, handler);
+    }
+    catch (XMLParserExc e) {
+      throw new TALFailure(e);
+    }
+
+    return new Template(aParser, handler.getNode(), templateContext);
+  }
+
+  protected class TALHandler implements SectionHandler {
+    private CompositeTemplateNode compositeNode;
+    private StringBuffer data;
+    private StringBuffer plainData;
+    private TALExpressionParser parser;
+    private String currentTag;
+    private TemplateNodeLibrary library;
+    private XMLName tag;
+    private Map attributes;
+    private Map templateContext;
+
+    public TALHandler(TALExpressionParser aParser, Map aTemplateContext) {
+      parser = aParser;
+      data = new StringBuffer();
+      plainData = new StringBuffer();
+      compositeNode = new CompositeTemplateNode();
+      templateContext = aTemplateContext;
+    }
+
+    private void flushData() {
+      if (data.length()!=0) {
+        compositeNode.appendSubNode(new PlainTextTemplateNode(data.toString(), plainData.toString()));
+        data.delete(0, data.length());
+        plainData.delete(0, plainData.length());
+      }
+    }
+
+    public void extra(String anExtraData) throws XMLParserExc, XMLParserFailure {
+      appendCode(anExtraData);
+    }
+
+    public TemplateNodeLibrary findLibrary(XMLName aName) {
+      TemplateNodeLibrary result = null;
+
+      if (aName.getNamespaceURI()!=null) {
+        result = registry.findLibraryForUrl(aName.getNamespaceURI());
+      }
+
+      if ((result == null) && (aName.getPrefix()!=null) && (aName.getPrefix().length()>0)) {
+        result = registry.findLibraryForPrefix(aName.getPrefix());
+      }
+
+      return result;
+    }
+
+    public SectionHandler startElement(mir.util.xml.XMLName aTag, Map anAttributes) throws XMLParserExc {
+      library = findLibrary(aTag);
+
+      Iterator i = anAttributes.keySet().iterator();
+      while (library==null && i.hasNext()) {
+        library=findLibrary((XMLName) i.next());
+      }
+
+      currentTag = XMLReaderTool.normalizeXMLName(aTag);
+
+      if (library == null) {
+        appendCode("<"+currentTag);
+        i = anAttributes.entrySet().iterator();
+
+        while (i.hasNext()) {
+          Map.Entry entry = (Map.Entry) i.next();
+
+          appendCode(" "+ XMLReaderTool.normalizeXMLName((XMLName) entry.getKey()));
+          appendCode("=\"");
+          appendText((String) entry.getValue());
+          appendCode("\"");
+        }
+      }
+      else {
+        tag = aTag;
+        attributes = anAttributes;
+      }
+
+      return new TALHandler(parser, templateContext);
+    }
+
+    public void endElement(mir.util.xml.SectionHandler aHandler) throws XMLParserExc {
+      if (library == null) {
+        TemplateNode subNode = ((TALHandler) aHandler).getNode();
+        if (subNode instanceof CompositeTemplateNode &&
+            ((CompositeTemplateNode) subNode).isEmpty()) {
+          appendCode(" />");
+        }
+        else {
+          appendCode(">");
+          appendSubNode(subNode);
+          appendCode("</"+currentTag+">");
+        }
+      }
+      else {
+        appendSubNode(
+            library.constructTemplateNode(parser, tag, attributes, ((TALHandler) aHandler).getNode(), templateContext));
+        tag = null;
+        attributes = null;
+      }
+    }
+
+    protected void appendSubNode(TemplateNode aNode) {
+      flushData();
+
+      compositeNode.appendSubNode(aNode);
+    }
+
+    protected void appendCode(String aCode) {
+      data.append(aCode);
+    }
+
+    protected void appendText(String aText) {
+      data.append(HTMLRoutines.encodeHTML(aText));
+      plainData.append(aText);
+    }
+
+    public void finishSection() throws XMLParserExc {
+      flushData();
+    }
+
+    public TemplateNode getNode() {
+      return compositeNode;
+    }
+
+    public void characters(String aCharacters) throws XMLParserExc {
+      appendText(aCharacters);
+    }
+
+    public void startSection() throws XMLParserExc, XMLParserFailure {
+    }
+  }
+}