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