/**
*
*/
package org.concord.otrunk.overlay;
import org.concord.otrunk.datamodel.OTDataCollection;
import org.concord.otrunk.datamodel.OTDataObject;
/**
* @author scott
*
*/
public abstract class CompositeDataCollection
implements OTDataCollection
{
private Class<? extends OTDataCollection> collectionType;
private CompositeDataObject parent;
private OTDataCollection baseCollection;
private String resourceName;
private boolean composite;
public CompositeDataCollection(Class<? extends OTDataCollection> collectionType,
CompositeDataObject parent,
OTDataCollection baseCollection,
String resourceName, boolean composite)
{
this.collectionType = collectionType;
this.parent = parent;
this.baseCollection = baseCollection;
this.resourceName = resourceName;
this.composite = composite;
}
protected OTDataCollection getActiveDeltaCollection()
{
OTDataObject activeDelta = parent.getActiveDeltaObject();
if(activeDelta == null) {
return null;
}
Object oldCollection = activeDelta.getResource(resourceName);
return (OTDataCollection)oldCollection;
}
protected OTDataCollection getCollectionForWrite()
{
if(!composite){
OTDataObject baseObject = parent.getBaseObject();
return baseObject.getResourceCollection(resourceName, collectionType);
}
OTDataObject activeDelta = parent.getOrCreateActiveDeltaObject();
Object oldCollection = activeDelta.getResource(resourceName);
if(oldCollection != null) {
return (OTDataCollection)oldCollection;
}
OTDataCollection userCollection =
(OTDataCollection)activeDelta.getResourceCollection(
resourceName, collectionType);
if(baseCollection != null) {
copyInto(userCollection, baseCollection);
}
return userCollection;
}
protected OTDataCollection getCollectionForRead()
{
if(!composite){
OTDataObject baseObject = parent.getBaseObject();
return baseObject.getResourceCollection(resourceName, collectionType);
}
OTDataCollection activeDeltaCollection = getActiveDeltaCollection();
if(activeDeltaCollection != null) {
return activeDeltaCollection;
}
if(baseCollection == null) return null;
return baseCollection;
}
protected Object resolveIDResource(Object object)
{
return parent.resolveIDResource(object);
}
protected abstract void copyInto(OTDataCollection userCollection,
OTDataCollection authoredCollection);
public int size()
{
OTDataCollection collectionForRead = getCollectionForRead();
if(collectionForRead == null) return 0;
return collectionForRead.size();
}
public void removeAll()
{
getCollectionForWrite().removeAll();
}
}