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
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 }