blob: 433ea6d206cc3139667d8877956508d245186415 [file] [log] [blame]
/*
* Copyright (c) 2010-2012, 2015 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.schema;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.eresource.EresourcePackage;
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.db.ObjyObject;
import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjyObjectManager;
import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjySchema;
import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjySession;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.ecore.EStructuralFeature;
import com.objy.as.app.Class_Object;
import com.objy.as.app.Proposed_Class;
import com.objy.as.app.d_Access_Kind;
import com.objy.as.app.d_Module;
import com.objy.db.ObjyRuntimeException;
import com.objy.db.app.ooId;
import com.objy.db.app.ooObj;
import com.objy.db.util.ooTreeListX;
/***
* OoResouceList is a specialized ooArrayListId, where all elements are of type Resourc(Node|Folder). The class will
* allow adding, validating and removing resources From the list.
*
* @author ibrahim
*/
public class ObjyResourceList
{
private static final ContextTracer TRACER_DEBUG = new ContextTracer(OM.DEBUG, ObjyProxy.class);
static public String className = "ooResourceList";
static public String Attribute_arrayName = "oo_array";
private ObjySession objySession;
protected Class_Object classObject;
protected ObjyArrayListId list = null;
protected ooId objectId;
private static final EStructuralFeature featureName = EresourcePackage.Literals.CDO_RESOURCE_NODE__NAME;
// we could use this "EresourcePackage.eINSTANCE.getCDOResourceNode_Name()" instead of above.
public static void buildSchema()
{
d_Module top_mod = ObjySchema.getTopModule();
if (top_mod.resolve_class(ObjyResourceList.className) == null
&& top_mod.resolve_proposed_class(ObjyResourceList.className) == null)
{
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("Schema not found for ooArrayListId. Adding ooArrayListId");
}
boolean inProcess = top_mod.proposed_classes().hasNext();
// Proposed_Class A = new Proposed_Class(ooArrayListId.ClassName);
Proposed_Class propClass = top_mod.propose_new_class(ObjyResourceList.className);
propClass.add_base_class(com.objy.as.app.d_Module.LAST, com.objy.as.app.d_Access_Kind.d_PUBLIC,
ObjyBase.CLASS_NAME /* "ooObj" */);
propClass.add_ref_attribute(com.objy.as.app.d_Module.LAST, // Access kind
d_Access_Kind.d_PUBLIC, // Access kind
ObjyResourceList.Attribute_arrayName, // Attribute name
1, // # elements in fixed-size array
ObjyArrayListId.className, false); // Default value // Default value
// top_mod.propose_new_class(A);
if (!inProcess)
{
top_mod.activate_proposals(true, true);
}
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("SCHEMA changed : ooArrayListId added");
}
}
}
public ObjyResourceList(ObjySession objySession, ObjyObject objyObject)
{
classObject = objyObject.ooClassObject();
this.objySession = objySession;
objectId = objyObject.ooId();
}
// public OoResourceList(ObjySession objySession, Class_Object classObject)
// {
// this.classObject = classObject;
// this.objySession = objySession;
// }
private ObjyArrayListId getList()
{
if (list != null)
{
return list;
}
try
{
// Class_Position position = classObject.position_in_class(ObjyResourceList.Attribute_arrayName);
ooId oid = classObject.nget_ooId(ObjyResourceList.Attribute_arrayName);
if (!oid.isNull())
{
list = new ObjyArrayListId(Class_Object.class_object_from_oid(oid));
}
}
catch (ObjyRuntimeException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
public void remove(ObjyObject objyObject)
{
int size = (int)getList().size();
for (int i = 0; i < size; i++)
{
if (objyObject.ooId().equals(getList().get(i)))
{
getList().remove(i);
break;
}
}
}
public void add(ObjyObject objyObject)
{
// TODO - we need to make sure that objyObject is a resource!!!
getList().add(objyObject.ooId());
}
// public void checkDuplicateResources(ObjectivityStoreAccessor storeAccessor, CDORevision revision)
// throws IllegalStateException
// {
// CDOID folderID = (CDOID)revision.data().getContainerID();
// String name = (String)revision.data().get(EresourcePackage.eINSTANCE.getCDOResourceNode_Name(), 0);
// CDOID existingID = storeAccessor.readResourceID(folderID, name, revision.getBranch().getHead());
// if (existingID != CDOID.NULL && !existingID.equals(revision.getID()))
// {
// throw new IllegalStateException("Duplicate resource or folder: " + name + " in folder " + folderID); //$NON-NLS-1$
// //$NON-NLS-2$
// }
// }
public void checkDuplicateResources(ObjectivityStoreAccessor storeAccessor, InternalCDORevision revision)
throws IllegalStateException
{
// CDOID folderID = (CDOID)revision.data().getContainerID();
CDOID folderId = (CDOID)revision.data().getContainerID();
String name = (String)revision.data().get(EresourcePackage.eINSTANCE.getCDOResourceNode_Name(), 0);
// ooId folderId = objyObject.getEContainerAsOid();
// String name = OoResourceList.getResourceName(objyObject);
// iterate over all resource in the list, and verify if we have both name and folderID.
int size = (int)getList().size();
ObjyObjectManager objyObjectManager = storeAccessor.getObjySession().getObjectManager();
for (int i = 0; i < size; i++)
{
ObjyObject resource = getResource(i);
ObjyObject resourceRevision = resource;
// get the proper revision of the resource (might need to refactor this code, see readRevision())
if (storeAccessor.getStore().isRequiredToSupportBranches())
{
try
{
resourceRevision = resource.getRevision(revision.getTimeStamp(), revision.getBranch().getID(),
objyObjectManager);
}
catch (RuntimeException ex)
{
ex.printStackTrace();
}
}
else if (storeAccessor.getStore().isRequiredToSupportAudits())
{
try
{
resourceRevision = resource.getRevision(revision.getTimeStamp(), CDOBranch.MAIN_BRANCH_ID, objyObjectManager);
}
catch (RuntimeException ex)
{
ex.printStackTrace();
}
}
if (resourceRevision == null || resourceRevision.getVersion() < 0)
{
continue;
}
// int v = resource.getVersion();
CDOID resourceFolderId = (CDOID)resourceRevision.getEContainer();
String resourceName = ObjyResourceList.getResourceName(resourceRevision);
if (resourceFolderId != null && resourceFolderId.equals(folderId) && resourceName != null
&& resourceName.equals(name))
{
throw new IllegalStateException("Duplicate resource or folder: " + name + " in folder: " + folderId); //$NON-NLS-1$
}
}
}
public ObjyObject getResource(int index)
{
return objySession.getObjectManager().getObject(getList().get(index));
}
public static String getResourceName(ObjyObject objyObject)
{
String name = (String)objyObject.get(featureName);
return name;
}
public static ObjyObject create(ooId nearOid)
{
Class_Object classObject = Class_Object
.new_persistent_object(ObjySchema.getObjyClass(ObjyResourceList.className).getASClass(), nearOid, false);
// ObjyObjectManager.newInternalObjCount++;
// Class_Position position = classObject.position_in_class(ObjyResourceList.Attribute_arrayName);
// Class_Object arrayClassObject = Class_Object.new_persistent_object(
// ObjySchema.getTopModule().resolve_class(ObjyArrayListId.className), classObject.objectID(), false);
// // ooId arrayOid = arrayClassObject.objectID();
ooTreeListX list = new ooTreeListX(10, false);
// ObjyObjectManager.newInternalObjCount++;
ooObj anObj = ooObj.create_ooObj(classObject.objectID());
anObj.cluster(list);
// System.out.println("initObject: " + anObj.getOid().getStoreString() + " treeListX: "
// // + list.getOid().getStoreString());
classObject.nset_ooId(ObjyResourceList.Attribute_arrayName, list.getOid());
// classObject.set_ooId(position, arrayClassObject.objectID());
// ObjyArrayListId.initObject(arrayClassObject);
ObjyObject objyObject = null;
try
{
objyObject = new ObjyObject(classObject);
}
catch (RuntimeException ex)
{
ex.printStackTrace();
}
return objyObject;
}
public ooId ooId()
{
return objectId;
}
public int size()
{
return (int)getList().size();
}
}