You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ke...@apache.org on 2007/06/06 16:46:15 UTC

svn commit: r544858 - in /incubator/tuscany/java/sdo/impl/src: main/java/org/apache/tuscany/sdo/helper/ main/java/org/apache/tuscany/sdo/impl/ main/java/org/apache/tuscany/sdo/model/internal/impl/ main/java/org/apache/tuscany/sdo/util/resource/ main/re...

Author: kelvingoodson
Date: Wed Jun  6 07:46:14 2007
New Revision: 544858

URL: http://svn.apache.org/viewvc?view=rev&rev=544858
Log:
Fix for TUSCANY-1325 : Property value with xsd:QName type is not deserialized and serialized correctly

Added:
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/XSDQNameTestCase.java   (with props)
Modified:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/SDOXSDEcoreBuilder.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/AttributeImpl.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/model/internal/impl/InternalFactoryImpl.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java
    incubator/tuscany/java/sdo/impl/src/main/resources/xml/sdoInternal.xsd
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/SDOXSDEcoreBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/SDOXSDEcoreBuilder.java?view=diff&rev=544858&r1=544857&r2=544858
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/SDOXSDEcoreBuilder.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/SDOXSDEcoreBuilder.java Wed Jun  6 07:46:14 2007
@@ -32,7 +32,7 @@
 import org.apache.tuscany.sdo.impl.AttributeImpl;
 import org.apache.tuscany.sdo.impl.SDOFactoryImpl.SDOEcoreFactory;
 import org.apache.tuscany.sdo.model.ModelFactory;
-import org.apache.tuscany.sdo.util.SDOUtil;
+import org.apache.tuscany.sdo.api.SDOUtil;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EClassifier;
@@ -156,10 +156,17 @@
   
   protected EClassifier getBuiltInEClassifier(String namespace, String name)
   {
-    EClassifier eClassifier = 
-      "base64Binary".equals(name)
-        ? (EClassifier)AttributeImpl.INTERNAL_BASE64_BYTES
-          : (EClassifier)SDOUtil.getXSDSDOType(name);
+      EClassifier eClassifier = null;
+      if ("base64Binary".equals(name)) {
+          eClassifier = (EClassifier)AttributeImpl.INTERNAL_BASE64_BYTES;
+      }
+      else if ("QName".equals(name)) {
+          eClassifier = (EClassifier)AttributeImpl.INTERNAL_QNAME;
+      }
+      else {
+          eClassifier = (EClassifier)SDOUtil.getXSDSDOType(name);
+      }
+      
     if (eClassifier == null)
       eClassifier = super.getBuiltInEClassifier(namespace, name);
     return eClassifier;

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/AttributeImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/AttributeImpl.java?view=diff&rev=544858&r1=544857&r2=544858
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/AttributeImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/AttributeImpl.java Wed Jun  6 07:46:14 2007
@@ -124,6 +124,7 @@
   }
   
   public static Type INTERNAL_BASE64_BYTES = ((InternalFactoryImpl)InternalFactory.INSTANCE).getBase64Bytes();
+  public static Type INTERNAL_QNAME = ((InternalFactoryImpl)InternalFactory.INSTANCE).getQName();
 
   /**
    * <!-- begin-user-doc -->
@@ -135,6 +136,8 @@
     EClassifier eType = getEType();
     if (eType == INTERNAL_BASE64_BYTES)
       return ((ModelFactoryImpl)ModelFactory.INSTANCE).getBytes();
+    else if (eType == INTERNAL_QNAME)
+        return ((ModelFactoryImpl)ModelFactory.INSTANCE).getURI();
     return (Type)eType;
   }
 

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/model/internal/impl/InternalFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/model/internal/impl/InternalFactoryImpl.java?view=diff&rev=544858&r1=544857&r2=544858
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/model/internal/impl/InternalFactoryImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/model/internal/impl/InternalFactoryImpl.java Wed Jun  6 07:46:14 2007
@@ -19,15 +19,21 @@
  */
 package org.apache.tuscany.sdo.model.internal.impl;
 
+import commonj.sdo.helper.HelperContext;
 import org.apache.tuscany.sdo.helper.TypeHelperImpl;
