You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by fr...@apache.org on 2007/03/07 21:19:20 UTC

svn commit: r515733 - in /incubator/tuscany/java/sdo: ./ impl/src/main/java/org/apache/tuscany/sdo/ impl/src/main/java/org/apache/tuscany/sdo/helper/ impl/src/main/java/org/apache/tuscany/sdo/impl/ impl/src/main/java/org/apache/tuscany/sdo/util/ impl/s...

Author: frankb
Date: Wed Mar  7 12:19:18 2007
New Revision: 515733

URL: http://svn.apache.org/viewvc?view=rev&rev=515733
Log:
Fix for TUSCANY-1098

Added:
    incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/MetadataInstancePropertiesTestCase.java
    incubator/tuscany/java/sdo/impl/src/test/resources/TypePropertyMetadataInfo.xsd
Removed:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/overview.html
Modified:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.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/impl/ClassImpl.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ReferenceImpl.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/DataObjectUtil.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java
    incubator/tuscany/java/sdo/pom.xml

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java?view=diff&rev=515733&r1=515732&r2=515733
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java Wed Mar  7 12:19:18 2007
@@ -30,6 +30,7 @@
 import org.apache.tuscany.sdo.model.java.JavaFactory;
 import org.apache.tuscany.sdo.model.xml.XMLFactory;
 import org.apache.tuscany.sdo.util.SDOUtil;
+import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EClassifier;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.util.ExtendedMetaData;
@@ -37,7 +38,6 @@
 import commonj.sdo.DataObject;
 import commonj.sdo.Property;
 import commonj.sdo.Type;
-import commonj.sdo.helper.DataFactory;
 import commonj.sdo.helper.TypeHelper;
 
 
@@ -185,45 +185,23 @@
         Type propertyType = getDefinedType(modeledProperty.getType_());
         Property definedProperty = SDOUtil.createProperty(definedType, modeledProperty.getName(), propertyType);
         
-        SDOUtil.setMany(definedProperty, modeledProperty.isMany());
-        SDOUtil.setDefault(definedProperty, modeledProperty.getDefault_());
-        SDOUtil.setReadOnly(definedProperty, modeledProperty.isReadOnly());
-        
-        for (Iterator iter2 = modeledProperty.getAliasName().iterator(); iter2.hasNext(); )
-        {
-          String aliasName = (String)iter2.next();
-          SDOUtil.addAliasName(definedProperty, aliasName);
-        }
-        
-        if (!propertyType.isDataType())
+        initializeProperty(definedProperty, modeledProperty);
+      }
+
+      // define a global property to accompany the type definition
+      if (!SDOUtil.isDocumentRoot(definedType)) 
+      { 
+        String propertyName = definedType.getName();
+        if (!Character.isLowerCase(propertyName.charAt(0))) 
         {
-          SDOUtil.setContainment(definedProperty, modeledProperty.isContainment());
-          if (modeledProperty.getOpposite_() != null)
-          {
-            SDOUtil.setOpposite(definedProperty, getDefinedProperty(modeledProperty.getOpposite_()));
-          }
+          propertyName = propertyName.substring(0, 1).toLowerCase() + propertyName.substring(1);
         }
+        Property globalProperty = SDOUtil.createGlobalProperty(this, definedType.getURI(), propertyName, definedType);
+        SDOUtil.setContainment(globalProperty, true);
       }
     } // if (!isDataType)
     
-    
-    // define a global property to accompany the type definition
-    if (definedType.getName() != null) { // null type name => type is
-        // global property holder,
-        // so we don't need a global property for null named type
-        DataObject globalProperty = DataFactory.INSTANCE.create(
-                "commonj.sdo", "Property");
-        String propertyName = definedType.getName();
-        if (!Character.isLowerCase(propertyName.charAt(0))) {
-            char[] pca = propertyName.toCharArray();
-            pca[0] = Character.toLowerCase(pca[0]);
-            propertyName = new String(pca);
-        }
-        globalProperty.set("name", propertyName);
-        globalProperty.set("type", definedType);
-        globalProperty.set("containment", Boolean.TRUE);
-        defineOpenContentProperty(definedType.getURI(), globalProperty);
-    }
+    SDOUtil.addTypeInstanceProperties(definedType, (DataObject)modeledType);
 
     return definedType;
   }
