geronimo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Lin Sun" <linsun....@gmail.com>
Subject Re: svn commit: r689244 - in /geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src: main/java/org/apache/geronimo/openejb/cluster/stateful/container/ test/java/org/apache/geronimo/openejb/cluster/stateful/container/
Date Wed, 27 Aug 2008 02:13:53 GMT
Me too getting this error.  I had to revert this change on my local machine.

Lin

On Tue, Aug 26, 2008 at 10:05 PM, Donald Woods <dwoods@apache.org> wrote:
> Guess we need to build OpenEJB trunk locally until a new SNAPSHOT is
> published?  I'm getting build errors on trunk r689302 now even after
> removing openejb from my local repo -
>
> [INFO] Compiling 9 source files to
> /Users/drwoods/geronimo/server-trunk/plugins/openejb/geronimo-openejb-clustering-wadi/target/classes
> [INFO]
> ------------------------------------------------------------------------
> [ERROR] BUILD FAILURE
> [INFO]
> ------------------------------------------------------------------------
> [INFO] Compilation failure
>
> /Users/drwoods/geronimo/server-trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainer.java:[40,40]
> cannot find symbol
> symbol  : class Instance
> location: package org.apache.openejb.core.stateful
>
>
>
> -Donald
>
>
> dain@apache.org wrote:
>>
>> Author: dain
>> Date: Tue Aug 26 14:37:11 2008
>> New Revision: 689244
>>
>> URL: http://svn.apache.org/viewvc?rev=689244&view=rev
>> Log:
>> Updated to newest StatefulContainer and Cache APIs
>>
>> Added:
>>
>>  geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCache.java
>>      - copied, changed from r688604,
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManager.java
>>
>>  geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCacheTest.java
>>      - copied, changed from r688604,
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManagerTest.java
>> Removed:
>>
>>  geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredBeanEntry.java
>>
>>  geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManager.java
>>
>>  geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManagerTest.java
>> Modified:
>>
>>  geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainer.java
>>
>>  geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainerTest.java
>>
>> Modified:
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainer.java
>> URL:
>> http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainer.java?rev=689244&r1=689243&r2=689244&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainer.java
>> (original)
>> +++
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainer.java
>> Tue Aug 26 14:37:11 2008
>> @@ -37,6 +37,9 @@
>>  import org.apache.openejb.OpenEJBException;
>>  import org.apache.openejb.core.CoreDeploymentInfo;
>>  import org.apache.openejb.core.stateful.StatefulContainer;
>> +import org.apache.openejb.core.stateful.Instance;
>> +import org.apache.openejb.core.stateful.Cache;
>> +import org.apache.openejb.core.stateful.PassivationStrategy;
>>  import org.apache.openejb.spi.SecurityService;
>>  import org.codehaus.wadi.core.contextualiser.BasicInvocation;
>>  import org.codehaus.wadi.core.contextualiser.InvocationContext;
>> @@ -66,22 +69,15 @@
>>         deploymentIdToNetworkConnectorTracker = new HashMap<Object,
>> NetworkConnectorTracker>();
>>     }
>>  -    @Override
>> -    protected ClusteredStatefulInstanceManager
>> newStatefulInstanceManager(SecurityService securityService,
>> -        Class passivator,
>> -        int timeOut,
>> -        int poolSize,
>> -        int bulkPassivate) throws OpenEJBException {
>> -        return new ClusteredStatefulInstanceManager(securityService,
>> -            entityManagerRegistry,
>> -            passivator,
>> -            timeOut,
>> -            poolSize,
>> -            bulkPassivate);
>> +    protected Cache<Object, Instance> createCache(Class<? extends
>> PassivationStrategy> passivator,
>> +            int timeOut,
>> +            int poolSize,
>> +            int bulkPassivate) throws OpenEJBException {
>> +        return new WadiCache(new StatefulCacheListener());
>>     }
>>       public void addSessionManager(Object deploymentId, SessionManager
>> sessionManager) {
>> -        ((ClusteredStatefulInstanceManager)
>> instanceManager).addSessionManager(deploymentId, sessionManager);
>> +        ((WadiCache) cache).addSessionManager(deploymentId,
>> sessionManager);
>>                 WADISessionManager wadiSessionManager =
>> (WADISessionManager) sessionManager;
>>         @@ -104,7 +100,7 @@
>>     }
>>       public void removeSessionManager(Object deploymentId, SessionManager
>> sessionManager) {
>> -        ((ClusteredStatefulInstanceManager)
>> instanceManager).removeSessionManager(deploymentId, sessionManager);
>> +        ((WadiCache) cache).removeSessionManager(deploymentId,
>> sessionManager);
>>                 synchronized (deploymentIdToManager) {
>>             deploymentIdToManager.remove(deploymentId);
>> @@ -181,8 +177,14 @@
>>         return super.removeEJBObject(deploymentInfo, primKey,
>> callInterface, callMethod, args);
>>     }
>>  -    protected Object invoke(CoreDeploymentInfo deploymentInfo,
>> AbstractEJBInvocation invocation)
>> -            throws OpenEJBException {
>> +    //
>> +    // TODO: THIS WILL NOT WORK
>> +    // OpenEJB invocations can not be redirected to another JavaVM.
>>  OpenEJB relies on several
>> +    // thread local variables to opperate, the most important of which is
>> ThreadContext which
>> +    // is used to coordiate transaction boundries.  At the very least to
>> redirect calls to a
>> +    // remote VM you will need a distributed TransactionManager.
>> +    //
>> +    protected Object invoke(CoreDeploymentInfo deploymentInfo,
>> AbstractEJBInvocation invocation) throws OpenEJBException {
>>         Manager manager;
>>         synchronized (deploymentIdToManager) {
>>             manager =
>> deploymentIdToManager.get(deploymentInfo.getDeploymentID());
>>
>> Copied:
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCache.java
>> (from r688604,
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManager.java)
>> URL:
>> http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCache.java?p2=geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCache.java&p1=geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManager.java&r1=688604&r2=689244&rev=689244&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManager.java
>> (original)
>> +++
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/main/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCache.java
>> Tue Aug 26 14:37:11 2008
>> @@ -19,200 +19,303 @@
>>   package org.apache.geronimo.openejb.cluster.stateful.container;
>>  -import java.lang.reflect.Method;
>>  import java.rmi.dgc.VMID;
>> -import java.util.HashMap;
>> -import java.util.Map;
>> +import java.util.Iterator;
>> +import java.util.concurrent.ConcurrentHashMap;
>> +import java.util.concurrent.ConcurrentMap;
>> +import java.util.concurrent.locks.ReentrantLock;
>>  -import org.slf4j.Logger;
>> -import org.slf4j.LoggerFactory;
>>  import org.apache.geronimo.clustering.Session;
>>  import org.apache.geronimo.clustering.SessionAlreadyExistException;
>>  import org.apache.geronimo.clustering.SessionListener;
>>  import org.apache.geronimo.clustering.SessionManager;
>>  import org.apache.geronimo.openejb.cluster.infra.SessionManagerTracker;
>> -import org.apache.openejb.OpenEJBException;
>> -import org.apache.openejb.core.CoreDeploymentInfo;
>> -import org.apache.openejb.core.ThreadContext;
>> -import org.apache.openejb.core.stateful.BeanEntry;
>> -import org.apache.openejb.core.stateful.StatefulInstanceManager;
>> -import org.apache.openejb.core.stateful.StatefulContainer.MethodType;
>> -import org.apache.openejb.persistence.JtaEntityManagerRegistry;
>> -import org.apache.openejb.spi.SecurityService;
>> -import org.apache.openejb.util.Index;
>> +import org.apache.openejb.core.stateful.Cache;
>> +import org.apache.openejb.core.stateful.Instance;
>> +import org.slf4j.Logger;
>> +import org.slf4j.LoggerFactory;
>>   /**
>>  *
>>  * @version $Rev:$ $Date:$
>>  */
>> -public class ClusteredStatefulInstanceManager extends
>> StatefulInstanceManager implements SessionManagerTracker {
>> -    private final Map<Object, SessionManager> sessionManagersById;
>> -    private final Map<Object, CoreDeploymentInfo> deploymentsById;
>> -
>> -    public ClusteredStatefulInstanceManager(SecurityService
>> securityService,
>> -        JtaEntityManagerRegistry jtaEntityManagerRegistry,
>> -        Class passivatorClass,
>> -        int timeout,
>> -        int poolSize,
>> -        int bulkPassivate) throws OpenEJBException {
>> -        super(securityService,
>> -            jtaEntityManagerRegistry,
>> -            passivatorClass,
>> -            timeout,
>> -            poolSize,
>> -            bulkPassivate);
>> -        -        sessionManagersById = new HashMap<Object,
>> SessionManager>();
>> -        deploymentsById = new HashMap<Object, CoreDeploymentInfo>();
>> +public class WadiCache implements Cache<Object, Instance>,
>> SessionManagerTracker {
>> +    private final ConcurrentMap<Object, SessionManager>
>> sessionManagersById = new ConcurrentHashMap<Object, SessionManager>();
>> +
>> +    private final ConcurrentMap<Object, WadiInstance> localInstances =
>> new ConcurrentHashMap<Object, WadiInstance>();
>> +
>> +    private final CacheListener<Instance> cacheListener;
>> +
>> +    public WadiCache(CacheListener<Instance> cacheListener) {
>> +        this.cacheListener = cacheListener;
>>     }
>> -    -    public void addSessionManager(Object deploymentId,
>> SessionManager sessionManager) {
>> -        synchronized (sessionManagersById) {
>> -            sessionManagersById.put(deploymentId, sessionManager);
>> +
>> +    public SessionManager getSessionManager(Object deploymentId) {
>> +        SessionManager sessionManager =
>> sessionManagersById.get(deploymentId);
>> +        if (sessionManager == null) {
>> +            throw new IllegalStateException("No SessionManager registered
>> for deployment [" + deploymentId + "]");
>>         }
>> +        return sessionManager;
>> +    }
>> +
>> +    public void addSessionManager(Object deploymentId, SessionManager
>> sessionManager) {
>> +        sessionManagersById.put(deploymentId, sessionManager);
>>         sessionManager.registerListener(new MigrationListener());
>>     }
>> -    +
>>     public void removeSessionManager(Object deploymentId, SessionManager
>> sessionManager) {
>> -        synchronized (sessionManagersById) {
>> -            sessionManagersById.remove(deploymentId);
>> -        }
>> +        sessionManagersById.remove(deploymentId);
>>     }
>> -    -    @Override
>> -    public void deploy(CoreDeploymentInfo deploymentInfo, Index<Method,
>> MethodType> index) throws OpenEJBException {
>> -        synchronized (deploymentsById) {
>> -            deploymentsById.put(deploymentInfo.getDeploymentID(),
>> deploymentInfo);
>> -        }
>> -        super.deploy(deploymentInfo, index);
>> -    }
>> -    -    @Override
>> -    public void undeploy(CoreDeploymentInfo deploymentInfo) throws
>> OpenEJBException {
>> -        synchronized (deploymentsById) {
>> -            deploymentsById.remove(deploymentInfo.getDeploymentID());
>> -        }
>> -        super.undeploy(deploymentInfo);
>> -    }
>> -    -    @Override
>> -    protected BeanEntry newBeanEntry(Object primaryKey, Object bean) {
>> -        ThreadContext threadContext = ThreadContext.getThreadContext();
>> -        if (null == threadContext) {
>> -            throw new IllegalStateException("No ThreadContext");
>> -        }
>> -        Object deploymentId =
>> threadContext.getDeploymentInfo().getDeploymentID();
>>  -        SessionManager sessionManager;
>> -        synchronized (sessionManagersById) {
>> -            sessionManager = sessionManagersById.get(deploymentId);
>> +    public void add(Object primaryKey, Instance instance) {
>> +        if (!primaryKey.equals(instance.primaryKey)) throw new
>> IllegalArgumentException("primaryKey does not equal instance.primaryKey");
>> +
>> +        // Check if we already have this primary key cached locally
>> +        WadiInstance wadiInstance = localInstances.get(primaryKey);
>> +        if (wadiInstance != null) {
>> +            wadiInstance.lock.lock();
>> +            try {
>> +                if (wadiInstance.getState() != WadiInstanceState.REMOVED)
>> {
>> +                    throw new IllegalStateException("An entry for the key
>> " + primaryKey + " already exists");
>> +                }
>> +                // Entry has been removed between get and lock, simply
>> remove the garbage entry
>> +                localInstances.remove(primaryKey);
>> +            } finally {
>> +                wadiInstance.lock.unlock();
>> +            }
>>         }
>> -        if (null == sessionManager) {
>> -            throw new IllegalStateException("No SessionManager registered
>> for deployment [" + deploymentId + "]");
>> +
>> +        if (!(primaryKey instanceof VMID)) {
>> +            // primaryKey.toString() must be an unique String
>> representation for an unique identifier. Here, we
>> +            // check that primaryKey is a VMID as its Object.toString
>> implementation returns an unique String
>> +            // representation. Other types may not implement
>> Object.toString() "correctly".
>> +            throw new AssertionError("primaryKey MUST be a " +
>> VMID.class.getName());
>>         }
>> -        -        Session session;
>> +
>>         try {
>> -            if (!(primaryKey instanceof VMID)) {
>> -                // primaryKey.toString() must be an unique String
>> representation for an unique identifier. Here, we
>> -                // check that primaryKey is a VMID as its Object.toString
>> implementation returns an unique String
>> -                // representation. Other types may not implement
>> Object.toString() "correctly".
>> -                throw new AssertionError("primaryKey MUST be a " +
>> VMID.class.getName());
>> -            }
>> -            session =
>> sessionManager.createSession(primaryKey.toString());
>> +            Object deploymentId =
>> instance.deploymentInfo.getDeploymentID();
>> +            Session session =
>> getSessionManager(deploymentId).createSession(primaryKey.toString());
>> +            localInstances.put(primaryKey, new WadiInstance(instance,
>> session));
>>         } catch (SessionAlreadyExistException e) {
>>             throw (IllegalStateException) new
>> IllegalStateException().initCause(e);
>>         }
>> -        -        return new ClusteredBeanEntry(session, deploymentId,
>> bean, primaryKey, timeOut);
>>     }
>>  -    @Override
>> -    protected void onFreeBeanEntry(ThreadContext callContext, BeanEntry
>> entry) {
>> -        SessionOperation operation =
>> callContext.get(SessionOperation.class);
>> -        if (null != operation) {
>> -            if (SessionOperation.DESTRUCTION != operation &&
>> SessionOperation.OUTBOUND_MIGRATION != operation) {
>> -                throw new AssertionError();
>> +    public Instance checkOut(Object primaryKey) throws Exception {
>> +        // attempt (up to 10 times) to obtain the entry from the cache
>> +        for (int i = 0; i < 10; i++) {
>> +            // find the entry
>> +            WadiInstance wadiInstance = localInstances.get(primaryKey);
>> +            if (wadiInstance == null) {
>> +                return null;
>> +            }
>> +
>> +            wadiInstance.lock.lock();
>> +            try {
>> +                // verfiy state
>> +                switch (wadiInstance.getState()) {
>> +                    case AVAILABLE:
>> +                        break;
>> +                    case CHECKED_OUT:
>> +                        throw new IllegalStateException("The entry " +
>> primaryKey + " is already checked-out");
>> +                    case PASSIVATED:
>> +                        // Entry was passivated between get and lock, we
>> need to load the Entry again
>> +                        // If the cache somehow got corrupted by an entry
>> containing in state PASSIVATED, this remove
>> +                        // call will remove the corruption
>> +                        localInstances.remove(primaryKey, wadiInstance);
>> +                        continue;
>> +                    case REMOVED:
>> +                        // Entry has been removed between get and lock
>> (most likely by undeploying the EJB), simply drop the instance
>> +                        return null;
>> +                }
>> +
>> +                // mark entry as in-use
>> +                wadiInstance.setState(WadiInstanceState.CHECKED_OUT);
>> +
>> +                return wadiInstance.instance;
>> +            } finally {
>> +                wadiInstance.lock.unlock();
>>             }
>> +        }
>> +
>> +        // something is really messed up with this entry, try to cleanup
>> before throwing an exception
>> +        localInstances.remove(primaryKey);
>> +        throw new RuntimeException("Cache is corrupted: the entry " +
>> primaryKey + " in the Map 'cache' is in state PASSIVATED");    }
>> +
>> +    public void checkIn(Object primaryKey) {
>> +        // find the entry
>> +        WadiInstance wadiInstance = localInstances.get(primaryKey);
>> +        if (wadiInstance == null) {
>>             return;
>>         }
>> -        ClusteredBeanEntry clusteredBeanEntry = (ClusteredBeanEntry)
>> entry;
>> -        clusteredBeanEntry.release();
>> -    }
>> -    -    @Override
>> -    protected void onPoolInstanceWithoutTransaction(ThreadContext
>> callContext, BeanEntry entry) {
>> -        SessionOperation operation =
>> callContext.get(SessionOperation.class);
>> -        if (null != operation) {
>> -            if (SessionOperation.INBOUND_MIGRATION != operation) {
>> -                throw new AssertionError();
>> +
>> +        wadiInstance.lock.lock();
>> +        try {
>> +            // verfiy state
>> +            switch (wadiInstance.getState()) {
>> +                case AVAILABLE:
>> +                    throw new IllegalStateException("The entry " +
>> primaryKey + " is not checked-out");
>> +                case PASSIVATED:
>> +                    // An entry in-use should not be passivated so we can
>> only assume
>> +                    // that the caller never checked out the bean in the
>> first place
>> +                    throw new IllegalStateException("The entry " +
>> primaryKey + " is not checked-out");
>> +                case REMOVED:
>> +                    // Entry has been removed between get and lock (most
>> likely by undeploying the EJB), simply drop the instance
>> +                    return;
>>             }
>> -            return;
>> +
>> +            // mark entry as available
>> +            wadiInstance.setState(WadiInstanceState.AVAILABLE);
>> +        } finally {
>> +            wadiInstance.lock.unlock();
>> +        }
>> +
>> +        // todo should this be instide of the lock?
>> +        wadiInstance.endAccess();
>> +    }
>> +
>> +    public Instance remove(Object primaryKey) {
>> +        // find the entry
>> +        WadiInstance wadiInstance = localInstances.get(primaryKey);
>> +        if (wadiInstance == null) {
>> +            return null;
>> +        }
>> +
>> +        wadiInstance.lock.lock();
>> +        try {
>> +            // remove the entry from the cache
>> +            localInstances.remove(primaryKey);
>> +
>> +            // There is no need to check the state because users of the
>> cache
>> +            // are responsible for maintaining references to beans in use
>> +
>> +            // mark the entry as removed
>> +            wadiInstance.setState(WadiInstanceState.REMOVED);
>> +
>> +        } finally {
>> +            wadiInstance.lock.unlock();
>>         }
>> -        ClusteredBeanEntry clusteredBeanEntry = (ClusteredBeanEntry)
>> entry;
>> -        clusteredBeanEntry.endAccess();
>> +
>> +        wadiInstance.release();
>> +        return wadiInstance.instance;
>>     }
>> -    -    protected enum SessionOperation {
>> -        INBOUND_MIGRATION,
>> -        OUTBOUND_MIGRATION,
>> -        DESTRUCTION
>> +
>> +    public void removeAll(CacheFilter<Instance> filter) {
>> +        for (Iterator<WadiInstance> iterator =
>> localInstances.values().iterator(); iterator.hasNext();) {
>> +            WadiInstance wadiInstance = iterator.next();
>> +
>> +            wadiInstance.lock.lock();
>> +            try {
>> +                if (filter.matches(wadiInstance.instance)) {
>> +                    // remove the entry from the cache and lru
>> +                    iterator.remove();
>> +
>> +                    // There is no need to check the state because users
>> of the cache
>> +                    // are responsible for maintaining references to
>> beans in use
>> +
>> +                    // mark the entry as removed
>> +                    wadiInstance.setState(WadiInstanceState.REMOVED);
>> +                }
>> +            } finally {
>> +                wadiInstance.lock.unlock();
>> +            }
>> +        }
>>     }
>> -    +
>>     protected class MigrationListener implements SessionListener {
>>         private final Logger log =
>> LoggerFactory.getLogger(MigrationListener.class);
>>  -        public void
>> notifyInboundSessionMigration(org.apache.geronimo.clustering.Session
>> session) {
>> -            ClusteredBeanEntry beanEntry = new
>> ClusteredBeanEntry(session);
>> -            ThreadContext context = newThreadContext(beanEntry);
>> -            if (null == context) {
>> +        public void notifyInboundSessionMigration(Session session) {
>> +            WadiInstance instance = getWadiInstance(session);
>> +            if (instance == null) {
>>                 return;
>>             }
>> -            context.set(SessionOperation.class,
>> SessionOperation.INBOUND_MIGRATION);
>>               try {
>> -                activateInstance(context, beanEntry);
>> -                poolInstance(context, beanEntry.getBean());
>> +                cacheListener.afterLoad(instance.instance);
>> +                localInstances.put(instance.instance.primaryKey,
>> instance);
>>             } catch (Exception e) {
>>                 log.warn("Cannot activate migrated bean entry.", e);
>>             }
>>         }
>>  -        public void
>> notifyOutboundSessionMigration(org.apache.geronimo.clustering.Session
>> session) {
>> -            ClusteredBeanEntry beanEntry = new
>> ClusteredBeanEntry(session);
>> -            ThreadContext context = newThreadContext(beanEntry);
>> -            if (null == context) {
>> +        public void notifyOutboundSessionMigration(Session session) {
>> +            WadiInstance instance = getWadiInstance(session);
>> +            if (instance == null) {
>>                 return;
>>             }
>> -            context.set(SessionOperation.class,
>> SessionOperation.OUTBOUND_MIGRATION);
>>  -            passivate(context, beanEntry);
>> -            freeInstance(context);
>> +            try {
>> +                cacheListener.beforeStore(instance.instance);
>> +                localInstances.remove(instance.instance.primaryKey);
>> +            } catch (Exception e) {
>> +                log.warn("Cannot passivate EJB for migration.", e);
>> +            }
>>         }
>>  -        public void
>> notifySessionDestruction(org.apache.geronimo.clustering.Session session) {
>> -            ClusteredBeanEntry beanEntry = new
>> ClusteredBeanEntry(session);
>> -            ThreadContext context = newThreadContext(beanEntry);
>> -            if (null == context) {
>> +        public void notifySessionDestruction(Session session) {
>> +            WadiInstance instance = getWadiInstance(session);
>> +            if (instance == null) {
>>                 return;
>>             }
>> -            context.set(SessionOperation.class,
>> SessionOperation.DESTRUCTION);
>>  -            freeInstance(context);
>> +            localInstances.remove(instance.instance.primaryKey);
>>         }
>> +    }
>>  -        protected ThreadContext newThreadContext(ClusteredBeanEntry
>> beanEntry) {
>> -            Object deploymentId = beanEntry.getDeploymentId();
>> -            CoreDeploymentInfo deploymentInfo;
>> -            synchronized (deploymentsById) {
>> -                deploymentInfo = deploymentsById.get(deploymentId);
>> -            }
>> -            if (null == deploymentInfo) {
>> -                log.warn("Deployment [" + deploymentId + "] is
>> unknown.");
>> -                return null;
>> +    public static final String SESSION_KEY_ENTRY = "entry";
>> +
>> +    protected WadiInstance getWadiInstance(Session session) {
>> +        if (session == null) {
>> +            throw new IllegalArgumentException("session is required");
>> +        }
>> +        Instance instance = (Instance)
>> session.getState(SESSION_KEY_ENTRY);
>> +        if (instance == null) {
>> +            return null;
>> +        }
>> +        return new WadiInstance(instance, session);
>> +    }
>> +
>> +    private static class WadiInstance {
>> +        private final Instance instance;
>> +        private final Session session;
>> +        private final ReentrantLock lock = new ReentrantLock();
>> +        private WadiInstanceState state;
>> +
>> +        private WadiInstance(Instance instance, Session session) {
>> +            this.instance = instance;
>> +            this.session = session;
>> +            session.addState(SESSION_KEY_ENTRY, instance);
>> +        }
>> +
>> +        public void release() {
>> +            session.release();
>> +        }
>> +
>> +        public void endAccess() {
>> +            session.addState(SESSION_KEY_ENTRY, this);
>> +            session.onEndAccess();
>> +        }
>> +
>> +        private WadiInstanceState getState() {
>> +            assertLockHeld();
>> +            return state;
>> +        }
>> +
>> +        private void setState(WadiInstanceState state) {
>> +            assertLockHeld();
>> +            this.state = state;
>> +        }
>> +
>> +        private void assertLockHeld() {
>> +            if (!lock.isHeldByCurrentThread()) {
>> +                throw new IllegalStateException("Entry must be locked");
>>             }
>> -            return new ThreadContext(deploymentInfo,
>> beanEntry.getPrimaryKey());
>>         }
>>     }
>> -    -}
>> +
>> +    private enum WadiInstanceState {
>> +        AVAILABLE, CHECKED_OUT, PASSIVATED, REMOVED
>> +    }
>> +
>> +}
>> \ No newline at end of file
>>
>> Modified:
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainerTest.java
>> URL:
>> http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainerTest.java?rev=689244&r1=689243&r2=689244&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainerTest.java
>> (original)
>> +++
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulContainerTest.java
>> Tue Aug 26 14:37:11 2008
>> @@ -46,8 +46,6 @@
>>  public class ClusteredStatefulContainerTest extends RMockTestCase {
>>       private WADISessionManager sessionManager;
>> -    private TransactionManager txManager;
>> -    private SecurityService securityService;
>>     private ClusteredStatefulContainer container;
>>     private CoreDeploymentInfo deploymentInfo;
>>     private String deploymentId;
>> @@ -80,12 +78,12 @@
>>         modify().multiplicity(expect.from(0));
>>         tracker = (NetworkConnectorTracker)
>> mock(NetworkConnectorTracker.class);
>>         modify().returnValue(tracker);
>> -        -        txManager = (TransactionManager)
>> mock(TransactionManager.class);
>> -        securityService = (SecurityService) mock(SecurityService.class);
>> +
>> +        TransactionManager txManager = (TransactionManager)
>> mock(TransactionManager.class);
>> +        SecurityService securityService = (SecurityService)
>> mock(SecurityService.class);
>>         container = (ClusteredStatefulContainer)
>> intercept(ClusteredStatefulContainer.class, new Object[] {"id",
>> -            txManager,
>> -            securityService, +                txManager,
>> +                securityService,
>>             null,
>>             1,
>>             1,
>>
>> Copied:
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCacheTest.java
>> (from r688604,
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManagerTest.java)
>> URL:
>> http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCacheTest.java?p2=geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCacheTest.java&p1=geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManagerTest.java&r1=688604&r2=689244&rev=689244&view=diff
>>
>> ==============================================================================
>> ---
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/ClusteredStatefulInstanceManagerTest.java
>> (original)
>> +++
>> geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-wadi/src/test/java/org/apache/geronimo/openejb/cluster/stateful/container/WadiCacheTest.java
>> Tue Aug 26 14:37:11 2008
>> @@ -20,12 +20,17 @@
>>   import java.io.IOException;
>>  import java.rmi.dgc.VMID;
>> +import java.util.Map;
>>  import java.util.concurrent.Callable;
>>  import java.util.concurrent.FutureTask;
>> +import javax.persistence.EntityManager;
>> +import javax.persistence.EntityManagerFactory;
>>  -import javax.transaction.TransactionManager;
>> -import javax.transaction.TransactionSynchronizationRegistry;
>> -
>> +import com.agical.rmock.core.Action;
>> +import com.agical.rmock.core.MethodHandle;
>> +import com.agical.rmock.core.describe.ExpressionDescriber;
>> +import com.agical.rmock.core.match.operator.AbstractExpression;
>> +import com.agical.rmock.extension.junit.RMockTestCase;
>>  import org.apache.geronimo.clustering.Session;
>>  import org.apache.geronimo.clustering.SessionListener;
>>  import org.apache.geronimo.clustering.wadi.WADISessionManager;
>> @@ -33,22 +38,15 @@
>>  import org.apache.openejb.core.CoreDeploymentInfo;
>>  import org.apache.openejb.core.DeploymentContext;
>>  import org.apache.openejb.core.ThreadContext;
>> -import org.apache.openejb.core.stateful.BeanEntry;
>> -import org.apache.openejb.persistence.JtaEntityManagerRegistry;
>> -import org.apache.openejb.spi.SecurityService;
>> -
>> -import com.agical.rmock.core.Action;
>> -import com.agical.rmock.core.MethodHandle;
>> -import com.agical.rmock.core.describe.ExpressionDescriber;
>> -import com.agical.rmock.core.match.operator.AbstractExpression;
>> -import com.agical.rmock.extension.junit.RMockTestCase;
>> +import org.apache.openejb.core.stateful.Cache.CacheListener;
>> +import org.apache.openejb.core.stateful.Instance;
>>   /**
>>  * @version $Rev$ $Date$
>>  */
>> -public class ClusteredStatefulInstanceManagerTest extends RMockTestCase {
>> +public class WadiCacheTest extends RMockTestCase {
>>  -    private ClusteredStatefulInstanceManager manager;
>> +    private WadiCache manager;
>>     private String deploymentId;
>>     private CoreDeploymentInfo deploymentInfo;
>>     private VMID primKey;
>> @@ -58,14 +56,17 @@
>>       @Override
>>     protected void setUp() throws Exception {
>> -        TransactionManager txManager = (TransactionManager)
>> mock(TransactionManager.class);
>> -        SecurityService securityService = (SecurityService)
>> mock(SecurityService.class);
>> -        TransactionSynchronizationRegistry txSynchRegistry =
>> (TransactionSynchronizationRegistry)
>> mock(TransactionSynchronizationRegistry.class);
>> -        JtaEntityManagerRegistry jtaEntityManagerRegistry = new
>> JtaEntityManagerRegistry(txSynchRegistry);
>> -        -        manager = (ClusteredStatefulInstanceManager)
>> intercept(ClusteredStatefulInstanceManager.class,
>> -            new Object[] { securityService, jtaEntityManagerRegistry,
>> null, 1, 1, 1 });
>> -        +        manager = new WadiCache(new CacheListener<Instance>() {
>> +            public void afterLoad(Instance instance) throws Exception {
>> +            }
>> +
>> +            public void beforeStore(Instance instance) throws Exception {
>> +            }
>> +
>> +            public void timedOut(Instance instance) {
>> +            }
>> +        });
>> +
>>         deploymentId = "deploymentId";
>>         deploymentInfo = new CoreDeploymentInfo(new
>> DeploymentContext(deploymentId, null, null),
>>             SFSB.class,
>> @@ -95,125 +96,131 @@
>>         threadContext = new ThreadContext(deploymentInfo, primKey);
>>         ThreadContext.enter(threadContext);
>>     }
>> -    +
>>     @Override
>>     protected void tearDown() throws Exception {
>>         if (threadContext != null) {
>>             ThreadContext.exit(threadContext);
>>         }
>>     }
>> -    +
>>     public void testNewBeanEntryForUnknownDeploymentThrowsISE() throws
>> Exception {
>>         startVerification();
>> -        +
>>         try {
>> -            manager.newBeanEntry("primaryKey", new Object());
>> +            VMID primaryKey = new VMID();
>> +            Instance instance = new Instance(deploymentInfo, primaryKey,
>> new Object(), null, (Map<EntityManagerFactory, EntityManager>) null);
>> +            manager.add(primaryKey, instance);
>>             fail();
>>         } catch (IllegalStateException e) {
>>         }
>>     }
>> -    +
>>     public void testNewBeanEntryOK() throws Exception {
>>         VMID primaryKey = new VMID();
>>           recordAddSessionManagerAndCreateSession(primaryKey);
>> -        +
>>         startVerification();
>> -        +
>>         manager.addSessionManager(deploymentId, sessionManager);
>> -        manager.newBeanEntry(primaryKey, new Object());
>> +
>> +        Instance instance = new Instance(deploymentInfo, primaryKey, new
>> Object(), null, (Map<EntityManagerFactory, EntityManager>) null);
>> +        manager.add(primaryKey, instance);
>>     }
>>       public void testSessionDestructionFreeInstance() throws Exception {
>>         Session session =
>> recordAddSessionManagerAndCreateSession(primKey);
>> -        FutureTask<BeanEntry> newBeanEntryTask =
>> newBeanEntryTask(primKey, session);
>> +        FutureTask<Instance> newBeanEntryTask = newBeanEntryTask(primKey,
>> session);
>>  -        manager.freeInstance(null);
>> +//        manager.freeInstance(null);
>>         modify().args(new ThreadContextArgAssertion());
>> -        +
>>         startVerification();
>> -        -        manager.deploy(deploymentInfo, null);
>> +
>> +//        manager.deploy(deploymentInfo, null);
>>         manager.addSessionManager(deploymentId, sessionManager);
>> -        +
>>         newBeanEntryTask.run();
>> -        sessionListener.notifySessionDestruction(session);
>> +//        sessionListener.notifySessionDestruction(session);
>>     }
>>       public void testInboundSessionMigrationActivateAndPoolBeanEntry()
>> throws Exception {
>>         Session session =
>> recordAddSessionManagerAndCreateSession(primKey);
>> -        FutureTask<BeanEntry> newBeanEntryTask =
>> newBeanEntryTask(primKey, session);
>> +        FutureTask<Instance> newBeanEntryTask = newBeanEntryTask(primKey,
>> session);
>> +
>> +//        manager.activateInstance(null, null);
>> +//        modify().args(new ThreadContextArgAssertion(), is.NOT_NULL);
>> +//        manager.poolInstance(null, null);
>> +//        modify().args(new ThreadContextArgAssertion(), is.NOT_NULL);
>>  -        manager.activateInstance(null, null);
>> -        modify().args(new ThreadContextArgAssertion(), is.NOT_NULL);
>> -        manager.poolInstance(null, null);
>> -        modify().args(new ThreadContextArgAssertion(), is.NOT_NULL);
>> -                 startVerification();
>> -        -        manager.deploy(deploymentInfo, null);
>> +
>> +//        manager.deploy(deploymentInfo, null);
>>         manager.addSessionManager(deploymentId, sessionManager);
>> -        +
>>         newBeanEntryTask.run();
>> -        sessionListener.notifyInboundSessionMigration(session);
>> +//        sessionListener.notifyInboundSessionMigration(session);
>>     }
>> -    +
>>     public void testOutboundSessionMigrationPassivateBeanEntry() throws
>> Exception {
>>         Session session =
>> recordAddSessionManagerAndCreateSession(primKey);
>> -        FutureTask<BeanEntry> newBeanEntryTask =
>> newBeanEntryTask(primKey, session);
>> -        -        manager.passivate(null, null);
>> -        modify().args(new ThreadContextArgAssertion(), is.NOT_NULL);
>> -        -        manager.freeInstance(null);
>> -        modify().args(new ThreadContextArgAssertion());
>> -        +        FutureTask<Instance> newBeanEntryTask =
>> newBeanEntryTask(primKey, session);
>> +
>> +//        manager.passivate(null, null);
>> +//        modify().args(new ThreadContextArgAssertion(), is.NOT_NULL);
>> +//
>> +//        manager.freeInstance(null);
>> +//        modify().args(new ThreadContextArgAssertion());
>> +
>>         startVerification();
>> -        -        manager.deploy(deploymentInfo, null);
>> +
>> +//        manager.deploy(deploymentInfo, null);
>>         manager.addSessionManager(deploymentId, sessionManager);
>> -        +
>>         newBeanEntryTask.run();
>> -        sessionListener.notifyOutboundSessionMigration(session);
>> +//        sessionListener.notifyOutboundSessionMigration(session);
>>     }
>> -    -    public void testOnFreeBeanEntryReleaseSession() throws Exception
>> {
>> -        Session session = (Session) mock(Session.class);
>> -        session.addState(ClusteredBeanEntry.SESSION_KEY_ENTRY, null);
>> -        modify().args(is.AS_RECORDED, is.NOT_NULL);
>> -
>> -        session.release();
>> -        -        startVerification();
>>  -        manager.onFreeBeanEntry(threadContext, new
>> ClusteredBeanEntry(session, deploymentId, new Object(), primKey, 0));
>> -    }
>> -    -    public void
>> testOnPoolInstanceWithoutTransactionTriggersSessionOnEndAccess() throws
>> Exception {
>> -        Session session = (Session) mock(Session.class);
>> -        session.addState(ClusteredBeanEntry.SESSION_KEY_ENTRY, null);
>> -        modify().args(is.AS_RECORDED, is.NOT_NULL);
>> -        -        session.addState(ClusteredBeanEntry.SESSION_KEY_ENTRY,
>> null);
>> -        modify().args(is.AS_RECORDED, is.NOT_NULL);
>> -        session.onEndAccess();
>> -        -        startVerification();
>> -        -        manager.onPoolInstanceWithoutTransaction(threadContext,
>> new ClusteredBeanEntry(session,
>> -            deploymentId,
>> -            new Object(),
>> -            primKey,
>> -            0));
>> -    }
>> -    -    private FutureTask<BeanEntry> newBeanEntryTask(final VMID
>> primaryKey, Session session) {
>> -        final FutureTask<BeanEntry> newBeanEntryTask = new
>> FutureTask<BeanEntry>(new Callable<BeanEntry>() {
>> -            public BeanEntry call() throws Exception {
>> -                return manager.newBeanEntry(primaryKey, new Object());
>> +//    public void testOnFreeBeanEntryReleaseSession() throws Exception {
>> +//        Session session = (Session) mock(Session.class);
>> +//        session.addState(ClusteredBeanEntry.SESSION_KEY_ENTRY, null);
>> +//        modify().args(is.AS_RECORDED, is.NOT_NULL);
>> +//
>> +//        session.release();
>> +//
>> +//        startVerification();
>> +//
>> +//        manager.onFreeBeanEntry(threadContext, new
>> ClusteredBeanEntry(session, deploymentId, new Object(), primKey, 0));
>> +//    }
>> +//
>> +//    public void
>> testOnPoolInstanceWithoutTransactionTriggersSessionOnEndAccess() throws
>> Exception {
>> +//        Session session = (Session) mock(Session.class);
>> +//        session.addState(ClusteredBeanEntry.SESSION_KEY_ENTRY, null);
>> +//        modify().args(is.AS_RECORDED, is.NOT_NULL);
>> +//
>> +//        session.addState(ClusteredBeanEntry.SESSION_KEY_ENTRY, null);
>> +//        modify().args(is.AS_RECORDED, is.NOT_NULL);
>> +//        session.onEndAccess();
>> +//
>> +//        startVerification();
>> +//
>> +//        manager.onPoolInstanceWithoutTransaction(threadContext, new
>> ClusteredBeanEntry(session,
>> +//            deploymentId,
>> +//            new Object(),
>> +//            primKey,
>> +//            0));
>> +//    }
>> +
>> +    private FutureTask<Instance> newBeanEntryTask(final VMID primaryKey,
>> Session session) {
>> +        final FutureTask<Instance> newBeanEntryTask = new
>> FutureTask<Instance>(new Callable<Instance>() {
>> +            public Instance call() throws Exception {
>> +                Instance instance = new Instance(deploymentInfo,
>> primaryKey, new Object(), null, (Map<EntityManagerFactory, EntityManager>)
>> null);
>> +                manager.add(primaryKey, instance);
>> +                return instance;
>>             }
>>         });
>> -        session.getState(ClusteredBeanEntry.SESSION_KEY_ENTRY);
>> +        session.getState(WadiCache.SESSION_KEY_ENTRY);
>>         modify().multiplicity(expect.from(0)).perform(new Action() {
>>             public Object invocation(Object[] arg0, MethodHandle arg1)
>> throws Throwable {
>>                 return newBeanEntryTask.get();
>> @@ -221,7 +228,7 @@
>>         });
>>         return newBeanEntryTask;
>>     }
>> -    +
>>     private Session recordAddSessionManagerAndCreateSession(VMID
>> primaryKey) throws Exception {
>>         sessionManager.registerListener(null);
>>         modify().args(new AbstractExpression() {
>> @@ -233,25 +240,25 @@
>>                 return true;
>>             }
>>         });
>> -        +
>>         Session session =
>> sessionManager.createSession(primaryKey.toString());
>> -        -        session.addState(ClusteredBeanEntry.SESSION_KEY_ENTRY,
>> null);
>> +
>> +        session.addState(WadiCache.SESSION_KEY_ENTRY, null);
>>         modify().args(is.AS_RECORDED, is.NOT_NULL);
>> -        +
>>         return session;
>>     }
>> -    +
>>     protected final class ThreadContextArgAssertion extends
>> AbstractExpression {
>>         public void describeWith(ExpressionDescriber arg0) throws
>> IOException {
>>         }
>>           public boolean passes(Object arg0) {
>> -            ThreadContext context = (ThreadContext) arg0;
>> -            assertSame(deploymentInfo, context.getDeploymentInfo());
>> -            assertSame(primKey, context.getPrimaryKey());
>> +//            ThreadContext context = (ThreadContext) arg0;
>> +//            assertSame(deploymentInfo, context.getDeploymentInfo());
>> +//            assertSame(primKey, context.getPrimaryKey());
>>             return true;
>>         }
>>     }
>>  -}
>> +}
>> \ No newline at end of file
>>
>>
>>
>

Mime
View raw message