[seam-commits] Seam SVN: r11696 - in modules/trunk/remoting: examples/helloworld/src/main/webapp/WEB-INF and 8 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Sat Nov 28 09:03:05 EST 2009


Author: shane.bryzak at jboss.com
Date: 2009-11-28 09:03:05 -0500 (Sat, 28 Nov 2009)
New Revision: 11696

Added:
   modules/trunk/remoting/src/main/resources/META-INF/
   modules/trunk/remoting/src/main/resources/META-INF/beans.xml
   modules/trunk/remoting/src/main/resources/org/
   modules/trunk/remoting/src/main/resources/org/jboss/
   modules/trunk/remoting/src/main/resources/org/jboss/seam/
   modules/trunk/remoting/src/main/resources/org/jboss/seam/remoting/
   modules/trunk/remoting/src/main/resources/org/jboss/seam/remoting/remote.js
Modified:
   modules/trunk/remoting/examples/helloworld/src/main/webapp/WEB-INF/web.xml
   modules/trunk/remoting/pom.xml
   modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/InterfaceGenerator.java
   modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/Remoting.java
   modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/messaging/SubscriptionRegistry.java
Log:
get example deploying, remoting servlet working


Modified: modules/trunk/remoting/examples/helloworld/src/main/webapp/WEB-INF/web.xml
===================================================================
--- modules/trunk/remoting/examples/helloworld/src/main/webapp/WEB-INF/web.xml	2009-11-28 10:59:01 UTC (rev 11695)
+++ modules/trunk/remoting/examples/helloworld/src/main/webapp/WEB-INF/web.xml	2009-11-28 14:03:05 UTC (rev 11696)
@@ -28,7 +28,7 @@
 
    <servlet-mapping>
       <servlet-name>Remoting Servlet</servlet-name>
-      <url-pattern>/seam/resource/remoting</url-pattern>
+      <url-pattern>/seam/resource/remoting/*</url-pattern>
    </servlet-mapping>
                     
    <context-param>

Modified: modules/trunk/remoting/pom.xml
===================================================================
--- modules/trunk/remoting/pom.xml	2009-11-28 10:59:01 UTC (rev 11695)
+++ modules/trunk/remoting/pom.xml	2009-11-28 14:03:05 UTC (rev 11696)
@@ -34,10 +34,11 @@
          <scope>provided</scope>
       </dependency>
 
-      <dependency>
+      <!--dependency>
          <groupId>${seam.groupId}</groupId>
          <artifactId>seam-el</artifactId>
-      </dependency>
+         <scope>provided</scope>
+      </dependency-->
 
       <!--dependency>
          <groupId>${seam.groupId}</groupId>

Modified: modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/InterfaceGenerator.java
===================================================================
--- modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/InterfaceGenerator.java	2009-11-28 10:59:01 UTC (rev 11695)
+++ modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/InterfaceGenerator.java	2009-11-28 14:03:05 UTC (rev 11696)
@@ -70,17 +70,23 @@
          throw new ServletException("Invalid request - no component specified");
       }
 
-      Set<Bean> beans = new HashSet<Bean>();
+      Set<Bean<?>> beansCached = new HashSet<Bean<?>>();
       Set<Type> types = new HashSet<Type>();
 
       response.setContentType("text/javascript");
 
-      Enumeration e = request.getParameterNames();
+      Enumeration<?> e = request.getParameterNames();
       while (e.hasMoreElements())
       {
          String componentName = ((String) e.nextElement()).trim();
 
-         Bean bean = beanManager.getBeans(componentName).iterator().next();
+         Set<Bean<?>> beans = beanManager.getBeans(componentName);
+         Bean<?> bean = null;
+         if (!beans.isEmpty())
+         {
+            bean = beans.iterator().next();
+         }
+
          if (bean == null)
          {
             try
@@ -96,11 +102,11 @@
             }
          } else
          {
-            beans.add(bean);
+            beansCached.add(bean);
          }
       }
 
-      generateBeanInterface(beans, response.getOutputStream(), types);
+      generateBeanInterface(beansCached, response.getOutputStream(), types);
    }
 
    /**
@@ -115,10 +121,10 @@
     * @throws IOException
     *            Thrown if there is an error writing to the OutputStream
     */
