Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java3384
1 files changed, 1692 insertions, 1692 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java
index f28e0af414..59d073ed72 100644
--- a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java
+++ b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java
@@ -1,1692 +1,1692 @@
-/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Ibrahim Sallam - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.objectivity.db;
-
-import org.eclipse.emf.cdo.common.branch.CDOBranch;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDExternal;
-import org.eclipse.emf.cdo.common.model.EMFUtil;
-import org.eclipse.emf.cdo.common.revision.CDOList;
-import org.eclipse.emf.cdo.common.revision.CDORevision;
-import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
-import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
-import org.eclipse.emf.cdo.server.internal.objectivity.ObjectivityStoreAccessor;
-import org.eclipse.emf.cdo.server.internal.objectivity.bundle.OM;
-import org.eclipse.emf.cdo.server.internal.objectivity.mapper.IManyTypeMapper;
-import org.eclipse.emf.cdo.server.internal.objectivity.mapper.ISingleTypeMapper;
-import org.eclipse.emf.cdo.server.internal.objectivity.mapper.ITypeMapper;
-import org.eclipse.emf.cdo.server.internal.objectivity.mapper.ObjyMapper;
-import org.eclipse.emf.cdo.server.internal.objectivity.mapper.SingleReferenceMapper;
-import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyArrayListId;
-import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyArrayListString;
-import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyBase;
-import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyFeatureMapArrayList;
-import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyFeatureMapEntry;
-import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyProxy;
-import org.eclipse.emf.cdo.server.internal.objectivity.utils.OBJYCDOIDUtil;
-import org.eclipse.emf.cdo.spi.common.revision.InternalCDOList;
-import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
-
-import org.eclipse.net4j.util.collection.MoveableList;
-import org.eclipse.net4j.util.om.trace.ContextTracer;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-import com.objy.as.app.Class_Object;
-import com.objy.as.app.Numeric_Value;
-import com.objy.as.app.Relationship_Object;
-import com.objy.as.app.String_Value;
-import com.objy.as.app.VArray_Object;
-import com.objy.as.app.d_Attribute;
-import com.objy.as.app.d_Class;
-import com.objy.as.app.d_Ref_Type;
-import com.objy.db.app.ooId;
-import com.objy.db.app.ooObj;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Ibrahim Sallam
- */
-public class ObjyObject
-{
-
- private static final ContextTracer TRACER_DEBUG = new ContextTracer(OM.DEBUG, ObjyObject.class);
-
- protected Class_Object classObject;
-
- protected ObjyClass objyClass;
-
- protected Class_Object baseClassObject = null;
-
- protected Relationship_Object baseRel = null;
-
- protected boolean hasBaseRelationshipChecked = false;
-
- protected Relationship_Object revisionsRel = null;
-
- protected Relationship_Object lastRevisionRel = null;
-
- protected ooId objectId;
-
- protected ooId revisionId = null;
-
- protected int version = Integer.MAX_VALUE;
-
- public static int fetchCount = 0;
-
- public static int updateCount = 0;
-
- public static long createObjectTime = 0;
-
- public static int createObjectCount = 0;
-
- // protected boolean isRoot = false;
-
- // IS: for stats.
- // public static int count = 0;
- // public static long tDiff = 0;
-
- // good for fast access.
- // private Map<Class_Position, Object> featureMap = new HashMap<Class_Position, Object>();
- private Map<String, Object> featureMap = new HashMap<String, Object>();
-
- public ObjyObject(Class_Object classObject)
- {
- // long tStart = System.currentTimeMillis();
-
- this.classObject = classObject;
- d_Class dClass = classObject.type_of();
- String fullyQualifiedClassName = null;
-
- try
- {
-
- if (dClass.namespace_name() != null)
- {
- fullyQualifiedClassName = dClass.namespace_name() + ":" + dClass.name();
- }
- else
- {
- fullyQualifiedClassName = dClass.name();
- }
-
- objyClass = ObjySchema.getObjyClass(fullyQualifiedClassName);
-
- // if (dClass.has_base_class(ObjyBase.CLASS_NAME))
- // {
- // if (TRACER_DEBUG.isEnabled())
- // {
- // TRACER_DEBUG.format("...classObject type: {0} - oid: {1}", classObject.type_of().name(), classObject
- // .objectID().getStoreString());
- // }
- // getBaseRelationship(classObject);
- // if (!baseRel.exists())
- // {
- // // we are the base...
- // getRevisionsRelationship(classObject);
- // getLastRevisionRelationship(classObject);
- // }
- // else
- // {
- // baseClassObject = baseRel.get_class_obj();
- // // TODO - we might want to delay getting the list of versions unless we need them.
- // // revisionsRel = baseClassObject.get_relationship(objyClass.resolve_position(ObjyBase.ATT_REVISIONS));
- // // lastRevisionRel = baseClassObject.get_relationship(objyClass.resolve_position(ObjyBase.ATT_LAST_REVISION));
- // }
- // }
- setObjectId(classObject.objectID());
- // version = classObject.get_numeric(objyClass.resolve_position(ObjyBase.ATT_VERSION)).intValue();
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
-
- // count++;
- // tDiff += System.currentTimeMillis() - tStart;
- }
-
- private Relationship_Object getLastRevisionRelationship()
- {
- if (lastRevisionRel == null)
- {
- lastRevisionRel = classObject.nget_relationship(ObjyBase.ATT_LAST_REVISION);
- }
- return lastRevisionRel;
- }
-
- private Relationship_Object getRevisionsRelationship()
- {
- if (revisionsRel == null)
- {
- // revisionsRel = classObject.get_relationship(objyClass.resolve_position(ObjyBase.ATT_REVISIONS));
- revisionsRel = classObject.nget_relationship(ObjyBase.ATT_REVISIONS);
- }
- return revisionsRel;
- }
-
- private Relationship_Object getBaseRelationship()
- {
- if (baseRel == null)
- {
- // baseRel = classObject.get_relationship(objyClass.resolve_position(ObjyBase.ATT_BASE));
- baseRel = classObject.nget_relationship(ObjyBase.ATT_BASE);
- }
- return baseRel;
- }
-
- public ObjyClass objyClass()
- {
- return objyClass;
- }
-
- public Class_Object ooClassObject()
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- return classObject;
- }
-
- public void setObjectId(ooId objectId)
- {
- this.objectId = objectId;
- }
-
- /**
- *
- */
- public ooId ooId()
- {
- return objectId;
- }
-
- public void setEContainer(Object containerID)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
-
- // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINERID);
-
- SingleReferenceMapper.INSTANCE.setValue(this, ObjyBase.ATT_CONTAINERID/* position */, containerID);
- }
-
- public Object getEContainer()
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
-
- // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINERID);
- Object value = SingleReferenceMapper.INSTANCE.getValue(this, ObjyBase.ATT_CONTAINERID/* position */);
-
- return value;
- }
-
- public ooId getEContainerAsOid()
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
-
- // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINERID);
- ooId childOid = get_ooId(ObjyBase.ATT_CONTAINERID/* position */);
- return childOid;
- }
-
- public void setEResource(Object resourceID)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
-
- // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_RESOURCEID);
- SingleReferenceMapper.INSTANCE.setValue(this, ObjyBase.ATT_RESOURCEID/* position */, resourceID);
-
- }
-
- public Object getEResource()
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
-
- // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_RESOURCEID);
- Object value = SingleReferenceMapper.INSTANCE.getValue(this, ObjyBase.ATT_RESOURCEID/* position */);
-
- return value;
- }
-
- public ooId getEResourceAsOid()
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_RESOURCEID);
- ooId childOid = get_ooId(ObjyBase.ATT_RESOURCEID/* position */);
- return childOid;
- }
-
- public void setEContainingFeature(int contFeature)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINER_FEATUERID);
- set_numeric(ObjyBase.ATT_CONTAINER_FEATUERID/* position */, new Numeric_Value(contFeature));
- }
-
- public int getEContainingFeature()
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINER_FEATUERID);
- return get_numeric(ObjyBase.ATT_CONTAINER_FEATUERID/* position */).intValue();
- }
-
- /**
- * This is used to cache the composite features, (manyAttributes, manyReference, and featureMap. TBD - verify the need
- * of this.
- */
- // public Object getFeatureList(Class_Position position)
- // {
- // return featureMap.get(position);
- // }
- public Object getFeatureList(String featureName)
- {
- return featureMap.get(featureName);
- }
-
- // public void setFeatureList(Class_Position position, Object object)
- // {
- // featureMap.put(position, object);
- // }
- public void setFeatureList(String featureName, Object object)
- {
- featureMap.put(featureName, object);
- }
-
- public int getVersion()
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- // if (version == Integer.MAX_VALUE)
- {
- version = classObject.nget_numeric(ObjyBase.ATT_VERSION).intValue();
- }
- return version;
- }
-
- public void setVersion(int version)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- classObject.nset_numeric(ObjyBase.ATT_VERSION, new Numeric_Value(version));
- // getVersion(); // TBD, verify the need for this call!!!!
- this.version = version;
- }
-
- public long getCreationTime()
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- long creationTime = classObject.nget_numeric(ObjyBase.ATT_CREATION_TIME).longValue();
- return creationTime;
- }
-
- public void setCreationTime(long creationTime)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- classObject.nset_numeric(ObjyBase.ATT_CREATION_TIME, new Numeric_Value(creationTime));
- }
-
- public long getRevisedTime()
- {
- long revisedTime = 0;
-
- try
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- revisedTime = classObject.nget_numeric(ObjyBase.ATT_REVISED_TIME).longValue();
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
-
- return revisedTime;
- }
-
- public void setRevisedTime(long revisedTime)
- {
- try
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- classObject.nset_numeric(ObjyBase.ATT_REVISED_TIME, new Numeric_Value(revisedTime));
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- }
-
- public void setBranchId(int branchId)
- {
- try
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- classObject.nset_numeric(ObjyBase.ATT_BRANCHID, new Numeric_Value(branchId));
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
-
- }
-
- public long getBranchId()
- {
- int branchId = 0;
- try
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- branchId = classObject.nget_numeric(ObjyBase.ATT_BRANCHID).intValue();
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- return branchId;
- }
-
- public ObjyObject copy(EClass eClass, ObjyObjectManager objyObjectManager)
- {
- ObjyObject newObjyObject = null;
- ooObj obj = ooObj.create_ooObj(objectId);
- ooObj newObj = (ooObj)obj.copy(obj); // Objy internal copy.
- // Dependent structures, for example array of refs are not copies, so we
- // have to iterate and copy (deep copy).
- // newObjyObject = new ObjyObject(Class_Object.class_object_from_oid(newObj.getOid()));
- newObjyObject = objyObjectManager.getObject(newObj.getOid());
-
- try
- {
- if (TRACER_DEBUG.isEnabled())
- {
- TRACER_DEBUG.trace("ObjyObject.copy() - oid:" + ooId().getStoreString() + " version:" + getVersion());
- }
- for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
- {
- if (!(feature instanceof EAttribute || feature instanceof EReference) || !EMFUtil.isPersistent(feature))
- {
- continue;
- }
-
- if (feature.isMany())
- {
- // copy this feature to the new object.
- // copy this feature to the new object.
- // get the attribute using feature name.
- d_Attribute attribute = objyClass.resolve_attribute(feature.getName());
- // System.out.println("... checking feature: " + feature.getName() + - attributeType: "
- // + attribute.type_of().name());
- if (attribute != null && attribute.type_of() instanceof d_Ref_Type)
- {
- // IS:temptest Class_Position position = objyClass.resolve_position(feature.getName());
- // ooId refOoId = get_ooId(position);
- Class_Object cObj = get_class_obj(feature.getName());
- if (cObj != null)
- {
- // System.out.println("\t\t referenced Class_Object with OID: " +cObj.objectID().getStoreString());
- d_Class refClass = cObj.type_of();
- String refClassName = refClass.name();
- if (refClassName.equals(ObjyFeatureMapArrayList.ClassName))
- {
- // we'll need to copy this one.
- TRACER_DEBUG.trace("\t TBD - copying ObjyFeatureMapArrayList attr: " + attribute.name());
- }
- else if (refClassName.equals(ObjyArrayListString.ClassName))
- {
- // we'll need to copy this one.
- TRACER_DEBUG.trace("\t TBD - copying ObjyArrayListString attr: " + attribute.name());
- }
- else if (refClassName.equals(ObjyArrayListId.className))
- {
- // we'll need to copy this one.
- // System.out.println("\t copying ObjyArrayListId attr: " + attibute.name());
- ObjyArrayListId arrayListId = new ObjyArrayListId(cObj);
- ooObj newArrayListId = arrayListId.copy(newObj);
- newObjyObject.set_ooId(feature.getName(), newArrayListId.getOid());
- }
- else if (refClassName.equals(ObjyProxy.className))
- {
- // we'll need to copy this one.
- TRACER_DEBUG.trace("\t TBD - copying ObjyProxy attr: " + attribute.name());
- }
- }
- }
-
- }
- }
- }
- catch (com.objy.as.asException ex)
- {
- ex.printStackTrace();
- }
-
- return newObjyObject;
- }
-
- /**
- * Use the revision info to update the object in the store.
- *
- * @param storeAccessor
- * @param revision
- */
- public void update(ObjectivityStoreAccessor storeAccessor, InternalCDORevision revision)
- {
- updateCount++;
-
- try
- {
-
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- TRACER_DEBUG.trace("ObjyObject.update() - oid:" + ooId().getStoreString() + " - version:"
- + revision.getVersion());
- }
-
- // this is done in the updateDate()
- // setEContainer(revision.getContainerID());
- // setEResource(revision.getResourceID());
- // setEContainingFeature(revision.getContainingFeatureID());
-
- updateData(storeAccessor, revision);
- }
- catch (com.objy.as.asException ex)
- {
- ex.printStackTrace();
- }
- }
-
- /**
- * Use the revision info to update the object in the store.
- *
- * @param storeAccessor
- * @param revision
- */
- private void updateData(ObjectivityStoreAccessor storeAccessor, InternalCDORevision revision)
- {
- EClass eClass = revision.getEClass();
-
- try
- {
- if (TRACER_DEBUG.isEnabled())
- {
- TRACER_DEBUG.trace("=> ObjyObject.updateData() - oid:" + ooId().getStoreString() + //$NON-NLS-1$
- " - version:" + revision.getVersion()); //$NON-NLS-1$
- }
-
- setVersion(revision.getVersion());
-
- setEContainer(revision.getContainerID());
- setEResource(revision.getResourceID());
- setEContainingFeature(revision.getContainingFeatureID());
- setCreationTime(revision.getTimeStamp());
- setRevisedTime(revision.getRevised());
- setBranchId(revision.getBranch().getID());
-
- for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
- {
- if (!(feature instanceof EAttribute || feature instanceof EReference) || !EMFUtil.isPersistent(feature))
- {
- continue;
- }
-
- ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
- if (mapper == null)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- TRACER_DEBUG.trace("In " + ooId().getStoreString() + " - Can't find mapper for feature "
- + feature.getName());
- }
- continue;
- }
- // -----------------------------------------------
- // TODO - this code definitely need refactoring!!!
- // -----------------------------------------------
-
- // Class_Position attr = objyClass.resolve_position(feature.getName());
- if (feature.isMany())
- {
- // Object newValue = revision.getValue(feature);
- // --- TEMP solution to fix one of the tests...
- CDOList list = revision.getList(feature);
- Object[] values = new Object[list.size()];
- // we need to pass a list of ooId objects.
- // TODO - This need some work!!!!
- for (int i = 0; i < values.length; i++)
- {
- // TODO - this code need refactoring...
- Object value = list.get(i);
- if (null == value)
- {
- values[i] = value;
- continue;
- }
- else if (value instanceof CDOIDExternal)
- {
- TRACER_DEBUG
- .trace("... CDOIDExternal inserted, at:" + i + ", content:" + ((CDOIDExternal)value).getURI());
- // System.out.println("value is a proxy object - it should be handled by the mapper.");
- // create an ObjyProxy object to hold the the value.
- ObjyProxy proxyObject = ObjyProxy.createObject(ooId());
- proxyObject.setUri(((CDOIDExternal)value).getURI());
- values[i] = proxyObject.ooId();
-
- }
- else if (value instanceof CDOID)
- {
- values[i] = OBJYCDOIDUtil.getooId((CDOID)value);
- }
- else if (value instanceof FeatureMap.Entry)
- {
- FeatureMap.Entry entry = (FeatureMap.Entry)value;
- EStructuralFeature entryFeature = entry.getEStructuralFeature();
- Object entryValue = entry.getValue();
-
- ooId oid = null;
- if (entryValue instanceof CDOIDExternal)
- {
- TRACER_DEBUG.trace("... CDOIDExternal inserted, at:" + i + ", content:"
- + ((CDOIDExternal)entryValue).getURI());
- // System.out.println("value is a proxy object - it should be handled by the mapper.");
- // create an ObjyProxy object to hold the the value.
- ObjyProxy proxyObject = ObjyProxy.createObject(ooId());
- proxyObject.setUri(((CDOIDExternal)entryValue).getURI());
- oid = proxyObject.ooId();
- }
- else if (entryValue instanceof CDOID)
- {
- oid = OBJYCDOIDUtil.getooId((CDOID)entryValue);
- }
- else
- {
- if (TRACER_DEBUG.isEnabled())
- {
- TRACER_DEBUG.trace("OBJY: don't know what kind of entryValue is this!!! - " + entryValue);
- }
- }
- // FeatureMapEntry is a presistent class.
- ObjyFeatureMapEntry featureMapEntry = new ObjyFeatureMapEntry(entryFeature.getFeatureID(), oid, objectId);
-
- // this.cluster(featureMapEntry);
- values[i] = featureMapEntry;
- }
- else if (value.equals(InternalCDOList.UNINITIALIZED))
- {
- TRACER_DEBUG.format("...GOT UNINITIALIZED at {0}, listSize:{1}, feature:{2}, oid:{3}", i, values.length,
- feature.getName(), objectId.getStoreString());
- continue;
- }
- else
- {
- // different feature then.
- values[i] = value;
- }
- }
-
- ((IManyTypeMapper)mapper).setAll(this, feature, 0, values);
- }
- else
- {
- Object newValue = revision.get(feature, feature.getFeatureID());
- // if (newValue instanceof CDOIDExternal)
- // {
- // System.out.println("value is a proxy object");
- // }
- ((ISingleTypeMapper)mapper).setValue(this, feature, newValue);
- }
- }
- }
- catch (com.objy.as.asException ex)
- {
- ex.printStackTrace();
- }
- }
-
- public ObjyObject getLastRevision(ObjyObjectManager objyObjectManager)
- {
- if (!getLastRevisionRelationship().exists())
- {
- return this;
- }
-
- // Class_Object lastRevision = lastRevisionRel.get_class_obj();
- ooId lastRevisionOid = getLastRevisionRelationship().get_ooId();
- // return new ObjyObject(lastRevision);
- return objyObjectManager.getObject(lastRevisionOid);
- }
-
- public ObjyObject getRevisionByVersion(int version, long branchId, ObjyObjectManager objyObjectManager)
- {
- ObjyObject objyRevision = null;
- int objectVersion = getVersion();
- long objectBranchId = getBranchId();
-
- if (branchId == objectBranchId && Math.abs(objectVersion) == version)
- {
- // there is a first time for everything...
- return this;
- }
-
- // check last revision first.
- objyRevision = getLastRevision(objyObjectManager);
- objectVersion = objyRevision.getVersion();
- objectBranchId = objyRevision.getBranchId();
- if (branchId == objectBranchId && Math.abs(objectVersion) == version)
- {
- return objyRevision;
- }
-
- // Session.getCurrent().setReturn_Class_Object(true);
- // int numRevisions = (int) revisions.size();
-
- @SuppressWarnings("unchecked")
- Iterator<ooObj> itr = getRevisionsRelationship().get_iterator();
- while (itr.hasNext())
- {
- // objyRevision = new ObjyObject(itr.next());
- objyRevision = objyObjectManager.getObject(itr.next().getOid());
- objectVersion = objyRevision.getVersion();
- objectBranchId = objyRevision.getBranchId();
- if (branchId == objectBranchId && Math.abs(objectVersion) == version)
- {
- return objyRevision;
- }
- objyRevision = null;
- }
-
- return null;
- }
-
- public void addToRevisions(ObjyObject objyRevision)
- {
- try
- {
- getRevisionsRelationship().add(objyRevision.objectId);
- // set it as last rev.
- getLastRevisionRelationship().clear(); // Ouch!! performance issue...
- getLastRevisionRelationship().form(objyRevision.objectId);
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- }
-
- // /**
- // * Wrapper around ObjyObject to allow clustering of other objects near this one.
- // */
- // private void cluster(ooObj otherObj)
- // {
- // try
- // {
- // ooObj thisObj = ooObj.create_ooObj(objectId);
- // thisObj.cluster(otherObj);
- // }
- // catch (ObjyRuntimeException ex)
- // {
- // ex.printStackTrace();
- // }
- // }
-
- /**
- * Fetch data from the store and return a revision.
- */
- public boolean fetch(ObjectivityStoreAccessor storeAccessor, InternalCDORevision revision, int listChunk)
- {
- boolean bRet = true;
- fetchCount++;
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- EClass eClass = revision.getEClass();
-
- try
- {
- if (TRACER_DEBUG.isEnabled())
- {
- TRACER_DEBUG.trace("ObjyObject.fetch() - oid:" + ooId().getStoreString() + " version:" + getVersion());
- }
- // Put the version of the objects;
- revision.setVersion(getVersion());
- revision.setContainerID(getEContainer());
- revision.setResourceID((CDOID)getEResource());
- revision.setContainingFeatureID(getEContainingFeature());
- long creationTime = getCreationTime();
- long revisedTime = getRevisedTime();
-
- if (TRACER_DEBUG.isEnabled())
- {
- TRACER_DEBUG.trace("... ObjyObject.creationTime: " + creationTime);
- TRACER_DEBUG.trace("... ObjyObject.revisedTime : " + revisedTime);
- }
-
- revision.setRevised(revisedTime);
-
- for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
- {
- if (!(feature instanceof EAttribute || feature instanceof EReference) || !EMFUtil.isPersistent(feature))
- {
- continue;
- }
-
- if (feature.isMany())
- {
- int featureSize = size(feature);
- int chunkSize = featureSize;
- if (listChunk != CDORevision.UNCHUNKED && listChunk > 0)
- {
- chunkSize = Math.min(chunkSize, listChunk);
- }
-
- Object[] objects = getAll(feature, 0, chunkSize);
- // if (size > 0)
- {
- // TODO - we could use getList() then fill the array with values, we
- // also
- // need to consider the chunking...
- // InternalCDOList cdoList =
- // (InternalCDOList)CDOListFactory.DEFAULT.createList(objects.length,
- // objects.length, 0);
- // TODO - use the following line instead of creating the cdoList
- // above.
- MoveableList<Object> list = revision.getList(feature);
-
- // size = Math.min(size, 0);
- for (int i = 0; i < chunkSize; i++)
- {
- if (objects[i] instanceof ooId)
- {
- // TODO - this code need refactoring....
- CDOID cdoId = null;
- ooId objyOid = (ooId)objects[i];
- if (objyOid.isNull())
- {
- cdoId = OBJYCDOIDUtil.getCDOID(objyOid);
- }
- else
- {
- Class_Object refClassObject = Class_Object.class_object_from_oid((ooId)objects[i]);
-
- if (refClassObject.type_of().name().equals(ObjyProxy.className))
- {
- // System.out.println("OBJY: Got proxy: " + refClassObject.objectID().getStoreString());
- ObjyProxy proxyObject = new ObjyProxy(refClassObject);
- // cdoList.set(i,
- // OBJYCDOIDUtil.createCDIDExternal(proxyObject));
- cdoId = OBJYCDOIDUtil.createCDIDExternal(proxyObject);
- }
- else
- {
- cdoId = OBJYCDOIDUtil.getCDOID(objyOid);
- }
- refClassObject = null;
- }
- list.add(cdoId);
-
- continue;
- }
- else if (objects[i] instanceof ObjyFeatureMapEntry)
- {
- FeatureMap.Entry entry = getFeatureMapEntry(eClass, (ObjyFeatureMapEntry)objects[i]);
- list.add(entry);
- }
- else
- {
- // different feature then.
- // System.out.println("-->> Hmmm fetch() feature (" + i + ") -> feature:" + feature.getName()
- // + " - value:" + objects[i]);
- // cdoList.set(i, objects[i]);
- list.add(objects[i]);
- }
- }
- // fill the rest if needed.
- if (featureSize - chunkSize > 0)
- {
- for (int i = 0; i < featureSize - chunkSize; i++)
- {
- list.add(InternalCDOList.UNINITIALIZED);
- }
- }
- }
- }
- else
- {
- Object object = get(feature, 0);
-
- /**
- * TODO - verify if this is needed for 2.x if (cdoFeature.getType() == CDOType.CUSTOM) { object =
- * EcoreUtil.convertToString((EDataType)eFeature.getEType(), object); }
- */
- revision.set(feature, 0, object);
- }
- }
- }
- catch (com.objy.as.asException ex)
- {
- ex.printStackTrace();
- }
-
- return bRet;
- }
-
- /**
- * Fetch data for a specific feature from the store, and return a list of objects. Used by
- * ObjectivityStoreChunkAccessor
- */
- public List<Object> fetchList(ObjectivityStoreAccessor storeAccessor, EStructuralFeature feature, int startIndex,
- int chunkSize)
- {
- fetchCount++;
-
- List<Object> results = new ArrayList<Object>();
- EClass eClass = feature.getEContainingClass();
-
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
-
- try
- {
- if (TRACER_DEBUG.isEnabled())
- {
- TRACER_DEBUG.trace("ObjyObject.fetch() - feature:" + feature.getName() + "from Object: "
- + ooId().getStoreString() + " version:" + getVersion());
- }
- int featureSize = size(feature);
- chunkSize = Math.min(featureSize - startIndex, chunkSize);
-
- Object[] objects = getAll(feature, startIndex, chunkSize);
- convertToCdoList(objects, results, eClass, chunkSize);
- }
- catch (com.objy.as.asException ex)
- {
- ex.printStackTrace();
- }
-
- return results;
- }
-
- /**
- * Function thats takes a list of Objy objects and convert them to CDO IDs This function is used by queryXRefs() as
- * well.
- */
- protected void convertToCdoList(Object[] objects, List<Object> results, EClass eClass, int chunkSize)
- {
- {
- for (int i = 0; i < chunkSize; i++)
- {
- if (objects[i] instanceof ooId)
- {
- // TODO - this code need refactoring....
-
- // System.out.println("-->> IS: getting Class_Object from OID: "
- // + childObject.getStoreString());
- CDOID cdoId = null;
- ooId objyOid = (ooId)objects[i];
- if (objyOid.isNull())
- {
- cdoId = OBJYCDOIDUtil.getCDOID(objyOid);
- }
- else
- {
- Class_Object refClassObject = Class_Object.class_object_from_oid(objyOid);
-
- if (refClassObject.type_of().name().equals(ObjyProxy.className))
- {
- ObjyProxy proxyObject = new ObjyProxy(refClassObject);
- cdoId = OBJYCDOIDUtil.createCDIDExternal(proxyObject);
- }
- else
- {
- cdoId = OBJYCDOIDUtil.getCDOID(objyOid);
- }
- refClassObject = null;
- }
-
- results.add(cdoId);
- continue;
-
- }
- else if (objects[i] instanceof ObjyFeatureMapEntry)
- {
- FeatureMap.Entry entry = getFeatureMapEntry(eClass, (ObjyFeatureMapEntry)objects[i]);
- results.add(entry);
- }
- }
- }
- }
-
- private FeatureMap.Entry getFeatureMapEntry(EClass eClass, ObjyFeatureMapEntry mapEntry)
- {
- ooId oid = mapEntry.getObject();
- CDOID id = null;
- Class_Object refClassObject = Class_Object.class_object_from_oid(oid);
- if (refClassObject.type_of().name().equals(ObjyProxy.className))
- {
- ObjyProxy proxyObject = new ObjyProxy(refClassObject);
- id = OBJYCDOIDUtil.createCDIDExternal(proxyObject);
- }
- else
- {
- id = OBJYCDOIDUtil.getCDOID(oid);
- }
-
- EStructuralFeature entryFeature = eClass.getEStructuralFeature(mapEntry.getTagId());
- FeatureMap.Entry entry = CDORevisionUtil.createFeatureMapEntry(entryFeature, id);
- return entry;
- }
-
- /**
- * Get the size of the composite object using the store info.
- *
- * @param feature
- * @return
- */
- private int size(EStructuralFeature feature)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
- int size = 0;
-
- // Class_Position position = objyClass().resolve_position(feature.getName());
- try
- {
- IManyTypeMapper mapper = (IManyTypeMapper)ObjyMapper.INSTANCE.getTypeMapper(feature);
-
- size = mapper.size(this, feature);
-
- if (TRACER_DEBUG.isEnabled())
- {
- // TODO - verify the message.
- TRACER_DEBUG.trace("Size of object " + ooId().getStoreString() + " - is: " + size + " - feature: "
- + feature.getName());
- }
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- return size;
- }
-
- /**
- * Get the value of an attribute from the persistent object.
- */
- public Object get(EStructuralFeature feature)
- {
- if (feature.isMany())
- {
- return getAll(feature, 0, CDORevision.UNCHUNKED);
- }
- return get(feature, 0);
- }
-
- /**
- * Get the value of an attribute at index (if many) from the persistent object.
- *
- * @param feature
- * @param index
- * @return
- */
- private Object get(EStructuralFeature feature, int index)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- }
-
- if (TRACER_DEBUG.isEnabled())
- {
- // TODO - verify the message.
- TRACER_DEBUG.trace("Getting object " + objectId.getStoreString() + " <feature ' " + feature.getName() + "':"
- + feature.getEType() + "> from " + this);
- }
-
- // Class_Position position =
- // this.objyClass().resolve_position(feature.getName());
-
- ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
- Object value = null;
- try
- {
- if (feature.isMany())
- {
- value = ((IManyTypeMapper)mapper).getValue(this, feature, index);
- }
- else
- {
- value = ((ISingleTypeMapper)mapper).getValue(this, feature);
- }
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- return value;
- }
-
- /**
- * Get all the values of an attribute, used for feature.isMany(). This function is also used by the
- * ObjectivityStoreChunkReader to read chunks of data from a feature.
- *
- * @param feature
- * @param size
- * @return
- */
- protected Object[] getAll(EStructuralFeature feature, int startIndex, int chunkSize)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- // TODO - verify the message.
- TRACER_DEBUG.trace("Get All objects for ID: " + ooId().getStoreString() + " <feature ' " + feature/*
- * .getName( )
- */
- + "':" + feature.getEType() + "> from " + this);
- }
-
- assert feature.isMany();
- Object[] values = null;
-
- try
- {
- IManyTypeMapper mapper = (IManyTypeMapper)ObjyMapper.INSTANCE.getTypeMapper(feature);
- values = mapper.getAll(this, feature, startIndex, chunkSize);
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
-
- return values;
- }
-
- public void add(EStructuralFeature feature, int index, Object value)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- TRACER_DEBUG.trace("Adding object " + value + " to " + ooId().getStoreString());
- }
-
- assert feature.isMany();
-
- try
- {
- IManyTypeMapper mapper = (IManyTypeMapper)ObjyMapper.INSTANCE.getTypeMapper(feature);
-
- // -- TODO -- verify the need to this one.
- // ensureObjectAttached(feature, value);
-
- // I believe we do the conversion in the add()
- // value = provider.convertToStore(ooObject, value);
-
- mapper.add(this, feature, index, value);
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- }
-
- /***
- * @param feature
- */
- public void clear(EStructuralFeature feature)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- TRACER_DEBUG.trace("Clear List for " + ooId().getStoreString());
- }
-
- // Class_Position position = objyClass.resolve_position(feature.getName());
- try
- {
- ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
-
- ((IManyTypeMapper)mapper).clear(this, feature);
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- }
-
- public void move(EStructuralFeature feature, int targetIndex, int sourceIndex)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- TRACER_DEBUG.trace("Move element from " + sourceIndex + " to " + targetIndex);
- }
- try
- {
- ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
-
- ((IManyTypeMapper)mapper).move(this, feature, targetIndex, sourceIndex);
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- }
-
- public Object remove(EStructuralFeature feature, int index)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- TRACER_DEBUG.trace("Remove object from '" + ooId().getStoreString() + "' at index " + index);
- }
-
- // Class_Position position = objyClass.resolve_position(feature.getName());
- Object retObject = null;
-
- try
- {
- IManyTypeMapper mapper = (IManyTypeMapper)ObjyMapper.INSTANCE.getTypeMapper(feature);
-
- Object value = mapper.remove(this, feature, index);
-
- if (feature instanceof EAttribute)
- {
- return value;
- }
-
- retObject = OBJYCDOIDUtil.getCDOID((ooId)value);
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
-
- return retObject;
-
- }
-
- public Object set(EStructuralFeature feature, int index, Object value)
- {
- if (TRACER_DEBUG.isEnabled())
- {
- checkSession();
- TRACER_DEBUG.trace("Set object '" + ooId().getStoreString() + "' feature : " + feature.getName());
- }
-
- /*
- * int i =0; for (EClass superEClass : object.eClass().getESuperTypes()) { if
- * (feature.getEContainingClass().isSuperTypeOf(superEClass)) { break; } i++; break; } String className = null; if
- * (i == 0) { className = EProposedManager.getObjectivityClass(feature.getEContainingClass()); } else { className =
- * EProposedManager.getObjectivityClass(feature.getEContainingClass(), true); } Class_Position position =
- * ooObject.ooClass().resolve_position(className + "::" + feature.getName());
- */
- // Class_Position position = objyClass.resolve_position(feature.getName());
- try
- {
- ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
-
- // --- TODO --- verify the need...
- // ensureObjectAttached(this, feature, value);
-
- /***
- * I believe we do the conversion in the setValue if (feature instanceof EReference) { value =
- * CDOIDUtil.getooId((CDOID)value); }
- ***/
-
- if (feature.isMany())
- {
- ((IManyTypeMapper)mapper).setValue(this, feature, index, value);
- }
- else
- {
- ((ISingleTypeMapper)mapper).setValue(this, feature, value);
- }
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
-
- return value;
- }
-
- /***
- * @param feature
- */
- public void unset(EStructuralFeature feature)
- {
- set(feature, 0, null);
- }
-
- protected void checkSession()
- {
- // 100610 - IS: disabled for now, since we have an issue with oojava_epl.jar "getSession()"
- // is not available.
- // if (TRACER_DEBUG.isEnabled())
- // {
- // try
- // {
- // if (!classObject.getPersistor().getSession().isOpen())
- // {
- // throw new Exception("Attempt to work on an object " + objectId.toString() + " without a trx. [Session: "
- // + classObject.getPersistor().getSession() + "]");
- // }
- // }
- // catch (Exception ex)
- // {
- // ex.printStackTrace();
- // } // for debugging.
- // }
- }
-
- /***
- * Iterate over the attributes and references and mark them deleted. This will only be called in non-audit mode.
- */
- public void delete(ObjectivityStoreAccessor storeAccessor, ObjyObjectManager objectManager)
- {
- EClass eClass = ObjySchema.getEClass(storeAccessor.getStore(), objyClass());
- try
- {
- for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
- {
- if (!(feature instanceof EAttribute || feature instanceof EReference) || !EMFUtil.isPersistent(feature))
- {
- continue;
- }
-
- if (feature.isMany())
- {
- deleteFeatureObjects(objectManager, feature);
- }
- else
- {
- ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
-
- if (mapper == null)
- {
- continue;
- }
- mapper.delete(this, feature);
- }
- }
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- }
-
- private void deleteFeatureObjects(ObjyObjectManager objectManager, EStructuralFeature feature)
- {
- // TODO - verify that we can do this to all referenced list.
- // I'm not sure if it's valid when you have many-many relationship.
- Object[] objects = getAll(feature, 0, CDORevision.UNCHUNKED);
-
- if (objects == null)
- {
- return;
- }
-
- for (int i = 0; i < objects.length; i++)
- {
- if (objects[i] instanceof ooId)
- {
- ooId oid = (ooId)objects[i];
- // TODO - this code need refactoring....
- ooObj obj = ooObj.create_ooObj(oid);
- if (obj.isDead())
- {
- continue;
- }
-
- Class_Object refClassObject = Class_Object.class_object_from_oid(oid);
-
- if (refClassObject.type_of().name().equals(ObjyProxy.className))
- {
- obj.delete();
- }
- else
- {
- // if this object is a parent (resourceId or
- // containerId) for obj, then we
- // need to mark obj version as (-1).
- ObjyObject childObjyObject = objectManager.getObject(oid);
- ooId containerId = childObjyObject.getEContainerAsOid();
- ooId resourceId = childObjyObject.getEResourceAsOid();
- int childVersion = childObjyObject.getVersion();
- if (containerId.equals(objectId) || resourceId.equals(objectId))
- {
- childObjyObject.setVersion(-childVersion);
- }
-
- }
- }
- else if (objects[i] instanceof ObjyFeatureMapEntry)
- {
- ObjyFeatureMapEntry mapEntry = (ObjyFeatureMapEntry)objects[i];
- ooId oid = mapEntry.getObject();
- ooObj obj = ooObj.create_ooObj(oid);
- obj.delete();
- }
- else
- {
- // different feature then.
- if (TRACER_DEBUG.isEnabled())
- {
- TRACER_DEBUG.trace("-->> No process to delete() feature (" + i + ") -> feature:" + feature.getName()
- + " - value:" + objects[i] + " ... nothing to do here.");
- }
- }
- }
- }
-
- // Wrapper functions over class object.
- // public Numeric_Value get_numeric(Class_Position position)
- // {
- // return classObject.get_numeric(position);
- // }
- public Numeric_Value get_numeric(String attributeName)
- {
- return classObject.nget_numeric(attributeName);
- }
-
- // public String_Value get_string(Class_Position position)
- // {
- // return classObject.get_string(position);
- // }
- public String_Value get_string(String attributeName)
- {
- return classObject.nget_string(attributeName);
- }
-
- // public void set_numeric(Class_Position position, Numeric_Value value)
- // {
- // classObject.set_numeric(position, value);
- // }
- public void set_numeric(String attributeName, Numeric_Value value)
- {
- classObject.nset_numeric(attributeName, value);
- }
-
- // public VArray_Object get_varray(Class_Position position)
- // {
- // return classObject.get_varray(position);
- // }
- public VArray_Object get_varray(String attributeName)
- {
- return classObject.nget_varray(attributeName);
- }
-
- // public ooId get_ooId(Class_Position position)
- // {
- // return classObject.get_ooId(position);
- // }
- public ooId get_ooId(String attributeName)
- {
- return classObject.nget_ooId(attributeName);
- }
-
- // public Class_Object get_class_obj(Class_Position position)
- // {
- // return classObject.get_class_obj(position);
- // }
-
- public Class_Object get_class_obj(String attributeName)
- {
- return classObject.nget_class_obj(attributeName);
- }
-
- // public void set_ooId(Class_Position position, ooId object)
- // {
- // classObject.set_ooId(position, object);
- // }
-
- public void set_ooId(String attributeName, ooId object)
- {
- classObject.nset_ooId(attributeName, object);
- }
-
- /**
- * Return the CDOID for the ObjyObject, it will go up to the base revision, and return it's ID.
- */
- public CDOID getRevisionId()
- {
- if (revisionId == null)
- {
- if (hasBaseRelationship())
- {
- baseClassObject = getBaseRelationship().get_class_obj();
- revisionId = baseClassObject.objectID();
- }
- else
- {
- revisionId = objectId;
- }
- }
-
- return OBJYCDOIDUtil.getCDOID(revisionId);
- }
-
- public ObjyObject getBaseObject()
- {
- ObjyObject objyObject = null;
- if (hasBaseRelationship())
- {
- baseClassObject = getBaseRelationship().get_class_obj();
- objyObject = new ObjyObject(baseClassObject);
- }
- else
- {
- objyObject = this;
- }
- return objyObject;
- }
-
- private boolean hasBaseRelationship()
- {
- if (!hasBaseRelationshipChecked)
- {
- hasBaseRelationshipChecked = getBaseRelationship().exists();
- }
- return hasBaseRelationshipChecked;
- }
-
- // private boolean hasRevisionsRelationship()
- // {
- // if (!hasRevisionsRelChecked)
- // {
- // hasRevisionsRelChecked = getRevisionsRelationship().exists();
- // }
- // return hasRevisionsRelChecked;
- // }
- //
- // private boolean hasLastRevisionRelationship()
- // {
- // if (!hasLastRevisionRelChecked)
- // {
- // hasLastRevisionRelChecked = getLastRevisionRelationship().exists();
- // }
- // return hasLastRevisionRelChecked;
- // }
-
- /**
- * Return the revision that satisfies the timeStamp and branchId constrains.
- *
- * @param objyObjectManager
- */
- public ObjyObject getRevision(long timeStamp, int branchId, ObjyObjectManager objyObjectManager)
- {
- ObjyObject objyRevision = null;
-
- // // evaluate current first.
- // if (evaluateRevision(timeStamp, branchId, this))
- // {
- // return this;
- // }
- //
- // // if we don't have other revisions.
- // if (!getLastRevisionRelationship().exists())
- // {
- // return null;
- // }
-
- // check last revision first.
- objyRevision = getLastRevision(objyObjectManager);
- if (evaluateRevision(timeStamp, branchId, objyRevision))
- {
- return objyRevision;
- }
-
- ObjyObject possibleRevision = null;
-
- // check first revision.
- if (evaluateRevision(timeStamp, branchId, this))
- {
- possibleRevision = this;
- }
-
- @SuppressWarnings("unchecked")
- Iterator<ooObj> itr = getRevisionsRelationship().get_iterator();
- while (itr.hasNext())
- {
- // objyRevision = new ObjyObject(itr.next());
- objyRevision = objyObjectManager.getObject(itr.next().getOid());
- if (evaluateRevision(timeStamp, branchId, objyRevision))
- {
- possibleRevision = objyRevision;
- }
- }
-
- return possibleRevision;
- }
-
- /**
- * return true if the objyRevision satisfies the constrains. This function is only called in case of auditing, and
- * branching.
- */
- protected boolean evaluateRevision(long timeStamp, int branchId, ObjyObject objyRevision)
- {
- // check the branchId first.
- if (objyRevision.getBranchId() == branchId)
- {
- // long revisedTS = objyRevision.getRevisedTime();
- // if (timeStamp != CDOBranchPoint.UNSPECIFIED_DATE)
- // {
- // long creationTS = objyRevision.getCreationTime();
- // if (creationTS <= timeStamp && (revisedTS == CDOBranchPoint.UNSPECIFIED_DATE || revisedTS >= timeStamp))
- // // if (creationTS >= timeStamp && (revisedTS == CDOBranchPoint.UNSPECIFIED_DATE || revisedTS <= timeStamp))
- // {
- // return true;
- // }
- // }
- // else if (revisedTS == CDOBranchPoint.UNSPECIFIED_DATE) // return the latest version in that branch.
- // {
- // return true;
- // }
-
- long creationTS = objyRevision.getCreationTime();
- long revisedTS = objyRevision.getRevisedTime();
- if (CDOCommonUtil.isValidTimeStamp(timeStamp, creationTS, revisedTS))
- {
- return true;
- }
- }
- return false;
- }
-
- public void detach(int version, CDOBranch branch, long timeStamp)
- {
- ObjyClass objyClass = ObjySchema.getObjyClass(ObjyBase.CLASS_NAME);
- Class_Object detachedClassObject = Class_Object.new_persistent_object(objyClass.getASClass(), objectId, false);
- if (TRACER_DEBUG.isEnabled())
- {
- ObjyObjectManager.newInternalObjCount++;
- }
- ObjyObject detachedObjyObject = null;
-
- try
- {
- detachedObjyObject = new ObjyObject(detachedClassObject);
-
- detachedObjyObject.setVersion(-(version + 1));
- detachedObjyObject.setBranchId(branch.getID());
- detachedObjyObject.setCreationTime(timeStamp);
-
- // add it to the revisions.
- addToRevisions(detachedObjyObject);
- }
- catch (RuntimeException ex)
- {
- ex.printStackTrace();
- }
- }
-
-}
+/*
+ * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Ibrahim Sallam - initial API and implementation
+ */
+package org.eclipse.emf.cdo.server.internal.objectivity.db;
+
+import org.eclipse.emf.cdo.common.branch.CDOBranch;
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDExternal;
+import org.eclipse.emf.cdo.common.model.EMFUtil;
+import org.eclipse.emf.cdo.common.revision.CDOList;
+import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
+import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
+import org.eclipse.emf.cdo.server.internal.objectivity.ObjectivityStoreAccessor;
+import org.eclipse.emf.cdo.server.internal.objectivity.bundle.OM;
+import org.eclipse.emf.cdo.server.internal.objectivity.mapper.IManyTypeMapper;
+import org.eclipse.emf.cdo.server.internal.objectivity.mapper.ISingleTypeMapper;
+import org.eclipse.emf.cdo.server.internal.objectivity.mapper.ITypeMapper;
+import org.eclipse.emf.cdo.server.internal.objectivity.mapper.ObjyMapper;
+import org.eclipse.emf.cdo.server.internal.objectivity.mapper.SingleReferenceMapper;
+import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyArrayListId;
+import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyArrayListString;
+import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyBase;
+import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyFeatureMapArrayList;
+import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyFeatureMapEntry;
+import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyProxy;
+import org.eclipse.emf.cdo.server.internal.objectivity.utils.OBJYCDOIDUtil;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDOList;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
+
+import org.eclipse.net4j.util.collection.MoveableList;
+import org.eclipse.net4j.util.om.trace.ContextTracer;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.FeatureMap;
+
+import com.objy.as.app.Class_Object;
+import com.objy.as.app.Numeric_Value;
+import com.objy.as.app.Relationship_Object;
+import com.objy.as.app.String_Value;
+import com.objy.as.app.VArray_Object;
+import com.objy.as.app.d_Attribute;
+import com.objy.as.app.d_Class;
+import com.objy.as.app.d_Ref_Type;
+import com.objy.db.app.ooId;
+import com.objy.db.app.ooObj;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Ibrahim Sallam
+ */
+public class ObjyObject
+{
+
+ private static final ContextTracer TRACER_DEBUG = new ContextTracer(OM.DEBUG, ObjyObject.class);
+
+ protected Class_Object classObject;
+
+ protected ObjyClass objyClass;
+
+ protected Class_Object baseClassObject = null;
+
+ protected Relationship_Object baseRel = null;
+
+ protected boolean hasBaseRelationshipChecked = false;
+
+ protected Relationship_Object revisionsRel = null;
+
+ protected Relationship_Object lastRevisionRel = null;
+
+ protected ooId objectId;
+
+ protected ooId revisionId = null;
+
+ protected int version = Integer.MAX_VALUE;
+
+ public static int fetchCount = 0;
+
+ public static int updateCount = 0;
+
+ public static long createObjectTime = 0;
+
+ public static int createObjectCount = 0;
+
+ // protected boolean isRoot = false;
+
+ // IS: for stats.
+ // public static int count = 0;
+ // public static long tDiff = 0;
+
+ // good for fast access.
+ // private Map<Class_Position, Object> featureMap = new HashMap<Class_Position, Object>();
+ private Map<String, Object> featureMap = new HashMap<String, Object>();
+
+ public ObjyObject(Class_Object classObject)
+ {
+ // long tStart = System.currentTimeMillis();
+
+ this.classObject = classObject;
+ d_Class dClass = classObject.type_of();
+ String fullyQualifiedClassName = null;
+
+ try
+ {
+
+ if (dClass.namespace_name() != null)
+ {
+ fullyQualifiedClassName = dClass.namespace_name() + ":" + dClass.name();
+ }
+ else
+ {
+ fullyQualifiedClassName = dClass.name();
+ }
+
+ objyClass = ObjySchema.getObjyClass(fullyQualifiedClassName);
+
+ // if (dClass.has_base_class(ObjyBase.CLASS_NAME))
+ // {
+ // if (TRACER_DEBUG.isEnabled())
+ // {
+ // TRACER_DEBUG.format("...classObject type: {0} - oid: {1}", classObject.type_of().name(), classObject
+ // .objectID().getStoreString());
+ // }
+ // getBaseRelationship(classObject);
+ // if (!baseRel.exists())
+ // {
+ // // we are the base...
+ // getRevisionsRelationship(classObject);
+ // getLastRevisionRelationship(classObject);
+ // }
+ // else
+ // {
+ // baseClassObject = baseRel.get_class_obj();
+ // // TODO - we might want to delay getting the list of versions unless we need them.
+ // // revisionsRel = baseClassObject.get_relationship(objyClass.resolve_position(ObjyBase.ATT_REVISIONS));
+ // // lastRevisionRel = baseClassObject.get_relationship(objyClass.resolve_position(ObjyBase.ATT_LAST_REVISION));
+ // }
+ // }
+ setObjectId(classObject.objectID());
+ // version = classObject.get_numeric(objyClass.resolve_position(ObjyBase.ATT_VERSION)).intValue();
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ // count++;
+ // tDiff += System.currentTimeMillis() - tStart;
+ }
+
+ private Relationship_Object getLastRevisionRelationship()
+ {
+ if (lastRevisionRel == null)
+ {
+ lastRevisionRel = classObject.nget_relationship(ObjyBase.ATT_LAST_REVISION);
+ }
+ return lastRevisionRel;
+ }
+
+ private Relationship_Object getRevisionsRelationship()
+ {
+ if (revisionsRel == null)
+ {
+ // revisionsRel = classObject.get_relationship(objyClass.resolve_position(ObjyBase.ATT_REVISIONS));
+ revisionsRel = classObject.nget_relationship(ObjyBase.ATT_REVISIONS);
+ }
+ return revisionsRel;
+ }
+
+ private Relationship_Object getBaseRelationship()
+ {
+ if (baseRel == null)
+ {
+ // baseRel = classObject.get_relationship(objyClass.resolve_position(ObjyBase.ATT_BASE));
+ baseRel = classObject.nget_relationship(ObjyBase.ATT_BASE);
+ }
+ return baseRel;
+ }
+
+ public ObjyClass objyClass()
+ {
+ return objyClass;
+ }
+
+ public Class_Object ooClassObject()
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ return classObject;
+ }
+
+ public void setObjectId(ooId objectId)
+ {
+ this.objectId = objectId;
+ }
+
+ /**
+ *
+ */
+ public ooId ooId()
+ {
+ return objectId;
+ }
+
+ public void setEContainer(Object containerID)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+
+ // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINERID);
+
+ SingleReferenceMapper.INSTANCE.setValue(this, ObjyBase.ATT_CONTAINERID/* position */, containerID);
+ }
+
+ public Object getEContainer()
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+
+ // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINERID);
+ Object value = SingleReferenceMapper.INSTANCE.getValue(this, ObjyBase.ATT_CONTAINERID/* position */);
+
+ return value;
+ }
+
+ public ooId getEContainerAsOid()
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+
+ // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINERID);
+ ooId childOid = get_ooId(ObjyBase.ATT_CONTAINERID/* position */);
+ return childOid;
+ }
+
+ public void setEResource(Object resourceID)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+
+ // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_RESOURCEID);
+ SingleReferenceMapper.INSTANCE.setValue(this, ObjyBase.ATT_RESOURCEID/* position */, resourceID);
+
+ }
+
+ public Object getEResource()
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+
+ // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_RESOURCEID);
+ Object value = SingleReferenceMapper.INSTANCE.getValue(this, ObjyBase.ATT_RESOURCEID/* position */);
+
+ return value;
+ }
+
+ public ooId getEResourceAsOid()
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_RESOURCEID);
+ ooId childOid = get_ooId(ObjyBase.ATT_RESOURCEID/* position */);
+ return childOid;
+ }
+
+ public void setEContainingFeature(int contFeature)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINER_FEATUERID);
+ set_numeric(ObjyBase.ATT_CONTAINER_FEATUERID/* position */, new Numeric_Value(contFeature));
+ }
+
+ public int getEContainingFeature()
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ // Class_Position position = objyClass.resolve_position(ObjyBase.ATT_CONTAINER_FEATUERID);
+ return get_numeric(ObjyBase.ATT_CONTAINER_FEATUERID/* position */).intValue();
+ }
+
+ /**
+ * This is used to cache the composite features, (manyAttributes, manyReference, and featureMap. TBD - verify the need
+ * of this.
+ */
+ // public Object getFeatureList(Class_Position position)
+ // {
+ // return featureMap.get(position);
+ // }
+ public Object getFeatureList(String featureName)
+ {
+ return featureMap.get(featureName);
+ }
+
+ // public void setFeatureList(Class_Position position, Object object)
+ // {
+ // featureMap.put(position, object);
+ // }
+ public void setFeatureList(String featureName, Object object)
+ {
+ featureMap.put(featureName, object);
+ }
+
+ public int getVersion()
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ // if (version == Integer.MAX_VALUE)
+ {
+ version = classObject.nget_numeric(ObjyBase.ATT_VERSION).intValue();
+ }
+ return version;
+ }
+
+ public void setVersion(int version)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ classObject.nset_numeric(ObjyBase.ATT_VERSION, new Numeric_Value(version));
+ // getVersion(); // TBD, verify the need for this call!!!!
+ this.version = version;
+ }
+
+ public long getCreationTime()
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ long creationTime = classObject.nget_numeric(ObjyBase.ATT_CREATION_TIME).longValue();
+ return creationTime;
+ }
+
+ public void setCreationTime(long creationTime)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ classObject.nset_numeric(ObjyBase.ATT_CREATION_TIME, new Numeric_Value(creationTime));
+ }
+
+ public long getRevisedTime()
+ {
+ long revisedTime = 0;
+
+ try
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ revisedTime = classObject.nget_numeric(ObjyBase.ATT_REVISED_TIME).longValue();
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ return revisedTime;
+ }
+
+ public void setRevisedTime(long revisedTime)
+ {
+ try
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ classObject.nset_numeric(ObjyBase.ATT_REVISED_TIME, new Numeric_Value(revisedTime));
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ public void setBranchId(int branchId)
+ {
+ try
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ classObject.nset_numeric(ObjyBase.ATT_BRANCHID, new Numeric_Value(branchId));
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ }
+
+ public long getBranchId()
+ {
+ int branchId = 0;
+ try
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ branchId = classObject.nget_numeric(ObjyBase.ATT_BRANCHID).intValue();
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ return branchId;
+ }
+
+ public ObjyObject copy(EClass eClass, ObjyObjectManager objyObjectManager)
+ {
+ ObjyObject newObjyObject = null;
+ ooObj obj = ooObj.create_ooObj(objectId);
+ ooObj newObj = (ooObj)obj.copy(obj); // Objy internal copy.
+ // Dependent structures, for example array of refs are not copies, so we
+ // have to iterate and copy (deep copy).
+ // newObjyObject = new ObjyObject(Class_Object.class_object_from_oid(newObj.getOid()));
+ newObjyObject = objyObjectManager.getObject(newObj.getOid());
+
+ try
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ TRACER_DEBUG.trace("ObjyObject.copy() - oid:" + ooId().getStoreString() + " version:" + getVersion());
+ }
+ for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
+ {
+ if (!(feature instanceof EAttribute || feature instanceof EReference) || !EMFUtil.isPersistent(feature))
+ {
+ continue;
+ }
+
+ if (feature.isMany())
+ {
+ // copy this feature to the new object.
+ // copy this feature to the new object.
+ // get the attribute using feature name.
+ d_Attribute attribute = objyClass.resolve_attribute(feature.getName());
+ // System.out.println("... checking feature: " + feature.getName() + - attributeType: "
+ // + attribute.type_of().name());
+ if (attribute != null && attribute.type_of() instanceof d_Ref_Type)
+ {
+ // IS:temptest Class_Position position = objyClass.resolve_position(feature.getName());
+ // ooId refOoId = get_ooId(position);
+ Class_Object cObj = get_class_obj(feature.getName());
+ if (cObj != null)
+ {
+ // System.out.println("\t\t referenced Class_Object with OID: " +cObj.objectID().getStoreString());
+ d_Class refClass = cObj.type_of();
+ String refClassName = refClass.name();
+ if (refClassName.equals(ObjyFeatureMapArrayList.ClassName))
+ {
+ // we'll need to copy this one.
+ TRACER_DEBUG.trace("\t TBD - copying ObjyFeatureMapArrayList attr: " + attribute.name());
+ }
+ else if (refClassName.equals(ObjyArrayListString.ClassName))
+ {
+ // we'll need to copy this one.
+ TRACER_DEBUG.trace("\t TBD - copying ObjyArrayListString attr: " + attribute.name());
+ }
+ else if (refClassName.equals(ObjyArrayListId.className))
+ {
+ // we'll need to copy this one.
+ // System.out.println("\t copying ObjyArrayListId attr: " + attibute.name());
+ ObjyArrayListId arrayListId = new ObjyArrayListId(cObj);
+ ooObj newArrayListId = arrayListId.copy(newObj);
+ newObjyObject.set_ooId(feature.getName(), newArrayListId.getOid());
+ }
+ else if (refClassName.equals(ObjyProxy.className))
+ {
+ // we'll need to copy this one.
+ TRACER_DEBUG.trace("\t TBD - copying ObjyProxy attr: " + attribute.name());
+ }
+ }
+ }
+
+ }
+ }
+ }
+ catch (com.objy.as.asException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ return newObjyObject;
+ }
+
+ /**
+ * Use the revision info to update the object in the store.
+ *
+ * @param storeAccessor
+ * @param revision
+ */
+ public void update(ObjectivityStoreAccessor storeAccessor, InternalCDORevision revision)
+ {
+ updateCount++;
+
+ try
+ {
+
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ TRACER_DEBUG.trace("ObjyObject.update() - oid:" + ooId().getStoreString() + " - version:"
+ + revision.getVersion());
+ }
+
+ // this is done in the updateDate()
+ // setEContainer(revision.getContainerID());
+ // setEResource(revision.getResourceID());
+ // setEContainingFeature(revision.getContainingFeatureID());
+
+ updateData(storeAccessor, revision);
+ }
+ catch (com.objy.as.asException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * Use the revision info to update the object in the store.
+ *
+ * @param storeAccessor
+ * @param revision
+ */
+ private void updateData(ObjectivityStoreAccessor storeAccessor, InternalCDORevision revision)
+ {
+ EClass eClass = revision.getEClass();
+
+ try
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ TRACER_DEBUG.trace("=> ObjyObject.updateData() - oid:" + ooId().getStoreString() + //$NON-NLS-1$
+ " - version:" + revision.getVersion()); //$NON-NLS-1$
+ }
+
+ setVersion(revision.getVersion());
+
+ setEContainer(revision.getContainerID());
+ setEResource(revision.getResourceID());
+ setEContainingFeature(revision.getContainingFeatureID());
+ setCreationTime(revision.getTimeStamp());
+ setRevisedTime(revision.getRevised());
+ setBranchId(revision.getBranch().getID());
+
+ for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
+ {
+ if (!(feature instanceof EAttribute || feature instanceof EReference) || !EMFUtil.isPersistent(feature))
+ {
+ continue;
+ }
+
+ ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
+ if (mapper == null)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ TRACER_DEBUG.trace("In " + ooId().getStoreString() + " - Can't find mapper for feature "
+ + feature.getName());
+ }
+ continue;
+ }
+ // -----------------------------------------------
+ // TODO - this code definitely need refactoring!!!
+ // -----------------------------------------------
+
+ // Class_Position attr = objyClass.resolve_position(feature.getName());
+ if (feature.isMany())
+ {
+ // Object newValue = revision.getValue(feature);
+ // --- TEMP solution to fix one of the tests...
+ CDOList list = revision.getList(feature);
+ Object[] values = new Object[list.size()];
+ // we need to pass a list of ooId objects.
+ // TODO - This need some work!!!!
+ for (int i = 0; i < values.length; i++)
+ {
+ // TODO - this code need refactoring...
+ Object value = list.get(i);
+ if (null == value)
+ {
+ values[i] = value;
+ continue;
+ }
+ else if (value instanceof CDOIDExternal)
+ {
+ TRACER_DEBUG
+ .trace("... CDOIDExternal inserted, at:" + i + ", content:" + ((CDOIDExternal)value).getURI());
+ // System.out.println("value is a proxy object - it should be handled by the mapper.");
+ // create an ObjyProxy object to hold the the value.
+ ObjyProxy proxyObject = ObjyProxy.createObject(ooId());
+ proxyObject.setUri(((CDOIDExternal)value).getURI());
+ values[i] = proxyObject.ooId();
+
+ }
+ else if (value instanceof CDOID)
+ {
+ values[i] = OBJYCDOIDUtil.getooId((CDOID)value);
+ }
+ else if (value instanceof FeatureMap.Entry)
+ {
+ FeatureMap.Entry entry = (FeatureMap.Entry)value;
+ EStructuralFeature entryFeature = entry.getEStructuralFeature();
+ Object entryValue = entry.getValue();
+
+ ooId oid = null;
+ if (entryValue instanceof CDOIDExternal)
+ {
+ TRACER_DEBUG.trace("... CDOIDExternal inserted, at:" + i + ", content:"
+ + ((CDOIDExternal)entryValue).getURI());
+ // System.out.println("value is a proxy object - it should be handled by the mapper.");
+ // create an ObjyProxy object to hold the the value.
+ ObjyProxy proxyObject = ObjyProxy.createObject(ooId());
+ proxyObject.setUri(((CDOIDExternal)entryValue).getURI());
+ oid = proxyObject.ooId();
+ }
+ else if (entryValue instanceof CDOID)
+ {
+ oid = OBJYCDOIDUtil.getooId((CDOID)entryValue);
+ }
+ else
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ TRACER_DEBUG.trace("OBJY: don't know what kind of entryValue is this!!! - " + entryValue);
+ }
+ }
+ // FeatureMapEntry is a presistent class.
+ ObjyFeatureMapEntry featureMapEntry = new ObjyFeatureMapEntry(entryFeature.getFeatureID(), oid, objectId);
+
+ // this.cluster(featureMapEntry);
+ values[i] = featureMapEntry;
+ }
+ else if (value.equals(InternalCDOList.UNINITIALIZED))
+ {
+ TRACER_DEBUG.format("...GOT UNINITIALIZED at {0}, listSize:{1}, feature:{2}, oid:{3}", i, values.length,
+ feature.getName(), objectId.getStoreString());
+ continue;
+ }
+ else
+ {
+ // different feature then.
+ values[i] = value;
+ }
+ }
+
+ ((IManyTypeMapper)mapper).setAll(this, feature, 0, values);
+ }
+ else
+ {
+ Object newValue = revision.get(feature, feature.getFeatureID());
+ // if (newValue instanceof CDOIDExternal)
+ // {
+ // System.out.println("value is a proxy object");
+ // }
+ ((ISingleTypeMapper)mapper).setValue(this, feature, newValue);
+ }
+ }
+ }
+ catch (com.objy.as.asException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ public ObjyObject getLastRevision(ObjyObjectManager objyObjectManager)
+ {
+ if (!getLastRevisionRelationship().exists())
+ {
+ return this;
+ }
+
+ // Class_Object lastRevision = lastRevisionRel.get_class_obj();
+ ooId lastRevisionOid = getLastRevisionRelationship().get_ooId();
+ // return new ObjyObject(lastRevision);
+ return objyObjectManager.getObject(lastRevisionOid);
+ }
+
+ public ObjyObject getRevisionByVersion(int version, long branchId, ObjyObjectManager objyObjectManager)
+ {
+ ObjyObject objyRevision = null;
+ int objectVersion = getVersion();
+ long objectBranchId = getBranchId();
+
+ if (branchId == objectBranchId && Math.abs(objectVersion) == version)
+ {
+ // there is a first time for everything...
+ return this;
+ }
+
+ // check last revision first.
+ objyRevision = getLastRevision(objyObjectManager);
+ objectVersion = objyRevision.getVersion();
+ objectBranchId = objyRevision.getBranchId();
+ if (branchId == objectBranchId && Math.abs(objectVersion) == version)
+ {
+ return objyRevision;
+ }
+
+ // Session.getCurrent().setReturn_Class_Object(true);
+ // int numRevisions = (int) revisions.size();
+
+ @SuppressWarnings("unchecked")
+ Iterator<ooObj> itr = getRevisionsRelationship().get_iterator();
+ while (itr.hasNext())
+ {
+ // objyRevision = new ObjyObject(itr.next());
+ objyRevision = objyObjectManager.getObject(itr.next().getOid());
+ objectVersion = objyRevision.getVersion();
+ objectBranchId = objyRevision.getBranchId();
+ if (branchId == objectBranchId && Math.abs(objectVersion) == version)
+ {
+ return objyRevision;
+ }
+ objyRevision = null;
+ }
+
+ return null;
+ }
+
+ public void addToRevisions(ObjyObject objyRevision)
+ {
+ try
+ {
+ getRevisionsRelationship().add(objyRevision.objectId);
+ // set it as last rev.
+ getLastRevisionRelationship().clear(); // Ouch!! performance issue...
+ getLastRevisionRelationship().form(objyRevision.objectId);
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ // /**
+ // * Wrapper around ObjyObject to allow clustering of other objects near this one.
+ // */
+ // private void cluster(ooObj otherObj)
+ // {
+ // try
+ // {
+ // ooObj thisObj = ooObj.create_ooObj(objectId);
+ // thisObj.cluster(otherObj);
+ // }
+ // catch (ObjyRuntimeException ex)
+ // {
+ // ex.printStackTrace();
+ // }
+ // }
+
+ /**
+ * Fetch data from the store and return a revision.
+ */
+ public boolean fetch(ObjectivityStoreAccessor storeAccessor, InternalCDORevision revision, int listChunk)
+ {
+ boolean bRet = true;
+ fetchCount++;
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ EClass eClass = revision.getEClass();
+
+ try
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ TRACER_DEBUG.trace("ObjyObject.fetch() - oid:" + ooId().getStoreString() + " version:" + getVersion());
+ }
+ // Put the version of the objects;
+ revision.setVersion(getVersion());
+ revision.setContainerID(getEContainer());
+ revision.setResourceID((CDOID)getEResource());
+ revision.setContainingFeatureID(getEContainingFeature());
+ long creationTime = getCreationTime();
+ long revisedTime = getRevisedTime();
+
+ if (TRACER_DEBUG.isEnabled())
+ {
+ TRACER_DEBUG.trace("... ObjyObject.creationTime: " + creationTime);
+ TRACER_DEBUG.trace("... ObjyObject.revisedTime : " + revisedTime);
+ }
+
+ revision.setRevised(revisedTime);
+
+ for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
+ {
+ if (!(feature instanceof EAttribute || feature instanceof EReference) || !EMFUtil.isPersistent(feature))
+ {
+ continue;
+ }
+
+ if (feature.isMany())
+ {
+ int featureSize = size(feature);
+ int chunkSize = featureSize;
+ if (listChunk != CDORevision.UNCHUNKED && listChunk > 0)
+ {
+ chunkSize = Math.min(chunkSize, listChunk);
+ }
+
+ Object[] objects = getAll(feature, 0, chunkSize);
+ // if (size > 0)
+ {
+ // TODO - we could use getList() then fill the array with values, we
+ // also
+ // need to consider the chunking...
+ // InternalCDOList cdoList =
+ // (InternalCDOList)CDOListFactory.DEFAULT.createList(objects.length,
+ // objects.length, 0);
+ // TODO - use the following line instead of creating the cdoList
+ // above.
+ MoveableList<Object> list = revision.getList(feature);
+
+ // size = Math.min(size, 0);
+ for (int i = 0; i < chunkSize; i++)
+ {
+ if (objects[i] instanceof ooId)
+ {
+ // TODO - this code need refactoring....
+ CDOID cdoId = null;
+ ooId objyOid = (ooId)objects[i];
+ if (objyOid.isNull())
+ {
+ cdoId = OBJYCDOIDUtil.getCDOID(objyOid);
+ }
+ else
+ {
+ Class_Object refClassObject = Class_Object.class_object_from_oid((ooId)objects[i]);
+
+ if (refClassObject.type_of().name().equals(ObjyProxy.className))
+ {
+ // System.out.println("OBJY: Got proxy: " + refClassObject.objectID().getStoreString());
+ ObjyProxy proxyObject = new ObjyProxy(refClassObject);
+ // cdoList.set(i,
+ // OBJYCDOIDUtil.createCDIDExternal(proxyObject));
+ cdoId = OBJYCDOIDUtil.createCDIDExternal(proxyObject);
+ }
+ else
+ {
+ cdoId = OBJYCDOIDUtil.getCDOID(objyOid);
+ }
+ refClassObject = null;
+ }
+ list.add(cdoId);
+
+ continue;
+ }
+ else if (objects[i] instanceof ObjyFeatureMapEntry)
+ {
+ FeatureMap.Entry entry = getFeatureMapEntry(eClass, (ObjyFeatureMapEntry)objects[i]);
+ list.add(entry);
+ }
+ else
+ {
+ // different feature then.
+ // System.out.println("-->> Hmmm fetch() feature (" + i + ") -> feature:" + feature.getName()
+ // + " - value:" + objects[i]);
+ // cdoList.set(i, objects[i]);
+ list.add(objects[i]);
+ }
+ }
+ // fill the rest if needed.
+ if (featureSize - chunkSize > 0)
+ {
+ for (int i = 0; i < featureSize - chunkSize; i++)
+ {
+ list.add(InternalCDOList.UNINITIALIZED);
+ }
+ }
+ }
+ }
+ else
+ {
+ Object object = get(feature, 0);
+
+ /**
+ * TODO - verify if this is needed for 2.x if (cdoFeature.getType() == CDOType.CUSTOM) { object =
+ * EcoreUtil.convertToString((EDataType)eFeature.getEType(), object); }
+ */
+ revision.set(feature, 0, object);
+ }
+ }
+ }
+ catch (com.objy.as.asException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ return bRet;
+ }
+
+ /**
+ * Fetch data for a specific feature from the store, and return a list of objects. Used by
+ * ObjectivityStoreChunkAccessor
+ */
+ public List<Object> fetchList(ObjectivityStoreAccessor storeAccessor, EStructuralFeature feature, int startIndex,
+ int chunkSize)
+ {
+ fetchCount++;
+
+ List<Object> results = new ArrayList<Object>();
+ EClass eClass = feature.getEContainingClass();
+
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+
+ try
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ TRACER_DEBUG.trace("ObjyObject.fetch() - feature:" + feature.getName() + "from Object: "
+ + ooId().getStoreString() + " version:" + getVersion());
+ }
+ int featureSize = size(feature);
+ chunkSize = Math.min(featureSize - startIndex, chunkSize);
+
+ Object[] objects = getAll(feature, startIndex, chunkSize);
+ convertToCdoList(objects, results, eClass, chunkSize);
+ }
+ catch (com.objy.as.asException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ return results;
+ }
+
+ /**
+ * Function thats takes a list of Objy objects and convert them to CDO IDs This function is used by queryXRefs() as
+ * well.
+ */
+ protected void convertToCdoList(Object[] objects, List<Object> results, EClass eClass, int chunkSize)
+ {
+ {
+ for (int i = 0; i < chunkSize; i++)
+ {
+ if (objects[i] instanceof ooId)
+ {
+ // TODO - this code need refactoring....
+
+ // System.out.println("-->> IS: getting Class_Object from OID: "
+ // + childObject.getStoreString());
+ CDOID cdoId = null;
+ ooId objyOid = (ooId)objects[i];
+ if (objyOid.isNull())
+ {
+ cdoId = OBJYCDOIDUtil.getCDOID(objyOid);
+ }
+ else
+ {
+ Class_Object refClassObject = Class_Object.class_object_from_oid(objyOid);
+
+ if (refClassObject.type_of().name().equals(ObjyProxy.className))
+ {
+ ObjyProxy proxyObject = new ObjyProxy(refClassObject);
+ cdoId = OBJYCDOIDUtil.createCDIDExternal(proxyObject);
+ }
+ else
+ {
+ cdoId = OBJYCDOIDUtil.getCDOID(objyOid);
+ }
+ refClassObject = null;
+ }
+
+ results.add(cdoId);
+ continue;
+
+ }
+ else if (objects[i] instanceof ObjyFeatureMapEntry)
+ {
+ FeatureMap.Entry entry = getFeatureMapEntry(eClass, (ObjyFeatureMapEntry)objects[i]);
+ results.add(entry);
+ }
+ }
+ }
+ }
+
+ private FeatureMap.Entry getFeatureMapEntry(EClass eClass, ObjyFeatureMapEntry mapEntry)
+ {
+ ooId oid = mapEntry.getObject();
+ CDOID id = null;
+ Class_Object refClassObject = Class_Object.class_object_from_oid(oid);
+ if (refClassObject.type_of().name().equals(ObjyProxy.className))
+ {
+ ObjyProxy proxyObject = new ObjyProxy(refClassObject);
+ id = OBJYCDOIDUtil.createCDIDExternal(proxyObject);
+ }
+ else
+ {
+ id = OBJYCDOIDUtil.getCDOID(oid);
+ }
+
+ EStructuralFeature entryFeature = eClass.getEStructuralFeature(mapEntry.getTagId());
+ FeatureMap.Entry entry = CDORevisionUtil.createFeatureMapEntry(entryFeature, id);
+ return entry;
+ }
+
+ /**
+ * Get the size of the composite object using the store info.
+ *
+ * @param feature
+ * @return
+ */
+ private int size(EStructuralFeature feature)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+ int size = 0;
+
+ // Class_Position position = objyClass().resolve_position(feature.getName());
+ try
+ {
+ IManyTypeMapper mapper = (IManyTypeMapper)ObjyMapper.INSTANCE.getTypeMapper(feature);
+
+ size = mapper.size(this, feature);
+
+ if (TRACER_DEBUG.isEnabled())
+ {
+ // TODO - verify the message.
+ TRACER_DEBUG.trace("Size of object " + ooId().getStoreString() + " - is: " + size + " - feature: "
+ + feature.getName());
+ }
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ return size;
+ }
+
+ /**
+ * Get the value of an attribute from the persistent object.
+ */
+ public Object get(EStructuralFeature feature)
+ {
+ if (feature.isMany())
+ {
+ return getAll(feature, 0, CDORevision.UNCHUNKED);
+ }
+ return get(feature, 0);
+ }
+
+ /**
+ * Get the value of an attribute at index (if many) from the persistent object.
+ *
+ * @param feature
+ * @param index
+ * @return
+ */
+ private Object get(EStructuralFeature feature, int index)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ }
+
+ if (TRACER_DEBUG.isEnabled())
+ {
+ // TODO - verify the message.
+ TRACER_DEBUG.trace("Getting object " + objectId.getStoreString() + " <feature ' " + feature.getName() + "':"
+ + feature.getEType() + "> from " + this);
+ }
+
+ // Class_Position position =
+ // this.objyClass().resolve_position(feature.getName());
+
+ ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
+ Object value = null;
+ try
+ {
+ if (feature.isMany())
+ {
+ value = ((IManyTypeMapper)mapper).getValue(this, feature, index);
+ }
+ else
+ {
+ value = ((ISingleTypeMapper)mapper).getValue(this, feature);
+ }
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ return value;
+ }
+
+ /**
+ * Get all the values of an attribute, used for feature.isMany(). This function is also used by the
+ * ObjectivityStoreChunkReader to read chunks of data from a feature.
+ *
+ * @param feature
+ * @param size
+ * @return
+ */
+ protected Object[] getAll(EStructuralFeature feature, int startIndex, int chunkSize)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ // TODO - verify the message.
+ TRACER_DEBUG.trace("Get All objects for ID: " + ooId().getStoreString() + " <feature ' " + feature/*
+ * .getName( )
+ */
+ + "':" + feature.getEType() + "> from " + this);
+ }
+
+ assert feature.isMany();
+ Object[] values = null;
+
+ try
+ {
+ IManyTypeMapper mapper = (IManyTypeMapper)ObjyMapper.INSTANCE.getTypeMapper(feature);
+ values = mapper.getAll(this, feature, startIndex, chunkSize);
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ return values;
+ }
+
+ public void add(EStructuralFeature feature, int index, Object value)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ TRACER_DEBUG.trace("Adding object " + value + " to " + ooId().getStoreString());
+ }
+
+ assert feature.isMany();
+
+ try
+ {
+ IManyTypeMapper mapper = (IManyTypeMapper)ObjyMapper.INSTANCE.getTypeMapper(feature);
+
+ // -- TODO -- verify the need to this one.
+ // ensureObjectAttached(feature, value);
+
+ // I believe we do the conversion in the add()
+ // value = provider.convertToStore(ooObject, value);
+
+ mapper.add(this, feature, index, value);
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ /***
+ * @param feature
+ */
+ public void clear(EStructuralFeature feature)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ TRACER_DEBUG.trace("Clear List for " + ooId().getStoreString());
+ }
+
+ // Class_Position position = objyClass.resolve_position(feature.getName());
+ try
+ {
+ ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
+
+ ((IManyTypeMapper)mapper).clear(this, feature);
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ public void move(EStructuralFeature feature, int targetIndex, int sourceIndex)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ TRACER_DEBUG.trace("Move element from " + sourceIndex + " to " + targetIndex);
+ }
+ try
+ {
+ ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
+
+ ((IManyTypeMapper)mapper).move(this, feature, targetIndex, sourceIndex);
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ public Object remove(EStructuralFeature feature, int index)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ TRACER_DEBUG.trace("Remove object from '" + ooId().getStoreString() + "' at index " + index);
+ }
+
+ // Class_Position position = objyClass.resolve_position(feature.getName());
+ Object retObject = null;
+
+ try
+ {
+ IManyTypeMapper mapper = (IManyTypeMapper)ObjyMapper.INSTANCE.getTypeMapper(feature);
+
+ Object value = mapper.remove(this, feature, index);
+
+ if (feature instanceof EAttribute)
+ {
+ return value;
+ }
+
+ retObject = OBJYCDOIDUtil.getCDOID((ooId)value);
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ return retObject;
+
+ }
+
+ public Object set(EStructuralFeature feature, int index, Object value)
+ {
+ if (TRACER_DEBUG.isEnabled())
+ {
+ checkSession();
+ TRACER_DEBUG.trace("Set object '" + ooId().getStoreString() + "' feature : " + feature.getName());
+ }
+
+ /*
+ * int i =0; for (EClass superEClass : object.eClass().getESuperTypes()) { if
+ * (feature.getEContainingClass().isSuperTypeOf(superEClass)) { break; } i++; break; } String className = null; if
+ * (i == 0) { className = EProposedManager.getObjectivityClass(feature.getEContainingClass()); } else { className =
+ * EProposedManager.getObjectivityClass(feature.getEContainingClass(), true); } Class_Position position =
+ * ooObject.ooClass().resolve_position(className + "::" + feature.getName());
+ */
+ // Class_Position position = objyClass.resolve_position(feature.getName());
+ try
+ {
+ ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
+
+ // --- TODO --- verify the need...
+ // ensureObjectAttached(this, feature, value);
+
+ /***
+ * I believe we do the conversion in the setValue if (feature instanceof EReference) { value =
+ * CDOIDUtil.getooId((CDOID)value); }
+ ***/
+
+ if (feature.isMany())
+ {
+ ((IManyTypeMapper)mapper).setValue(this, feature, index, value);
+ }
+ else
+ {
+ ((ISingleTypeMapper)mapper).setValue(this, feature, value);
+ }
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ return value;
+ }
+
+ /***
+ * @param feature
+ */
+ public void unset(EStructuralFeature feature)
+ {
+ set(feature, 0, null);
+ }
+
+ protected void checkSession()
+ {
+ // 100610 - IS: disabled for now, since we have an issue with oojava_epl.jar "getSession()"
+ // is not available.
+ // if (TRACER_DEBUG.isEnabled())
+ // {
+ // try
+ // {
+ // if (!classObject.getPersistor().getSession().isOpen())
+ // {
+ // throw new Exception("Attempt to work on an object " + objectId.toString() + " without a trx. [Session: "
+ // + classObject.getPersistor().getSession() + "]");
+ // }
+ // }
+ // catch (Exception ex)
+ // {
+ // ex.printStackTrace();
+ // } // for debugging.
+ // }
+ }
+
+ /***
+ * Iterate over the attributes and references and mark them deleted. This will only be called in non-audit mode.
+ */
+ public void delete(ObjectivityStoreAccessor storeAccessor, ObjyObjectManager objectManager)
+ {
+ EClass eClass = ObjySchema.getEClass(storeAccessor.getStore(), objyClass());
+ try
+ {
+ for (EStructuralFeature feature : eClass.getEAllStructuralFeatures())
+ {
+ if (!(feature instanceof EAttribute || feature instanceof EReference) || !EMFUtil.isPersistent(feature))
+ {
+ continue;
+ }
+
+ if (feature.isMany())
+ {
+ deleteFeatureObjects(objectManager, feature);
+ }
+ else
+ {
+ ITypeMapper mapper = ObjyMapper.INSTANCE.getTypeMapper(feature);
+
+ if (mapper == null)
+ {
+ continue;
+ }
+ mapper.delete(this, feature);
+ }
+ }
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ private void deleteFeatureObjects(ObjyObjectManager objectManager, EStructuralFeature feature)
+ {
+ // TODO - verify that we can do this to all referenced list.
+ // I'm not sure if it's valid when you have many-many relationship.
+ Object[] objects = getAll(feature, 0, CDORevision.UNCHUNKED);
+
+ if (objects == null)
+ {
+ return;
+ }
+
+ for (int i = 0; i < objects.length; i++)
+ {
+ if (objects[i] instanceof ooId)
+ {
+ ooId oid = (ooId)objects[i];
+ // TODO - this code need refactoring....
+ ooObj obj = ooObj.create_ooObj(oid);
+ if (obj.isDead())
+ {
+ continue;
+ }
+
+ Class_Object refClassObject = Class_Object.class_object_from_oid(oid);
+
+ if (refClassObject.type_of().name().equals(ObjyProxy.className))
+ {
+ obj.delete();
+ }
+ else
+ {
+ // if this object is a parent (resourceId or
+ // containerId) for obj, then we
+ // need to mark obj version as (-1).
+ ObjyObject childObjyObject = objectManager.getObject(oid);
+ ooId containerId = childObjyObject.getEContainerAsOid();
+ ooId resourceId = childObjyObject.getEResourceAsOid();
+ int childVersion = childObjyObject.getVersion();
+ if (containerId.equals(objectId) || resourceId.equals(objectId))
+ {
+ childObjyObject.setVersion(-childVersion);
+ }
+
+ }
+ }
+ else if (objects[i] instanceof ObjyFeatureMapEntry)
+ {
+ ObjyFeatureMapEntry mapEntry = (ObjyFeatureMapEntry)objects[i];
+ ooId oid = mapEntry.getObject();
+ ooObj obj = ooObj.create_ooObj(oid);
+ obj.delete();
+ }
+ else
+ {
+ // different feature then.
+ if (TRACER_DEBUG.isEnabled())
+ {
+ TRACER_DEBUG.trace("-->> No process to delete() feature (" + i + ") -> feature:" + feature.getName()
+ + " - value:" + objects[i] + " ... nothing to do here.");
+ }
+ }
+ }
+ }
+
+ // Wrapper functions over class object.
+ // public Numeric_Value get_numeric(Class_Position position)
+ // {
+ // return classObject.get_numeric(position);
+ // }
+ public Numeric_Value get_numeric(String attributeName)
+ {
+ return classObject.nget_numeric(attributeName);
+ }
+
+ // public String_Value get_string(Class_Position position)
+ // {
+ // return classObject.get_string(position);
+ // }
+ public String_Value get_string(String attributeName)
+ {
+ return classObject.nget_string(attributeName);
+ }
+
+ // public void set_numeric(Class_Position position, Numeric_Value value)
+ // {
+ // classObject.set_numeric(position, value);
+ // }
+ public void set_numeric(String attributeName, Numeric_Value value)
+ {
+ classObject.nset_numeric(attributeName, value);
+ }
+
+ // public VArray_Object get_varray(Class_Position position)
+ // {
+ // return classObject.get_varray(position);
+ // }
+ public VArray_Object get_varray(String attributeName)
+ {
+ return classObject.nget_varray(attributeName);
+ }
+
+ // public ooId get_ooId(Class_Position position)
+ // {
+ // return classObject.get_ooId(position);
+ // }
+ public ooId get_ooId(String attributeName)
+ {
+ return classObject.nget_ooId(attributeName);
+ }
+
+ // public Class_Object get_class_obj(Class_Position position)
+ // {
+ // return classObject.get_class_obj(position);
+ // }
+
+ public Class_Object get_class_obj(String attributeName)
+ {
+ return classObject.nget_class_obj(attributeName);
+ }
+
+ // public void set_ooId(Class_Position position, ooId object)
+ // {
+ // classObject.set_ooId(position, object);
+ // }
+
+ public void set_ooId(String attributeName, ooId object)
+ {
+ classObject.nset_ooId(attributeName, object);
+ }
+
+ /**
+ * Return the CDOID for the ObjyObject, it will go up to the base revision, and return it's ID.
+ */
+ public CDOID getRevisionId()
+ {
+ if (revisionId == null)
+ {
+ if (hasBaseRelationship())
+ {
+ baseClassObject = getBaseRelationship().get_class_obj();
+ revisionId = baseClassObject.objectID();
+ }
+ else
+ {
+ revisionId = objectId;
+ }
+ }
+
+ return OBJYCDOIDUtil.getCDOID(revisionId);
+ }
+
+ public ObjyObject getBaseObject()
+ {
+ ObjyObject objyObject = null;
+ if (hasBaseRelationship())
+ {
+ baseClassObject = getBaseRelationship().get_class_obj();
+ objyObject = new ObjyObject(baseClassObject);
+ }
+ else
+ {
+ objyObject = this;
+ }
+ return objyObject;
+ }
+
+ private boolean hasBaseRelationship()
+ {
+ if (!hasBaseRelationshipChecked)
+ {
+ hasBaseRelationshipChecked = getBaseRelationship().exists();
+ }
+ return hasBaseRelationshipChecked;
+ }
+
+ // private boolean hasRevisionsRelationship()
+ // {
+ // if (!hasRevisionsRelChecked)
+ // {
+ // hasRevisionsRelChecked = getRevisionsRelationship().exists();
+ // }
+ // return hasRevisionsRelChecked;
+ // }
+ //
+ // private boolean hasLastRevisionRelationship()
+ // {
+ // if (!hasLastRevisionRelChecked)
+ // {
+ // hasLastRevisionRelChecked = getLastRevisionRelationship().exists();
+ // }
+ // return hasLastRevisionRelChecked;
+ // }
+
+ /**
+ * Return the revision that satisfies the timeStamp and branchId constrains.
+ *
+ * @param objyObjectManager
+ */
+ public ObjyObject getRevision(long timeStamp, int branchId, ObjyObjectManager objyObjectManager)
+ {
+ ObjyObject objyRevision = null;
+
+ // // evaluate current first.
+ // if (evaluateRevision(timeStamp, branchId, this))
+ // {
+ // return this;
+ // }
+ //
+ // // if we don't have other revisions.
+ // if (!getLastRevisionRelationship().exists())
+ // {
+ // return null;
+ // }
+
+ // check last revision first.
+ objyRevision = getLastRevision(objyObjectManager);
+ if (evaluateRevision(timeStamp, branchId, objyRevision))
+ {
+ return objyRevision;
+ }
+
+ ObjyObject possibleRevision = null;
+
+ // check first revision.
+ if (evaluateRevision(timeStamp, branchId, this))
+ {
+ possibleRevision = this;
+ }
+
+ @SuppressWarnings("unchecked")
+ Iterator<ooObj> itr = getRevisionsRelationship().get_iterator();
+ while (itr.hasNext())
+ {
+ // objyRevision = new ObjyObject(itr.next());
+ objyRevision = objyObjectManager.getObject(itr.next().getOid());
+ if (evaluateRevision(timeStamp, branchId, objyRevision))
+ {
+ possibleRevision = objyRevision;
+ }
+ }
+
+ return possibleRevision;
+ }
+
+ /**
+ * return true if the objyRevision satisfies the constrains. This function is only called in case of auditing, and
+ * branching.
+ */
+ protected boolean evaluateRevision(long timeStamp, int branchId, ObjyObject objyRevision)
+ {
+ // check the branchId first.
+ if (objyRevision.getBranchId() == branchId)
+ {
+ // long revisedTS = objyRevision.getRevisedTime();
+ // if (timeStamp != CDOBranchPoint.UNSPECIFIED_DATE)
+ // {
+ // long creationTS = objyRevision.getCreationTime();
+ // if (creationTS <= timeStamp && (revisedTS == CDOBranchPoint.UNSPECIFIED_DATE || revisedTS >= timeStamp))
+ // // if (creationTS >= timeStamp && (revisedTS == CDOBranchPoint.UNSPECIFIED_DATE || revisedTS <= timeStamp))
+ // {
+ // return true;
+ // }
+ // }
+ // else if (revisedTS == CDOBranchPoint.UNSPECIFIED_DATE) // return the latest version in that branch.
+ // {
+ // return true;
+ // }
+
+ long creationTS = objyRevision.getCreationTime();
+ long revisedTS = objyRevision.getRevisedTime();
+ if (CDOCommonUtil.isValidTimeStamp(timeStamp, creationTS, revisedTS))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void detach(int version, CDOBranch branch, long timeStamp)
+ {
+ ObjyClass objyClass = ObjySchema.getObjyClass(ObjyBase.CLASS_NAME);
+ Class_Object detachedClassObject = Class_Object.new_persistent_object(objyClass.getASClass(), objectId, false);
+ if (TRACER_DEBUG.isEnabled())
+ {
+ ObjyObjectManager.newInternalObjCount++;
+ }
+ ObjyObject detachedObjyObject = null;
+
+ try
+ {
+ detachedObjyObject = new ObjyObject(detachedClassObject);
+
+ detachedObjyObject.setVersion(-(version + 1));
+ detachedObjyObject.setBranchId(branch.getID());
+ detachedObjyObject.setCreationTime(timeStamp);
+
+ // add it to the revisions.
+ addToRevisions(detachedObjyObject);
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+}

Back to the top