summaryrefslogtreecommitdiffstats
path: root/java/sca/modules/common-xml/src/main/java/org/apache
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-09-22 21:40:50 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-09-22 21:40:50 +0000
commit536352a54507e044006bc0234f50d7a089dba746 (patch)
tree2278e8c90420e1aecf29cf21ef0778a63742b013 /java/sca/modules/common-xml/src/main/java/org/apache
parent86163b4ee4d80014e063e01add2f69b77cdf63a0 (diff)
Apply the @attachTo to SCA domain info set for external policy attachment
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@817852 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca/modules/common-xml/src/main/java/org/apache')
-rw-r--r--java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java58
1 files changed, 41 insertions, 17 deletions
diff --git a/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java b/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java
index 491837c7ee..85306622b2 100644
--- a/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java
+++ b/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java
@@ -19,9 +19,10 @@
package org.apache.tuscany.sca.common.xml.xpath;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.List;
+import java.util.HashSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
@@ -62,7 +63,7 @@ public class XPathHelper {
public XPath newXPath() {
return factory.newXPath();
}
-
+
public XPathExpression compile(NamespaceContext context, String expression) throws XPathExpressionException {
XPath path = newXPath();
context = getNamespaceContext(expression, context);
@@ -100,27 +101,50 @@ public class XPathHelper {
* @return A collection of prefixes
*/
private Collection<String> getPrefixes(String expression) {
- List<String> prefixes = new ArrayList<String>();
- prefixes.add("");
- String[] segments = expression.split(":");
- for (int i = 0; i < segments.length - 1; i++) {
- String prefix = segments[i];
- if(prefix.length()<1) {
- continue;
+ Collection<String> prefixes = new HashSet<String>();
+ Pattern pattern = Pattern.compile("([^:]+):([^:]+)");
+ Matcher matcher = pattern.matcher(expression);
+ while (matcher.find()) {
+ String prefix = extractNCName(matcher.group(1), true);
+ String local = extractNCName(matcher.group(2), false);
+ if (prefix != null && local != null) {
+ prefixes.add(prefix);
+ }
+ }
+ return prefixes;
+ }
+
+ private String extractNCName(String str, boolean reverse) {
+ if (str.length() < 1) {
+ return null;
+ }
+ if (!reverse) {
+ if (!XMLCharHelper.isNCNameStart(str.charAt(0))) {
+ return null;
}
- int j = prefix.length() -1;
+ int i = 0, j = str.length();
+ // Find the last non-NCName char
+ for (; i < j; i++) {
+ if (!XMLCharHelper.isNCName(str.charAt(i))) {
+ break;
+ }
+ }
+ return str.substring(0, i);
+ } else {
+ int j = str.length() - 1;
+ // Find the first non-NCName char
for (; j >= 0; j--) {
- if (XMLCharHelper.isNCName(prefix.charAt(j))) {
- continue;
+ if (!XMLCharHelper.isNCName(str.charAt(j))) {
+ break;
}
- break;
}
// j is before the first char of the prefix
- if (j != (prefix.length() - 1) && XMLCharHelper.isNCNameStart(prefix.charAt(j + 1))) {
- prefixes.add(prefix.substring(j + 1));
+ if (j != (str.length() - 1) && XMLCharHelper.isNCNameStart(str.charAt(j + 1))) {
+ return str.substring(j + 1);
+ } else {
+ return null;
}
}
- return prefixes;
}
}