@@ -276,6 +254,27 @@
     }
   }
   
+  protected void initializeProperty(Property newProperty, org.apache.tuscany.sdo.model.Property modeledProperty)
+  {
+    SDOUtil.setMany(newProperty, modeledProperty.isMany());
+    SDOUtil.setDefault(newProperty, modeledProperty.getDefault_());
+    SDOUtil.setReadOnly(newProperty, modeledProperty.isReadOnly());
+    for (Iterator iter = modeledProperty.getAliasName().iterator(); iter.hasNext();)
+    {
+      String aliasName = (String)iter.next();
+      SDOUtil.addAliasName(newProperty, aliasName);
+    }
+    if (!newProperty.getType().isDataType())
+    {
+      SDOUtil.setContainment(newProperty, modeledProperty.isContainment());
+      if (modeledProperty.getOpposite_() != null)
+      {
+        SDOUtil.setOpposite(newProperty, getDefinedProperty(modeledProperty.getOpposite_()));
+      }
+    }
+    SDOUtil.addPropertyInstanceProperties(newProperty, (DataObject)modeledProperty);
+  }
+  
   public static final String TUSCANY_NO_URI="http://tuscany-no-uri";
   
   public Property defineOpenContentProperty(String uri, DataObject property)
@@ -288,56 +287,19 @@
 
     if (uri == null) uri = TUSCANY_NO_URI;
 
-    // get/create document root
-    EPackage ePackage = extendedMetaData.getPackage(uri);
-    Type documentRoot = 
-      ePackage != null ? (Type)extendedMetaData.getType(ePackage, "") : null;
-    if (documentRoot == null) 
-    {
-      documentRoot = SDOUtil.createType(this, uri, null, false);
-    }
-
-    // Determine if property already exists
-    Property newProperty = documentRoot.getProperty(modeledProperty.getName());
-    if (newProperty == null)
-    {
-      //FB TBD ... is this code really supposed to be the same as in define()? If so, factor it out and reuse
-       
-      // Create the new property 'under' the document root.....
-      newProperty = SDOUtil.createProperty(documentRoot, modeledProperty.getName(), propertyType);
-
-      // Propagate the modeled property's attributes
-      SDOUtil.setMany(newProperty, modeledProperty.isMany());
-      SDOUtil.setDefault(newProperty, modeledProperty.getDefault_());
-      SDOUtil.setReadOnly(newProperty, modeledProperty.isReadOnly());
-      for (Iterator iter = modeledProperty.getAliasName().iterator(); iter.hasNext();)
-      {
-        String aliasName = (String)iter.next();
-        SDOUtil.addAliasName(newProperty, aliasName);
-      }
-      if (!propertyType.isDataType())
-      {
-        SDOUtil.setContainment(newProperty, modeledProperty.isContainment());
-        if (modeledProperty.getOpposite_() != null)
-        {
-          SDOUtil.setOpposite(newProperty, getDefinedProperty(modeledProperty.getOpposite_()));
-        }
-      }
-    }
-    else
-    {
-      // if property already exists, validate the expected type
-      if (!newProperty.getType().equals(propertyType))
-        throw new IllegalArgumentException();
-    }
+    Property newProperty = SDOUtil.createGlobalProperty(this, uri, modeledProperty.getName(), propertyType);
+   
+    // Propagate the modeled property's attributes
+    initializeProperty(newProperty, modeledProperty);
 
     return newProperty;
   }
 
   public Property getOpenContentProperty(String uri, String propertyName)
   {
-    //FB TBD ... in the future we will allow elements or attributes - see SDOUtil.createProperty()
-    return (Property)extendedMetaData.getElement(uri, propertyName);
+    //return (Property)extendedMetaData.getElement(uri, propertyName);
+    EClass documentRoot = (EClass)extendedMetaData.getType(uri, "");
+    return documentRoot != null ? (Property)documentRoot.getEStructuralFeature(propertyName) : null;
   }
 
 }

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=515733&r1=515732&r2=515733
==============================================================================
--- 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 Mar  7 12:19:18 2007
@@ -185,14 +185,12 @@
     throw new UnsupportedOperationException();
   }
 
