%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
org.apache.commons.jelly.tags.jsl.TemplateTag$1 |
|
|
1 | /* |
|
2 | * Copyright 2002,2004 The Apache Software Foundation. |
|
3 | * |
|
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
|
5 | * you may not use this file except in compliance with the License. |
|
6 | * You may obtain a copy of the License at |
|
7 | * |
|
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
|
9 | * |
|
10 | * Unless required by applicable law or agreed to in writing, software |
|
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
|
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
13 | * See the License for the specific language governing permissions and |
|
14 | * limitations under the License. |
|
15 | */ |
|
16 | ||
17 | package org.apache.commons.jelly.tags.jsl; |
|
18 | ||
19 | import org.apache.commons.jelly.JellyTagException; |
|
20 | import org.apache.commons.jelly.TagSupport; |
|
21 | import org.apache.commons.jelly.XMLOutput; |
|
22 | import org.apache.commons.jelly.xpath.XPathSource; |
|
23 | import org.apache.commons.logging.Log; |
|
24 | import org.apache.commons.logging.LogFactory; |
|
25 | import org.dom4j.Node; |
|
26 | import org.dom4j.rule.Action; |
|
27 | import org.dom4j.rule.Pattern; |
|
28 | import org.dom4j.rule.Rule; |
|
29 | ||
30 | /** |
|
31 | * This tag represents a declarative matching rule, similar to the template tag in XSLT. |
|
32 | * |
|
33 | * @author <a href="mailto:jstrachan@apache.org">James Strachan</a> |
|
34 | * @version $Revision: 155420 $ |
|
35 | */ |
|
36 | public class TemplateTag extends TagSupport implements XPathSource { |
|
37 | ||
38 | /** The Log to which logging calls will be made. */ |
|
39 | private Log log = LogFactory.getLog(TemplateTag.class); |
|
40 | ||
41 | ||
42 | /** Holds value of property name. */ |
|
43 | private String name; |
|
44 | ||
45 | /** Holds value of property mode. */ |
|
46 | private String mode; |
|
47 | ||
48 | /** Holds value of property priority. */ |
|
49 | private double priority; |
|
50 | ||
51 | /** The pattern to match */ |
|
52 | private Pattern match; |
|
53 | ||
54 | /** The source XPath context for any child tags */ |
|
55 | private Object xpathSource; |
|
56 | ||
57 | ||
58 | public TemplateTag() { |
|
59 | } |
|
60 | ||
61 | ||
62 | // Tag interface |
|
63 | //------------------------------------------------------------------------- |
|
64 | public void doTag(XMLOutput output) throws JellyTagException { |
|
65 | StylesheetTag tag = (StylesheetTag) findAncestorWithClass( StylesheetTag.class ); |
|
66 | if (tag == null) { |
|
67 | throw new JellyTagException( "This <template> tag must be used inside a <stylesheet> tag" ); |
|
68 | } |
|
69 | ||
70 | if ( log.isDebugEnabled() ) { |
|
71 | log.debug( "adding template rule for match: " + match ); |
|
72 | } |
|
73 | ||
74 | Rule rule = createRule(tag, output); |
|
75 | if ( rule != null && tag != class="keyword">null) { |
|
76 | rule.setMode( mode ); |
|
77 | tag.addTemplate( rule ); |
|
78 | } |
|
79 | } |
|
80 | ||
81 | // XPathSource interface |
|
82 | //------------------------------------------------------------------------- |
|
83 | ||
84 | /** |
|
85 | * @return the current XPath value on which relative paths are evaluated |
|
86 | */ |
|
87 | public Object getXPathSource() { |
|
88 | return xpathSource; |
|
89 | } |
|
90 | ||
91 | ||
92 | // Properties |
|
93 | //------------------------------------------------------------------------- |
|
94 | ||
95 | public void setMatch(Pattern match) { |
|
96 | this.match = match; |
|
97 | } |
|
98 | ||
99 | /** Getter for property priority. |
|
100 | * @return Value of property priority. |
|
101 | */ |
|
102 | public double getPriority() { |
|
103 | return priority; |
|
104 | } |
|
105 | ||
106 | /** Sets the priority. |
|
107 | * @param priority New value of property priority. |
|
108 | */ |
|
109 | public void setPriority(double priority) { |
|
110 | this.priority = priority; |
|
111 | } |
|
112 | ||
113 | /** Getter for property name. |
|
114 | * @return Value of property name. |
|
115 | */ |
|
116 | public String getName() { |
|
117 | return name; |
|
118 | } |
|
119 | ||
120 | /** Sets the name. |
|
121 | * @param name New value of property name. |
|
122 | */ |
|
123 | public void setName(String name) { |
|
124 | this.name = name; |
|
125 | } |
|
126 | ||
127 | ||
128 | /** Sets the mode. |
|
129 | * @param mode New value of property mode. |
|
130 | */ |
|
131 | public void setMode(String mode) { |
|
132 | this.mode = mode; |
|
133 | } |
|
134 | ||
135 | ||
136 | // Implementation methods |
|
137 | //------------------------------------------------------------------------- |
|
138 | protected Rule createRule(StylesheetTag tag, XMLOutput output) { |
|
139 | return new Rule( match, createAction(tag, output) ); |
|
140 | } |
|
141 | ||
142 | protected Action createAction(final StylesheetTag tag, class="keyword">final XMLOutput output) { |
|
143 | return new Action() { |
|
144 | 72 | public void run(Node node) throws Exception { |
145 | ||
146 | // store the context for use by applyTemplates tag |
|
147 | 51 | tag.setXPathSource( node ); |
148 | ||
149 | 51 | xpathSource = node; |
150 | ||
151 | 51 | if (log.isDebugEnabled()) { |
152 | 0 | log.debug( "Firing template body for match: " + match + " and node: " + node ); |
153 | } |
|
154 | ||
155 | 51 | XMLOutput actualOutput = tag.getStylesheetOutput(); |
156 | 51 | if (actualOutput == null) { |
157 | 0 | actualOutput = output; |
158 | } |
|
159 | ||
160 | 51 | invokeBody(actualOutput); |
161 | 48 | } |
162 | }; |
|
163 | } |
|
164 | } |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |