diff options
author | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-09-22 21:40:50 +0000 |
---|---|---|
committer | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-09-22 21:40:50 +0000 |
commit | 536352a54507e044006bc0234f50d7a089dba746 (patch) | |
tree | 2278e8c90420e1aecf29cf21ef0778a63742b013 /java | |
parent | 86163b4ee4d80014e063e01add2f69b77cdf63a0 (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')
5 files changed, 87 insertions, 25 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; } } diff --git a/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java b/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java index 6bd37cb34e..a2922e9173 100644 --- a/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java +++ b/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java @@ -52,7 +52,7 @@ public class XPathHelperTestCase { + "</r:root>"; private static String XPATH = - "<policySet attachTo=\"//c:child1[@name='child1']\" xmlns:c=\"http://child1\" xmlns=\"http://p\">" + "<child xmlns:c=\"http://c2\"/></policySet>"; + "<policySet attachTo=\"//c:child1[@name='child1']/self::node()\" xmlns:c=\"http://child1\" xmlns=\"http://p\">" + "<child xmlns:c=\"http://c2\"/></policySet>"; /** * @throws java.lang.Exception diff --git a/java/sca/modules/policy-builder/src/test/java/org/apache/tuscany/sca/policy/builder/impl/PolicyAttachmentTestCase.java b/java/sca/modules/policy-builder/src/test/java/org/apache/tuscany/sca/policy/builder/impl/PolicyAttachmentTestCase.java index 1c2a0dcb0f..b7ea3d8fa2 100644 --- a/java/sca/modules/policy-builder/src/test/java/org/apache/tuscany/sca/policy/builder/impl/PolicyAttachmentTestCase.java +++ b/java/sca/modules/policy-builder/src/test/java/org/apache/tuscany/sca/policy/builder/impl/PolicyAttachmentTestCase.java @@ -33,6 +33,7 @@ import org.apache.tuscany.sca.assembly.Base; import org.apache.tuscany.sca.assembly.Composite; import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint; import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; +import org.apache.tuscany.sca.assembly.builder.impl.CompositeBindingURIBuilderImpl; import org.apache.tuscany.sca.assembly.builder.impl.CompositeCloneBuilderImpl; import org.apache.tuscany.sca.assembly.builder.impl.CompositeIncludeBuilderImpl; import org.apache.tuscany.sca.contribution.processor.ContributionReadException; @@ -126,6 +127,7 @@ public class PolicyAttachmentTestCase { CompositeBuilder includeBuilder = new CompositeIncludeBuilderImpl(); CompositeBuilder cloneBuilder = new CompositeCloneBuilderImpl(); + CompositeBuilder uriBuilder = new CompositeBindingURIBuilderImpl(extensionPoints); /* CompositeBuilder includeBuilder = @@ -136,6 +138,7 @@ public class PolicyAttachmentTestCase { includeBuilder.build(domainComposite, definitions, monitor); cloneBuilder.build(domainComposite, definitions, monitor); + uriBuilder.build(domainComposite, definitions, monitor); PolicyAttachmentBuilderImpl builder = new PolicyAttachmentBuilderImpl(extensionPoints); builder.build(domainComposite, definitions, monitor); diff --git a/java/sca/modules/policy-xml/src/main/java/org/apache/tuscany/sca/policy/xml/PolicyXPathFunction.java b/java/sca/modules/policy-xml/src/main/java/org/apache/tuscany/sca/policy/xml/PolicyXPathFunction.java index 1b6d64e4f7..10f142c67b 100644 --- a/java/sca/modules/policy-xml/src/main/java/org/apache/tuscany/sca/policy/xml/PolicyXPathFunction.java +++ b/java/sca/modules/policy-xml/src/main/java/org/apache/tuscany/sca/policy/xml/PolicyXPathFunction.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.xml.namespace.NamespaceContext; import javax.xml.namespace.QName; @@ -39,7 +41,7 @@ import org.w3c.dom.NodeList; */ public class PolicyXPathFunction implements XPathFunction { private static Logger logger = Logger.getLogger(PolicyXPathFunction.class.getName()); - + static final QName InterfaceRef = new QName(PolicyConstants.SCA11_NS, "InterfaceRef"); static final QName OperationRef = new QName(PolicyConstants.SCA11_NS, "OperationRef"); static final QName MessageRef = new QName(PolicyConstants.SCA11_NS, "MessageRef"); @@ -67,12 +69,12 @@ public class PolicyXPathFunction implements XPathFunction { } return null; } - + public Object evaluate(List args) throws XPathFunctionException { if (logger.isLoggable(Level.FINE)) { logger.fine(functionName + "(" + args + ")"); } - + String arg = (String)args.get(0); Node node = getContextNode(args); if (InterfaceRef.equals(functionName)) { @@ -124,4 +126,33 @@ public class PolicyXPathFunction implements XPathFunction { return Boolean.FALSE; } + private static Pattern FUNCTION; + static { + String functionPattern = "(URIRef|InterfaceRef|OperationRef|MessageRef|IntentRefs)\\s*\\((.*)\\)"; + FUNCTION = Pattern.compile(functionPattern); + } + + public static String normalize(String attachTo) { + Matcher matcher = FUNCTION.matcher(attachTo); + boolean result = matcher.find(); + if (result) { + StringBuffer sb = new StringBuffer(); + do { + String function = matcher.group(1); + String args = matcher.group(2); + String replacement = null; + if (args.trim().length() > 0) { + replacement = function + "(" + args + "," + "self::node())"; + } else { + replacement = function + "(self::node())"; + } + matcher.appendReplacement(sb, replacement); + result = matcher.find(); + } while (result); + matcher.appendTail(sb); + return sb.toString(); + } + return attachTo; + } + } diff --git a/java/sca/modules/policy-xml/src/test/java/org/apache/tuscany/sca/policy/xml/PolicyXPathFunctionResolverTestCase.java b/java/sca/modules/policy-xml/src/test/java/org/apache/tuscany/sca/policy/xml/PolicyXPathFunctionResolverTestCase.java index e954f1ebe4..f0bd5d8bde 100644 --- a/java/sca/modules/policy-xml/src/test/java/org/apache/tuscany/sca/policy/xml/PolicyXPathFunctionResolverTestCase.java +++ b/java/sca/modules/policy-xml/src/test/java/org/apache/tuscany/sca/policy/xml/PolicyXPathFunctionResolverTestCase.java @@ -19,6 +19,8 @@ package org.apache.tuscany.sca.policy.xml; +import static org.apache.tuscany.sca.policy.xml.PolicyXPathFunction.normalize; + import java.util.Collections; import java.util.Iterator; @@ -55,8 +57,10 @@ public class PolicyXPathFunctionResolverTestCase { @Test public void testIntentsRef() throws Exception { InputSource xml = new InputSource(getClass().getResourceAsStream("Calculator.composite")); + String str = "//sca:composite/sca:component[sca:IntentRefs('sca:confidentiality')]"; + str = normalize(str); // Test the rewrite of xpath so that the self:node() is passed into the SCA function - XPathExpression exp = xpath.compile("//sca:composite/sca:component[sca:IntentRefs('sca:confidentiality', self::node())]"); + XPathExpression exp = xpath.compile(str); Object result = exp.evaluate(xml, XPathConstants.NODESET); Assert.assertTrue(result instanceof NodeList); NodeList nodes = (NodeList)result; @@ -66,7 +70,7 @@ public class PolicyXPathFunctionResolverTestCase { @Test public void testURIRef() throws Exception { InputSource xml = new InputSource(getClass().getResourceAsStream("Calculator.composite")); - XPathExpression exp = xpath.compile("sca:composite/sca:component[sca:URIRef('AddServiceComponent')]"); + XPathExpression exp = xpath.compile(normalize("sca:composite/sca:component[sca:URIRef('AddServiceComponent')]")); Object result = exp.evaluate(xml, XPathConstants.NODESET); Assert.assertTrue(result instanceof NodeList); NodeList nodes = (NodeList)result; @@ -76,7 +80,7 @@ public class PolicyXPathFunctionResolverTestCase { @Test public void testInterfaceRef() throws Exception { InputSource xml = new InputSource(getClass().getResourceAsStream("Calculator.composite")); - XPathExpression exp = xpath.compile("//sca:composite/sca:component/sca:service[sca:InterfaceRef('AddService')]"); + XPathExpression exp = xpath.compile(normalize("//sca:composite/sca:component/sca:service[sca:InterfaceRef('AddService')]")); Object result = exp.evaluate(xml, XPathConstants.NODESET); Assert.assertTrue(result instanceof NodeList); NodeList nodes = (NodeList)result; @@ -86,7 +90,7 @@ public class PolicyXPathFunctionResolverTestCase { @Test public void testOperationRef() throws Exception { InputSource xml = new InputSource(getClass().getResourceAsStream("Calculator.composite")); - XPathExpression exp = xpath.compile("//sca:composite/sca:component/sca:reference[sca:OperationRef('AddService/add')]"); + XPathExpression exp = xpath.compile(normalize("//sca:composite/sca:component/sca:reference[sca:OperationRef('AddService/add')]")); Object result = exp.evaluate(xml, XPathConstants.NODESET); Assert.assertTrue(result instanceof NodeList); NodeList nodes = (NodeList)result; |