home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 139 / dpcs0999.iso / Web / CFserver / data1.cab / Java / allaire / util / template / TemplateParser.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-12  |  8.0 KB  |  268 lines

  1. package allaire.util.template;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.net.URL;
  8. import java.net.URLConnection;
  9. import java.util.EmptyStackException;
  10. import java.util.Stack;
  11. import netscape.util.Enumeration;
  12. import netscape.util.Hashtable;
  13. import netscape.util.Vector;
  14.  
  15. public class TemplateParser {
  16.    private TemplateRuntimeContext m_runtimeContext;
  17.    private ExpressionFilter m_expressionFilter;
  18.    private ExpressionParser m_expressionParser;
  19.    private Vector m_textOnlyTags = new Vector();
  20.    private Hashtable m_tags = new Hashtable();
  21.    private Hashtable m_customTagClasses = new Hashtable();
  22.    private boolean m_bIgnoreComments;
  23.    private int m_nCommentDashes;
  24.    private boolean m_bTrimDocumentWhitespace;
  25.    private boolean m_bTrimTagWhitespace;
  26.    private Stack m_urlInclude = new Stack();
  27.  
  28.    TemplateRuntimeContext getRuntimeContext() {
  29.       return this.m_runtimeContext;
  30.    }
  31.  
  32.    public void setExpressionParser(ExpressionParser var1) {
  33.       this.m_expressionParser = var1;
  34.    }
  35.  
  36.    public void setTextOnlyTags(Vector var1) {
  37.       this.m_textOnlyTags.addElements(var1);
  38.    }
  39.  
  40.    public void ignoreComments(boolean var1) {
  41.       this.m_bIgnoreComments = var1;
  42.    }
  43.  
  44.    public void setCommentDashes(int var1) {
  45.       this.m_nCommentDashes = var1;
  46.    }
  47.  
  48.    public void trimDocumentWhitespace(boolean var1) {
  49.       this.m_bTrimDocumentWhitespace = var1;
  50.    }
  51.  
  52.    public void trimTagWhitespace(boolean var1) {
  53.       this.m_bTrimTagWhitespace = var1;
  54.    }
  55.  
  56.    public void parse(URL var1, TemplateOutput var2) throws TemplateException {
  57.       this.m_urlInclude.push(var1);
  58.       InputStream var3 = null;
  59.  
  60.       try {
  61.          URLConnection var4 = var1.openConnection();
  62.          var4.setUseCaches(false);
  63.          var4.connect();
  64.          var3 = var4.getInputStream();
  65.          this.parse(var3, var2);
  66.       } catch (FileNotFoundException var14) {
  67.          throw new TemplateException(1003, "The template file '" + var1.toString() + "' was " + "not found. Please verify that this file exists and is " + "accessible.");
  68.       } catch (IOException var15) {
  69.          throw new TemplateException(1004, "An IO error occurred while attempting to parse template file '" + var1.toString() + "' (" + ((Throwable)var15).getMessage() + ").");
  70.       } catch (TemplateException var16) {
  71.          var16.setTemplateURL(var1.toString());
  72.          throw var16;
  73.       } finally {
  74.          if (var3 != null) {
  75.             try {
  76.                var3.close();
  77.             } catch (IOException var13) {
  78.             }
  79.          }
  80.  
  81.       }
  82.  
  83.       this.m_urlInclude.pop();
  84.    }
  85.  
  86.    public void parse(InputStream var1, TemplateOutput var2) throws TemplateException {
  87.       TagParser var3 = new TagParser();
  88.       var3.setIncludeTags(this.m_tags.keysVector());
  89.       var3.setTextOnlyTags(this.m_textOnlyTags);
  90.       var3.skipNonTagText(false);
  91.       var3.autoTrimWhitespace(false);
  92.       var3.ignoreComments(this.m_bIgnoreComments);
  93.       var3.setCommentDashes(this.m_nCommentDashes);
  94.       Vector var4 = var3.parse(var1);
  95.       Vector var5 = this.createElementTree(var4);
  96.       ByteArrayOutputStream var6 = new ByteArrayOutputStream();
  97.       TemplateOutput var7 = new TemplateOutput(var6);
  98.       Enumeration var8 = var5.elements();
  99.  
  100.       while(var8.hasMoreElements()) {
  101.          TemplateElement var9 = (TemplateElement)var8.nextElement();
  102.          var9.process(var7);
  103.       }
  104.  
  105.       if (this.m_bTrimDocumentWhitespace) {
  106.          var2.write(var6.toString().trim());
  107.       } else {
  108.          var2.write(var6.toString());
  109.       }
  110.    }
  111.  
  112.    public String resolveExpression(String var1) throws TemplateException {
  113.       return this.m_expressionParser.resolveExpression(var1);
  114.    }
  115.  
  116.    URL getBaseIncludeURL() throws TemplateException {
  117.       try {
  118.          return (URL)this.m_urlInclude.peek();
  119.       } catch (EmptyStackException var1) {
  120.          throw new TemplateException(1006, "A relative reference to a URL was attempted when no " + "base URL has been established for parsing (this error will " + "occur when attempting to INCLUDE a template from within " + "another template which not originate from a URL location).");
  121.       }
  122.    }
  123.  
  124.    public void addCustomTag(String var1, TemplateCustomTag var2) throws TemplateException {
  125.       Class var3 = var2.getClass();
  126.  
  127.       try {
  128.          var3.newInstance();
  129.       } catch (Exception var4) {
  130.          throw new TemplateException(1005, "Error attempting to create a tag object for custom tag " + "named '" + var1 + "'. The class registered " + "for the tag is '" + var3.getName() + "'.");
  131.       }
  132.  
  133.       this.addTag(var1, (new CustomElement()).getClass());
  134.       this.m_customTagClasses.put(var1.toUpperCase(), var3);
  135.    }
  136.  
  137.    private boolean previousElementWasTag(Vector var1, int var2) {
  138.       if (var2 > 0) {
  139.          Object var3 = var1.elementAt(var2 - 1);
  140.          return var3 instanceof Tag;
  141.       } else {
  142.          return false;
  143.       }
  144.    }
  145.  
  146.    public TemplateParser(TemplateRuntimeContext var1, ExpressionFilter var2, ExpressionParser var3) {
  147.       this.m_runtimeContext = var1;
  148.       this.m_expressionFilter = var2;
  149.       this.m_expressionParser = var3;
  150.       this.ignoreComments(false);
  151.       this.setCommentDashes(2);
  152.       this.trimDocumentWhitespace(true);
  153.       this.trimTagWhitespace(false);
  154.    }
  155.  
  156.    public void addStandardTags(String var1, boolean var2) {
  157.       this.addTag(var1 + "CUSTOMCODE", (TemplateTagElement)(new CustomElement()));
  158.       this.addTag(var1 + "SET", (TemplateTagElement)(new SetElement()));
  159.       this.addTag(var1 + "INCLUDE", (TemplateTagElement)(new IncludeElement()));
  160.       this.addTag(var1 + "LOOP", (TemplateTagElement)(new LoopElement()));
  161.       this.addTag(var1 + "BREAK", (TemplateTagElement)(new BreakElement()));
  162.       this.addTag(var1 + "CONTINUE", (TemplateTagElement)(new ContinueElement()));
  163.       this.addTag(var1 + "IF", (TemplateTagElement)(new IfElement()));
  164.       this.addTag(var1 + "ELSEIF", (TemplateTagElement)(new ElseIfElement()));
  165.       this.addTag(var1 + "ELSE", (TemplateTagElement)(new ElseElement()));
  166.       if (var2) {
  167.          this.m_textOnlyTags.addElement(var1 + "SET");
  168.          this.m_textOnlyTags.addElement(var1 + "IF");
  169.          this.m_textOnlyTags.addElement(var1 + "ELSEIF");
  170.       }
  171.  
  172.    }
  173.  
  174.    public void addStandardTags(boolean var1) {
  175.       this.addStandardTags("", var1);
  176.    }
  177.  
  178.    Class getCustomTagClass(String var1) {
  179.       return (Class)this.m_customTagClasses.get(var1.toUpperCase());
  180.    }
  181.  
  182.    private Vector createElementTree(Vector var1) throws TemplateException {
  183.       Vector var2 = new Vector();
  184.       int var3 = var1.size();
  185.  
  186.       for(int var4 = 0; var4 < var3; ++var4) {
  187.          Object var5 = var1.elementAt(var4);
  188.          Object var6 = null;
  189.          if (var5 instanceof Tag) {
  190.             Tag var7 = (Tag)var5;
  191.             Class var8 = this.getClassForTag(var7.getName());
  192.             Object var9 = null;
  193.  
  194.             try {
  195.                var13 = (TemplateTagElement)var8.newInstance();
  196.             } catch (Exception var10) {
  197.                throw new TemplateException(1005, "Error attempting to create a tag object for tag " + "named '" + var7.getName() + "'. The class registered " + "for the tag is '" + var8.getName() + "'.");
  198.             }
  199.  
  200.             var13.setTag(var7);
  201.             if (var7.hasSubItems()) {
  202.                var13.addSubElements(this.createElementTree(var7.getSubItems()));
  203.             }
  204.  
  205.             var6 = var13;
  206.          } else if (var5 instanceof String) {
  207.             String var11 = (String)var5;
  208.             if (this.m_bTrimTagWhitespace && var11.trim().length() == 0 && (this.previousElementWasTag(var1, var4) || this.nextElementIsTag(var1, var4))) {
  209.                continue;
  210.             }
  211.  
  212.             TextElement var12 = new TextElement();
  213.             var12.setText(var11);
  214.             var6 = var12;
  215.          }
  216.  
  217.          ((TemplateElement)var6).setTemplateParser(this);
  218.          var2.addElement(var6);
  219.       }
  220.  
  221.       return var2;
  222.    }
  223.  
  224.    public void addTag(String var1, TemplateTagElement var2) {
  225.       this.addTag(var1, var2.getClass());
  226.    }
  227.  
  228.    private void addTag(String var1, Class var2) {
  229.       this.m_tags.put(var1.toUpperCase(), var2);
  230.    }
  231.  
  232.    private Class getClassForTag(String var1) {
  233.       return (Class)this.m_tags.get(var1.toUpperCase());
  234.    }
  235.  
  236.    private boolean nextElementIsTag(Vector var1, int var2) {
  237.       if (var2 < var1.size() - 1) {
  238.          Object var3 = var1.elementAt(var2 + 1);
  239.          return var3 instanceof Tag;
  240.       } else {
  241.          return false;
  242.       }
  243.    }
  244.  
  245.    public String resolveExpressionsInText(String var1) throws TemplateException {
  246.       StringBuffer var2 = new StringBuffer();
  247.       Vector var3 = this.m_expressionFilter.seekExpressionsInText(var1);
  248.  
  249.       String var5;
  250.       for(Enumeration var4 = var3.elements(); var4.hasMoreElements(); var2.append(var5)) {
  251.          var5 = null;
  252.          Object var6 = var4.nextElement();
  253.          if (var6 instanceof ExpressionText) {
  254.             ExpressionText var7 = (ExpressionText)var6;
  255.             var5 = this.resolveExpression(var7.getText());
  256.          } else if (var6 instanceof String) {
  257.             var5 = (String)var6;
  258.          }
  259.       }
  260.  
  261.       return new String(var2);
  262.    }
  263.  
  264.    public void setRuntimeContext(TemplateRuntimeContext var1) {
  265.       this.m_runtimeContext = var1;
  266.    }
  267. }
  268.