/**
*
*/
package org.concord.otrunk;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;
import org.concord.framework.otrunk.OTChangeEvent;
import org.concord.framework.otrunk.OTResourceList;
import org.concord.otrunk.datamodel.OTDataList;
/**
* @author scott
*
*/
public class OTResourceListImpl extends OTResourceCollectionImpl
implements OTResourceList
{
protected OTDataList list;
/**
* @param handler
*
*/
public OTResourceListImpl(String property, OTDataList list,
OTObjectInternal handler)
{
super(property, handler);
this.list = list;
}
/* (non-Javadoc)
* @see org.concord.framework.otrunk.OTResourceList#add(java.lang.Object)
*/
public boolean add(Object object)
{
Object toBeStored = translateExternalToStored(object);
boolean added = list.add(toBeStored);
notifyOTChange(OTChangeEvent.OP_ADD, object, null);
return added;
}
/* (non-Javadoc)
* @see org.concord.framework.otrunk.OTResourceList#add(int, java.lang.Object)
*/
public void add(int index, Object object)
{
Object toBeStored = translateExternalToStored(object);
list.add(index, toBeStored);
notifyOTChange(OTChangeEvent.OP_ADD, object, null);
}
/* (non-Javadoc)
* @see org.concord.framework.otrunk.OTResourceList#get(int)
*/
public Object get(int index)
{
Object stored = list.get(index);
return translateStoredToExternal(stored);
}
/* (non-Javadoc)
* @see org.concord.framework.otrunk.OTResourceList#remove(int)
*/
public void remove(int index)
{
Object obj = list.get(index);
list.remove(index);
notifyOTChange(OTChangeEvent.OP_REMOVE, obj, null);
}
/* (non-Javadoc)
* @see org.concord.framework.otrunk.OTResourceList#remove(java.lang.Object)
* FIXME if this fails we need to search for the byte[] in
* BlobResources
*/
public boolean remove(Object obj)
{
boolean removed = list.remove(obj);
notifyOTChange(OTChangeEvent.OP_REMOVE, obj, null);
return removed;
}
/* (non-Javadoc)
* @see org.concord.framework.otrunk.OTResourceList#set(int, java.lang.Object)
*/
public void set(int index, Object object)
{
Object toBeStored = translateExternalToStored(object);
Object previousValue = list.set(index, toBeStored);
notifyOTChange(OTChangeEvent.OP_SET, object, previousValue);
}
public void clear()
{
list.removeAll();
notifyOTChange(OTChangeEvent.OP_REMOVE_ALL, null, null);
}
/* (non-Javadoc)
* @see org.concord.framework.otrunk.OTResourceCollection#size()
*/
public int size()
{
return list.size();
}
public boolean containsAll(Collection<?> c)
{
Iterator<?> iterator = c.iterator();
while(iterator.hasNext()){
if(!contains(iterator.next())){
return false;
}
}
return true;
}
public Object[] toArray()
{
return toArray(new Object[list.size()]);
}
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] array)
{
int size = list.size();
if(array.length < size){
array = (T[])Array.newInstance(array.getClass().getComponentType(), size);
}
for(int i=0; i<size; i++) {
array[i] = (T)list.get(i);
}
if (array.length > size) {
array[size] = null;
}
return array;
}
public boolean contains(Object obj)
{
return list.contains(obj);
}
public Iterator<Object> iterator()
{
return new Iterator<Object>(){
/**
* This points to the current object index;
*/
int index = -1;
public boolean hasNext()
{
return index < (size() - 1);
}
public Object next()
{
index++;
return get(index);
}
public void remove()
{
OTResourceListImpl.this.remove(index);
}
};
}
public boolean addAll(Collection<?> c)
{
boolean added = true;
for (Object object : c) {
Object toBeStored = translateExternalToStored(object);
boolean a = list.add(toBeStored);
if (!a) added = false;
}
notifyOTChange(OTChangeEvent.OP_ADD, c, null);
return added;
}
public boolean removeAll(Collection<?> c)
{
throw new UnsupportedOperationException();
}
public boolean retainAll(Collection<?> c)
{
throw new UnsupportedOperationException();
}
}