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 <[EMAIL PROTECTED]> 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 > > > [EMAIL PROTECTED] 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 >> >> >> >
