Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java?rev=394728&r1=394727&r2=394728&view=diff ============================================================================== --- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java (original) +++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java Mon Apr 17 10:02:02 2006 @@ -20,7 +20,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; -import java.net.URL; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -33,11 +33,19 @@ import org.apache.tuscany.sdo.helper.XMLHelperImpl; import org.apache.tuscany.sdo.helper.XSDHelperImpl; import org.apache.tuscany.sdo.impl.DataGraphImpl; -import org.apache.tuscany.sdo.model.ModelFactory; +import org.apache.tuscany.sdo.impl.DynamicDataObjectImpl; import org.apache.tuscany.sdo.model.impl.ModelPackageImpl; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.ETypedElement; +import org.eclipse.emf.ecore.EcoreFactory; +import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; @@ -46,6 +54,7 @@ import org.eclipse.emf.ecore.xml.type.XMLTypePackage; import commonj.sdo.DataGraph; +import commonj.sdo.Property; import commonj.sdo.Type; import commonj.sdo.helper.DataFactory; import commonj.sdo.helper.TypeHelper; @@ -225,7 +234,7 @@ { return new XMLHelperImpl(scope); } - + /** * Create a new XSDHelper, with visibility to types in the specified TypeHelper scope. * @param scope the TypeHelper to use for locating and populating types. @@ -234,6 +243,131 @@ public static XSDHelper createXSDHelper(TypeHelper scope) { return new XSDHelperImpl(scope); + } + + public static Type createType(TypeHelper scope, String uri, String name, boolean isDataType) + { + ExtendedMetaData extendedMetaData = ((TypeHelperImpl)scope).getExtendedMetaData(); + + EPackage ePackage = extendedMetaData.getPackage(uri); + if (ePackage == null) + { + ePackage = EcoreFactory.eINSTANCE.createEPackage(); + ePackage.setEFactoryInstance(new DynamicDataObjectImpl.FactoryImpl()); + ePackage.setNsURI(uri); + String packagePrefix = URI.createURI(uri).trimFileExtension().lastSegment(); + ePackage.setName(packagePrefix); + ePackage.setNsPrefix(packagePrefix); + extendedMetaData.putPackage(uri, ePackage); + } + + EClassifier eClassifier = ePackage.getEClassifier(name); + if (eClassifier != null) + throw new IllegalArgumentException(); // already defined + + if (name != null) + { + eClassifier = isDataType ? (EClassifier)SDOFactory.eINSTANCE.createDataType() : (EClassifier)SDOFactory.eINSTANCE.createClass(); + eClassifier.setName(name); + } + else + { + eClassifier = DataObjectUtil.createDocumentRoot(); + } + + ePackage.getEClassifiers().add(eClassifier); + + return (Type)eClassifier; + } + + public static void addBaseType(Type type, Type baseType) + { + ((EClass)type).getESuperTypes().add(baseType); + } + + public static void addAliasName(Type type, String aliasName) + { + //TODO + } + + public static void setOpen(Type type, boolean isOpen) + { + if (type.isDataType() || !type.getProperties().isEmpty()) + { + if (type.getName() != null) //FB TEMP ... figure out how to handle document root + throw new IllegalArgumentException(); // type must a non dataType with no properties yet + } + if (isOpen) + { + EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute(); + ((EClass)type).getEStructuralFeatures().add(eAttribute); + + eAttribute.setName("any"); + eAttribute.setUnique(false); + eAttribute.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY); + eAttribute.setEType(EcorePackage.eINSTANCE.getEFeatureMapEntry()); + ExtendedMetaData.INSTANCE.setFeatureKind(eAttribute, ExtendedMetaData.ELEMENT_WILDCARD_FEATURE); + ExtendedMetaData.INSTANCE.setProcessingKind(eAttribute, ExtendedMetaData.LAX_PROCESSING); + ExtendedMetaData.INSTANCE.setWildcards(eAttribute, Collections.singletonList("##any")); + } + } + + public static void setSequenced(Type type, boolean isSequenced) + { + //TODO + } + + public static void setAbstract(Type type, boolean isAbstract) + { + ((EClass)type).setAbstract(isAbstract); + } + + public static void setJavaClassName(Type type, String javaClassName) + { + ((EClassifier)type).setInstanceClassName(javaClassName); + } + + public static Property createProperty(Type containingType, String name, Type propertyType) + { + EStructuralFeature eStructuralFeature = propertyType.isDataType() ? (EStructuralFeature)SDOFactory.eINSTANCE.createAttribute() : (EStructuralFeature)SDOFactory.eINSTANCE.createReference(); + eStructuralFeature.setName(name); + eStructuralFeature.setEType((EClassifier)propertyType); + if (containingType.getName() == null) + { + ExtendedMetaData.INSTANCE.setFeatureKind(eStructuralFeature, ExtendedMetaData.ELEMENT_FEATURE); + } + ((EClass)containingType).getEStructuralFeatures().add(eStructuralFeature); + return (Property)eStructuralFeature; + } + + public static void addAliasName(Property property, String aliasName) + { + //TODO + } + + public static void setMany(Property property, boolean isMany) + { + ((EStructuralFeature)property).setUpperBound(isMany ? EStructuralFeature.UNBOUNDED_MULTIPLICITY : 1); + } + + public static void setContainment(Property property, boolean isContainment) + { + ((EReference)property).setContainment(isContainment); + } + + public static void setDefault(Property property, String defaultValue) + { + ((EStructuralFeature)property).setDefaultValueLiteral(defaultValue); + } + + public static void setReadOnly(Property property, boolean isReadOnly) + { + ((EStructuralFeature)property).setChangeable(!isReadOnly); + } + + public static void setOpposite(Property property, Property opposite) + { + ((EReference)property).setEOpposite((EReference)opposite); } /**
Added: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java?rev=394728&view=auto ============================================================================== --- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java (added) +++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java Mon Apr 17 10:02:02 2006 @@ -0,0 +1,284 @@ +package org.apache.tuscany.sdo.test; + +import java.math.BigDecimal; + +import junit.framework.TestCase; + +import org.apache.tuscany.sdo.util.SDOUtil; + +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Type; +import commonj.sdo.helper.DataFactory; +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.helper.XSDHelper; + +public class DefineTypeTestCase extends TestCase +{ + public void testDefineType() throws Exception + { + TypeHelper types = SDOUtil.createTypeHelper(); + DataFactory factory = SDOUtil.createDataFactory(types); + + Type intType = types.getType("commonj.sdo", "Int"); + Type stringType = types.getType("commonj.sdo", "String"); + + // create a new Type for Customers + DataObject customerType = factory.create("commonj.sdo", + "Type"); + customerType.set("uri", "http://example.com/customer"); + customerType.set("name", "Customer"); + + // create a customer number property + DataObject custNumProperty = customerType.createDataObject("property"); + custNumProperty.set("name", "custNum"); + custNumProperty.set("type", intType); + + // create a first name property + DataObject firstNameProperty = + customerType.createDataObject("property"); + firstNameProperty.set("name", "firstName"); + firstNameProperty.set("type", stringType); + + // create a last name property + DataObject lastNameProperty = customerType.createDataObject("property"); + lastNameProperty.set("name", "lastName"); + lastNameProperty.set("type", stringType); + + // now define the Customer type so that customers can be made + types.define(customerType); + + DataObject customer1 = factory.create("http://example.com/customer", + "Customer"); + customer1.setInt("custNum", 1); + customer1.set("firstName", "John"); + customer1.set("lastName", "Adams"); + DataObject customer2 = factory.create("http://example.com/customer", + "Customer"); + customer2.setInt("custNum", 2); + customer2.set("firstName", "Jeremy"); + customer2.set("lastName", "Pavick"); + + assertNotNull(customer1); + Type type = customer1.getType(); + assertNotNull(type.getProperty("custNum")); + assertNotNull(type.getProperty("firstName")); + assertNotNull(type.getProperty("lastName")); + assertEquals(type.getProperty("custNum").getType(), intType); + assertEquals(type.getProperty("firstName").getType(), stringType); + assertEquals(type.getProperty("lastName").getType(), stringType); + + assertNotNull(customer2); + type = customer2.getType(); + assertNotNull(type.getProperty("custNum")); + assertNotNull(type.getProperty("firstName")); + assertNotNull(type.getProperty("lastName")); + assertEquals(type.getProperty("custNum").getType(), intType); + assertEquals(type.getProperty("firstName").getType(), stringType); + assertEquals(type.getProperty("lastName").getType(), stringType); + } + + public void testDefineDataType() throws Exception + { + TypeHelper types = SDOUtil.createTypeHelper(); + DataFactory factory = SDOUtil.createDataFactory(types); + XSDHelper xsdHelper = SDOUtil.createXSDHelper(types); + Property javaClassProperty = xsdHelper.getGlobalProperty("commonj.sdo/java", "javaClass", false); + + // create a data types + DataObject intType = factory.create("commonj.sdo", "Type"); + intType.set("uri", "http://example.com/customer"); + intType.set("name", "MyIntType"); + intType.setBoolean("dataType", true); + intType.set(javaClassProperty, "int"); + + DataObject stringType = factory.create("commonj.sdo", "Type"); + stringType.set("uri", "http://example.com/customer"); + stringType.set("name", "MyStringType"); + stringType.setBoolean("dataType", true); + stringType.set(javaClassProperty, "java.lang.String"); + + // create a new Type for Customers + DataObject customerType = factory.create("commonj.sdo", + "Type"); + customerType.set("uri", "http://example.com/customer"); + customerType.set("name", "Customer"); + + // create a customer number property + DataObject custNumProperty = customerType.createDataObject("property"); + custNumProperty.set("name", "custNum"); + custNumProperty.set("type", intType); + + // create a first name property + DataObject firstNameProperty = + customerType.createDataObject("property"); + firstNameProperty.set("name", "firstName"); + firstNameProperty.set("type", stringType); + + // create a last name property + DataObject lastNameProperty = customerType.createDataObject("property"); + lastNameProperty.set("name", "lastName"); + lastNameProperty.set("type", stringType); + + // now define the Customer type so that customers can be made + types.define(customerType); + + DataObject customer1 = factory.create("http://example.com/customer", + "Customer"); + customer1.setInt("custNum", 1); + customer1.set("firstName", "John"); + customer1.set("lastName", "Adams"); + DataObject customer2 = factory.create("http://example.com/customer", + "Customer"); + customer2.setInt("custNum", 2); + customer2.set("firstName", "Jeremy"); + customer2.set("lastName", "Pavick"); + + assertNotNull(customer1); + Type type = customer1.getType(); + assertNotNull(type.getProperty("custNum")); + assertNotNull(type.getProperty("firstName")); + assertNotNull(type.getProperty("lastName")); + assertNotNull(type.getProperty("custNum")); + assertNotNull(type.getProperty("firstName")); + assertNotNull(type.getProperty("lastName")); + + type = type.getProperty("custNum").getType(); + assertEquals(type.getURI(), "http://example.com/customer"); + assertEquals(type.getName(), "MyIntType"); + assertTrue(type.isDataType()); + + assertNotNull(customer2); + type = customer2.getType(); + assertNotNull(type.getProperty("custNum")); + assertNotNull(type.getProperty("firstName")); + assertNotNull(type.getProperty("lastName")); + assertNotNull(type.getProperty("custNum")); + assertNotNull(type.getProperty("firstName")); + assertNotNull(type.getProperty("lastName")); + } + + public void testFastDefineType() throws Exception + { + TypeHelper types = SDOUtil.createTypeHelper(); + DataFactory factory = SDOUtil.createDataFactory(types); + + Type intType = types.getType("commonj.sdo", "Int"); + Type stringType = types.getType("commonj.sdo", "String"); + + // create a new Type for Customers + Type customerType = SDOUtil.createType(types, "http://example.com/customer", "Customer", false); + + // create a customer number property + SDOUtil.createProperty(customerType, "custNum", intType); + + // create a first name property + SDOUtil.createProperty(customerType, "firstName", stringType); + + // create a last name property + SDOUtil.createProperty(customerType, "lastName", stringType); + + DataObject customer1 = factory.create("http://example.com/customer", + "Customer"); + customer1.setInt("custNum", 1); + customer1.set("firstName", "John"); + customer1.set("lastName", "Adams"); + DataObject customer2 = factory.create("http://example.com/customer", + "Customer"); + customer2.setInt("custNum", 2); + customer2.set("firstName", "Jeremy"); + customer2.set("lastName", "Pavick"); + + assertNotNull(customer1); + Type type = customer1.getType(); + assertNotNull(type.getProperty("custNum")); + assertNotNull(type.getProperty("firstName")); + assertNotNull(type.getProperty("lastName")); + assertEquals(type.getProperty("custNum").getType(), intType); + assertEquals(type.getProperty("firstName").getType(), stringType); + assertEquals(type.getProperty("lastName").getType(), stringType); + + assertNotNull(customer2); + type = customer2.getType(); + assertNotNull(type.getProperty("custNum")); + assertNotNull(type.getProperty("firstName")); + assertNotNull(type.getProperty("lastName")); + assertEquals(type.getProperty("custNum").getType(), intType); + assertEquals(type.getProperty("firstName").getType(), stringType); + assertEquals(type.getProperty("lastName").getType(), stringType); + } + + public void testDefineOpenType() throws Exception + { + TypeHelper types = SDOUtil.createTypeHelper(); + DataFactory factory = SDOUtil.createDataFactory(types); + + Type stringType = types.getType("commonj.sdo", "String"); + Type decimalType = types.getType("commonj.sdo", "Decimal"); + + // Define a new open type - OpenQuote + DataObject openQuoteType = factory.create("commonj.sdo", "Type"); + openQuoteType.set("uri", "http://www.example.com/open"); + openQuoteType.set("name", "OpenQuote"); + openQuoteType.set("open", Boolean.TRUE); + openQuoteType.setBoolean("open", true); + + // create property - "symbol" + DataObject symbolProperty = openQuoteType.createDataObject("property"); + symbolProperty.set("name", "symbol"); + symbolProperty.set("type", stringType); + + types.define(openQuoteType); + + // Define new type - CompanyType + DataObject companyType = factory.create("commonj.sdo", "Type"); + companyType.set("uri", "http://www.example.com/open"); + companyType.set("name", "CompanyType"); + + // Create CompanyType property - "name" + DataObject nameProperty = companyType.createDataObject("property"); + nameProperty.set("name", "name"); + nameProperty.set("type", stringType); + + types.define(companyType); + + // Define a global type + DataObject globalType = factory.create("commonj.sdo", "Type"); + globalType.set("uri", "http://www.example.com/open"); + // no need to specify the type's name + + // Define a global property - company + DataObject companyProperty = globalType.createDataObject("property"); + companyProperty.set("name", "company"); + companyProperty.set("type", companyType); + companyProperty.set("containment", Boolean.TRUE); + + // Define a global property - price + DataObject priceProperty = globalType.createDataObject("property"); + priceProperty.set("name", "price"); + priceProperty.set("type", decimalType); + + types.define(globalType); + + // Create DataObject instances + DataObject openQuote = factory.create("http://www.example.com/open", "OpenQuote"); + + assertTrue(openQuote.getType().isOpen()); + + openQuote.set("symbol", "s1"); + + // Get global type + Type definedGlobalType = types.getType("http://www.example.com/open", null); + + Property definedCompanyProperty = definedGlobalType.getProperty("company"); + + DataObject company = openQuote.createDataObject(definedCompanyProperty); + company.setString("name", "FlyByNightTechnology"); + + Property definedPriceProperty = definedGlobalType.getProperty("price"); + openQuote.setBigDecimal(definedPriceProperty, new BigDecimal("1000.0")); + + assertEquals(definedPriceProperty.getType(), decimalType); + } + +} Modified: incubator/tuscany/java/sdo/tools/src/main/java/org/apache/tuscany/sdo/generate/JavaGenerator.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sdo/tools/src/main/java/org/apache/tuscany/sdo/generate/JavaGenerator.java?rev=394728&r1=394727&r2=394728&view=diff ============================================================================== --- incubator/tuscany/java/sdo/tools/src/main/java/org/apache/tuscany/sdo/generate/JavaGenerator.java (original) +++ incubator/tuscany/java/sdo/tools/src/main/java/org/apache/tuscany/sdo/generate/JavaGenerator.java Mon Apr 17 10:02:02 2006 @@ -29,6 +29,7 @@ import org.apache.tuscany.sdo.helper.XSDHelperImpl; import org.apache.tuscany.sdo.impl.SDOPackageImpl; +import org.apache.tuscany.sdo.model.ModelPackage; import org.apache.tuscany.sdo.model.impl.ModelPackageImpl; import org.apache.tuscany.sdo.util.DataObjectUtil; import org.eclipse.emf.codegen.ecore.genmodel.GenClass; @@ -274,7 +275,7 @@ { genModel = currentGenPackage.getGenModel(); } - else + else if (!currentEPackage.getNsURI().equals(ModelPackage.eNS_URI)) { usedGenPackages.add(currentGenPackage); } Modified: incubator/tuscany/java/spec/sdo/src/main/resources/xml/sdoJava.xsd URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/spec/sdo/src/main/resources/xml/sdoJava.xsd?rev=394728&r1=394727&r2=394728&view=diff ============================================================================== --- incubator/tuscany/java/spec/sdo/src/main/resources/xml/sdoJava.xsd (original) +++ incubator/tuscany/java/spec/sdo/src/main/resources/xml/sdoJava.xsd Mon Apr 17 10:02:02 2006 @@ -39,8 +39,11 @@ the Java binding of SDO Types and Properties. --> +<!-- FIXME need this global attribute because as per spec Type's with JavaInfo.javaClass cannot be (de)serialized --> +<xsd:attribute name="javaClass" type="sdo:String"/> + <xsd:complexType name="JavaInfo"> - <xsd:attribute name="javaClass" type="sdo:String"/> + <xsd:attribute ref="sdoJava:javaClass"/> </xsd:complexType> <!--
