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>
 
 <!--


Reply via email to