1
2
3
4
5
6
7
8 package org.dom4j.xpath;
9
10 import java.util.ArrayList;
11
12 import org.dom4j.InvalidXPathException;
13 import org.dom4j.Node;
14 import org.dom4j.XPathException;
15
16 import org.jaxen.Context;
17 import org.jaxen.ContextSupport;
18 import org.jaxen.JaxenException;
19 import org.jaxen.SimpleNamespaceContext;
20 import org.jaxen.SimpleVariableContext;
21 import org.jaxen.VariableContext;
22 import org.jaxen.XPathFunctionContext;
23 import org.jaxen.dom4j.DocumentNavigator;
24 import org.jaxen.pattern.Pattern;
25 import org.jaxen.pattern.PatternParser;
26 import org.jaxen.saxpath.SAXPathException;
27
28 /***
29 * <p>
30 * <code>XPathPattern</code> is an implementation of Pattern which uses an
31 * XPath xpath.
32 * </p>
33 *
34 * @author <a href="mailto:jstrachan@apache.org">James Strachan </a>
35 * @version $Revision: 1.18.2.1 $
36 */
37 public class XPathPattern implements org.dom4j.rule.Pattern {
38 private String text;
39
40 private Pattern pattern;
41
42 private Context context;
43
44 public XPathPattern(Pattern pattern) {
45 this.pattern = pattern;
46 this.text = pattern.getText();
47 this.context = new Context(getContextSupport());
48 }
49
50 public XPathPattern(String text) {
51 this.text = text;
52 this.context = new Context(getContextSupport());
53
54 try {
55 this.pattern = PatternParser.parse(text);
56 } catch (SAXPathException e) {
57 throw new InvalidXPathException(text, e.getMessage());
58 } catch (Throwable t) {
59 throw new InvalidXPathException(text, t);
60 }
61 }
62
63 public boolean matches(Node node) {
64 try {
65 ArrayList list = new ArrayList(1);
66 list.add(node);
67 context.setNodeSet(list);
68
69 return pattern.matches(node, context);
70 } catch (JaxenException e) {
71 handleJaxenException(e);
72
73 return false;
74 }
75 }
76
77 public String getText() {
78 return text;
79 }
80
81 public double getPriority() {
82 return pattern.getPriority();
83 }
84
85 public org.dom4j.rule.Pattern[] getUnionPatterns() {
86 Pattern[] patterns = pattern.getUnionPatterns();
87
88 if (patterns != null) {
89 int size = patterns.length;
90 XPathPattern[] answer = new XPathPattern[size];
91
92 for (int i = 0; i < size; i++) {
93 answer[i] = new XPathPattern(patterns[i]);
94 }
95
96 return answer;
97 }
98
99 return null;
100 }
101
102 public short getMatchType() {
103 return pattern.getMatchType();
104 }
105
106 public String getMatchesNodeName() {
107 return pattern.getMatchesNodeName();
108 }
109
110 public void setVariableContext(VariableContext variableContext) {
111 context.getContextSupport().setVariableContext(variableContext);
112 }
113
114 public String toString() {
115 return "[XPathPattern: text: " + text + " Pattern: " + pattern + "]";
116 }
117
118 protected ContextSupport getContextSupport() {
119 return new ContextSupport(new SimpleNamespaceContext(),
120 XPathFunctionContext.getInstance(),
121 new SimpleVariableContext(), DocumentNavigator.getInstance());
122 }
123
124 protected void handleJaxenException(JaxenException exception)
125 throws XPathException {
126 throw new XPathException(text, exception);
127 }
128 }
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165