2009/05/20 - Apache Shale has been retired.
For more information, please explore the Attic.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.shale.clay.parser.builder.chain;
22
23 import org.apache.commons.chain.Command;
24 import org.apache.commons.chain.Context;
25 import org.apache.shale.clay.parser.Node;
26 import org.apache.shale.clay.parser.builder.Builder;
27 import org.apache.shale.clay.parser.builder.IgnoreBuilder;
28 import org.apache.shale.clay.parser.builder.JspIncludeDirectiveBuilder;
29 import org.apache.shale.clay.parser.builder.VoidBuilder;
30
31 /***
32 * <p>This builder will be ordered first in the rule registration list.
33 * If the node has a <code>jsfid</code> attribute, and its value is
34 * "ignore", or "void" then special assumptions will be made.
35 * Beside the clay "ignore" and "void" directives, handles
36 * all "jsp:" nodes. Most are are assigned to the clay "void"
37 * directive except the "jsp:include" and "jsp:directive.include"
38 * elements. The include and directive.include are
39 * converted into a nested clay components.
40 */
41 public class DirectiveBuilderRule implements Command {
42
43 /***
44 * <p>The builders that will assined to a "ignore" or "void"
45 * {@link Builder}.
46 * <p>
47 */
48 private static final Builder[] BUILDERS = {new IgnoreBuilder(),
49 new VoidBuilder(), new JspIncludeDirectiveBuilder()};
50
51 /***
52 * <p>If the node has a <code>jsfid</code> attribute, and its value is
53 * "ignore", child elements will be rendered as comment/verbatim
54 * content. The enclosing tag will not be rendered in the document,
55 * only it's children. If the <code>jsfid</code> is "void",
56 * the element will not be rendered but its children will
57 * keep their original characteristics.<br/><br/>
58 * All "jsp:" nodes are assigned to the clay void directive except the
59 * "jsp:include" and "jsp:directive.include". These are converted into a
60 * nested clay component. Nodes with a jsp prefix must be in the
61 * "http://java.sun.com/JSP/Page" namespace to be eligible for this
62 * processing.
63 * </p>
64 *
65 * @param context commons chains
66 * @return <code>true</code> if the command ends the chain
67 * @exception Exception pushes an exception back to the invoking Command
68 */
69 public boolean execute(Context context) throws Exception {
70 boolean isFinal = false;
71
72 BuilderRuleContext builderRuleContext = (BuilderRuleContext) context;
73 Node node = builderRuleContext.getNode();
74 if (!node.isComment() && node.isStart() && node.getName() != null) {
75 String jsfid = (String) node.getAttributes().get("jsfid");
76 if (jsfid != null) {
77 if (jsfid.equals("ignore")) {
78 builderRuleContext.setBuilder(BUILDERS[0]);
79 isFinal = true;
80 } else if (jsfid.equals("void")) {
81 builderRuleContext.setBuilder(BUILDERS[1]);
82 isFinal = true;
83 }
84 } else if (node.getQname() != null) {
85 String uri = node.getNamespaceURI(node.getQname());
86 if (uri != null && uri.equals("http://java.sun.com/JSP/Page")) {
87 if (node.getName().equals("directive.include")
88 || node.getName().equals("include")) {
89 builderRuleContext.setBuilder(BUILDERS[2]);
90 isFinal = true;
91 } else {
92 builderRuleContext.setBuilder(BUILDERS[1]);
93 isFinal = true;
94 }
95 }
96 }
97 }
98
99 return isFinal;
100 }
101
102 }