-   public void generateBeanInterface(Set<Bean> beans,
+   public void generateBeanInterface(Set<Bean<?>> beans,
          OutputStream out, Set<Type> types) throws IOException
    {
-      for (Bean bean : beans)
+      for (Bean<?> bean : beans)
       {
          if (bean != null)
          {
@@ -149,7 +155,7 @@
     *           Class
     * @return List
     */
-   public static Set<String> getAccessibleProperties(Class cls)
+   public static Set<String> getAccessibleProperties(Class<?> cls)
    {
       /**
        * @todo This is a hack to get the "real" class - find out if there is an

Modified: modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/Remoting.java
===================================================================
--- modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/Remoting.java	2009-11-28 10:59:01 UTC (rev 11695)
+++ modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/Remoting.java	2009-11-28 14:03:05 UTC (rev 11696)
@@ -197,20 +197,20 @@
    {
       try
       {
-         String pathInfo = request.getPathInfo().substring(
-               servletConfig.getServletContext().getContextPath().length());
+        // String pathInfo = request.getPathInfo().substring(
+          //     servletConfig.getServletContext().getContextPath().length());
 
-         if (REQUEST_PATH_EXECUTE.equals(pathInfo))
+         if (REQUEST_PATH_EXECUTE.equals(request.getPathInfo()))
          {
             executionHandlerInstance.get().handle(request, response);
          }
-         else if (REQUEST_PATH_INTERFACE.equals(pathInfo))
+         else if (REQUEST_PATH_INTERFACE.equals(request.getPathInfo()))
          {
             interfaceHandlerInstance.get().handle(request, response);
          }
          else
          {
-            Matcher m = pathPattern.matcher(pathInfo);
+            Matcher m = pathPattern.matcher(request.getPathInfo());
             if (m.matches())
             {
                String path = m.group(1);

Modified: modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/messaging/SubscriptionRegistry.java
===================================================================
--- modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/messaging/SubscriptionRegistry.java	2009-11-28 10:59:01 UTC (rev 11695)
+++ modules/trunk/remoting/src/main/java/org/jboss/seam/remoting/messaging/SubscriptionRegistry.java	2009-11-28 14:03:05 UTC (rev 11696)
@@ -1,5 +1,6 @@
 package org.jboss.seam.remoting.messaging;
 
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -18,7 +19,7 @@
  * @author Shane Bryzak
  */
 @ApplicationScoped
-public class SubscriptionRegistry
+public class SubscriptionRegistry implements Serializable
 {
   private String connectionProvider;
 

Added: modules/trunk/remoting/src/main/resources/META-INF/beans.xml
===================================================================

Added: modules/trunk/remoting/src/main/resources/org/jboss/seam/remoting/remote.js
===================================================================
--- modules/trunk/remoting/src/main/resources/org/jboss/seam/remoting/remote.js	                        (rev 0)
+++ modules/trunk/remoting/src/main/resources/org/jboss/seam/remoting/remote.js	2009-11-28 14:03:05 UTC (rev 11696)
@@ -0,0 +1,1235 @@
+// Init base-level objects
+var Seam = new Object();
+Seam.Remoting = new Object();
+Seam.Component = new Object();
+Seam.pageContext = new Object();
+
+// Components registered here
+Seam.Component.components = new Array();
+Seam.Component.instances = new Array();
+
+Seam.Component.newInstance = function(name)
+{
+  for (var i = 0; i < Seam.Component.components.length; i++)
+  {
+    if (Seam.Component.components[i].__name == name)
+      return new Seam.Component.components[i];
+  }
+}
+
+Seam.Component.getInstance = function(name)
+{
+  for (var i = 0; i < Seam.Component.components.length; i++)
+  {
+    if (Seam.Component.components[i].__name == name)
+    {
+      if (Seam.Component.components[i].__instance == null)
+        Seam.Component.components[i].__instance = new Seam.Component.components[i]();
+      return Seam.Component.components[i].__instance;
+    }
+  }
+  return null;
+}
+
+Seam.Component.getComponentType = function(obj)
+{
+  for (var i = 0; i < Seam.Component.components.length; i++)
+  {
+    if (obj instanceof Seam.Component.components[i])
+      return Seam.Component.components[i];
+  }
+  return null;
+}
+
+Seam.Component.getComponentName = function(obj)
+{
+  var componentType = Seam.Component.getComponentType(obj);
+  return componentType ? componentType.__name : null;
+}
+
+Seam.Component.register = function(component)
+{
+  for (var i = 0; i < Seam.Component.components.length; i++)
+  {
+    if (Seam.Component.components[i].__name == component.__name)
+    {
+      // Replace the existing component with the new one
+      Seam.Component.components[i] = component;
+      return;
+    }
+  }
+  Seam.Component.components.push(component);
+  component.__instance = null;
+}
+
+Seam.Component.isRegistered = function(name)
+{
+  for (var i = 0; i < Seam.Component.components.length; i++)
+  {
+    if (Seam.Component.components[i].__name == name)
+      return true;
+  }
+  return false;
+}
+
+Seam.Component.getMetadata = function(obj)
+{
+  for (var i = 0; i < Seam.Component.components.length; i++)
+  {
+    if (obj instanceof Seam.Component.components[i])
+      return Seam.Component.components[i].__metadata;
+  }
+  return null;
+}
+
+Seam.Remoting.extractEncodedSessionId = function(url) 
+{
+	var sessionId = null;
+  if (url.indexOf(';jsessionid=') >= 0)
+  {
+    var qpos = url.indexOf('?');
+    sessionId = url.substring(url.indexOf(';jsessionid=') + 12, qpos >= 0 ? qpos : url.length); 
+  }
+	return sessionId;
+}
+
+Seam.Remoting.PATH_EXECUTE = "/execute";
+Seam.Remoting.PATH_SUBSCRIPTION = "/subscription";
+Seam.Remoting.PATH_POLL = "/poll";
+
+Seam.Remoting.encodedSessionId = Seam.Remoting.extractEncodedSessionId(window.location.href);
+
+// Type declarations will live in this namespace
+Seam.Remoting.type = new Object();
+
+// Types are registered in an array
+Seam.Remoting.types = new Array();
+
+Seam.Remoting.debug = false;
+Seam.Remoting.debugWindow = null;
+
+Seam.Remoting.setDebug = function(val)
+{
+  Seam.Remoting.debug = val;
+}
+
+// Log a message to a popup debug window
+Seam.Remoting.log = function(msg)
+{
+  if (!Seam.Remoting.debug)
+    return;
+
+  if (!Seam.Remoting.debugWindow || Seam.Remoting.debugWindow.document == null)
+  {
+    var attr = "left=400,top=400,resizable=yes,scrollbars=yes,width=400,height=400";
+    Seam.Remoting.debugWindow = window.open("", "__seamDebugWindow", attr);
+    if (Seam.Remoting.debugWindow)
+    {
+      Seam.Remoting.debugWindow.document.write("<html><head><title>Seam Debug Window</title></head><body></body></html>");
+      var bodyTag = Seam.Remoting.debugWindow.document.getElementsByTagName("body").item(0);
+      bodyTag.style.fontFamily = "arial";
+      bodyTag.style.fontSize = "8pt";
+    }
+  }
+
+  if (Seam.Remoting.debugWindow)
+  {
+    msg = msg.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
+    Seam.Remoting.debugWindow.document.write("<pre>" + (new Date()) + ": " + msg + "</pre><br/>");
+  }
+}
+
+Seam.Remoting.createNamespace = function(namespace)
+{
+  var parts = namespace.split(".");
+  var base = Seam.Remoting.type;
+  
+  for(var i = 0; i < parts.length; i++)
+  {
+    if (typeof base[parts[i]] == "undefined")
+      base[parts[i]] = new Object();
+    base = base[parts[i]];
+  }
+}
+
+Seam.Remoting.__Context = function()
+{
+  this.conversationId = null;
+
+  Seam.Remoting.__Context.prototype.setConversationId = function(conversationId)
+  {
+    this.conversationId = conversationId;
+  }
+
+  Seam.Remoting.__Context.prototype.getConversationId = function()
+  {
+    return this.conversationId;
+  }
+}
+
+Seam.Remoting.Exception = function(msg) 
+{
+  this.message = msg;
+  
+  Seam.Remoting.Exception.prototype.getMessage = function()
+  {
+    return this.message;
+  }
+}
+
+Seam.Remoting.context = new Seam.Remoting.__Context();
+
+Seam.Remoting.getContext = function()
+{
+  return Seam.Remoting.context;
+}
+
+Seam.Remoting.Map = function()
+{
+  this.elements = new Array();
+
+  Seam.Remoting.Map.prototype.size = function()
+  {
+    return this.elements.length;
+  }
+
+  Seam.Remoting.Map.prototype.isEmpty = function()
+  {
+    return this.elements.length == 0;
+  }
+
+  Seam.Remoting.Map.prototype.keySet = function()
+  {
+    var keySet = new Array();
+    for (var i = 0; i < this.elements.length; i++)
+      keySet[keySet.length] = this.elements[i].key;
+    return keySet;
+  }
+
+  Seam.Remoting.Map.prototype.values = function()
+  {
+    var values = new Array();
+    for (var i = 0; i < this.elements.length; i++)
+      values[values.length] = this.elements[i].value;
+    return values;
+  }
+
+  Seam.Remoting.Map.prototype.get = function(key)
+  {
+    for (var i = 0; i < this.elements.length; i++)
+    {
+      if (this.elements[i].key == key)
+        return this.elements[i].value;
+    }
+    return null;
+  }
+
+  Seam.Remoting.Map.prototype.put = function(key, value)
+  {
+    for (var i = 0; i < this.elements.length; i++)
+    {
+      if (this.elements[i].key == key)
+      {
+        this.elements[i].value = value;
+        return;
+      }
+    }
+    this.elements.push({key:key,value:value});
+  }
+
+  Seam.Remoting.Map.prototype.remove = function(key)
+  {
+    for (var i = 0; i < this.elements.length; i++)
+    {
+      if (this.elements[i].key == key)
+        this.elements.splice(i, 1);
+    }
+  }
+
+  Seam.Remoting.Map.prototype.contains = function(key)
+  {
+    for (var i = 0; i < this.elements.length; i++)
+    {
+      if (this.elements[i].key == key)
+        return true;
+    }
+    return false;
+  }
+}
+
+Seam.Remoting.registerType = function(type)
+{
+  for (var i = 0; i < Seam.Remoting.types.length; i++)
+  {
+    if (Seam.Remoting.types[i].__name == type.__name)
+    {
+      Seam.Remoting.types[i] = type;
+      return;
+    }
+  }
+  Seam.Remoting.types.push(type);
+}
+
+Seam.Remoting.createType = function(name)
+{
+  for (var i = 0; i < Seam.Remoting.types.length; i++)
+  {
+    if (Seam.Remoting.types[i].__name == name)
+      return new Seam.Remoting.types[i];
+  }
+}
+
+Seam.Remoting.getType = function(obj)
+{
+  for (var i = 0; i < Seam.Remoting.types.length; i++)
+  {
+    if (obj instanceof Seam.Remoting.types[i])
+      return Seam.Remoting.types[i];
+  }
+  return null;
+}
+
+Seam.Remoting.getTypeName = function(obj)
+{
+  var type = Seam.Remoting.getType(obj);
+  return type ? type.__name : null;
+}
+
+Seam.Remoting.getMetadata = function(obj)
+{
+  for (var i = 0; i < Seam.Remoting.types.length; i++)
+  {
+    if (obj instanceof Seam.Remoting.types[i])
+      return Seam.Remoting.types[i].__metadata;
+  }
+  return null;
+}
+
+Seam.Remoting.serializeValue = function(value, type, refs)
+{
+  if (value == null)
+    return "<null/>";
+  else if (type)
+  {
+    switch (type) {
+      // Boolean
+      case "bool": return "<bool>" + (value ? "true" : "false") + "</bool>";
+
+      // Numerical types
+      case "number": return "<number>" + value + "</number>";
+
+      // Date
+      case "date": return Seam.Remoting.serializeDate(value);
+      // Beans
+      case "bean": return Seam.Remoting.getTypeRef(value, refs);
+
+      // Collections
+      case "bag": return Seam.Remoting.serializeBag(value, refs);
+      case "map": return Seam.Remoting.serializeMap(value, refs);
+
+      default: return "<str>" + encodeURIComponent(value) + "</str>";
+    }
+  }
+  else // We don't know the type.. try to guess
+  {
+    switch (typeof(value)) {
+      case "number":
+        return "<number>" + value + "</number>";
+      case "boolean":
+        return "<bool>" + (value ? "true" : "false") + "</bool>";
+      case "object":
+        if (value instanceof Array)
+          return Seam.Remoting.serializeBag(value, refs);
+        else if (value instanceof Date)
+          return Seam.Remoting.serializeDate(value);
+        else if (value instanceof Seam.Remoting.Map)
+          return Seam.Remoting.serializeMap(value, refs);
+        else
+          return Seam.Remoting.getTypeRef(value, refs);
+      default:
+        return "<str>" + encodeURIComponent(value) + "</str>"; // Default to String
+    }
+  }
+}
+
+Seam.Remoting.serializeBag = function(value, refs)
+{
+  var data = "<bag>";
+
+  for (var i = 0; i < value.length; i++)
+  {
+    data += "<element>";
+    data += Seam.Remoting.serializeValue(value[i], null, refs);
+    data += "</element>";
+  }
+
+  data += "</bag>";
+  return data;
+}
+
+Seam.Remoting.serializeMap = function(value, refs)
+{
+  var data = "<map>";
+
+  var keyset = value.keySet();
+  for (var i = 0; i < keyset.length; i++)
+  {
+    data += "<element><k>";
+    data += Seam.Remoting.serializeValue(keyset[i], null, refs);
+    data += "</k><v>";
+    data += Seam.Remoting.serializeValue(value.get(keyset[i]), null, refs);
+    data += "</v></element>";
+  }
+
+  data += "</map>";
+  return data;
+}
+
+Seam.Remoting.serializeDate = function(value)
+{
+  var zeroPad = function(val, digits) { while (("" + val).length < digits) val = "0" + val; return val; };
+
+  var data = "<date>";
+  data += value.getFullYear();
+  data += zeroPad(value.getMonth() + 1, 2);
+  data += zeroPad(value.getDate(), 2);
+  data += zeroPad(value.getHours(), 2);
+  data += zeroPad(value.getMinutes(), 2);
+  data += zeroPad(value.getSeconds(), 2);
+  data += zeroPad(value.getMilliseconds(), 3);
+  data += "</date>";
+  return data;
+}
+
+Seam.Remoting.getTypeRef = function(obj, refs)
+{
+  var refId = -1;
+
+  for (var i = 0; i < refs.length; i++)
+  {
+    if (refs[i] == obj)
+    {
+      refId = i;
+      break;
+    }
+  }
+
+  if (refId == -1)
+  {
+    refId = refs.length;
+    refs[refId] = obj;
+  }
+
+  return "<ref id=\"" + refId + "\"/>";
+}
+
+Seam.Remoting.serializeType = function(obj, refs)
+{
+  var data = "<bean type=\"";
+
+  var objType = Seam.Component.getComponentType(obj);
+  var isComponent = objType != null;
+
+  if (!isComponent)
+    objType = Seam.Remoting.getType(obj);
+
+  if (!objType)
+  {
+    alert("Unknown Type error.");
+    return null;
+  }
+
+  data += objType.__name;
+  data += "\">\n";
+
+  var meta = isComponent ? Seam.Component.getMetadata(obj) : Seam.Remoting.getMetadata(obj);
+  for (var i = 0; i < meta.length; i++)
+  {
+    data += "<member name=\"";
+    data += meta[i].field;
+    data += "\">";
+    data += Seam.Remoting.serializeValue(obj[meta[i].field], meta[i].type, refs);
+    data += "</member>\n";
+  }
+
+  data += "</bean>";
+
+  return data;
+}
+
+Seam.Remoting.__callId = 0;
+
+// eval() disabled until security issues resolved.
+
+//Seam.Remoting.eval = function(expression, callback)
+//{
+//  var callId = "" + Seam.Remoting.__callId++; 
+//  var data = "<eval expr=\"";
+//  data += expression;
+//  data += "\" id=\"";
+//  data += callId;
+//  data += "\"/>";
+//  var call = {data: data, id: callId, callback: callback};  
+  
+//  var envelope = Seam.Remoting.createEnvelope(Seam.Remoting.createHeader(), data);
+//  Seam.Remoting.pendingCalls.put(call.id, call);
+  
+//  call.asyncReq = Seam.Remoting.sendAjaxRequest(envelope, Seam.Remoting.PATH_EXECUTE, Seam.Remoting.processResponse, false);
+//}
+
+Seam.Remoting.createCall = function(component, methodName, params, callback, exceptionHandler)
+{
+  var callId = "" + Seam.Remoting.__callId++;
+  if (!callback)
+    callback = component.__callback[methodName];
+
+  var data = "<call component=\"";
+  data += Seam.Component.getComponentType(component).__name;
+  data += "\" method=\"";
+  data += methodName;
+  data += "\" id=\"";
+  data += callId;
+  data += "\">\n";
+
+  // Add parameters
+  data += "<params>";
+
+  var refs = new Array();
+
+  for (var i = 0; i < params.length; i++)
+  {
+    data += "<param>";
+    data += Seam.Remoting.serializeValue(params[i], null, refs);
+    data += "</param>";
+  }
+
+  data += "</params>";
+
+  // Add refs
+  data += "<refs>";
+  for (var i = 0; i < refs.length; i++)
+  {
+    data += "<ref id=\"" + i + "\">";
+    data += Seam.Remoting.serializeType(refs[i], refs);
+    data += "</ref>";
+  }
+  data += "</refs>";
+
+  data += "</call>";
+
+  return {data: data, id: callId, callback: callback, exceptionHandler: exceptionHandler};
+}
+
+Seam.Remoting.createHeader = function()
+{
+  var header = "";
+
+  header += "<context>";
+  if (Seam.Remoting.getContext().getConversationId())
+  {
+    header += "<conversationId>";
+    header += Seam.Remoting.getContext().getConversationId();
+    header += "</conversationId>";
+  }
+  header += "</context>";
+
+  return header;
+}
+
+Seam.Remoting.createEnvelope = function(header, body)
+{
+  var data = "<envelope>";
+
+  if (header)
+  {
+    data += "<header>";
+    data += header;
+    data += "</header>";
+  }
+
+  if (body)
+  {
+    data += "<body>";
+    data += body;
+    data += "</body>";
+  }
+
+  data += "</envelope>";
+
+  return data;
+}
+
+Seam.Remoting.pendingCalls = new Seam.Remoting.Map();
+Seam.Remoting.inBatch = false;
+Seam.Remoting.batchedCalls = new Array();
+
+Seam.Remoting.startBatch = function()
+{
+  Seam.Remoting.inBatch = true;
+  Seam.Remoting.batchedCalls.length = 0;
+}
+
+Seam.Remoting.executeBatch = function()
+{
+  if (!Seam.Remoting.inBatch)
+    return;
+
+  var data = "";
+  for (var i = 0; i < Seam.Remoting.batchedCalls.length; i++)
+  {
+    Seam.Remoting.pendingCalls.put(Seam.Remoting.batchedCalls[i].id, Seam.Remoting.batchedCalls[i]);
+    data += Seam.Remoting.batchedCalls[i].data;
+  }
+
+  var envelope = Seam.Remoting.createEnvelope(Seam.Remoting.createHeader(), data);
+  Seam.Remoting.batchAsyncReq = Seam.Remoting.sendAjaxRequest(envelope, Seam.Remoting.PATH_EXECUTE, Seam.Remoting.processResponse, false);
+  Seam.Remoting.inBatch = false;
+}
+
+Seam.Remoting.cancelBatch = function()
+{
+  Seam.Remoting.inBatch = false;
+  for (var i = 0; i < Seam.Remoting.batchedCalls.length; i++)
+    Seam.Remoting.pendingCalls.remove(Seam.Remoting.batchedCalls[i].id);
+}
+
+Seam.Remoting.cancelCall = function(callId)
+{
+  var call = Seam.Remoting.pendingCalls.get(callId);
+  Seam.Remoting.pendingCalls.remove(callId);
+  if (call && call.asyncReq)
+  {
+    if (Seam.Remoting.pendingCalls.isEmpty())
+      Seam.Remoting.hideLoadingMessage();
+    window.setTimeout(function() {
+      call.asyncReq.onreadystatechange = function() {};
+    }, 0);
+    call.asyncReq.abort();
+  }
+}
+
+Seam.Remoting.execute = function(component, methodName, params, callback, exceptionHandler)
+{
+  var call = Seam.Remoting.createCall(component, methodName, params, callback, exceptionHandler);
+
+  if (Seam.Remoting.inBatch)
+  {
+    Seam.Remoting.batchedCalls[Seam.Remoting.batchedCalls.length] = call;
+  }
+  else
+  {
+    // Marshal the request
+    var envelope = Seam.Remoting.createEnvelope(Seam.Remoting.createHeader(), call.data);
+    Seam.Remoting.pendingCalls.put(call.id, call);
+    Seam.Remoting.sendAjaxRequest(envelope, Seam.Remoting.PATH_EXECUTE, Seam.Remoting.processResponse, false);
+  }
+
+  return call;
+}
+
+Seam.Remoting.sendAjaxRequest = function(envelope, path, callback, silent)
+{
+  Seam.Remoting.log("Request packet:\n" + envelope);
+
+  if (!silent)
+    Seam.Remoting.displayLoadingMessage();
+    
+  var asyncReq;
+
+  if (window.XMLHttpRequest)
+  {
+    asyncReq = new XMLHttpRequest();
+    if (asyncReq.overrideMimeType)
+      asyncReq.overrideMimeType('text/xml');
+  }
+  else
+  {
+    asyncReq = new ActiveXObject("Microsoft.XMLHTTP");
+  }
+
+  asyncReq.onreadystatechange = function() 
+  {
+    if (asyncReq.readyState == 4)
+    {
+      var inScope = typeof(Seam) == "undefined" ? false : true;
+      
+      if (inScope) Seam.Remoting.hideLoadingMessage();
+        
+      if (asyncReq.status == 200)
+      {
+        // We do this to avoid a memory leak
+        window.setTimeout(function() {
+          asyncReq.onreadystatechange = function() {};
+        }, 0);      
+      
+        if (inScope) Seam.Remoting.log("Response packet:\n" + asyncReq.responseText);
+  
+        if (callback)
+        {
+          // The following code deals with a Firefox security issue.  It reparses the XML
+          // response if accessing the documentElement throws an exception
+          try
+          {         
+            asyncReq.responseXML.documentElement;
+            //Seam.Remoting.processResponse(asyncReq.responseXML);
+	    callback(asyncReq.responseXML);
+          }
+          catch (ex)
+          {
+             try
+             {
+               // Try it the IE way first...
+               var doc = new ActiveXObject("Microsoft.XMLDOM");
+               doc.async = "false";
+               doc.loadXML(asyncReq.responseText);
+               callback(doc);
+             }
+             catch (e)
+             {
+               // If that fails, use standards
+               var parser = new DOMParser();
+               //Seam.Remoting.processResponse(parser.parseFromString(asyncReq.responseText, "text/xml"));
+	       callback(parser.parseFromString(asyncReq.responseText, "text/xml")); 
+             }
+          } 
+        }
+      }
+      else
+      {
+        Seam.Remoting.displayError(asyncReq.status);
+      }
+    }    
+  }
+
+  if (Seam.Remoting.encodedSessionId)
+  {
+    path += ';jsessionid=' + Seam.Remoting.encodedSessionId;
+  }
+    
+  asyncReq.open("POST", Seam.Remoting.resourcePath + path, true);
+  asyncReq.send(envelope);
+}
+
+Seam.Remoting.displayError = function(code)
+{
+  alert("There was an error processing your request.  Error code: " + code);  
+}
+
+Seam.Remoting.setCallback = function(component, methodName, callback)
+{
+  component.__callback[methodName] = callback;
+}
+
+Seam.Remoting.processResponse = function(doc)
+{
+  var headerNode;
+  var bodyNode;
+
+  var inScope = typeof(Seam) == "undefined" ? false : true;
+  if (!inScope) return;    
+  
+  var context = new Seam.Remoting.__Context;
+
+  if (doc.documentElement)
+  {
+    for (var i = 0; i < doc.documentElement.childNodes.length; i++)
+    {
+      var node = doc.documentElement.childNodes.item(i);
+      if (node.tagName == "header")
+        headerNode = node;
+      else if (node.tagName == "body")
+        bodyNode = node;
+    }
+  }
+
+  if (headerNode)
+  {
+    var contextNode;
+    for (var i = 0; i < headerNode.childNodes.length; i++)
+    {
+      var node = headerNode.childNodes.item(i);
+      if (node.tagName == "context")
+      {
+        contextNode = node;
+        break;
+      }
+    }
+    if (contextNode && context)
+    {
+      Seam.Remoting.unmarshalContext(contextNode, context);
+      if (context.getConversationId() && Seam.Remoting.getContext().getConversationId() == null)
+        Seam.Remoting.getContext().setConversationId(context.getConversationId());
+    }
+  }
+
+  if (bodyNode)
+  {
+    for (var i = 0; i < bodyNode.childNodes.length; i++)
+    {
+      var node = bodyNode.childNodes.item(i);
+      if (node.tagName == "result")
+        Seam.Remoting.processResult(node, context);
+    }
+  }
+}
+
+Seam.Remoting.processResult = function(result, context)
+{
+  var callId = result.getAttribute("id");
+  var call = Seam.Remoting.pendingCalls.get(callId);
+  Seam.Remoting.pendingCalls.remove(callId);
+
+  if (call && (call.callback || call.exceptionHandler))
+  {
+    var valueNode = null;
+    var refsNode = null;
+    var exceptionNode = null;
+
+    var children = result.childNodes;
+    for (var i = 0; i < children.length; i++)
+    {
+      var tag = children.item(i).tagName;
+      if (tag == "value")
+        valueNode = children.item(i);
+      else if (tag == "refs")
+        refsNode = children.item(i);
+      else if (tag == "exception")
+        exceptionNode = children.item(i);
+    }
+
+    if (exceptionNode != null)
+    {
+      var msgNode = null;
+      var children = exceptionNode.childNodes;
+      for (var i = 0; i < children.length; i++)
+      {
+        var tag = children.item(i).tagName;
+        if (tag == "message")
+          msgNode = children.item(i); 
+      }
+      
+      var msg = Seam.Remoting.unmarshalValue(msgNode.firstChild);
+      var ex = new Seam.Remoting.Exception(msg);
+      call.exceptionHandler(ex); 
+    }
+    else
+    {
+      var refs = new Array();
+      if (refsNode)
+        Seam.Remoting.unmarshalRefs(refsNode, refs);
+  
+      var value = Seam.Remoting.unmarshalValue(valueNode.firstChild, refs);
+  
+      call.callback(value, context, callId);
+    }
+  }
+}
+
+Seam.Remoting.unmarshalContext = function(ctxNode, context)
+{
+  for (var i = 0; i < ctxNode.childNodes.length; i++)
+  {
+    var tag = ctxNode.childNodes.item(i).tagName;
+    if (tag == "conversationId")
+      context.setConversationId(ctxNode.childNodes.item(i).firstChild.nodeValue);
+  }
+}
+
+Seam.Remoting.unmarshalRefs = function(refsNode, refs)
+{
+  var objs = new Array();
+
+  // Pass 1 - create the reference objects
+  for (var i = 0; i < refsNode.childNodes.length; i++)
+  {
+    if (refsNode.childNodes.item(i).tagName == "ref")
+    {
+      var refNode = refsNode.childNodes.item(i);
+      var refId = parseInt(refNode.getAttribute("id"));
+
+      var valueNode = refNode.firstChild;
+      if (valueNode.tagName == "bean")
+      {
+        var obj = null;
+        var typeName = valueNode.getAttribute("type");
+        if (Seam.Component.isRegistered(typeName))
+          obj = Seam.Component.newInstance(typeName);
+        else
+          obj = Seam.Remoting.createType(typeName);
+        if (obj)
+        {
+          refs[refId] = obj;
+          objs[objs.length] = {obj: obj, node: valueNode};
+        }
+      }
+    }
+  }
+
+  // Pass 2 - populate the object members
+  for (var i = 0; i < objs.length; i++)
+  {
+    for (var j = 0; j < objs[i].node.childNodes.length; j++)
+    {
+      var child = objs[i].node.childNodes.item(j);
+      if (child.tagName == "member")
+      {
+        var name = child.getAttribute("name");
+        objs[i].obj[name] = Seam.Remoting.unmarshalValue(child.firstChild, refs);
+      }
+    }
+  }
+}
+
+Seam.Remoting.unmarshalValue = function(element, refs)
+{
+  var tag = element.tagName;
+
+  switch (tag)
+  {
+    case "bool": return element.firstChild.nodeValue == "true";
+    case "number":
+      if (element.firstChild.nodeValue.indexOf(".") == -1)
+        return parseInt(element.firstChild.nodeValue);
+      else
+        return parseFloat(element.firstChild.nodeValue);
+    case "str":
+      var data = "";
+      for (var i = 0; i < element.childNodes.length; i++)
+      {
+        if (element.childNodes[i].nodeType == 3) // NODE_TEXT
+          data += element.childNodes[i].nodeValue;
+      }
+      return decodeURIComponent(data);
+    case "ref": return refs[parseInt(element.getAttribute("id"))];
+    case "bag":
+      var value = new Array();
+      for (var i = 0; i < element.childNodes.length; i++)
+      {
+        if (element.childNodes.item(i).tagName == "element")
+          value[value.length] = Seam.Remoting.unmarshalValue(element.childNodes.item(i).firstChild, refs);
+      }
+      return value;
+    case "map":
+      var map = new Seam.Remoting.Map();
+      for (var i = 0; i < element.childNodes.length; i++)
+      {
+        var childNode = element.childNodes.item(i);
+        if (childNode.tagName == "element")
+        {
+          var key = null
+          var value = null;
+
+          for (var j = 0; j < childNode.childNodes.length; j++)
+          {
+            if (key == null && childNode.childNodes.item(j).tagName == "k")
+              key = Seam.Remoting.unmarshalValue(childNode.childNodes.item(j).firstChild, refs);
+            else if (value == null && childNode.childNodes.item(j).tagName == "v")
+              value = Seam.Remoting.unmarshalValue(childNode.childNodes.item(j).firstChild, refs);
+          }
+
+          if (key != null)
+            map.put(key, value);
+        }
+      }
+      return map;
+    case "date": return Seam.Remoting.deserializeDate(element.firstChild.nodeValue);
+    default: return null;
+  }
+}
+
+Seam.Remoting.deserializeDate = function(val)
+{
+  var dte = new Date();
+  dte.setFullYear(parseInt(val.substring(0,4), 10),
+                  parseInt(val.substring(4,6), 10) - 1,
+                  parseInt(val.substring(6,8), 10));
+  dte.setHours(parseInt(val.substring(8,10), 10));
+  dte.setMinutes(parseInt(val.substring(10,12), 10));
+  dte.setSeconds(parseInt(val.substring(12,14), 10));
+  dte.setMilliseconds(parseInt(val.substring(14,17), 10));
+  return dte;
+}
+
+Seam.Remoting.loadingMsgDiv = null;
+Seam.Remoting.loadingMessage = "Please wait...";
+Seam.Remoting.displayLoadingMessage = function()
+{
+  if (!Seam.Remoting.loadingMsgDiv)
+  {
+    Seam.Remoting.loadingMsgDiv = document.createElement('div');
+    var msgDiv = Seam.Remoting.loadingMsgDiv;
+    msgDiv.setAttribute('id', 'loadingMsg');
+
+    msgDiv.style.position = "absolute";
+    msgDiv.style.top = "0px";
+    msgDiv.style.right = "0px";
+    msgDiv.style.background = "red";
+    msgDiv.style.color = "white";
+    msgDiv.style.fontFamily = "Verdana,Helvetica,Arial";
+    msgDiv.style.fontSize = "small";
+    msgDiv.style.padding = "2px";
+    msgDiv.style.border = "1px solid black";
+
+    document.body.appendChild(msgDiv);
+
+    var text = document.createTextNode(Seam.Remoting.loadingMessage);
+    msgDiv.appendChild(text);
+  }
+  else
+  {
+    Seam.Remoting.loadingMsgDiv.innerHTML = Seam.Remoting.loadingMessage;
+    Seam.Remoting.loadingMsgDiv.style.visibility = 'visible';
+  }
+}
+
+Seam.Remoting.hideLoadingMessage = function()
+{
+  if (Seam.Remoting.loadingMsgDiv)
+    Seam.Remoting.loadingMsgDiv.style.visibility = 'hidden';
+}
+
+/* Messaging API */
+
+Seam.Remoting.pollInterval = 10; // Default poll interval of 10 seconds
+Seam.Remoting.pollTimeout = 0; // Default timeout of 0 seconds
+Seam.Remoting.polling = false;
+
+Seam.Remoting.setPollInterval = function(interval)
+{
+  Seam.Remoting.pollInterval = interval;
+}
+
+Seam.Remoting.setPollTimeout = function(timeout)
+{
+  Seam.Remoting.pollTimeout = timeout;
+}
+
+Seam.Remoting.subscriptionRegistry = new Array();
+
+Seam.Remoting.subscribe = function(topicName, callback)
+{
+  for (var i = 0; i < Seam.Remoting.subscriptionRegistry.length; i++)
+  {
+    if (Seam.Remoting.subscriptionRegistry[i].topic == topicName)
+      return;
+  }
+
+  var body = "<subscribe topic=\"" + topicName + "\"/>";
+  var env = Seam.Remoting.createEnvelope(null, body);
+  Seam.Remoting.subscriptionRegistry.push({topic:topicName, callback:callback});
+  Seam.Remoting.sendAjaxRequest(env, Seam.Remoting.PATH_SUBSCRIPTION, Seam.Remoting.subscriptionCallback, false);
+}
+
+Seam.Remoting.unsubscribe = function(topicName)
+{
+  var token = null;
+
+  for (var i = 0; i < Seam.Remoting.subscriptionRegistry.length; i++)
+  {
+    if (Seam.Remoting.subscriptionRegistry[i].topic == topicName)
+    {
+      token = Seam.Remoting.subscriptionRegistry[i].token;
+      Seam.Remoting.subscriptionRegistry.splice(i, 1);
+    }
+  }
+
+  if (token)
+  {
+    var body = "<unsubscribe token=\"" + token + "\"/>";
+    var env = Seam.Remoting.createEnvelope(null, body);
+    Seam.Remoting.sendAjaxRequest(env, Seam.Remoting.PATH_SUBSCRIPTION, null, false);
+  }
+}
+
+Seam.Remoting.subscriptionCallback = function(doc)
+{
+  var body = doc.documentElement.firstChild;
+  for (var i = 0; i < body.childNodes.length; i++)
+  {
+    var node = body.childNodes.item(i);
+    if (node.tagName == "subscription")
+    {
+      var topic = node.getAttribute("topic");
+      var token = node.getAttribute("token");
+      for (var i = 0; i < Seam.Remoting.subscriptionRegistry.length; i++)
+      {
+        if (Seam.Remoting.subscriptionRegistry[i].topic == topic)
+        {
+          Seam.Remoting.subscriptionRegistry[i].token = token;
+          Seam.Remoting.poll();
+          break;
+        }
+      }
+    }
+  }
+}
+
+Seam.Remoting.pollTimeoutFunction = null;
+
+Seam.Remoting.poll = function()
+{
+  if (Seam.Remoting.polling)
+    return;
+
+  Seam.Remoting.polling = true;
+  clearTimeout(Seam.Remoting.pollTimeoutFunction);
+
+  var body = "";
+
+  if (Seam.Remoting.subscriptionRegistry.length == 0)
+  {
+    Seam.Remoting.polling = false;
+    return;
+  }
+
+  for (var i = 0; i < Seam.Remoting.subscriptionRegistry.length; i++)
+  {
+    body += "<poll token=\"" + Seam.Remoting.subscriptionRegistry[i].token + "\" ";
+    body += "timeout=\"" + Seam.Remoting.pollTimeout + "\"/>";
+  }
+
+  var env = Seam.Remoting.createEnvelope(null, body);
+  Seam.Remoting.sendAjaxRequest(env, Seam.Remoting.PATH_POLL, Seam.Remoting.pollCallback, true);
+}
+
+Seam.Remoting.pollCallback = function(doc)
+{
+  Seam.Remoting.polling = false;
+
+  var body = doc.documentElement.firstChild;
+  for (var i = 0; i < body.childNodes.length; i++)
+  {
+    var node = body.childNodes.item(i);
+    if (node.tagName == "messages")
+      Seam.Remoting.processMessages(node);
+    else if (node.tagName == "errors")
+      Seam.Remoting.processPollErrors(node);
+  }
+
+  Seam.Remoting.pollTimeoutFunction = setTimeout("Seam.Remoting.poll()", Math.max(Seam.Remoting.pollInterval * 1000, 1000));
+}
+
+Seam.Remoting.processMessages = function(messages)
+{
+  var token = messages.getAttribute("token");
+
+  var callback = null;
+  for (var i = 0; i < Seam.Remoting.subscriptionRegistry.length; i++)
+  {
+    if (Seam.Remoting.subscriptionRegistry[i].token == token)
+    {
+      callback = Seam.Remoting.subscriptionRegistry[i].callback;
+      break;
+    }
+  }
+
+  if (callback != null)
+  {
+    var messageNode = null;
+
+    var children = messages.childNodes;
+    for (var i = 0; i < children.length; i++)
+    {
+      if (children.item(i).tagName == "message")
+      {
+        messageNode = children.item(i);
+        var messageType = messageNode.getAttribute("type");
+
+        var valueNode = null;
+        var refsNode = null;
+        for (var j = 0; j < messageNode.childNodes.length; j++)
+        {
+          var node = messageNode.childNodes.item(j);
+          if (node.tagName == "value")
+            valueNode = node;
+          else if (node.tagName == "refs")
+            refsNode = node;
+        }
+
+        var refs = new Array();
+        if (refsNode)
+          Seam.Remoting.unmarshalRefs(refsNode, refs);
+
+        var value = Seam.Remoting.unmarshalValue(valueNode.firstChild, refs);
+
+        callback(Seam.Remoting.createMessage(messageType, value));
+      }
+    }
+  }
+}
+
+Seam.Remoting.processErrors = function(errors)
+{
+  var token = errors.getAttribute("token");
+
+  // Unsubscribe to the topic
+  for (var i = 0; i < Seam.Remoting.subscriptionRegistry.length; i++)
+  {
+    if (Seam.Remoting.subscriptionRegistry[i].token == token)
+    {
+      Seam.Remoting.subscriptionRegistry.splice(i, 1);
+      break;
+    }
+  }
+
+  for (var i = 0; i < errors.childNodes.length; i++)
+  {
+    if (errors.childNodes.item(i).tagName == "error")
+    {
+      var errorNode = errors.childNodes.item(i);
+      var code = errorNode.getAttribute("code");
+      var message = errorNode.firstChild.nodeValue;
+
+      if (Seam.Remoting.onPollError)
+        Seam.Remoting.onPollError(code, message);
+      else
+        alert("A polling error occurred: " + code + " " + message);
+    }
+  }
+}
+
+Seam.Remoting.ObjectMessage = function()
+{
+  this.value = null;
+
+  Seam.Remoting.ObjectMessage.prototype.getValue = function()
+  {
+    return this.value;
+  }
+
+  Seam.Remoting.ObjectMessage.prototype.setValue = function(value)
+  {
+    this.value = value;
+  }
+}
+
+Seam.Remoting.TextMessage = function()
+{
+  this.text = null;
+
+  Seam.Remoting.TextMessage.prototype.getText = function()
+  {
+    return this.text;
+  }
+
+  Seam.Remoting.TextMessage.prototype.setText = function(text)
+  {
+    this.text = text;
+  }
+}
+
+Seam.Remoting.createMessage = function(messageType, value)
+{
+  switch (messageType)
+  {
+    case "object":
+      var msg = new Seam.Remoting.ObjectMessage();
+      msg.setValue(value);
+      return msg;
+    case "text":
+      var msg = new Seam.Remoting.TextMessage();
+      msg.setText(value);
+      return msg;
+  }
+  return null;
+}



More information about the seam-commits mailing list