FileDocCategorySizeDatePackage
DistributedListState.javaAPI DocJBoss 4.2.119203Fri Jul 13 21:02:32 BST 2007org.jboss.aspects.versioned

DistributedListState

public class DistributedListState extends CollectionStateManager implements Externalizable, List, DistributedState
author
Bill Burke
version
$Revision: 57186 $

Fields Summary
private static final long
serialVersionUID
private static HashMap
listMethodMap
protected static Logger
log
protected volatile long
versionId
protected ArrayList
updates
protected String
classname
protected transient List
base
protected transient org.jboss.tm.TransactionLocal
txState
protected transient org.jboss.tm.TransactionLocal
txVersion
protected transient DistributedVersionManager
versionManager
protected transient SynchronizationManager
synchManager
protected transient TransactionManager
tm
protected transient org.jboss.aop.proxy.ClassProxy
proxy
Constructors Summary
public DistributedListState()
For serialization


         
     
public DistributedListState(org.jboss.util.id.GUID guid, long timeout, org.jboss.aop.proxy.ClassProxy proxy, List obj, DistributedVersionManager versionManager, SynchronizationManager synchManager)

      super(guid, timeout, listMethodMap);
      this.base = obj;
      this.classname = obj.getClass().getName();
      this.versionManager = versionManager;
      this.synchManager = synchManager;
      this.proxy = proxy;
      InitialContext ctx = new InitialContext();
      this.tm = (TransactionManager)ctx.lookup("java:/TransactionManager");
      this.updates = createListUpdates(base);
   
