You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by br...@apache.org on 2006/03/11 11:44:48 UTC

svn commit: r385055 - /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/TemplateObjectModelHelper.java

Author: bruno
Date: Sat Mar 11 02:44:48 2006
New Revision: 385055

URL: http://svn.apache.org/viewcvs?rev=385055&view=rev
Log:
Sharing template block with 2.1: step 4: backport TemplateObjectModelHelper to 2.1 core
The class is identical to the one in 2.2, except for the line:
scope = ctx.newObject(rootScope);
which needed a try-catch

Added:
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/TemplateObjectModelHelper.java   (with props)

Added: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/TemplateObjectModelHelper.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/TemplateObjectModelHelper.java?rev=385055&view=auto
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/TemplateObjectModelHelper.java (added)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/TemplateObjectModelHelper.java Sat Mar 11 02:44:48 2006
@@ -0,0 +1,198 @@
+/*
+ * 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.environment;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.cocoon.components.flow.FlowHelper;
+import org.apache.cocoon.components.flow.javascript.fom.FOM_JavaScriptFlowHelper;
+import org.apache.commons.jxpath.DynamicPropertyHandler;
+import org.apache.commons.jxpath.JXPathBeanInfo;
+import org.apache.commons.jxpath.JXPathIntrospector;
+import org.mozilla.javascript.*;
+import org.mozilla.javascript.Context;
+
+
+/**
+ * This is an utility class to create an object model which is similar to the one
+ * used in flow, that can be used from every component.
+ * 
+ * Work-in-progress, derived from JXTemplateGenerator
+ * 
+ * @version $Id: TemplateObjectModelHelper.java 359757 2005-12-29 08:53:30Z cziegeler $
+ */
+public class TemplateObjectModelHelper {
+    private static Scriptable rootScope = null;
+
+    /** Avoid instantiation */
+    private TemplateObjectModelHelper() {}
+
+    public static Scriptable getScope() {
+        Context ctx = Context.enter();
+        try {
+            // Create it if never used up to now
+            if (rootScope == null)
+                rootScope = ctx.initStandardObjects(null);
+
+            Scriptable scope = null;
+            try {
+                scope = ctx.newObject(rootScope);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            scope.setPrototype(rootScope);
+            scope.setParentScope(null);
+            return scope;
+        } finally {
+            Context.exit();
+        }
+    }
+
+    public static void fillContext(Object contextObject, Map map) {
+        // Hack: I use jxpath to populate the context object's properties
+        // in the jexl context
+        final JXPathBeanInfo bi =
+            JXPathIntrospector.getBeanInfo(contextObject.getClass());
+        if (bi.isDynamic()) {
+            Class cl = bi.getDynamicPropertyHandlerClass();
+            try {
+                DynamicPropertyHandler h =
+                    (DynamicPropertyHandler) cl.newInstance();
+                String[] result = h.getPropertyNames(contextObject);
+                int len = result.length;
+                for (int i = 0; i < len; i++) {
+                    try {
+                        map.put(result[i], h.getProperty(contextObject, result[i]));
+                    } catch (Exception exc) {
+                        exc.printStackTrace();
+                    }
+                }
+            } catch (Exception ignored) {
+                ignored.printStackTrace();
+            }
+        } else {
+            PropertyDescriptor[] props =  bi.getPropertyDescriptors();
+            int len = props.length;
+            for (int i = 0; i < len; i++) {
+                try {
+                    Method read = props[i].getReadMethod();
+                    if (read != null) {
+                        map.put(props[i].getName(),
+                                read.invoke(contextObject, null));
+                    }
+                } catch (Exception ignored) {
+                    ignored.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * Create the object model.
+     * Currently the object model is a map with one single entry:
+     *  cocoon + request         The Request Object
+     *         + session         The Session (if available)
+     *         + context         The Context
+     *         + continuation    The Continuation (if available)
+     *         + parameters      The parameters (if provided)
+     */
+    public static Object getTemplateObjectModel(final Map objectModel,
+                                                final Parameters parameters) {
+
+        // first create the "cocoon object":
+        final Map cocoon = new HashMap();
+
+        // Needed for the FOM wrappers
+        Context.enter();
+        try {
+            // cocoon.request
+            final Request request = ObjectModelHelper.getRequest( objectModel );
+            cocoon.put("request", request);
+
+            // cocoon.session
+            final Session session = request.getSession(false);
+            if (session != null) {
+                cocoon.put("session", session);
+            }
+
+            // cocoon.context
+            final org.apache.cocoon.environment.Context context =
+                ObjectModelHelper.getContext( objectModel );
+            cocoon.put("context", context);
+
+        } finally {
+            Context.exit();
+        }
+
+        // cocoon.continuation
+        final Object cont = FlowHelper.getWebContinuation(objectModel);
+        if ( cont != null ) {
+            cocoon.put("continuation", cont);
+        }
+
+        // cocoon.parameters
+        if ( parameters != null ) {
+            cocoon.put("parameters", Parameters.toProperties(parameters));
+        }
+
+        final Map map = new HashMap();
+        map.put("cocoon", cocoon);
+
+        // Now add objects from flow context (if any)
+        final Object contextObject = FlowHelper.getContextObject(objectModel);
+        if (contextObject instanceof Map) {
+            map.putAll((Map)contextObject);
+        } else if ( contextObject != null ) {
+            fillContext(contextObject, map);
+        }
+
+        return map;
+    }
+
+    /**
+     * Add java packages to object model. Allows to construct java objects.
+     * @param objectModel usually the result of invoking getTemplateObjectModel
+     */
+    public static Object addJavaPackages( Map objectModel ) {
+        Object javaPkg = FOM_JavaScriptFlowHelper.getJavaPackage(objectModel);
+        Object pkgs = FOM_JavaScriptFlowHelper.getPackages(objectModel);
+
+        // packages might have already been set up if flowscript is being used
+        if ( javaPkg != null && pkgs != null ) {
+            objectModel.put( "Packages", javaPkg );
+            objectModel.put( "java", pkgs );
+        } else {
+            Context.enter();
+            try {
+                final String JAVA_PACKAGE = "JavaPackage";
+                ClassLoader cl = Thread.currentThread().getContextClassLoader();
+                Scriptable newPackages = new NativeJavaPackage( "", cl );
+                newPackages.setParentScope( getScope() );
+                newPackages.setPrototype( ScriptableObject.getClassPrototype(   getScope(),
+                                                                                JAVA_PACKAGE ) );
+                objectModel.put( "Packages", newPackages );
+                objectModel.put( "java", ScriptableObject.getProperty( getScope(), "java" ) );
+            } finally {
+                Context.exit();
+            }
+        }
+        return objectModel;
+    }
+}

Propchange: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/TemplateObjectModelHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native