blob: 9234a5d54dcd6bf690e91a16cadea2b9fc54437d [file] [log] [blame]
/***************************************************************************
* Copyright (c) 2008 - 2008 Martin Taal 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:
* Martin Taal - initial api
**************************************************************************/
package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.server.internal.hibernate.HibernateUtil;
import org.eclipse.net4j.util.collection.MoveableList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* Wraps a moveable list so that hibernate always sees an object view while cdo always sees a cdoid view.
*
* @author Martin Taal
*/
public class HibernateMoveableListWrapper implements List<Object>
{
private MoveableList<Object> delegate;
public HibernateMoveableListWrapper()
{
}
/**
* @return the delegate
*/
public MoveableList<Object> getDelegate()
{
return delegate;
}
/**
* @param delegate
* the delegate to set
*/
public void setDelegate(MoveableList<Object> delegate)
{
this.delegate = delegate;
}
protected Object getObject(Object o)
{
if (o == null)
{
return null;
}
// is already resolved
if (!(o instanceof CDOID))
{
return o;
}
return HibernateUtil.getInstance().getCDORevision((CDOID)o);
}
protected List<Object> getObjects(List<?> cdoIDs)
{
List<Object> result = new ArrayList<Object>();
for (Object o : cdoIDs)
{
result.add(getObject(o));
}
return result;
}
protected CDOID getCDOID(Object o)
{
CDORevision cdoRevision = (CDORevision)o;
return cdoRevision.getID();
}
protected List<CDOID> getCDOIDs(Collection<?> c)
{
List<CDOID> newC = new ArrayList<CDOID>();
for (Object o : c)
{
newC.add(getCDOID(o));
}
return newC;
}
public void add(int index, Object element)
{
getDelegate().add(index, getCDOID(element));
}
public boolean add(Object o)
{
return getDelegate().add(getCDOID(o));
}
public boolean addAll(Collection<? extends Object> c)
{
return getDelegate().addAll(getCDOIDs(c));
}
public boolean addAll(int index, Collection<? extends Object> c)
{
return getDelegate().addAll(index, getCDOIDs(c));
}
public void clear()
{
getDelegate().clear();
}
public boolean contains(Object o)
{
return getDelegate().contains(getCDOID(o));
}
public boolean containsAll(Collection<?> c)
{
return getDelegate().containsAll(getCDOIDs(c));
}
public Object get(int index)
{
return getObject(getDelegate().get(index));
}
public int indexOf(Object o)
{
return getDelegate().indexOf(getCDOID(o));
}
public boolean isEmpty()
{
return getDelegate().isEmpty();
}
public Iterator<Object> iterator()
{
return new CDOHibernateIterator(getDelegate().iterator());
}
public int lastIndexOf(Object o)
{
return getDelegate().lastIndexOf(getCDOID(o));
}
public ListIterator<Object> listIterator()
{
return new CDOHibernateListIterator(getDelegate().listIterator());
}
public ListIterator<Object> listIterator(int index)
{
return new CDOHibernateListIterator(getDelegate().listIterator(index));
}
public Object remove(int index)
{
return getDelegate().remove(index);
}
public boolean remove(Object o)
{
return getDelegate().remove(getCDOID(o));
}
public boolean removeAll(Collection<?> c)
{
return getDelegate().removeAll(getCDOIDs(c));
}
public boolean retainAll(Collection<?> c)
{
return getDelegate().retainAll(getCDOIDs(c));
}
public Object set(int index, Object element)
{
return getDelegate().set(index, getCDOID(element));
}
public int size()
{
return getDelegate().size();
}
public List<Object> subList(int fromIndex, int toIndex)
{
return getObjects(getDelegate().subList(fromIndex, toIndex));
}
public Object[] toArray()
{
Object[] result = new Object[size()];
int i = 0;
for (Object o : this)
{
result[i++] = o;
}
return result;
}
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a)
{
int i = 0;
for (Object o : this)
{
a[i++] = (T)o;
}
return a;
}
private static final class CDOHibernateIterator implements Iterator<Object>
{
private final Iterator<?> delegate;
public CDOHibernateIterator(Iterator<?> delegate)
{
this.delegate = delegate;
}
public boolean hasNext()
{
return delegate.hasNext();
}
public Object next()
{
Object o = delegate.next();
if (o instanceof CDOID)
{
return HibernateUtil.getInstance().getCDORevision((CDOID)o);
}
return o;
}
public void remove()
{
delegate.remove();
}
}
private static final class CDOHibernateListIterator implements ListIterator<Object>
{
private final ListIterator<Object> delegate;
public CDOHibernateListIterator(ListIterator<Object> delegate)
{
this.delegate = delegate;
}
public void add(Object o)
{
delegate.add(((CDORevision)o).getID());
}
public boolean hasNext()
{
return delegate.hasNext();
}
public boolean hasPrevious()
{
return delegate.hasPrevious();
}
public Object next()
{
Object o = delegate.next();
if (o instanceof CDOID)
{
return HibernateUtil.getInstance().getCDORevision((CDOID)delegate.next());
}
return o;
}
public int nextIndex()
{
return delegate.nextIndex();
}
public Object previous()
{
Object o = delegate.previous();
if (o instanceof CDOID)
{
return HibernateUtil.getInstance().getCDORevision((CDOID)delegate.next());
}
return o;
}
public int previousIndex()
{
return delegate.previousIndex();
}
public void remove()
{
delegate.remove();
}
public void set(Object o)
{
delegate.set(((CDORevision)o).getID());
}
}
}