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/04/16 18:16:24 UTC

svn commit: r529307 - in /incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util: BasicSequence.java DataObjectUtil.java

Author: frankb
Date: Mon Apr 16 09:16:23 2007
New Revision: 529307

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

Modified:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/BasicSequence.java
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/DataObjectUtil.java

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/BasicSequence.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/BasicSequence.java?view=diff&rev=529307&r1=529306&r2=529307
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/BasicSequence.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/BasicSequence.java Mon Apr 16 09:16:23 2007
@@ -26,6 +26,7 @@
 
 import commonj.sdo.Property;
 import commonj.sdo.Sequence;
+import commonj.sdo.Type;
 
 /**
  *  SDO Sequance implementation which delegates to a feature map.
@@ -75,10 +76,26 @@
     return featureMap.setValue(index, value);
   }
 
+  /*
   protected EStructuralFeature getEStructuralFeature(String propertyName)
   {
     return featureMap.getEObject().eClass().getEStructuralFeature(propertyName);
   }
+  */
+
+  protected EStructuralFeature getEStructuralFeature(String propertyName, Object value)
+  {
+    EStructuralFeature result = featureMap.getEObject().eClass().getEStructuralFeature(propertyName);
+    if (result == null)
+    {
+      Type type = (Type)featureMap.getEObject().eClass();
+      if (type.isOpen())
+      {
+        result = (EStructuralFeature)DataObjectUtil.demandOpenProperty(type, propertyName, value, true);
+      }
+    }
+    return result;
+  }
 
   protected EStructuralFeature getEStructuralFeature(int propertyIndex)
   {
@@ -87,7 +104,7 @@
 
   public boolean add(String propertyName, Object value)
   {
-    return featureMap.add(getEStructuralFeature(propertyName), value);
+    return featureMap.add(getEStructuralFeature(propertyName, value), value);
   }
 
   public boolean add(int propertyIndex, Object value)
@@ -102,7 +119,7 @@
 
   public void add(int index, String propertyName, Object value)
   {
-    featureMap.add(index, getEStructuralFeature(propertyName), value);
+    featureMap.add(index, getEStructuralFeature(propertyName, value), value);
   }
 
   public void add(int index, int propertyIndex, Object value)

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=529307&r1=529306&r2=529307
==============================================================================
--- 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 Mon Apr 16 09:16:23 2007
@@ -40,7 +40,6 @@
 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.SDOURIConverterImpl;
 import org.apache.tuscany.sdo.util.resource.SDOXMLResourceFactoryImpl;
 import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.URI;
@@ -730,7 +729,7 @@
     else 
     {
       DataObjectUtil.Accessor.create(
-        (EObject)dataObject, path).setAndRecyle(value);
+        (EObject)dataObject, path, value).setAndRecyle(value);
     }
   }
   
@@ -1794,6 +1793,52 @@
     }
     return list;
   }
+  
+  protected static Property demandOpenProperty(Type type, String name, Object value, boolean isSequence)
+  {
+    TypeHelper typeHelper = TypeHelper.INSTANCE; //FB TODO: what TypeHelper to use?
+    
+    String uri = type.getURI() + "/" + type.getName(); // unique URI for open content properties on instances of the type
+    Property property = typeHelper.getOpenContentProperty(uri, name);
+    if (property != null)
+      return property;
+
+    boolean isMany = isSequence;
+    boolean isContainment = false;
+    Type propertyType;
+    
+    if (value instanceof DataObject)
+    {
+      DataObject dataObject = (DataObject)value;
+      propertyType = dataObject.getType();
+      isContainment = dataObject.getContainer() == null;
+    }
+    else if (value instanceof List && !((List)value).isEmpty())
+    {
+      Object listValue = ((List)value).get(0); //TODO: get common base class if all values are not the same type?
+      if (listValue instanceof DataObject)
+        propertyType = ((DataObject)listValue).getType();
+      else
+        propertyType = typeHelper.getType(listValue.getClass());
+      isMany = true;
+    }
+    else
+    {
+      propertyType = typeHelper.getType(value.getClass()); 
+    }
+    if (propertyType == null)
+    {
+      propertyType = ((ModelFactoryImpl)ModelFactory.INSTANCE).getObject();
+    }
+    
+    Property newProperty = SDOUtil.createGlobalProperty(TypeHelper.INSTANCE, uri, name, propertyType);
+    if (isMany)
+      SDOUtil.setMany(newProperty, isMany);
+    if (isContainment)
+      SDOUtil.setContainment(newProperty, isContainment);
+
+    return newProperty;
+  }
 
   /**
    * Process the default EMF path and minimal XPath syntax.
@@ -1829,8 +1874,13 @@
      */
     public static Accessor create(EObject eObject, String path)
     {
+      return create(eObject, path, null);
+    }
+      
+    public static Accessor create(EObject eObject, String path, Object value)
+    {
       Accessor result = pool.get();
-      result.init(eObject, path);
+      result.init(eObject, path, value);
       return result;
     }
 
@@ -1887,6 +1937,7 @@
     protected static final int NO_INDEX = -1;
 
     protected EObject eObject;
+    protected Object value;
 
     protected EStructuralFeature feature;
 
@@ -1898,14 +1949,15 @@
     {
     }
 
-    protected Accessor(EObject eObject, String path)
-    {
-      init(eObject, path);
-    }
+    //protected Accessor(EObject eObject, String path)
+    //{
+    //  init(eObject, path);
+    //}
 
-    protected void init(EObject eObject, String path)
+    protected void init(EObject eObject, String path, Object value)
     {
       this.eObject = eObject;
+      this.value = value;
       runtimeException = null;
 
       // This should only be called with a path right now.
@@ -2041,7 +2093,16 @@
         {
           int index = name.lastIndexOf('.');
           if (index == -1)
+          {
+            Type type = (Type)eObject.eClass();
+            if (value != null && type.isOpen())
+            {
+              feature = (EStructuralFeature)demandOpenProperty(type, name, value, false);
+              this.index = NO_INDEX;
+              return;
+            }
             runtimeException = new IllegalArgumentException("Class '" + eObject.eClass().getName() + "' does not have a feature named '" + name + '\'');
+          }
           else
           {
             int propertyNameEnd = index;



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