Skip to content

Commit

Permalink
Clean up lifecycles (ContextLifecycle, ServletLifecycle, AbstractConv…
Browse files Browse the repository at this point in the history
…ersationManager)

Fix broken (until otherwise proven) test
  • Loading branch information
nickarls committed Apr 6, 2010
1 parent ae8baf4 commit e286909
Show file tree
Hide file tree
Showing 7 changed files with 374 additions and 165 deletions.
261 changes: 194 additions & 67 deletions impl/src/main/java/org/jboss/weld/context/ContextLifecycle.java
Expand Up @@ -30,6 +30,7 @@
import static org.jboss.weld.logging.messages.ContextMessage.REQUEST_STARTED;
import static org.jboss.weld.logging.messages.ContextMessage.SESSION_ENDED;
import static org.jboss.weld.logging.messages.ContextMessage.SESSION_RESTORED;
import static org.jboss.weld.logging.messages.ContextMessage.CONVERSATION_RESTORED;

import org.jboss.weld.bootstrap.api.Lifecycle;
import org.jboss.weld.bootstrap.api.Service;
Expand All @@ -43,11 +44,21 @@
* destroying all the built in contexts
*
* @author Pete Muir
* @author Nicklas Karlsson
*
*/
public class ContextLifecycle implements Lifecycle, Service
{

/*
* Naming conventions:
*
* "activating a context" = setting a non-null BeanStore and setting active to true
* "deactivating a context" = setting a null BeanStore and setting active to false
* "destroying a context" = activating the context, calling destroy(), deactivating the context
* "restoring a context" = alias for activating the context
*
*/

private static final LocLogger log = loggerFactory().getLogger(CONTEXT);

private final AbstractApplicationContext applicationContext;
Expand All @@ -67,34 +78,34 @@ public ContextLifecycle(AbstractApplicationContext applicationContext, AbstractA
this.dependentContext = dependentContext;
}

public void restoreSession(String id, BeanStore sessionBeanStore)
public AbstractApplicationContext getApplicationContext()
{
log.trace(SESSION_RESTORED, id);
setupContext(sessionContext, sessionBeanStore);
return applicationContext;
}

public void endSession(String id, BeanStore sessionBeanStore)
public AbstractApplicationContext getSingletonContext()
{
log.trace(SESSION_ENDED, id);
teardownContext(sessionContext);
return singletonContext;
}

public void beginRequest(String id, BeanStore requestBeanStore)
public SessionContext getSessionContext()
{
log.trace(REQUEST_STARTED, id);
dependentContext.setActive(true);
setupContext(requestContext, requestBeanStore);
setupConversationContext();
return sessionContext;
}

public void endRequest(String id, BeanStore requestBeanStore)
public ConversationContext getConversationContext()
{
log.trace(REQUEST_ENDED, id);
requestContext.setBeanStore(requestBeanStore);
dependentContext.setActive(false);
teardownContext(requestContext);
conversationContext.setBeanStore(null);
conversationContext.setActive(false);
return conversationContext;
}

public RequestContext getRequestContext()
{
return requestContext;
}

public DependentContext getDependentContext()
{
return dependentContext;
}

public boolean isRequestActive()
Expand All @@ -117,20 +128,6 @@ public boolean isSessionActive()
return singletonContext.isActive() && applicationContext.isActive() && sessionContext.isActive() && dependentContext.isActive();
}

public void beginApplication(BeanStore applicationBeanStore)
{
log.trace(APPLICATION_STARTED, "");
setupContext(applicationContext, applicationBeanStore);
setupContext(singletonContext, new ConcurrentHashMapBeanStore());
}

public void endApplication()
{
log.trace(APPLICATION_ENDED, "");
teardownContext(applicationContext);
teardownContext(singletonContext);
}

public void cleanup()
{
dependentContext.cleanup();
Expand All @@ -141,76 +138,206 @@ public void cleanup()
applicationContext.cleanup();
}

public AbstractApplicationContext getApplicationContext()
public void beginApplication(BeanStore applicationBeanStore)
{
return applicationContext;
log.trace(APPLICATION_STARTED, "");
activateApplicationContext(applicationBeanStore);
activateSingletonContext();
}

public AbstractApplicationContext getSingletonContext()
private void activateApplicationContext(BeanStore applicationBeanStore)
{
return singletonContext;
activateContext(applicationContext, applicationBeanStore);
}

public SessionContext getSessionContext()
private void activateContext(AbstractApplicationContext context, BeanStore beanStore)
{
return sessionContext;
if (beanStore == null)
{
throw new IllegalArgumentException("null bean store for " + context);
}
context.setBeanStore(beanStore);
context.setActive(true);
}

public ConversationContext getConversationContext()
private void activateSingletonContext()
{
return conversationContext;
activateContext(singletonContext, new ConcurrentHashMapBeanStore());
}

public RequestContext getRequestContext()
public void beginRequest(String id, BeanStore requestBeanStore)
{
return requestContext;
log.trace(REQUEST_STARTED, id);
activateDependentContext();
activateRequestContext(requestBeanStore);
activateConversationContext();
activateSessionContext();
}

public DependentContext getDependentContext()
private void activateDependentContext()
{
return dependentContext;
dependentContext.setActive(true);
}

public void setupConversationContext()
private void activateRequestContext(BeanStore requestBeanStore)
{
setupContext(conversationContext, new HashMapBeanStore());
activateContext(requestContext, requestBeanStore);
}

