View Javadoc
1   package org.esigate.tags;
2   
3   import java.io.IOException;
4   
5   import org.esigate.aggregator.AggregationSyntaxException;
6   import org.esigate.parser.Element;
7   import org.esigate.parser.ElementType;
8   import org.esigate.parser.ParserContext;
9   
10  class ParamElement implements Element {
11      public static final ElementType TYPE = new ElementType() {
12  
13          @Override
14          public boolean isStartTag(String tag) {
15              return tag.startsWith("<!--$beginparam$");
16          }
17  
18          @Override
19          public boolean isEndTag(String tag) {
20              return tag.startsWith("<!--$endparam$");
21          }
22  
23          @Override
24          public Element newInstance() {
25              return new ParamElement();
26          }
27  
28          @Override
29          public boolean isSelfClosing(String tag) {
30              return false;
31          }
32  
33      };
34  
35      private Element parent;
36      private boolean valueFound = false;
37  
38      @Override
39      public boolean onError(Exception e, ParserContext ctx) {
40          return false;
41      }
42  
43      @Override
44      public void onTagEnd(String tag, ParserContext ctx) {
45          // Nothing to do
46      }
47  
48      @Override
49      public boolean onTagStart(String tag, ParserContext ctx) throws IOException {
50          this.parent = ctx.getCurrent();
51          String[] parameters = tag.split("\\$");
52          if (parameters.length != 4) {
53              throw new AggregationSyntaxException("Invalid syntax: " + tag);
54          }
55          String name = parameters[2];
56          TemplateElement templateElement = ctx.findAncestor(TemplateElement.class);
57          TemplateRenderer templateRenderer = ctx.findAncestor(TemplateRenderer.class);
58          if (templateElement == null || templateElement.isNameMatches()) {
59              String value = templateRenderer.getParam(name);
60              if (value != null) {
61                  parent.characters(value, 0, value.length());
62                  valueFound = true;
63              }
64          }
65          return true;
66      }
67  
68      @Override
69      public void characters(CharSequence csq, int start, int end) throws IOException {
70          if (!valueFound) {
71              parent.characters(csq, start, end);
72          }
73      }
74  
75  }