-import org.apache.tuscany.sdo.impl.FactoryBase;
-import org.apache.tuscany.sdo.model.internal.InternalFactory;
-import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
 
 import commonj.sdo.DataObject;
 import commonj.sdo.Property;
 import commonj.sdo.Type;
-import commonj.sdo.helper.HelperContext;
+
+import org.apache.tuscany.sdo.SDOFactory;
+
+import org.apache.tuscany.sdo.impl.FactoryBase;
+
+import org.apache.tuscany.sdo.model.ModelFactory;
+
+import org.apache.tuscany.sdo.model.internal.*;
+import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
 
 /**
  * <!-- begin-user-doc -->
@@ -68,9 +74,10 @@
    * <!-- end-user-doc -->
    * @generated
    */
-  public static final String PATTERN_VERSION = "1.1";
+  public static final String PATTERN_VERSION = "1.2";
   
-  public static final int BASE64_BYTES = 1;
+  public static final int BASE64_BYTES = 1;	
+  public static final int QNAME = 2;
   
   /**
    * Creates an instance of the factory.
@@ -123,6 +130,8 @@
     {
       case BASE64_BYTES:
         return createBase64BytesFromString(initialValue);
+      case QNAME:
+        return createQNameFromString(initialValue);
       default:
         throw new IllegalArgumentException("The type number '" + typeNumber + "' is not a valid datatype");
     }
@@ -139,6 +148,8 @@
     {
       case BASE64_BYTES:
         return convertBase64BytesToString(instanceValue);
+      case QNAME:
+        return convertQNameToString(instanceValue);
       default:
         throw new IllegalArgumentException("The type number '" + typeNumber + "' is not a valid datatype");
     }
@@ -151,6 +162,13 @@
   {
     return base64BytesType;
   }
+    
+  protected Type qNameType = null;
+
+  public Type getQName()
+  {
+    return qNameType;
+  }
   
 
   private static boolean isInited = false;
@@ -161,10 +179,10 @@
     InternalFactoryImpl theInternalFactoryImpl = new InternalFactoryImpl();
     isInited = true;
 
-    // Initialize simple dependencies
+    //  Initialize simple dependencies
     //SDOUtil.registerStaticTypes(SDOFactory.class);
     //SDOUtil.registerStaticTypes(ModelFactory.class);
-
+    
     // Create package meta-data objects
     theInternalFactoryImpl.createMetaData();
 
@@ -186,6 +204,7 @@
 
     // Create data types
     base64BytesType = createType(true, BASE64_BYTES );
+    qNameType = createType(true, QNAME );
   }
   
   private boolean isInitialized = false;
@@ -203,6 +222,9 @@
     initializeType(base64BytesType, byte[].class, "Base64Bytes", true, false);
     setInstanceProperty (base64BytesType, "commonj.sdo/java", "instanceClass", "byte[]");
 
+    initializeType(qNameType, String.class, "QName", true, false);
+    setInstanceProperty (qNameType, "commonj.sdo/java", "instanceClass", "java.lang.String");
+
     createXSDMetaData();
   }
     
@@ -220,6 +242,13 @@
        "name", "Base64Bytes"
        });
 
+    addXSDMapping
+      (qNameType,
+       new String[] 
+       {
+       "name", "QName"
+       });
+
   }
     
   /**
@@ -229,7 +258,7 @@
    */
   public byte[] createBase64BytesFromString(String initialValue)
   {
-    return XMLTypeFactory.eINSTANCE.createBase64Binary(initialValue);
+      return XMLTypeFactory.eINSTANCE.createBase64Binary(initialValue);
   }
 
   /**
@@ -239,11 +268,31 @@
    */
   public String convertBase64BytesToString(Object instanceValue)
   {
-    if (instanceValue instanceof byte[]) {
-      return XMLTypeFactory.eINSTANCE.convertBase64Binary((byte[])instanceValue);
-    } else {
-      return XMLTypeFactory.eINSTANCE.convertBase64Binary(instanceValue.toString().getBytes());
-    }
+      if (instanceValue instanceof byte[]) {
+          return XMLTypeFactory.eINSTANCE.convertBase64Binary((byte[])instanceValue);
+        } else {
+          return XMLTypeFactory.eINSTANCE.convertBase64Binary(instanceValue.toString().getBytes());
+      }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String createQNameFromString(String initialValue)
+  {
+    return (String)super.createFromString(QNAME, initialValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String convertQNameToString(Object instanceValue)
+  {
+    return super.convertToString(QNAME, instanceValue);
   }
 
 } //InternalFactoryImpl

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java?view=diff&rev=544858&r1=544857&r2=544858
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java Wed Jun  6 07:46:14 2007
@@ -50,6 +50,7 @@
 import org.apache.tuscany.sdo.util.StAX2SAXAdapter;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EDataType;
 import org.eclipse.emf.ecore.EFactory;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
@@ -167,6 +168,78 @@
             if (nameSpaceContext == null)
                 nameSpaceContext = new NameSpaceContext();
             return nameSpaceContext;
+        }
+        
+        private String xsdQName2SDOURI(String xsdQName) {
+            org.eclipse.emf.ecore.xml.type.internal.QName qname = new org.eclipse.emf.ecore.xml.type.internal.QName(xsdQName);
+            updateQNameURI(qname);
+            return qname.getNamespaceURI() + "#" + qname.getLocalPart();
+        }
+        
+        private String SDOURI2XsdQName(String sdoURI) {
+            String namespace = null;
+            String localPart = sdoURI;
+            
+            int index = sdoURI.indexOf('#');
+            if (index == -1) {
+                return localPart;
+            }
+            else {
+                namespace = sdoURI.substring(0, index);
+                localPart = sdoURI.substring(index+1);
+                
+                EPackage ePackage = extendedMetaData.getPackage(namespace);
+                if (ePackage == null)
+                {
+                  ePackage = extendedMetaData.demandPackage(namespace);
+                }
+
+                String prefix = getPrefix(ePackage, true);
+                if (!packages.containsKey(ePackage))
+                {
+                  packages.put(ePackage, prefix);
+                }
+                
+                return prefix + ":" + localPart;
+            }
+        }
+        
+        protected Object createFromString(EFactory eFactory, EDataType eDataType, String value) {
+            Object obj = super.createFromString(eFactory, eDataType, value);
+            if (eDataType.getName().equals("QName")) {
+                if (extendedMetaData != null) {
+                    if (obj instanceof List) {
+                        List list = (List)obj;
+                        for (int i=0; i<list.size(); i++) {
+                            String xsdQName = (String)list.get(i);
+                            list.set(i, xsdQName2SDOURI(xsdQName));
+                        }
+                    }
+                    else {
+                        obj = xsdQName2SDOURI((String)obj);
+                    }
+                }
+            }
+            return obj;
+        }
+        
+        public String convertToString(EFactory factory, EDataType dataType, Object value) {
+            if (dataType.getName().equals("QName")) {
+                if (extendedMetaData != null) {
+                    if (value instanceof List) {
+                        List list = (List)value;
+                        for (int i=0; i<list.size(); i++) {
+                            String sdoURI = (String)list.get(i);
+                            list.set(i, SDOURI2XsdQName(sdoURI));
+                        }
+                    }
+                    else {
+                        value = SDOURI2XsdQName((String)value);
+                    }
+                }
+            }
+            
+            return super.convertToString(factory, dataType, value);
         }
     }
 

