From 536352a54507e044006bc0234f50d7a089dba746 Mon Sep 17 00:00:00 2001 From: rfeng Date: Tue, 22 Sep 2009 21:40:50 +0000 Subject: 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 --- .../tuscany/sca/common/xml/xpath/XPathHelper.java | 58 +++++++++++++++------- 1 file changed, 41 insertions(+), 17 deletions(-) (limited to 'java/sca/modules/common-xml/src/main/java/org/apache') 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 getPrefixes(String expression) { - List prefixes = new ArrayList(); - 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 prefixes = new HashSet(); + 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; } } -- cgit v1.2.3