| /* |
| * 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(); |
| } |
| } |
| } |
| |
| } |