Modified: incubator/tuscany/java/sdo/impl/src/main/resources/xml/sdoInternal.xsd
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/resources/xml/sdoInternal.xsd?view=diff&rev=544858&r1=544857&r2=544858
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/resources/xml/sdoInternal.xsd (original)
+++ incubator/tuscany/java/sdo/impl/src/main/resources/xml/sdoInternal.xsd Wed Jun  6 07:46:14 2007
@@ -26,4 +26,8 @@
     <xsd:restriction base="xsd:base64Binary"/>
   </xsd:simpleType>
  
+  <xsd:simpleType name="QName" sdoJava:instanceClass="java.lang.String">
+    <xsd:restriction base="xsd:QName"/>
+  </xsd:simpleType>
+
 </xsd:schema>

Modified: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java?view=diff&rev=544858&r1=544857&r2=544858
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java (original)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/AllTests.java Wed Jun  6 07:46:14 2007
@@ -60,6 +60,7 @@
         suite.addTestSuite(XMLStreamHelperTestCase.class);
         suite.addTestSuite(XPathTestCase.class);
         suite.addTestSuite(XSDHelperTestCase.class);
+        suite.addTestSuite(XSDQNameTestCase.class);
 
         return suite;
     }

Added: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/XSDQNameTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/XSDQNameTestCase.java?view=auto&rev=544858
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/XSDQNameTestCase.java (added)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/XSDQNameTestCase.java Wed Jun  6 07:46:14 2007
@@ -0,0 +1,123 @@
+/**
+ *
+ *  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.sdo.test;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import commonj.sdo.DataObject;
+import commonj.sdo.Type;
+import commonj.sdo.helper.HelperContext;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XMLDocument;
+import org.apache.tuscany.sdo.api.SDOUtil;
+
+public class XSDQNameTestCase extends TestCase {
+    private final String xsdString =
+        "<xsd:schema targetNamespace=\"http://www.example.com/simple\" " +
+        "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " + 
+        "xmlns:simple=\"http://www.example.com/simple\"> " +   
+            "<xsd:element name=\"stockQuote\" type=\"simple:Quote\"/> " +
+            "<xsd:complexType name=\"Quote\"> " +
+                "<xsd:sequence> " +
+                    "<xsd:element name=\"symbol\" type=\"xsd:string\"/> " +
+                    "<xsd:element name=\"policy\" type=\"xsd:QName\"/> " +
+                "</xsd:sequence> " +
+            "</xsd:complexType> " +
+        "</xsd:schema>";
+  
+    private final String xmlString =
+        "<?xml version=\"1.0\" encoding=\"ASCII\"?> " +
+        "<simple:stockQuote xmlns:simple=\"http://www.example.com/simple\"> " +
+            "<symbol>fbnt</symbol> " +
+            "<policy>simple:stockQuote</policy> " +
+        "</simple:stockQuote>";
+    
+    private final String TEST_NAMESPACE = "http://www.example.com/simple";
+    
+    HelperContext hc;
+    TypeHelper th;
+
+    /**
+     * Based on Spec 2.1, section 9.4.1, the return value of DataObject.get() on XSD QName property
+     * should be http://www.example.com/simple#stockQuote
+     * TODO add this to the CTS
+     * 
+     * @throws IOException
+     */
+    public void testLoad() throws IOException {
+        XMLDocument doc = hc.getXMLHelper().load(xmlString);
+        DataObject root = doc.getRootObject();
+        assertEquals("http://www.example.com/simple#stockQuote", root.get("policy"));
+    }
+    
+    /**
+     * After serialization, the value of XSD QName property in XML should be <prefix>:stockQuote
+     */
+    public void testSave() throws IOException {
+        Type quoteType = th.getType(TEST_NAMESPACE, "Quote");
+        DataObject quote = hc.getDataFactory().create(quoteType);
+
+        quote.setString("symbol", "fbnt");
+        quote.set("policy", "http://www.example.com/simple#stockQuote");
+
+        String str = hc.getXMLHelper().save(quote, TEST_NAMESPACE, "stockQuote");
+        int start = str.indexOf("<policy>");
+        int end = str.indexOf("</policy>");
+        assertTrue(start != -1 && end != -1);
+        
+        String policyValue = str.substring(start + "<policy>".length(), end);
+        
+        Pattern pattern = Pattern.compile(".*:stockQuote");     // prefix can be anything
+        
+        Matcher matcher = pattern.matcher(policyValue);
+        assertTrue(matcher.find());
+    }
+    
+    /**
+     * Test the scenario that the xsd:QName property value contains non-existent namespace
+     */
+    public void testSave2() throws IOException {
+        Type quoteType = th.getType(TEST_NAMESPACE, "Quote");
+        DataObject quote = hc.getDataFactory().create(quoteType);
+
+        quote.setString("symbol", "fbnt");
+        quote.set("policy", "http://www.example.com/simple2#stockQuote");
+
+        String str = hc.getXMLHelper().save(quote, TEST_NAMESPACE, "stockQuote");
+        
+        // Make sure the non-existent namespace was serialized
+        Pattern pattern = Pattern.compile(".*xmlns:.*=\"http://www.example.com/simple2\"");
+        Matcher matcher = pattern.matcher(str);
+        assertTrue(matcher.find());
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        
+        hc = SDOUtil.createHelperContext();
+        th = hc.getTypeHelper();
+        
+        hc.getXSDHelper().define(xsdString);
+    }
+}

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/XSDQNameTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/XSDQNameTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org