-  public List getInstanceProperties()
-  {
-    throw new UnsupportedOperationException();
+  public List getInstanceProperties() {
+    return DataObjectUtil.getMetaObjectInstanceProperties(this);
   }
 
-  public Object get(Property property)
-  {
-    throw new UnsupportedOperationException();
+  public Object get(Property property) {
+    return DataObjectUtil.getMetaObjectInstanceProperty(this, property);
   }
 
   /////////////////////////////////////////////////////////////////////////////////////////////////////////

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ClassImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ClassImpl.java?view=diff&rev=515733&r1=515732&r2=515733
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ClassImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ClassImpl.java Wed Mar  7 12:19:18 2007
@@ -430,14 +430,12 @@
   
   protected Map propertyNameToPropertyMap;
   
-  public List getInstanceProperties()
-  {
-    throw new UnsupportedOperationException();
+  public List getInstanceProperties() {
+    return DataObjectUtil.getMetaObjectInstanceProperties(this);
   }
 
-  public Object get(Property property)
-  {
-    throw new UnsupportedOperationException();
+  public Object get(Property property) {
+    return DataObjectUtil.getMetaObjectInstanceProperty(this, property);
   }
   
   /////////////////////////////////////////////////////////////////////////////////////////////////////////

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java?view=diff&rev=515733&r1=515732&r2=515733
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/DataTypeImpl.java Wed Mar  7 12:19:18 2007
@@ -168,14 +168,12 @@
     return null;
   }
   
-  public List getInstanceProperties()
-  {
-    throw new UnsupportedOperationException();
+  public List getInstanceProperties() {
+    return DataObjectUtil.getMetaObjectInstanceProperties(this);
   }
 
-  public Object get(Property property)
-  {
-    throw new UnsupportedOperationException();
+  public Object get(Property property) {
+    return DataObjectUtil.getMetaObjectInstanceProperty(this, property);
   }
   
   /////////////////////////////////////////////////////////////////////////////////////////////////////////

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ReferenceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ReferenceImpl.java?view=diff&rev=515733&r1=515732&r2=515733
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ReferenceImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/impl/ReferenceImpl.java Wed Mar  7 12:19:18 2007
@@ -151,14 +151,12 @@
     throw new UnsupportedOperationException();
   }
 
-  public List getInstanceProperties()
-  {
-    throw new UnsupportedOperationException();
+  public List getInstanceProperties() {
+    return DataObjectUtil.getMetaObjectInstanceProperties(this);
   }
 
-  public Object get(Property property)
-  {
-    throw new UnsupportedOperationException();
+  public Object get(Property property) {
+    return DataObjectUtil.getMetaObjectInstanceProperty(this, property);
   }
   
   /////////////////////////////////////////////////////////////////////////////////////////////////////////

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/DataObjectUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/DataObjectUtil.java?view=diff&rev=515733&r1=515732&r2=515733
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/DataObjectUtil.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/DataObjectUtil.java Wed Mar  7 12:19:18 2007
@@ -27,6 +27,7 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -37,18 +38,23 @@
 import org.apache.tuscany.sdo.SDOPackage;
 import org.apache.tuscany.sdo.impl.ClassImpl;
 import org.apache.tuscany.sdo.impl.DataGraphImpl;
+import org.apache.tuscany.sdo.model.ModelFactory;
+import org.apache.tuscany.sdo.model.impl.ModelFactoryImpl;
 import org.apache.tuscany.sdo.util.resource.SDOXMLResourceFactoryImpl;
 import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.common.util.UniqueEList;
+import org.eclipse.emf.ecore.EAnnotation;
 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.EModelElement;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
@@ -74,6 +80,7 @@
 import commonj.sdo.Type;
 import commonj.sdo.helper.DataHelper;
 import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.impl.HelperProvider;
 
 
 public final class DataObjectUtil
@@ -2583,6 +2590,9 @@
     //resource.getDefaultSaveOptions().put(XMLResource.OPTION_FORMATTED, Boolean.FALSE);
   }
 
+  /**
+   * @deprecated SDO runtime initialization is no longer required
+   */
   public static void initRuntime()
   {
     // NOOP since init is done during static initialization of this class. See above.
@@ -2702,5 +2712,92 @@
     return false;
   }
   */
+
+  /**
+   * Returns a unique list of meta object instance properties (stored in EAnnotations)
+   *  
+   * @param metaObject - A Type or Property instance
+   * @return A list of commonj.sdo.Property instances
+   */
+  public static List getMetaObjectInstanceProperties(EModelElement metaObject) 
+  {
+    // Use the default helper context for now
+    TypeHelper typeHelper = HelperProvider.getDefaultContext().getTypeHelper();
+      
+    List result = new UniqueEList();
+    List annotations = metaObject.getEAnnotations();
+    int size = annotations.size();
+    for (int i=0; i<size; i++) 
+    {
+      EAnnotation annotation = (EAnnotation)annotations.get(i);
+      String propertyURI = annotation.getSource();
+      
+      for (Iterator iter = annotation.getDetails().iterator(); iter.hasNext(); ) 
+      {
+        EStringToStringMapEntryImpl entry = (EStringToStringMapEntryImpl)iter.next();
+        String propertyName = entry.getTypedKey();
+        
+        Property globalProperty = getGlobalProperty(typeHelper, propertyURI, propertyName);
+        if (globalProperty != null)
+        {
+          result.add(globalProperty);
+        }
+      }
+    }
+    return result; 
+  }
   
+  /**
+   * Return the value of the specified mata object instance property (stored in EAnnotations)
+   * 
+   * @param metaObject - A Type or Property instance
+   * @param property - The instance property to retrieve
+   * @return The value of the instance property
+   */
+  public static Object getMetaObjectInstanceProperty(EModelElement metaObject, Property property)
+  {
+    String value = EcoreUtil.getAnnotation(metaObject, property.getContainingType().getURI(), property.getName());
+    //TODO if (property.isMany()) ... // create list of values from from string
+    return SDOUtil.createFromString(property.getType(), value);
+  }
+
+  protected static Property getGlobalProperty(TypeHelper typeHelper, String uri, String name)
+  {
+    Property property;
+    if (ExtendedMetaData.ANNOTATION_URI.equals(uri)) {
+      if ("minExclusive".equals(name) ||
+          "minInclusive".equals(name) ||
+          "maxExclusive".equals(name) ||
+          "maxInclusive".equals(name) ||
+          "totalDigits".equals(name) ||
+          "fractionDigits".equals(name) ||
+          "length".equals(name) ||
+          "minLength".equals(name) ||
+          "maxLength".equals(name) ||
+          "enumeration".equals(name) ||
+          "whiteSpace".equals(name) ||
+          "pattern".equals(name))
+      {
+        //TODO Use standard facet properties, once SDO defines them
+        //TODO property = getSDOFacetProperty(name);
+        //TEMP For now just expose a string property for the EMF (ExtendedMetaData) facets
+        property = SDOUtil.createGlobalProperty(typeHelper, uri, name, ((ModelFactoryImpl)ModelFactory.INSTANCE).getString());
+      }
+      else
+      {
+        //TODO Should we consider exposing more ExtendedMetaData?
+        property = null;
+      }
+    }
+    else
+    {
+      property = typeHelper.getOpenContentProperty(uri, name);
+      if (property == null)
+      {
+        property = SDOUtil.createGlobalProperty(typeHelper, uri, name, ((ModelFactoryImpl)ModelFactory.INSTANCE).getString());
+      }
+    }
+    return property;
+  }
+
 }

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java?view=diff&rev=515733&r1=515732&r2=515733
==============================================================================
--- 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 Wed Mar  7 12:19:18 2007
@@ -51,6 +51,7 @@
 import org.apache.tuscany.sdo.helper.XMLStreamHelper;
 import org.apache.tuscany.sdo.helper.XMLStreamHelperImpl;
 import org.apache.tuscany.sdo.helper.XSDHelperImpl;
+import org.apache.tuscany.sdo.impl.ClassImpl;
 import org.apache.tuscany.sdo.impl.DataGraphImpl;
 import org.apache.tuscany.sdo.impl.DynamicDataObjectImpl;
 import org.apache.tuscany.sdo.model.ModelFactory;
@@ -58,10 +59,13 @@
 import org.apache.tuscany.sdo.util.resource.SDOObjectInputStream;
 import org.apache.tuscany.sdo.util.resource.SDOObjectOutputStream;
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.UniqueEList;
+import org.eclipse.emf.ecore.EAnnotation;
 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.EModelElement;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EReference;
@@ -512,6 +516,18 @@
       return null;
   }
   
+  public static List getOpenContentProperties(DataObject dataObject)
+  {
+    List result = new UniqueEList();
+    ((ClassImpl)dataObject.getType()).addOpenProperties((EObject)dataObject, result);
+    return result;
+  }
+
+  public static boolean isDocumentRoot(Type type)
+  {
+    return "".equals(SDOExtendedMetaData.INSTANCE.getName((EClassifier)type));
+  }
+  
   public static Type createType(TypeHelper scope, String uri, String name, boolean isDataType)
   {
     ExtendedMetaData extendedMetaData = ((TypeHelperImpl)scope).getExtendedMetaData();
@@ -668,6 +684,34 @@
     return (Property)eStructuralFeature;
   }
   
+  public static Property createGlobalProperty(TypeHelper scope, String uri, String name, Type type)
+  {
+    ExtendedMetaData extendedMetaData = ((TypeHelperImpl)scope).getExtendedMetaData();
+
+    // get/create document root
+    EPackage ePackage = extendedMetaData.getPackage(uri);
+    Type documentRoot = ePackage != null ? (Type)extendedMetaData.getType(ePackage, "") : null;
+    if (documentRoot == null) 
+    {
+      documentRoot = SDOUtil.createType(scope, uri, null, false);
+    }
+
+    // Determine if property already exists
+    Property newProperty = documentRoot.getProperty(name);
+    if (newProperty == null)
+    {
+      // Create the new property 'under' the document root.....
+      newProperty = SDOUtil.createProperty(documentRoot, name, type);
+    }
+    else
+    {
+      // if property already exists, validate the expected type
+      if (!newProperty.getType().equals(type))
+        throw new IllegalArgumentException();
+    }
+    return newProperty;
+  }
+  
   public static void addAliasName(Property property, String aliasName)
   {
     throw new UnsupportedOperationException(); // TODO: implement this method properly
@@ -697,6 +741,37 @@
   public static void setOpposite(Property property, Property opposite)
   {
     ((EReference)property).setEOpposite((EReference)opposite);
+  }
+  
+  public static void addTypeInstanceProperties(Type definedType, DataObject modeledType)
+  {
+    addInstanceProperties((EModelElement)definedType, modeledType);
+  }
+
+  public static void addPropertyInstanceProperties(Property definedProperty, DataObject modeledProperty)
+  {
+    addInstanceProperties((EModelElement)definedProperty, modeledProperty);
+  }
+  
+  protected static void addInstanceProperties(EModelElement metaObject, DataObject dataObject)
+  {
+    List instanceProperties = getOpenContentProperties(dataObject);
+    for (Iterator iter = instanceProperties.iterator(); iter.hasNext(); )
+    {
+      Property property = (Property)iter.next();
+      String uri = property.getContainingType().getURI();
+      EAnnotation eAnnotation = metaObject.getEAnnotation(uri);
+      if (eAnnotation == null)
+      {
+        eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
+        eAnnotation.setSource(uri);
+        metaObject.getEAnnotations().add(eAnnotation);
+      }
+      Object value = dataObject.get(property);
+      //TODO if (property.isMany()) ... // convert list of values
+      String stringValue = SDOUtil.convertToString(property.getType(), value);
+      eAnnotation.getDetails().put(property.getName(), stringValue);
+    }
   }
   
   /**

Added: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/MetadataInstancePropertiesTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/MetadataInstancePropertiesTestCase.java?view=auto&rev=515733
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/MetadataInstancePropertiesTestCase.java (added)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/MetadataInstancePropertiesTestCase.java Wed Mar  7 12:19:18 2007
@@ -0,0 +1,219 @@
+/**
+ *
+ *  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.InputStream;
+import java.net.URL;
+import java.util.List;
+
+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.HelperContext;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XSDHelper;
+
+
+public class MetadataInstancePropertiesTestCase extends TestCase
+{
+  private final String TEST_MODEL = "/TypePropertyMetadataInfo.xsd";
+  private final String TEST_NAMESPACE = "http://www.example.com/metadata/retrievaltest";
+  private final String DYNAMIC_TEST_NAMESPACE = "http://www.example.com/metadata/dynamicmetadata";
+
+  private TypeHelper typeHelper;
+  private XSDHelper xsdHelper;
+  private DataFactory dataFactory;
+
+  public void testXSDTypeProperties()
+  {
+    // Note: We won't check the actual value of XSD instance properties yet since they're not defined 
+    // in the SDO spec yet.
+
+    //displayInstanceProperties(TEST_NAMESPACE);
+
+    Type type = typeHelper.getType(TEST_NAMESPACE, "Example");
+    assertTrue(getInstanceProperty(type, "appinfo") != null); 
+    assertTrue(getInstanceProperty(type, "foo") == null);
+
+    Property property = type.getProperty("number");
+    assertTrue(getInstanceProperty(property, "appinfo") != null);
+    assertTrue(getInstanceProperty(property, "foo") == null);
+
+    property = type.getProperty("Exampletype");
+    assertTrue(getInstanceProperty(property, "appinfo") != null);
+    assertTrue(getInstanceProperty(property, "foo") == null);
+
+    type = typeHelper.getType(TEST_NAMESPACE, "ExampleNumber");
+    assertTrue(getInstanceProperty(type, "appinfo") != null);
+    assertTrue(getInstanceProperty(type, "minInclusive") != null);
+    assertTrue(getInstanceProperty(type, "maxInclusive") != null);
+    assertTrue(getInstanceProperty(type, "foo") == null);
+
+    type = typeHelper.getType(TEST_NAMESPACE, "ExampleRating");
+    assertTrue(getInstanceProperty(type, "enumeration") != null);
+    assertTrue(getInstanceProperty(type, "foo") == null);
+
+    type = typeHelper.getType(TEST_NAMESPACE, "PhoneNumber");
+    assertTrue(getInstanceProperty(type, "appinfo") != null);
+    assertTrue(getInstanceProperty(type, "length") != null);
+    assertTrue(getInstanceProperty(type, "pattern") != null);
+    assertTrue(getInstanceProperty(type, "foo") == null);
+  }
+
+  public void testDynamicTypeProperties()
+  {
+    // Create dynamic model
+    Type intType = typeHelper.getType("commonj.sdo", "Int");
+    Type stringType = typeHelper.getType("commonj.sdo", "String");
+    
+    Property openContentProperty = typeHelper.getOpenContentProperty("commonj.sdo/xml", "xmlElement");
+    
+    // create a new Type for Customers
+    DataObject customerType = dataFactory.create("commonj.sdo", "Type");
+    customerType.set("uri", DYNAMIC_TEST_NAMESPACE);
+    customerType.set("name", "Customer");
+    customerType.set(openContentProperty, Boolean.TRUE);
+
+    // 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);
+    firstNameProperty.set(openContentProperty, Boolean.FALSE);
+
+    // 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
+    typeHelper.define(customerType);
+
+    //displayInstanceProperties(DYNAMIC_TEST_NAMESPACE);
+    
+    Type type = typeHelper.getType(DYNAMIC_TEST_NAMESPACE, "Customer");
+    assertTrue(getInstanceProperty(type, "xmlElement") == openContentProperty);
+    assertTrue(type.get(openContentProperty) == Boolean.TRUE);
+    assertTrue(getInstanceProperty(type, "foo") == null);
+
+    Property property = type.getProperty("custNum");
+    assertTrue(getInstanceProperty(property, "xmlElement") == null);
+    assertTrue(getInstanceProperty(property, "foo") == null);
+   
+    property = type.getProperty("firstName");
+    assertTrue(getInstanceProperty(property, "xmlElement") == openContentProperty);
+    assertTrue(property.get(openContentProperty) == Boolean.FALSE);
+    assertTrue(getInstanceProperty(property, "foo") == null);
+   
+    property = type.getProperty("lastName");
+    assertTrue(getInstanceProperty(property, "xmlElement") == null);
+    assertTrue(getInstanceProperty(property, "foo") == null);
+  }
+  
+  public void setUp() throws Exception
+  {
+    super.setUp();
+
+    HelperContext helperContext = SDOUtil.createHelperContext();
+    
+    typeHelper = helperContext.getTypeHelper();
+    xsdHelper = helperContext.getXSDHelper();
+    dataFactory = helperContext.getDataFactory();
+
+    URL url = getClass().getResource(TEST_MODEL);
+    InputStream inputStream = url.openStream();
+
+    xsdHelper.define(inputStream, url.toString());
+    inputStream.close();
+  }
+
+  public Property getInstanceProperty(Type type, String propertyName)
+  {
+    return getInstanceProperty(type.getInstanceProperties(), propertyName);
+  }
+
+  public Property getInstanceProperty(Property property, String propertyName)
+  {
+    return getInstanceProperty(property.getInstanceProperties(), propertyName);
+  }
+
+  private Property getInstanceProperty(List instProps, String propertyName)
+  {
+    for (int i = 0; i < instProps.size(); i++)
+    {
+      Property prop = (Property)instProps.get(i);
+      if (propertyName.equals(prop.getName()))
+        return prop;
+    }
+    return null;
+  }
+
+  private void displayInstanceProperties(Type type)
+  {
+    System.out.println("Type's name: " + type.getName());
+    List instProps = type.getInstanceProperties();
+    for (int i = 0; i < instProps.size(); i++)
+    {
+      Property prop = (Property)instProps.get(i);
+      System.out.println("\tType's instance property name: " + prop.getName());
+      System.out.println("\tType's instance property value: \"" + type.get(prop) + "\"");
+    }
+  }
+
+  private void displayInstanceProperties(Property prop)
+  {
+    System.out.println("\tProperty's name: " + prop.getName());
+    List propsInstProps = prop.getInstanceProperties();
+    for (int j = 0; j < propsInstProps.size(); j++)
+    {
+      Property propsInstProp = (Property)propsInstProps.get(j);
+      System.out.println("\t\tProperty's instance property name: " + propsInstProp.getName());
+      System.out.println("\t\tProperty's instance property value: \"" + prop.get(propsInstProp) + "\"");
+    }
+  }
+
+  public void displayInstanceProperties(String namespace)
+  {
+    List types = SDOUtil.getTypes(typeHelper, namespace);
+    for (int i = 0; i < types.size(); i++)
+    {
+      Type type = (Type)types.get(i);
+      displayInstanceProperties(type);
+      List properties = type.getProperties();
+      for (int j = 0; j < properties.size(); j++)
+      {
+        Property property = (Property)properties.get(j);
+        displayInstanceProperties(property);
+      }
+      System.out.println("**************************************");
+    }
+  }
+
+}

Added: incubator/tuscany/java/sdo/impl/src/test/resources/TypePropertyMetadataInfo.xsd
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/resources/TypePropertyMetadataInfo.xsd?view=auto&rev=515733
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/resources/TypePropertyMetadataInfo.xsd (added)
+++ incubator/tuscany/java/sdo/impl/src/test/resources/TypePropertyMetadataInfo.xsd Wed Mar  7 12:19:18 2007
@@ -0,0 +1,96 @@
+<?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.    
+ -->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+	targetNamespace="http://www.example.com/metadata/retrievaltest"
+	xmlns:metadata="http://www.example.com/metadata/retrievaltest">
+
+<annotation>
+	<appinfo source="http://www.example.com/metadata/annotation">
+		<p1:annotationSet xmlns:p1="http://www.example.com/metadata/annotation" name="test"/>
+	</appinfo>
+</annotation>
+
+<complexType name="Example">
+	<annotation>
+		<appinfo source="http://www.example.com/metadata/annotation">
+			<p1:example xmlns:p1="http://www.example.com/metadata/annotation">
+				<p1:picture>forest.jpg</p1:picture>
+			</p1:example>
+		</appinfo>
+	</annotation>
+
+	<sequence>
+		<element name="number" type="integer" minOccurs="0" maxOccurs="1">
+			<annotation>
+				<appinfo source="http://www.example.com/metadata/annotation">
+					<p1:AttributeTypeMetadata xmlns:p1="http://www.example.com/metadata/annotation">
+						<p1:getter>getNumber</p1:getter>
+						<p1:setter>setNumber</p1:setter>
+					</p1:AttributeTypeMetadata>
+				</appinfo>
+			</annotation>
+		</element>
+
+		<element name="Exampletype" type="string">
+			<annotation>
+				<appinfo source="http://www.example.com/metadata/annotation">
+					<p1:AttributeTypeMetadata xmlns:p1="http://www.example.com/metadata/annotation">
+						<p1:getter>getPhonetype</p1:getter>
+						<p1:setter>setPhonetype</p1:setter>
+					</p1:AttributeTypeMetadata>
+				</appinfo>
+			</annotation>
+		</element>
+	</sequence>
+</complexType>
+
+<simpleType name="ExampleNumber">
+	<annotation>
+		<appinfo source="http://www.example.com/metadata/annotation">
+			This is the metadata for defining the ExampleNumber type.
+		</appinfo>
+	</annotation>
+	<restriction base="integer">
+		<minInclusive value="1"/>
+		<maxInclusive value="29035"/>
+	</restriction>
+</simpleType>
+
+<simpleType name="PhoneNumber">
+	<annotation>
+		<appinfo source="http://www.example.com/metadata/annotation">
+			This is the metadata for defining the PhoneNumber type.
+		</appinfo>
+	</annotation>
+	<restriction base="string">
+		<length value="8"/>
+		<pattern value="\d{3}-\d{4}"/>
+	</restriction>
+</simpleType>
+
+<simpleType name="ExampleRating">
+	<restriction base="string">
+		<enumeration value=""/>
+		<enumeration value="Good"/>
+        <enumeration value="Bad"/>
+	</restriction>
+</simpleType>
+   
+</schema>
\ No newline at end of file

Modified: incubator/tuscany/java/sdo/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/pom.xml?view=diff&rev=515733&r1=515732&r2=515733
==============================================================================
--- incubator/tuscany/java/sdo/pom.xml (original)
+++ incubator/tuscany/java/sdo/pom.xml Wed Mar  7 12:19:18 2007
@@ -94,6 +94,7 @@
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <version>2.3</version>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
                     <includes>



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