public void teardownConversationContext()
private void activateContext(AbstractThreadLocalMapContext context, BeanStore beanStore)
{
teardownContext(conversationContext);
if (beanStore == null)
{
throw new IllegalArgumentException("null bean store for " + context);
}
context.setBeanStore(beanStore);
context.setActive(true);
}

private void setupContext(AbstractThreadLocalMapContext context, BeanStore beanStore)
private void activateConversationContext()
{
context.setBeanStore(beanStore);
context.setActive(true);
activateContext(conversationContext, new ConcurrentHashMapBeanStore());
}

private void setupContext(AbstractApplicationContext context, BeanStore beanStore)
private void activateSessionContext()
{
context.setBeanStore(beanStore);
context.setActive(true);
activateContext(sessionContext, new ConcurrentHashMapBeanStore());
}
private void teardownContext(AbstractThreadLocalMapContext context)

public void endApplication()
{
if (context.getBeanStore() == null)
{
return;
}
context.setActive(true);
log.trace(APPLICATION_ENDED, "");
destroyApplicationContext();
destroySingletonContext();
}

private void destroyApplicationContext()
{
destroyContext(applicationContext);
}

private void destroyContext(AbstractApplicationContext context)
{
if (context.getBeanStore() == null)
{
return;
}
activateContext(context, context.getBeanStore());
context.destroy();
deactivateContext(context);
}

private void deactivateContext(AbstractApplicationContext context)
{
context.setBeanStore(null);
context.setActive(false);
}
private void teardownContext(AbstractApplicationContext context)

private void destroySingletonContext()
{
context.setActive(true);
destroyContext(singletonContext);
}

public void endRequest(String id, BeanStore requestBeanStore)
{
log.trace(REQUEST_ENDED, id);
deactivateDependentContext();
destroyRequestContext(requestBeanStore);
deactivateConversationContext();
deactivateSessionContext();
}

private void deactivateDependentContext()
{
dependentContext.setActive(false);
}

private void destroyRequestContext(BeanStore requestBeanStore)
{
destroyContext(requestContext, requestBeanStore);
}

private void deactivateConversationContext()
{
deactivateContext(conversationContext);
}

public void deactivateSessionContext()
{
deactivateContext(sessionContext);
}

public void endSession(String id, BeanStore sessionBeanStore)
{
log.trace(SESSION_ENDED, id);
destroyConversationContext();
destroySessionContext(sessionBeanStore);
}

private void destroyConversationContext()
{
destroyContext(conversationContext, conversationContext.getBeanStore());
}

private void destroySessionContext(BeanStore sessionBeanStore)
{
destroyContext(sessionContext, sessionBeanStore);
}

private void destroyContext(AbstractThreadLocalMapContext context, BeanStore beanStore)
{
activateContext(context, beanStore);
context.destroy();
deactivateContext(context);
}

private void deactivateContext(AbstractThreadLocalMapContext context)
{
context.setBeanStore(null);
context.setActive(false);
}
}

public void restoreSession(String id, BeanStore sessionBeanStore)
{
log.trace(SESSION_RESTORED, id);
activateSessionContext(sessionBeanStore);
}

private void activateSessionContext(BeanStore sessionBeanStore)
{
activateContext(sessionContext, sessionBeanStore);
}

public void restoreConversation(String id, BeanStore conversationBeanStore)
{
log.trace(CONVERSATION_RESTORED, id);
activateConversationContext(new HashMapBeanStore());
conversationContext.loadTransientBeanStore(conversationBeanStore);
}

private void activateConversationContext(BeanStore conversationBeanStore)
{
activateContext(conversationContext, conversationBeanStore);
}

public void setupConversationContext()
{
activateConversationContext();
}

public void teardownConversationContext()
{
destroyConversationContext();
}

public boolean isSessionContextActive()
{
return sessionContext.isActive();
}

public boolean isRequestContextActive()
{
return requestContext.isActive();
}

}
}
Expand Up @@ -167,7 +167,7 @@ public ConversationManager2 setupConversation(String cid)
}
String oldConversation = conversation.toString();
conversation.switchTo(resumedManagedConversation.getConversation());
getConversationContext().loadTransientBeanStore(getBeanStore(cid));
getContextLifeCycle().restoreConversation(cid, getBeanStore(cid));
log.trace(CONVERSATION_SWITCHED, oldConversation, conversation);
return this;
}
Expand Down Expand Up @@ -297,17 +297,22 @@ public ConversationManager2 destroyBackgroundConversations()

public ConversationManager2 setupContext()
{
Container.instance().services().get(ContextLifecycle.class).setupConversationContext();
getContextLifeCycle().setupConversationContext();
return this;
}

public ConversationManager2 teardownContext()
{
Container.instance().services().get(ContextLifecycle.class).teardownConversationContext();
getContextLifeCycle().teardownConversationContext();
destroyBackgroundConversations();
return this;
}

private ContextLifecycle getContextLifeCycle()
{
return Container.instance().services().get(ContextLifecycle.class);
}

public String generateConversationId()
{
return conversationIdGenerator.nextId();
Expand Down
Expand Up @@ -47,6 +47,7 @@ public enum ContextMessage
@MessageId("000210") DEPENDENT_INSTANCE_ATTACHED,
@MessageId("000211") DELIMITER_IN_PREFIX,
@MessageId("000212") CONTEXTUAL_IS_NULL,
@MessageId("000213") NO_BEAN_STORE_AVAILABLE;
@MessageId("000213") NO_BEAN_STORE_AVAILABLE,
@MessageId("000214") CONVERSATION_RESTORED;

}

0 comments on commit e286909

Please sign in to comment.