Methods Summary
public booleanadd(java.lang.Object val)

      try
      {
         lock.readLock().acquire();
         try
         {
            val = versionManager.makeVersioned(val);
            List state = getCurrentState(true);
            return state.add(val);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public voidadd(int index, java.lang.Object val)

      try
      {
         lock.readLock().acquire();
         try
         {
            val = versionManager.makeVersioned(val);
            List state = getCurrentState(true);
            state.add(index, val);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public booleanaddAll(java.util.Collection c)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(true);
            Object[] copy = c.toArray();
            for (int i = 0; i < copy.length; i++)
            {
               Object item = versionManager.makeVersioned(copy[i]);
               state.add(item);
            }
            return true;
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public booleanaddAll(int index, java.util.Collection c)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(true);
            Object[] copy = c.toArray();
            for (int i = 0; i < copy.length; i++)
            {
               Object item = versionManager.makeVersioned(copy[i]);
               state.add(index + i, item);
            }
            return true;
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public org.jboss.aop.InstanceAdvisedbuildObject(SynchronizationManager manager, DistributedVersionManager versionManager)

      log.trace("building a List");
      this.versionManager = versionManager;
      this.synchManager = manager;
      log.trace("DistributedListState: classname: " + classname);
      Class clazz = Thread.currentThread().getContextClassLoader().loadClass(classname);
      base = (List)clazz.newInstance();
      Iterator it = updates.iterator();
      while (it.hasNext())
      {
         Object val = it.next();
         if (val instanceof VersionReference)
         {
            VersionReference ref = (VersionReference)val;
            val = manager.getObject(ref.getGUID());
            if (val == null)
            {
               DistributedState fieldVal = manager.getState(ref.getGUID());
               val = fieldVal.buildObject(manager, versionManager);
               ref.set((InstanceAdvised)val);
            }
         }
         base.add(val);
      }
      proxy = versionManager.addListVersioning(base, this);
      return proxy;
   
public voidcheckOptimisticLock(javax.transaction.Transaction tx)

      // NOTE THIS CODE ASSUMES THAT A WRITELOCK HAS BEEN ACQUIRED!!!!
      Long version = (Long)txVersion.get(tx);
      if (version.longValue() <= versionId)
         throw new OptimisticLockFailure("optimistic lock failure for list");
   
public voidclear()

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(true);
            state.clear();
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public booleancontains(java.lang.Object o)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.contains(o);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public booleancontainsAll(java.util.Collection c)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.containsAll(c);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
protected java.util.ArrayListcreateListUpdates(java.util.List state)

      ArrayList listUpdates = new ArrayList(state.size());
      Iterator it = state.iterator();
      while (it.hasNext())
      {
         Object obj = it.next();
         if (versionManager.isVersioned(obj))
         {
            listUpdates.add(new VersionReference(VersionManager.getGUID((InstanceAdvised)obj)));
         }
         else
         {
            listUpdates.add(obj);
         }
      }
      return listUpdates;
   
public DistributedUpdatecreateTxUpdate(javax.transaction.Transaction tx)

      List state = (List)txState.get(tx);
      long newId = ((Long)txVersion.get(tx)).longValue();
      DistributedListUpdate update = new DistributedListUpdate(guid, createListUpdates(state), newId);
      return update;
   
public booleanequals(java.lang.Object o)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.equals(o);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public java.lang.Objectget(int i)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.get(i);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
protected java.util.ListgetCurrentState(boolean forUpdate)

      Transaction tx = tm.getTransaction();
      if (tx == null)
      {
         if (forUpdate) versionId++;
         return base;
      }

      List state = (List)txState.get(tx);
      if (state == null && forUpdate)
      {
         state = (List)base.getClass().newInstance();
         state.addAll(base);
         txState.set(tx, state);
         long newId = versionId + 1;
         synchManager.registerUpdate(tx, this);
         txVersion.set(tx, new Long(newId));
         return state;
      }
      return base;
   
public java.util.HashMapgetMethodMap()

      return ClassProxyFactory.getMethodMap(base.getClass().getName());
   
public org.jboss.aop.InstanceAdvisedgetObject()

 return proxy; 
public inthashCode()

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.hashCode();
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public intindexOf(java.lang.Object o)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.indexOf(o);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public booleanisEmpty()

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.isEmpty();
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public java.util.Iteratoriterator()

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.iterator();
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public intlastIndexOf(java.lang.Object o)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.lastIndexOf(o);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public java.util.ListIteratorlistIterator()

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.listIterator();
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public java.util.ListIteratorlistIterator(int index)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.listIterator(index);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public voidmergeState(javax.transaction.Transaction tx)

      // NOTE THIS CODE ASSUMES THAT A WRITELOCK HAS BEEN ACQUIRED!!!!
      List current = (List)txState.get(tx);
      base = current;
      Long version = (Long)txVersion.get(tx);
      versionId = version.longValue();
   
public voidmergeState(DistributedUpdate update)

      DistributedListUpdate listUpdate = (DistributedListUpdate)update;
      this.versionId = listUpdate.versionId;
      base.clear();
      Iterator it = listUpdate.listUpdates.iterator();
      while (it.hasNext())
      {
         Object val = it.next();
         if (val instanceof VersionReference)
         {
            VersionReference ref = (VersionReference)val;
            val = synchManager.getObject(ref.getGUID());
            ref.set((InstanceAdvised)val);
         }
         base.add(val);
      }
      updates = listUpdate.listUpdates;
   
public voidreadExternal(java.io.ObjectInput in)

      super.readExternal(in);
      versionId = in.readLong();
      this.updates = (ArrayList)in.readObject();
      this.classname = (String)in.readObject();
      try
      {
         InitialContext ctx = new InitialContext();
         this.tm = (TransactionManager)ctx.lookup("java:/TransactionManager");
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
      this.txState = new TransactionLocal();
      this.txVersion = new TransactionLocal();
      this.methodMap = listMethodMap;
   
public java.lang.Objectremove(int index)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(true);
            return state.remove(index);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public booleanremove(java.lang.Object o)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(true);
            return state.remove(o);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public booleanremoveAll(java.util.Collection c)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(true);
            return state.removeAll(c);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public booleanretainAll(java.util.Collection c)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(true);
            return state.retainAll(c);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public java.lang.Objectset(int index, java.lang.Object element)

      try
      {
         lock.readLock().acquire();
         try
         {
            try
            {
               element = versionManager.makeVersioned(element);
            }
            catch (Exception ex)
            {
               throw new RuntimeException(ex);
            }
            List state = getCurrentState(true);
            return state.set(index, element);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public intsize()

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.size();
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public java.util.ListsubList(int fromIndex, int toIndex)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.subList(fromIndex, toIndex);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public java.lang.Object[]toArray()

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.toArray();
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public java.lang.Object[]toArray(java.lang.Object[] a)

      try
      {
         lock.readLock().acquire();
         try
         {
            List state = getCurrentState(false);
            return state.toArray(a);
         }
         finally
         {
            lock.readLock().release();
         }
      }
      catch (Exception ex)
      {
         throw new RuntimeException(ex);
      }
   
public voidwriteExternal(java.io.ObjectOutput out)

      super.writeExternal(out);
      out.writeLong(versionId);
      out.writeObject(updates);
      out.writeObject(classname);