Skip to content

Commit

Permalink
WELD-52
Browse files Browse the repository at this point in the history
  • Loading branch information
pmuir committed Jan 13, 2010
1 parent cd79c18 commit 80c804b
Show file tree
Hide file tree
Showing 56 changed files with 376 additions and 333 deletions.
Expand Up @@ -16,7 +16,8 @@
*/
package org.jboss.weld.jsf;

import static org.jboss.weld.jsf.JsfHelper.getModuleBeanManager;
import static org.jboss.weld.jsf.JsfHelper.getServletContext;
import static org.jboss.weld.servlet.BeanProvider.conversation;

import javax.faces.application.ViewHandler;
import javax.faces.application.ViewHandlerWrapper;
Expand Down Expand Up @@ -67,7 +68,7 @@ public ConversationAwareViewHandler(ViewHandler delegate)
public String getActionURL(FacesContext context, String viewId)
{
String actionUrl = super.getActionURL(context, viewId);
ConversationImpl conversation = getModuleBeanManager(context).getInstanceByType(ConversationImpl.class);
ConversationImpl conversation = conversation(getServletContext(context));
if (!conversation.isTransient())
{
return new FacesUrlTransformer(actionUrl, context).appendConversationIdIfNecessary(conversation.getUnderlyingId()).getUrl();
Expand Down
Expand Up @@ -15,14 +15,10 @@
* limitations under the License.
*/
package org.jboss.weld.jsf;
import static org.jboss.weld.jsf.JsfHelper.getConversationId;

import static org.jboss.weld.jsf.JsfHelper.getModuleBeanManager;

import javax.enterprise.util.AnnotationLiteral;
import javax.faces.context.FacesContext;

import org.jboss.weld.conversation.ConversationIdName;

/**
* Helper class for preparing JSF URLs which include the conversation id.
*
Expand Down Expand Up @@ -50,7 +46,7 @@ public FacesUrlTransformer(String url, FacesContext facesContext)

public FacesUrlTransformer appendConversationIdIfNecessary(String cid)
{
String cidParamName = getModuleBeanManager(context).getInstanceByType(String.class, new AnnotationLiteral<ConversationIdName>(){});
String cidParamName = getConversationId(context);
int queryStringIndex = url.indexOf(QUERY_STRING_DELIMITER);
// if there is no query string or there is a query string but the cid param is absent, then append it
if (queryStringIndex < 0 || url.indexOf(cidParamName + PARAMETER_ASSIGNMENT_OPERATOR, queryStringIndex) < 0)
Expand Down
44 changes: 5 additions & 39 deletions impl/src/main/java/org/jboss/weld/jsf/JsfHelper.java
Expand Up @@ -21,18 +21,13 @@
import static org.jboss.weld.logging.messages.JsfMessage.FOUND_CONVERSATION_FROM_REQUEST;
import static org.jboss.weld.logging.messages.JsfMessage.IMPROPER_ENVIRONMENT;
import static org.jboss.weld.logging.messages.JsfMessage.RESUMING_CONVERSATION;
import static org.jboss.weld.servlet.BeanProvider.conversationIdName;

import javax.enterprise.util.AnnotationLiteral;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.jboss.weld.Container;
import org.jboss.weld.conversation.ConversationIdName;
import org.jboss.weld.exceptions.ForbiddenStateException;
import org.jboss.weld.manager.BeanManagerImpl;
import org.jboss.weld.servlet.ServletHelper;
import org.jboss.weld.util.reflection.SecureReflections;
import org.slf4j.cal10n.LocLogger;

/**
Expand All @@ -43,36 +38,8 @@
*/
public class JsfHelper
{
private static final LocLogger log = loggerFactory().getLogger(JSF);

/**
* Checks if the current request is a JSF postback. The JsfApiAbstraction is
* consulted to determine if the JSF version is compatible with JSF 2.0. If
* so, the {@link FacesContext#isPostback()} convenience method is used
* (which is technically an optimized and safer implementation). Otherwise,
* the ResponseStateManager is consulted directly.
*
* @return true if this request is a JSF postback, false otherwise
*/
public static boolean isPostback(FacesContext facesContext)
{
if (Container.instance().services().get(JsfApiAbstraction.class).isApiVersionCompatibleWith(2.0))
{
try
{
return (Boolean) SecureReflections.invoke(facesContext, "isPostback");
}
catch (Exception e)
{
// Sorry, guys ;-) --NIK
return false;
}
}
else
{
return facesContext.getRenderKit().getResponseStateManager().isPostback(facesContext);
}
}
private static final LocLogger log = loggerFactory().getLogger(JSF);

/**
* Gets the propagated conversation id parameter from the request
Expand All @@ -81,8 +48,7 @@ public static boolean isPostback(FacesContext facesContext)
*/
public static String getConversationIdFromRequest(FacesContext facesContext)
{
BeanManagerImpl moduleBeanManager = JsfHelper.getModuleBeanManager(facesContext);
String cidName = moduleBeanManager.getInstanceByType(String.class, new AnnotationLiteral<ConversationIdName>(){});
String cidName = conversationIdName(getServletContext(facesContext));
String cid = facesContext.getExternalContext().getRequestParameterMap().get(cidName);
log.trace(FOUND_CONVERSATION_FROM_REQUEST, cid);
return cid;
Expand Down Expand Up @@ -118,11 +84,11 @@ public static HttpSession getHttpSession(FacesContext facesContext)
}
}

public static BeanManagerImpl getModuleBeanManager(FacesContext facesContext)
public static ServletContext getServletContext(FacesContext facesContext)
{
if (facesContext.getExternalContext().getContext() instanceof ServletContext)
{
return ServletHelper.getModuleBeanManager((ServletContext) facesContext.getExternalContext().getContext());
return (ServletContext) facesContext.getExternalContext().getContext();
}
else
{
Expand Down
24 changes: 11 additions & 13 deletions impl/src/main/java/org/jboss/weld/jsf/WeldPhaseListener.java
Expand Up @@ -24,28 +24,28 @@

import static org.jboss.weld.jsf.JsfHelper.getConversationId;
import static org.jboss.weld.jsf.JsfHelper.getHttpSession;
import static org.jboss.weld.jsf.JsfHelper.getModuleBeanManager;
import static org.jboss.weld.jsf.JsfHelper.getServletContext;
import static org.jboss.weld.logging.Category.JSF;
import static org.jboss.weld.logging.LoggerFactory.loggerFactory;
import static org.jboss.weld.logging.messages.JsfMessage.CLEANING_UP_CONVERSATION;
import static org.jboss.weld.logging.messages.JsfMessage.INITIATING_CONVERSATION;
import static org.jboss.weld.logging.messages.JsfMessage.SKIPPING_CLEANING_UP_CONVERSATION;
import static org.jboss.weld.servlet.BeanProvider.conversation;
import static org.jboss.weld.servlet.BeanProvider.conversationManager;
import static org.jboss.weld.servlet.BeanProvider.httpSessionManager;

import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.jboss.weld.Container;
import org.jboss.weld.context.ContextLifecycle;
import org.jboss.weld.context.ConversationContext;
import org.jboss.weld.context.SessionContext;
import org.jboss.weld.conversation.ConversationImpl;
import org.jboss.weld.conversation.ConversationManager;
import org.jboss.weld.manager.BeanManagerImpl;
import org.jboss.weld.servlet.ConversationBeanStore;
import org.jboss.weld.servlet.HttpSessionManager;
import org.slf4j.cal10n.LocLogger;

/**
Expand Down Expand Up @@ -123,13 +123,12 @@ private void beforeRestoreView(FacesContext facesContext)
*/
private void afterRenderResponse(FacesContext facesContext)
{
BeanManagerImpl moduleBeanManager = getModuleBeanManager(facesContext);
SessionContext sessionContext = Container.instance().services().get(ContextLifecycle.class).getSessionContext();
ConversationContext conversationContext = Container.instance().services().get(ContextLifecycle.class).getConversationContext();
if (sessionContext.isActive())
{
log.trace(CLEANING_UP_CONVERSATION, "Render Response", "response complete");
moduleBeanManager.getInstanceByType(ConversationManager.class).cleanupConversation();
conversationManager(getServletContext(facesContext)).cleanupConversation();
conversationContext.setActive(false);
}
else
Expand All @@ -143,12 +142,11 @@ private void afterRenderResponse(FacesContext facesContext)
*/
private void afterResponseComplete(FacesContext facesContext, PhaseId phaseId)
{
BeanManagerImpl moduleBeanManager = getModuleBeanManager(facesContext);
SessionContext sessionContext = Container.instance().services().get(ContextLifecycle.class).getSessionContext();
if (sessionContext.isActive())
{
log.trace(CLEANING_UP_CONVERSATION, phaseId, "the response has been marked complete");
moduleBeanManager.getInstanceByType(ConversationManager.class).cleanupConversation();
conversationManager(getServletContext(facesContext)).cleanupConversation();
}
else
{
Expand All @@ -164,11 +162,11 @@ private void afterResponseComplete(FacesContext facesContext, PhaseId phaseId)
*/
private void initiateSessionAndConversation(FacesContext facesContext)
{
ServletContext servletContext = getServletContext(facesContext);
HttpSession session = getHttpSession(facesContext);
BeanManagerImpl moduleBeanManager = getModuleBeanManager(facesContext);
moduleBeanManager.getInstanceByType(HttpSessionManager.class).setSession(session);
moduleBeanManager.getInstanceByType(ConversationManager.class).beginOrRestoreConversation(getConversationId(facesContext));
String cid = moduleBeanManager.getInstanceByType(ConversationImpl.class).getUnderlyingId();
httpSessionManager(servletContext).setSession(session);
conversationManager(servletContext).beginOrRestoreConversation(getConversationId(facesContext));
String cid = conversation(servletContext).getUnderlyingId();

ConversationContext conversationContext = Container.instance().services().get(ContextLifecycle.class).getConversationContext();
conversationContext.setBeanStore(new ConversationBeanStore(session, cid));
Expand Down
26 changes: 0 additions & 26 deletions impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java
Expand Up @@ -33,7 +33,6 @@
import static org.jboss.weld.logging.messages.BeanManagerMessage.TOO_MANY_ACTIVITIES;
import static org.jboss.weld.logging.messages.BeanManagerMessage.UNPROXYABLE_RESOLUTION;
import static org.jboss.weld.logging.messages.BeanManagerMessage.UNRESOLVABLE_ELEMENT;
import static org.jboss.weld.logging.messages.BeanManagerMessage.UNRESOLVABLE_TYPE;

import java.io.Serializable;
import java.lang.annotation.Annotation;
Expand Down Expand Up @@ -872,31 +871,6 @@ public Object getInjectableReference(InjectionPoint injectionPoint, CreationalCo
return getReference(injectionPoint, resolvedBean, creationalContext);
}

/**
* Returns an instance by API type and binding types
*
* @param beanType The API type to match
* @param bindings The binding types to match
* @return An instance of the bean
*
*/
@Deprecated
public <T> T getInstanceByType(Class<T> beanType, Annotation... bindings)
{
Set<Bean<?>> beans = getBeans(beanType, bindings);
Bean<?> bean = resolve(beans);
if (bean == null)
{
throw new UnsatisfiedResolutionException(UNRESOLVABLE_TYPE, beanType, Arrays.toString(bindings));
}
Object reference = getReference(bean, beanType, createCreationalContext(bean));

@SuppressWarnings("unchecked")
T instance = (T) reference;

return instance;
}

public <T> Bean<T> getBean(WeldAnnotated<T, ?> element, Annotation... bindings)
{
Bean<T> bean = (Bean<T>) resolve(getBeans(element, bindings));
Expand Down
56 changes: 56 additions & 0 deletions impl/src/main/java/org/jboss/weld/servlet/BeanProvider.java
@@ -0,0 +1,56 @@
package org.jboss.weld.servlet;

import static org.jboss.weld.servlet.ServletHelper.getModuleBeanManager;

import javax.enterprise.inject.spi.Bean;
import javax.enterprise.util.AnnotationLiteral;
import javax.servlet.ServletContext;

import org.jboss.weld.conversation.ConversationIdName;
import org.jboss.weld.conversation.ConversationImpl;
import org.jboss.weld.conversation.ConversationManager;
import org.jboss.weld.manager.BeanManagerImpl;

public class BeanProvider
{

private static class ConversationIdNameLiteral extends AnnotationLiteral<ConversationIdName> implements ConversationIdName
{

public static final ConversationIdName INSTANCE = new ConversationIdNameLiteral();

private ConversationIdNameLiteral() {}

}

public static ConversationManager conversationManager(ServletContext servletContext)
{
BeanManagerImpl beanManager = getModuleBeanManager(servletContext);
Bean<?> bean = beanManager.resolve(beanManager.getBeans(ConversationManager.class));
return (ConversationManager) beanManager.getReference(bean, ConversationManager.class, beanManager.createCreationalContext(bean));
}

public static HttpSessionManager httpSessionManager(ServletContext servletContext)
{
BeanManagerImpl beanManager = getModuleBeanManager(servletContext);
Bean<?> bean = beanManager.resolve(beanManager.getBeans(HttpSessionManager.class));
return (HttpSessionManager) beanManager.getReference(bean, HttpSessionManager.class, beanManager.createCreationalContext(bean));
}

public static ConversationImpl conversation(ServletContext servletContext)
{
BeanManagerImpl beanManager = getModuleBeanManager(servletContext);
Bean<?> bean = beanManager.resolve(beanManager.getBeans(ConversationImpl.class));
return (ConversationImpl) beanManager.getReference(bean, ConversationImpl.class, beanManager.createCreationalContext(bean));
}

public static String conversationIdName(ServletContext servletContext)
{
BeanManagerImpl beanManager = getModuleBeanManager(servletContext);
Bean<?> bean = beanManager.resolve(beanManager.getBeans(String.class, ConversationIdNameLiteral.INSTANCE));
return (String) beanManager.getReference(bean, String.class, beanManager.createCreationalContext(bean));
}

private BeanProvider() {}

}
Expand Up @@ -16,11 +16,11 @@
*/
package org.jboss.weld.servlet;

import static org.jboss.weld.servlet.ServletHelper.getModuleBeanManager;
import static org.jboss.weld.servlet.BeanProvider.conversation;
import static org.jboss.weld.servlet.BeanProvider.conversationManager;

import java.io.IOException;

import javax.enterprise.util.AnnotationLiteral;
import javax.faces.context.FacesContext;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
Expand All @@ -33,9 +33,7 @@
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.jboss.weld.conversation.ConversationIdName;
import org.jboss.weld.conversation.ConversationImpl;
import org.jboss.weld.conversation.ConversationManager;
import org.jboss.weld.jsf.FacesUrlTransformer;

/**
Expand Down Expand Up @@ -79,12 +77,11 @@ private ServletResponse wrapResponse(HttpServletResponse response, final String
@Override
public void sendRedirect(String path) throws IOException
{
ConversationImpl conversation = getModuleBeanManager(ctx) .getInstanceByType(ConversationImpl.class);
ConversationImpl conversation = conversation(ctx);
if (!conversation.isTransient())
{
String cidParamName = getModuleBeanManager(ctx).getInstanceByType(String.class, new AnnotationLiteral<ConversationIdName>(){});
path = new FacesUrlTransformer(path, FacesContext.getCurrentInstance()).toRedirectViewId().toActionUrl().appendConversationIdIfNecessary(conversation.getUnderlyingId()).encode();
getModuleBeanManager(ctx).getInstanceByType(ConversationManager.class).cleanupConversation();
conversationManager(ctx).cleanupConversation();
}
super.sendRedirect(path);
}
Expand Down
Expand Up @@ -23,7 +23,8 @@
package org.jboss.weld.servlet;

import static org.jboss.weld.logging.messages.ServletMessage.REQUEST_SCOPE_BEAN_STORE_MISSING;
import static org.jboss.weld.servlet.ServletHelper.getModuleBeanManager;
import static org.jboss.weld.servlet.BeanProvider.conversationManager;
import static org.jboss.weld.servlet.BeanProvider.httpSessionManager;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
Expand Down Expand Up @@ -73,7 +74,7 @@ public void beginSession(HttpSession session)
*/
public void endSession(HttpSession session)
{
ConversationManager conversationManager = getModuleBeanManager(session.getServletContext()).getInstanceByType(ConversationManager.class);
ConversationManager conversationManager = conversationManager(session.getServletContext());
if (lifecycle.getSessionContext().isActive())
{
conversationManager.destroyAllConversations();
Expand Down Expand Up @@ -111,7 +112,7 @@ protected BeanStore restoreSessionContext(HttpServletRequest request)
lifecycle.restoreSession(session == null ? "Inactive session" : session.getId(), sessionBeanStore);
if (session != null)
{
getModuleBeanManager(session.getServletContext()).getInstanceByType(HttpSessionManager.class).setSession(session);
httpSessionManager(session.getServletContext()).setSession(session);
}
return sessionBeanStore;
}
Expand All @@ -120,7 +121,7 @@ protected BeanStore restoreSessionContext(HttpSession session)
{
BeanStore beanStore = new HttpSessionBeanStore(session);
lifecycle.restoreSession(session.getId(), beanStore);
getModuleBeanManager(session.getServletContext()).getInstanceByType(HttpSessionManager.class).setSession(session);
httpSessionManager(session.getServletContext()).setSession(session);
return beanStore;
}

Expand Down

0 comments on commit 80c804b

Please sign in to comment.