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