[seam-commits] Seam SVN: r11761 - in modules/remoting/trunk/src/main/java/org/jboss/seam/remoting: model and 1 other directory.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Sun Dec 6 15:35:02 EST 2009


Author: shane.bryzak at jboss.com
Date: 2009-12-06 15:35:02 -0500 (Sun, 06 Dec 2009)
New Revision: 11761

Added:
   modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/model/ModelHandler.java
Modified:
   modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/ExecutionHandler.java
   modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/Remoting.java
   modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/RequestContext.java
   modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/RequestHandler.java
Log:
added model handler


Modified: modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/ExecutionHandler.java
===================================================================
--- modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/ExecutionHandler.java	2009-12-06 13:24:44 UTC (rev 11760)
+++ modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/ExecutionHandler.java	2009-12-06 20:35:02 UTC (rev 11761)
@@ -18,6 +18,7 @@
 import org.dom4j.Element;
 import org.dom4j.io.SAXReader;
 import org.jboss.seam.remoting.wrapper.Wrapper;
+import org.jboss.weld.conversation.ConversationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -29,29 +30,17 @@
  */
 public class ExecutionHandler implements RequestHandler
 {
-   private static final Logger log = LoggerFactory
-         .getLogger(ExecutionHandler.class);
+   private static final Logger log = LoggerFactory.getLogger(ExecutionHandler.class);
 
-   private static final byte[] HEADER_OPEN = "<header>".getBytes();
-   private static final byte[] HEADER_CLOSE = "</header>".getBytes();
-   private static final byte[] CONVERSATION_ID_TAG_OPEN = "<conversationId>"
-         .getBytes();
-   private static final byte[] CONVERSATION_ID_TAG_CLOSE = "</conversationId>"
-         .getBytes();
-
-   private static final byte[] CONTEXT_TAG_OPEN = "<context>".getBytes();
-   private static final byte[] CONTEXT_TAG_CLOSE = "</context>".getBytes();
-
    @Inject BeanManager beanManager;
+   @Inject ConversationManager conversationManager;
    @Inject Conversation conversation;
 
    /**
     * The entry point for handling a request.
     * 
-    * @param request
-    *           HttpServletRequest
-    * @param response
-    *           HttpServletResponse
+    * @param request HttpServletRequest
+    * @param response HttpServletResponse
     * @throws Exception
     */
    public void handle(HttpServletRequest request,
@@ -78,12 +67,12 @@
       SAXReader xmlReader = new SAXReader();
       Document doc = xmlReader.read(new StringReader(requestData));
       final Element env = doc.getRootElement();
-      final RequestContext ctx = unmarshalContext(env);
+      final RequestContext ctx = new RequestContext(env.element("header"));
       
       if (!ctx.getConversationId().isEmpty())
       { 
-         // TODO restore the conversation if there is a conversation ID in the context
-         //conversation.
+         // this is non portable ;/
+         conversationManager.beginOrRestoreConversation(ctx.getConversationId());
       }
 
       // Extract the calls from the request
@@ -103,35 +92,6 @@
    }
 
    /**
-    * Unmarshals the context from the request envelope header.
-    * 
-    * @param env
-    *           Element
-    * @return RequestContext
-    */
-   private RequestContext unmarshalContext(Element env)
-   {
-      RequestContext ctx = new RequestContext();
-
-      Element header = env.element("header");
-      if (header != null)
-      {
-         Element context = header.element("context");
-         if (context != null)
-         {
-
-            Element convId = context.element("conversationId");
-            if (convId != null)
-            {
-               ctx.setConversationId(convId.getText());
-            }
-         }
-      }
-
-      return ctx;
-   }
-
-   /**
     * Unmarshal the request into a list of Calls.
     * 
     * @param env

Modified: modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/Remoting.java
===================================================================
--- modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/Remoting.java	2009-12-06 13:24:44 UTC (rev 11760)
+++ modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/Remoting.java	2009-12-06 20:35:02 UTC (rev 11761)
@@ -33,9 +33,11 @@
    //private static final String REQUEST_PATH_SUBSCRIPTION = "/subscription";
    //private static final String REQUEST_PATH_POLL = "/poll";
    private static final String REQUEST_PATH_INTERFACE = "/interface.js";   
+   private static final String REQUEST_PATH_MODEL = "/model";
    
    @Inject Instance<ExecutionHandler> executionHandlerInstance;
    @Inject Instance<InterfaceGenerator> interfaceHandlerInstance;
+   @Inject Instance<ModelHandler> modelHandlerInstance;
    
    public static final int DEFAULT_POLL_TIMEOUT = 10; // 10 seconds
    public static final int DEFAULT_POLL_INTERVAL = 1; // 1 second
@@ -214,6 +216,10 @@
          {
             interfaceHandlerInstance.get().handle(request, response);
          }
+         else if (REQUEST_PATH_MODEL.equals(pathInfo))
+         {
+            modelHandlerInstance.get().handle(request, response);
+         }
          else
          {
             Matcher m = pathPattern.matcher(pathInfo);

Modified: modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/RequestContext.java
===================================================================
--- modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/RequestContext.java	2009-12-06 13:24:44 UTC (rev 11760)
+++ modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/RequestContext.java	2009-12-06 20:35:02 UTC (rev 11761)
@@ -1,11 +1,29 @@
 package org.jboss.seam.remoting;
 
+import org.dom4j.Element;
+
 /**
  *
  * @author Shane Bryzak
  */
 public class RequestContext
 {
+   public RequestContext(Element header)
+   {
+      if (header != null)
+      {
+         Element context = header.element("context");
+         if (context != null)
+         {
+            Element convId = context.element("conversationId");
+            if (convId != null)
+            {
+               setConversationId(convId.getText());
+            }
+         }
+      }
+   }
+   
   private String conversationId;
 
   public String getConversationId()

Modified: modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/RequestHandler.java
===================================================================
--- modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/RequestHandler.java	2009-12-06 13:24:44 UTC (rev 11760)
+++ modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/RequestHandler.java	2009-12-06 20:35:02 UTC (rev 11761)
@@ -18,7 +18,18 @@
   static final byte[] REF_TAG_OPEN_START = "<ref id=\"".getBytes();
   static final byte[] REF_TAG_OPEN_END = "\">".getBytes();
   static final byte[] REF_TAG_CLOSE = "</ref>".getBytes();
+  
+  
+  static final byte[] HEADER_OPEN = "<header>".getBytes();
+  static final byte[] HEADER_CLOSE = "</header>".getBytes();
+  static final byte[] CONVERSATION_ID_TAG_OPEN = "<conversationId>"
+        .getBytes();
+  static final byte[] CONVERSATION_ID_TAG_CLOSE = "</conversationId>"
+        .getBytes();
 
+  static final byte[] CONTEXT_TAG_OPEN = "<context>".getBytes();
+  static final byte[] CONTEXT_TAG_CLOSE = "</context>".getBytes();   
+
   void handle(HttpServletRequest request, HttpServletResponse response)
       throws Exception;
 }

Added: modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/model/ModelHandler.java
===================================================================
--- modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/model/ModelHandler.java	                        (rev 0)
+++ modules/remoting/trunk/src/main/java/org/jboss/seam/remoting/model/ModelHandler.java	2009-12-06 20:35:02 UTC (rev 11761)
@@ -0,0 +1,116 @@
+package org.jboss.seam.remoting.model;
+
+import java.io.ByteArrayOutputStream;
+import java.io.StringReader;
+import java.util.Iterator;
+
+import javax.enterprise.context.Conversation;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.jboss.seam.remoting.Call;
+import org.jboss.seam.remoting.RequestContext;
+import org.jboss.seam.remoting.RequestHandler;
+import org.jboss.seam.remoting.wrapper.Wrapper;
+import org.jboss.weld.conversation.ConversationManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ModelHandler implements RequestHandler
+{
+   private static final Logger log = LoggerFactory.getLogger(ModelHandler.class); 
+   
+   @Inject BeanManager beanManager;
+   @Inject ConversationManager conversationManager;
+   @Inject Conversation conversation;
+   @Inject ModelRegistry registry;
+   
+   public void handle(HttpServletRequest request, HttpServletResponse response)
+         throws Exception
+   {
+      response.setContentType("text/xml");
+
+      ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+      byte[] buffer = new byte[256];
+      int read = request.getInputStream().read(buffer);
+      while (read != -1)
+      {
+         out.write(buffer, 0, read);
+         read = request.getInputStream().read(buffer);
+      }
+
+      String requestData = new String(out.toByteArray());
+      log.debug("Processing model request: " + requestData);
+
+      SAXReader xmlReader = new SAXReader();
+      Document doc = xmlReader.read(new StringReader(requestData));
+      final Element env = doc.getRootElement();
+      final RequestContext ctx = new RequestContext(env.element("header"));
+      
+      if (!ctx.getConversationId().isEmpty())
+      { 
+         conversationManager.beginOrRestoreConversation(ctx.getConversationId());
+      }
+      
+      Element modelElement = env.element("body").element("model");
+      
+      String operation = modelElement.attributeValue("operation");
+      String id = modelElement.attributeValue("id");
+      
+      if ("fetch".equals(operation))
+      {
+         Call action = null;
+         if (modelElement.elements("action").size() > 0)
+         {
+            Element actionElement = modelElement.element("action");
+            Element targetElement = actionElement.element("target");
+            Element qualifiersElement = actionElement.element("qualifiers");
+            Element methodElement = actionElement.element("method");
+            Element paramsElement = actionElement.element("params");
+            action = new Call(beanManager, id, targetElement.getTextTrim(), 
+                 qualifiersElement.getTextTrim(), methodElement.getTextTrim());
+            
+            Element refsNode = modelElement.element("refs");
+
+            Iterator<?> iter = refsNode.elementIterator("ref");
+            while (iter.hasNext())
+            {
+               action.getContext().createWrapperFromElement((Element) iter.next());
+            }
+
+            for (Wrapper w : action.getContext().getInRefs().values())
+            {
+               w.unmarshal();
+            }
+
+            iter = paramsElement.elementIterator("param");
+            while (iter.hasNext())
+            {
+               Element param = (Element) iter.next();
+
+               action.addParameter(action.getContext().createWrapperFromElement(
+                     (Element) param.elementIterator().next()));
+            }
+         }
+         
+         // Unmarshal beans
+         
+         // Unmarshal expressions
+         
+         if (action != null)
+         {
+            action.execute();
+         }
+         
+      }
+
+      // Store the conversation ID in the outgoing context
+      ctx.setConversationId(conversation.getId());
+   }
+}



More information about the seam-commits mailing list