blob: 6888d1fc3e6cbfe170e1b35e4f5a993ecc4061e8 [file] [log] [blame]
/*
* Copyright (c) 2010-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:
* Simon McDuff - initial API and implementation
* Ibrahim Sallam - code refactoring for CDO 3.0
*/
package org.eclipse.emf.cdo.server.internal.objectivity.mapper;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjyObject;
import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjySchema;
import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyArrayListId;
import org.eclipse.emf.cdo.server.internal.objectivity.utils.TypeConvert;
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_Attribute;
import com.objy.as.app.d_Class;
import com.objy.db.ObjyRuntimeException;
import com.objy.db.app.ooId;
import com.objy.db.app.ooObj;
import com.objy.db.util.ooTreeListX;
/**
* @author Simon McDuff
*/
public class ManyReferenceMapper extends BasicTypeMapper implements IManyTypeMapper
{
static d_Class dClassObject = null;
static ManyReferenceMapper INSTANCE = new ManyReferenceMapper();
@SuppressWarnings("unused")
private static d_Class getArrayListClass()
{
if (dClassObject == null)
{
dClassObject = ObjySchema.getTopModule().resolve_class(ObjyArrayListId.className);
}
return dClassObject;
}
public boolean createSchema(Proposed_Class propClass, EStructuralFeature feature)
{
try
{
// ooArrayListId.buildSchema();
propClass.add_ref_attribute(com.objy.as.app.d_Module.LAST, // Access kind
d_Access_Kind.d_PUBLIC, // Access kind
feature.getName(), // Attribute name
1, // # elements in fixed-size array
ObjyArrayListId.className, false); // Default value // Default value
return true;
}
catch (ObjyRuntimeException ex)
{
ex.printStackTrace();
return false;
}
}
public Object getValue(ObjyObject internal, EStructuralFeature feature, int index)
{
ObjyArrayListId list = getList(internal, feature);
if (list != null)
{
return list.get(index);
}
try
{
throw new Exception("Trying to getValue of object while the list is null.");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void setValue(ObjyObject internal, EStructuralFeature feature, int index, Object newValue)
{
ObjyArrayListId list = getList(internal, feature);
try
{
if (list != null)
{
list.set(index, TypeConvert.toOoId(newValue));
}
else
{
throw new Exception("Trying to setValue for object while the list is null.");
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ObjyArrayListId getList(ObjyObject objyObject, EStructuralFeature feature)
{
// System.out.println("getList() for : " + objyObject.ooId().getStoreString() + " feature: " + feature.getName());
// Class_Position position = getAttributePosition(objyObject, feature);
String attributeName = getAttributeName(feature);
ObjyArrayListId list = (ObjyArrayListId)objyObject.getFeatureList(attributeName/* position */);
if (list == null)
{
try
{
ooId oid = objyObject.get_ooId(attributeName/* position */);
if (!oid.isNull())
{
list = new ObjyArrayListId(Class_Object.class_object_from_oid(oid));
objyObject.setFeatureList(attributeName/* position */, list);
}
// System.out.println("... getList() -> gotOID: " + oid.getStoreString());
}
catch (ObjyRuntimeException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
public int size(ObjyObject objyObject, EStructuralFeature feature)
{
ObjyArrayListId list = getList(objyObject, feature);
return (int)(list == null ? 0 : list.size());
}
public void add(ObjyObject objyObject, EStructuralFeature feature, int index, Object value)
{
ooId obj = TypeConvert.toOoId(value);
ObjyArrayListId list = getList(objyObject, feature);
if (list != null)
{
list.add(index, obj);
}
else
{
try
{
throw new Exception("Trying to add objects while the list is null.");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void addAll(ObjyObject objyObject, EStructuralFeature feature, int index, Object[] value)
{
ObjyArrayListId list = getList(objyObject, feature);
if (list != null)
{
list.addAll(index, value);
}
else
{
try
{
throw new Exception("Trying to addAll objects while the list is null.");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public boolean validate(d_Attribute ooAttribute, EStructuralFeature feature)
{
// TODO Auto-generated method stub
System.out.println("OBJYIMPL: ManyReferenceMapper.validate() - not implemented.");
return true;
}
public void initialize(Class_Object classObject, EStructuralFeature feature)
{
// Class_Position position = classObject.position_in_class(getAttributeName(feature));
// Class_Object newClassObject = Class_Object
// .new_persistent_object(getArrayListClass(), classObject.objectID(), false);
ooTreeListX list = new ooTreeListX(2, false);
// ObjyObjectManager.newInternalObjCount++;
ooObj anObj = ooObj.create_ooObj(classObject.objectID());
anObj.cluster(list);
classObject.nset_ooId(getAttributeName(feature), list.getOid());
// classObject.set_ooId(position, newClassObject.objectID());
// ObjyArrayListId.initObject(newClassObject);
}
public void delete(ObjyObject objyObject, EStructuralFeature feature)
{
// System.out.println("delete() for : " + objyObject.ooId().getStoreString() + " feature: " + feature.getName());
// Class_Position position = getAttributePosition(objyObject, feature);
String attributeName = getAttributeName(feature);
ooId tobeDeleted = objyObject.get_ooId(attributeName/* position */);
ooObj objectToDelete = ooObj.create_ooObj(tobeDeleted);
objectToDelete.delete();
// set the reference to null.
objyObject.set_ooId(getAttributeName(feature)/* position */, null);
objyObject.setFeatureList(attributeName/* position */, null);
}
public void clear(ObjyObject objyObject, EStructuralFeature feature)
{
ObjyArrayListId list = getList(objyObject, feature);
if (list != null)
{
list.clear();
}
else
{
try
{
throw new Exception("Trying to clear objects while the list is null.");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public Object remove(ObjyObject objyObject, EStructuralFeature feature, int index)
{
// System.out.println("remove() for : " + objyObject.ooId().getStoreString() + " feature: " + feature.getName() +
// " index: "+index);
Object oldValue = getValue(objyObject, feature, index);
ObjyArrayListId list = getList(objyObject, feature);
if (list != null)
{
list.remove(index);
}
else
{
try
{
throw new Exception("Trying to remove element while the list is null.");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return oldValue;
}
public Object[] getAll(ObjyObject objyObject, EStructuralFeature feature, int index, int chunkSize)
{
int size = size(objyObject, feature);
if (chunkSize != CDORevision.UNCHUNKED)
{
size = Math.min(size, chunkSize);
}
// CDOList cdoList = CDOListFactory.DEFAULT.createList(size, size, 0);
ooId[] ooIds = null;
ObjyArrayListId list = getList(objyObject, feature);
if (list != null)
{
ooIds = list.getAll(index, size);
}
else
{
try
{
throw new Exception("Trying to getAll objects while the list is null.");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return ooIds;
}
public void modifySchema(Proposed_Class proposedooClass, EStructuralFeature feature)
{
throw new UnsupportedOperationException("Implement me!!");
}
public void setAll(ObjyObject objyObject, EStructuralFeature feature, int index, Object[] newValues)
{
addAll(objyObject, feature, 0, newValues);
}
public void move(ObjyObject objyObject, EStructuralFeature feature, int targetIndex, int sourceIndex)
{
ObjyArrayListId list = getList(objyObject, feature);
if (list != null)
{
list.move(targetIndex, sourceIndex);
}
else
{
try
{
throw new Exception("Trying to move element while the list is null.");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}