You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2010/03/02 15:36:32 UTC

svn commit: r918054 - in /tuscany/sca-java-2.x/trunk/modules: assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/ assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/ assembly-xml/src/test/resources/org/apache/tuscany/sca/assembl...

Author: slaws
Date: Tue Mar  2 14:36:32 2010
New Revision: 918054

URL: http://svn.apache.org/viewvc?rev=918054&view=rev
Log:
TUSCANY-242 add operation to trim whitespace from anyURI attributes according to XML whitespace facet set to "collapse". Only exploited by composite service promote attribute while I ask on the ML if there is a smart way of detecting anyURI types. 

Added:
    tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/StripURISpacesTestCase.java   (with props)
    tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/resources/org/apache/tuscany/sca/assembly/xml/CalculatorURISpaces.composite   (with props)
Modified:
    tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java
    tuscany/sca-java-2.x/trunk/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java
    tuscany/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/BaseStAXArtifactProcessor.java

Modified: tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java?rev=918054&r1=918053&r2=918054&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/CompositeProcessor.java Tue Mar  2 14:36:32 2010
@@ -229,7 +229,7 @@
                                 contract = compositeService;
                                 compositeService.setName(getString(reader, NAME));
 
-                                String promoted = getString(reader, PROMOTE);
+                                String promoted = getURIString(reader, PROMOTE);
                                 if (promoted != null) {
                                     String promotedComponentName;
                                     String promotedServiceName;

Added: tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/StripURISpacesTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/StripURISpacesTestCase.java?rev=918054&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/StripURISpacesTestCase.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/StripURISpacesTestCase.java Tue Mar  2 14:36:32 2010
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.assembly.xml;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+
+import java.io.InputStream;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.CompositeService;
+import org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test reading SCA XML assemblies.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class StripURISpacesTestCase {
+
+    private static XMLInputFactory inputFactory;
+    private static StAXArtifactProcessor<Object> staxProcessor;
+    private static ProcessorContext context;
+    
+    @BeforeClass
+    public static void setUp() throws Exception {
+        ExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry();
+        context = new ProcessorContext(extensionPoints);
+        inputFactory = XMLInputFactory.newInstance();
+        StAXArtifactProcessorExtensionPoint staxProcessors = extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+        staxProcessor = new ExtensibleStAXArtifactProcessor(staxProcessors, XMLInputFactory.newInstance(), XMLOutputFactory.newInstance());
+    }
+
+
+
+    @Test
+    public void testReadComposite() throws Exception {
+        InputStream is = getClass().getResourceAsStream("CalculatorURISpaces.composite");
+        XMLStreamReader reader = inputFactory.createXMLStreamReader(is);
+        Composite composite = (Composite)staxProcessor.read(reader, context);
+        assertNotNull(composite);
+        is.close();
+
+        CompositeService compositeService = (CompositeService)composite.getServices().get(0);
+        assertNotNull(compositeService);
+        
+        // Promoted component name with leading and training spaces removed
+        assertEquals("CalculatorServiceComponent", compositeService.getPromotedComponent().getName());
+    }
+}

Propchange: tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/StripURISpacesTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/java/org/apache/tuscany/sca/assembly/xml/StripURISpacesTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/resources/org/apache/tuscany/sca/assembly/xml/CalculatorURISpaces.composite
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/resources/org/apache/tuscany/sca/assembly/xml/CalculatorURISpaces.composite?rev=918054&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/resources/org/apache/tuscany/sca/assembly/xml/CalculatorURISpaces.composite (added)
+++ tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/resources/org/apache/tuscany/sca/assembly/xml/CalculatorURISpaces.composite Tue Mar  2 14:36:32 2010
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+	xmlns:x="http://x"
+	xmlns:calc="http://calc"
+	targetNamespace="http://calc"
+	name="Calculator">
+	
+	<service name="CalculatorService" promote="    CalculatorServiceComponent   ">
+        <interface.java interface="calculator.CalculatorService"/>
+    </service>
+    
+    <component name="CalculatorServiceComponent">
+		<implementation.java class="calculator.CalculatorServiceImpl"/>
+        <reference name="addService"  multiplicity="0..1" target="AddServiceComponent"/>
+        <reference name="subtractService" target="SubtractServiceComponent"/>
+        <reference name="multiplyService" target="MultiplyServiceComponent"/>
+        <reference name="divideService" target="DivideServiceComponent"/>
+    </component>
+
+    <component name="AddServiceComponent">
+        <implementation.java class="calculator.AddServiceImpl"/>
+    </component>
+
+    <component name="SubtractServiceComponent">
+        <implementation.java class="calculator.SubtractServiceImpl"/>
+    </component>
+
+    <component name="MultiplyServiceComponent">
+        <implementation.java class="calculator.MultiplyServiceImpl"/>
+    </component>
+
+    <component name="DivideServiceComponent">
+        <implementation.java class="calculator.DivideServiceImpl"/>
+    </component>
+    
+    <x:unknownElement uknAttr="attribute1">
+		<y:subUnknownElement1 xmlns:y="http://y" uknAttr1="attribute2"/>
+		<x:subUnknownElement2 />
+	</x:unknownElement>
+		
+</composite>

Propchange: tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/resources/org/apache/tuscany/sca/assembly/xml/CalculatorURISpaces.composite
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/resources/org/apache/tuscany/sca/assembly/xml/CalculatorURISpaces.composite
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: tuscany/sca-java-2.x/trunk/modules/assembly-xml/src/test/resources/org/apache/tuscany/sca/assembly/xml/CalculatorURISpaces.composite
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: tuscany/sca-java-2.x/trunk/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java?rev=918054&r1=918053&r2=918054&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java Tue Mar  2 14:36:32 2010
@@ -309,6 +309,71 @@
     public static String getAttributeAsString(XMLStreamReader reader, String name) {
         return reader.getAttributeValue(null, name);
     }
+    
+    /**
+     * TUSCANY-242
+     * 
+     * Returns the URI value of an attribute as a string and first applies the 
+     * URI whitespace processing as defined in section 4.3.6 of XML Schema Part2: Datatypes
+     * [http://www.w3.org/TR/xmlschema-2/#rf-facets]. anyURI is defined with the following 
+     * XSD:
+     *   <xs:simpleType name="anyURI" id="anyURI">
+     *        <xs:restriction base="xs:anySimpleType">
+     *          <xs:whiteSpace value="collapse" fixed="true" id="anyURI.whiteSpace"/>
+     *        </xs:restriction>
+     *   </xs:simpleType>
+     *   
+     * The <xs:whiteSpace value="collapse"/> constraining facet is defined as follows
+     * 
+     *   replace
+     *      All occurrences of #x9 (tab), #xA (line feed) and #xD (carriage return) are replaced with #x20 (space) 
+     *   collapse
+     *      After the processing implied by replace, contiguous sequences of #x20's are collapsed to a single #x20, 
+     *      and leading and trailing #x20's are removed
+     *      
+     * It seems that the StAX parser does apply this rule so we do it here. 
+     * 
+     * @param reader
+     * @param name
+     * @return
+     */
+    public static String getAttributeAsURIString(XMLStreamReader reader, String name) {
+        // get the basic string value
+        String uri = reader.getAttributeValue(null, name);
+        
+        // apply the "collapse" rule
+        if (uri != null){
+            // turn tabs, line feeds and carriage returns into spaces
+            uri = uri.replace('\t', ' ');
+            uri = uri.replace('\n', ' ');
+            uri = uri.replace('\r', ' ');
+            
+            // remote leading and trailing spaces. Other whitespace
+            // has already been converted to spaces above
+            uri = uri.trim();
+                        
+            // collapse any contiguous spaces into a single space
+            StringBuilder sb= new StringBuilder(uri.length());
+            boolean spaceFound= false;
+            for(int i=0; i< uri.length(); ++i){
+                char c= uri.charAt(i);
+                if(c == ' '){
+                    if(!spaceFound){
+                        sb.append(c);
+                        spaceFound = true;
+                    } else {
+                        // collapse the space by ignoring it
+                    }
+                }else{
+                    sb.append(c);
+                    spaceFound= false;
+                }
+            }     
+            uri = sb.toString();            
+        }
+        
+        return uri;
+    }
 
     /**
      * Returns the value of xsi:type attribute

Modified: tuscany/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/BaseStAXArtifactProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/BaseStAXArtifactProcessor.java?rev=918054&r1=918053&r2=918054&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/BaseStAXArtifactProcessor.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/BaseStAXArtifactProcessor.java Tue Mar  2 14:36:32 2010
@@ -101,6 +101,16 @@
     protected String getString(XMLStreamReader reader, String name) {
         return StAXHelper.getAttributeAsString(reader, name);
     }
+    
+    /**
+     * Returns the string value of an attribute.
+     * @param reader
+     * @param name
+     * @return
+     */
+    protected String getURIString(XMLStreamReader reader, String name) {
+        return StAXHelper.getAttributeAsURIString(reader, name);
+    }    
 
     /**
      * Test if an attribute is explicitly set