You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by si...@apache.org on 2006/05/14 20:34:58 UTC

svn commit: r406397 - in /cocoon: branches/BRANCH_2_1_X/ trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/

Author: simoneg
Date: Sun May 14 11:34:57 2006
New Revision: 406397

URL: http://svn.apache.org/viewcvs?rev=406397&view=rev
Log:
COCOON-1804 added FOM_SimpleCocoon to give access to cocoon javascript object from definition snippets also when javaflow is used

Added:
    cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/FOM_SimpleCocoon.java
Modified:
    cocoon/branches/BRANCH_2_1_X/status.xml
    cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/JavaScriptHelper.java

Modified: cocoon/branches/BRANCH_2_1_X/status.xml
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/status.xml?rev=406397&r1=406396&r2=406397&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml (original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml Sun May 14 11:34:57 2006
@@ -182,6 +182,11 @@
   <release version="@version@" date="@date@">
 -->
   <release version="2.1.10" date="TBD">
+    <action dev="SG" type="add" fixes-bug="COCOON-1804">
+      Added a lightweight FOM_SimpleCocoon class, and placed it in the javascript scope when there isn't 
+      already a scope defined. This way, even when using javaflow, you have access to the cocoon
+      object (with request etc..) from javascript snippets in definition.
+    </action>
     <action dev="SG" type="add" fixes-bug="COCOON-1782">
       Added CSS classes in cocoon forms default XSLs.
     </action>

Added: cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/FOM_SimpleCocoon.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/FOM_SimpleCocoon.java?rev=406397&view=auto
==============================================================================
--- cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/FOM_SimpleCocoon.java (added)
+++ cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/FOM_SimpleCocoon.java Sun May 14 11:34:57 2006
@@ -0,0 +1,119 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.forms.util;
+
+import java.util.Map;
+
+import org.apache.cocoon.components.flow.javascript.fom.FOM_Cocoon;
+import org.apache.cocoon.components.flow.javascript.fom.FOM_Cocoon.FOM_Context;
+import org.apache.cocoon.components.flow.javascript.fom.FOM_Cocoon.FOM_Request;
+import org.apache.cocoon.components.flow.javascript.fom.FOM_Cocoon.FOM_Session;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ * A simplified javascript cocoon object to use when using javaflow. In that case
+ * the cocoon object would not be accessible from definition javascript snippets.
+ */
+public class FOM_SimpleCocoon extends ScriptableObject {
+
+    private Map objectModel;
+
+    public String getClassName() {
+        return "FOM_SimpleCocoon";
+    }
+
+    private FOM_Cocoon.FOM_Request request = null;
+    private FOM_Cocoon.FOM_Context context = null;
+    private FOM_Cocoon.FOM_Session session = null;
+    
+    private Scriptable response;
+    private Scriptable parameters;
+    
+    
+    public Scriptable jsGet_request() {
+        return getRequest();
+    }
+
+    public Scriptable jsGet_response() {
+        return getResponse();
+    }
+
+    public Scriptable jsGet_context() {
+        return getContext();
+    }
+
+    public Scriptable jsGet_session() {
+        return getSession();
+    }
+
+    /**
+     * Get Sitemap parameters
+     *
+     * @return a <code>Scriptable</code> value whose properties represent
+     * the Sitemap parameters from <map:call>
+     */
+    public Scriptable jsGet_parameters() {
+        //return getParameters();
+        // TODO parameters are accessible someway?
+        return null;
+    }
+
+    public Scriptable getSession() {
+        if (session != null) {
+            return session;
+        }
+        session = new FOM_Session(
+                getParentScope(),
+                ObjectModelHelper.getRequest(objectModel).getSession(true));
+        return session;
+    }
+
+    public Scriptable getRequest() {
+        if (request != null) {
+            return request;
+        }
+        request = new FOM_Request(
+                getParentScope(),
+                ObjectModelHelper.getRequest(objectModel));
+        return request;
+    }
+
+    public Scriptable getContext() {
+        if (context != null) {
+            return context;
+        }
+        context = new FOM_Context(
+                getParentScope(),
+                ObjectModelHelper.getContext(objectModel));
+        return context;
+    }
+
+    public Scriptable getResponse() {
+        if (response != null) {
+            return response;
+        }
+        response = org.mozilla.javascript.Context.toObject(
+                ObjectModelHelper.getResponse(objectModel),
+                getParentScope());
+        return response;
+    }
+    
+    public void setObjectModel(Map objectModel) {
+        this.objectModel = objectModel;
+    }
+}

Modified: cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/JavaScriptHelper.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/JavaScriptHelper.java?rev=406397&r1=406396&r2=406397&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/JavaScriptHelper.java (original)
+++ cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/util/JavaScriptHelper.java Sun May 14 11:34:57 2006
@@ -28,6 +28,7 @@
 import org.mozilla.javascript.JavaScriptException;
 import org.mozilla.javascript.Script;
 import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
 import org.w3c.dom.Element;
 
 /**
@@ -59,7 +60,7 @@
         try {
             // This version of compileReader is deprecated but must be left as is to avoid breaking 2.1
             script = ctx.compileReader(
-                getRootScope(), //scope
+                getRootScope(null), //scope
                 new StringReader(jsText), // in
                 sourceName == null ? "<unknown>" : sourceName, // sourceName
                 DomHelper.getLineLocation(element), // lineNo
@@ -98,7 +99,7 @@
         Function func;
         try {
             func = ctx.compileFunction(
-                getRootScope(), //scope
+                getRootScope(null), //scope
                 jsText, // in
                 sourceName == null ? "<unknown>" : sourceName, // sourceName
                 DomHelper.getLineLocation(element) - 1, // lineNo, "-1" because we added "function..."
@@ -115,7 +116,7 @@
      * 
      * @return an appropriate root scope
      */
-    public static Scriptable getRootScope() {
+    public static Scriptable getRootScope(Map objectModel) {
         // FIXME: TemplateOMH should be used in 2.2
         //return TemplateObjectModelHelper.getScope();
         
@@ -125,11 +126,32 @@
             Context ctx = Context.enter();
             try {
                 _rootScope = ctx.initStandardObjects(null);
+                try {
+                    ScriptableObject.defineClass(_rootScope, FOM_SimpleCocoon.class);
+                } catch (Exception e) {
+                    throw new CascadingRuntimeException("Cannot setup a root context with a cocoon object for javascript", e);
+                }
+            } finally {
+                Context.exit();
+            }
+        }
+        if (objectModel == null) {
+            return _rootScope;
+        } else {
+            Context ctx = Context.enter();
+            try {
+                Scriptable scope = ctx.newObject(_rootScope);
+                FOM_SimpleCocoon cocoon = (FOM_SimpleCocoon) ctx.newObject(scope, "FOM_SimpleCocoon", new Object[] { });
+                cocoon.setObjectModel(objectModel);
+                cocoon.setParentScope(scope);
+                scope.put("cocoon", scope, cocoon);
+                return scope;
+            } catch (Exception e) {
+                throw new CascadingRuntimeException("Cannot setup a root context with a cocoon object for javascript", e);
             } finally {
                 Context.exit();
             }
         }
-        return _rootScope;
     }
 
     /**
@@ -150,7 +172,7 @@
         if (parentScope != null) {
             return parentScope;
         } else {
-            return getRootScope();
+            return getRootScope(objectModel);
         }
     }
 
@@ -214,6 +236,7 @@
                     scope.put("viewData", scope, Context.toObject(viewData, scope));
                 }
             }
+            func.setParentScope(scope);
             Object result = func.call(ctx, scope, thisObject == null? null: Context.toObject(thisObject, scope), arguments);
             return FlowHelper.unwrap(result);
         } finally {