[jboss-cvs] jboss-seam/src/main/org/jboss/seam/interceptors ...

Shane Bryzak sbryzak at redhat.com
Thu Jun 7 07:34:11 EDT 2007


  User: sbryzak2
  Date: 07/06/07 07:34:11

  Added:       src/main/org/jboss/seam/interceptors 
                        WebServiceInterceptor.java
  Log:
  web service interceptor
  
  Revision  Changes    Path
  1.1      date: 2007/06/07 11:34:11;  author: sbryzak2;  state: Exp;jboss-seam/src/main/org/jboss/seam/interceptors/WebServiceInterceptor.java
  
  Index: WebServiceInterceptor.java
  ===================================================================
  package org.jboss.seam.interceptors;
  
  import java.lang.annotation.Annotation;
  import java.lang.reflect.Method;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.xml.ws.handler.MessageContext;
  
  import org.jboss.seam.annotations.AroundInvoke;
  import org.jboss.seam.annotations.Conversation;
  import org.jboss.seam.annotations.ConversationId;
  import org.jboss.seam.annotations.Interceptor;
  import org.jboss.seam.contexts.ContextAdaptor;
  import org.jboss.seam.contexts.Contexts;
  import org.jboss.seam.contexts.Lifecycle;
  import org.jboss.seam.core.Expressions;
  import org.jboss.seam.core.Manager;
  import org.jboss.seam.intercept.InvocationContext;
  import org.jboss.seam.ws.SeamWSRequestHandler;
  
  /**
   * Implements conversation management for web services.
   * 
   * @author Shane Bryzak
   */
  @Interceptor(stateless=true,
           around={ValidationInterceptor.class, BijectionInterceptor.class},
           within=BusinessProcessInterceptor.class)
  public class WebServiceInterceptor extends AbstractInterceptor
  {
     @AroundInvoke
     public Object aroundInvoke(InvocationContext invocation) throws Exception
     {
        try
        {
           MessageContext messageContext = (MessageContext) Contexts.getEventContext().get(
                    SeamWSRequestHandler.MESSAGE_CONTEXT);
           HttpServletRequest request = (HttpServletRequest) messageContext.get(
                    MessageContext.SERVLET_REQUEST);
           
           String conversationId = extractConversationId(invocation);
           
           Manager.instance().restoreConversation(conversationId);
           Lifecycle.resumeConversation(request.getSession());    
           
           Object result = invocation.proceed();
           
           Manager.instance().endRequest( ContextAdaptor.getSession(request.getSession()) );
           Lifecycle.endRequest();        
           
           return result;
        }
        finally
        {
           Lifecycle.setServletRequest(null);
           Lifecycle.setPhaseId(null);         
        } 
        
     }
     
     private String extractConversationId(InvocationContext invocation)
     {
        Method method = invocation.getMethod();
        
        for ( int i = 0; i < method.getParameterAnnotations().length; i++)
        {         
           Annotation[] annotations = method.getParameterAnnotations()[i];
           
           for ( Annotation annotation : annotations )
           {
              if (annotation.annotationType().equals(ConversationId.class))
              {
                 Conversation conversation = method.getDeclaringClass().getAnnotation(Conversation.class);
                 String conversationName = conversation != null ?
                          conversation.value() : null;
                 
                 ConversationId convId = (ConversationId) annotation;
                 Object paramValue = invocation.getParameters()[i];
                 
                 String id = null;
                 
                 if (convId.value() != null && !"".equals(convId.value()))
                 {
                    Contexts.getEventContext().set("param", paramValue);
                    id = Expressions.instance().createValueExpression(
                             convId.value()).getValue().toString();
                    Contexts.getEventContext().remove("param");
                 }
                 else
                 {
                    id = paramValue.toString();
                 }
                 
                 return (conversationName != null) ? conversationName + ":" + id : id;
              }
           }
        }
        
        return null;
     }
  }
  
  
  



More information about the jboss-cvs-commits mailing list