velocity-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cbris...@apache.org
Subject svn commit: r746564 - in /velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view: WebappUberspector.java velocity.properties
Date Sat, 21 Feb 2009 18:54:21 GMT
Author: cbrisson
Date: Sat Feb 21 18:54:21 2009
New Revision: 746564

URL: http://svn.apache.org/viewvc?rev=746564&view=rev
Log:
WebappUberspector to allow ,  and  control objets to share their attributes via standard property
getters and setters

Added:
    velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/WebappUberspector.java
Modified:
    velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/velocity.properties

Added: velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/WebappUberspector.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/WebappUberspector.java?rev=746564&view=auto
==============================================================================
--- velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/WebappUberspector.java
(added)
+++ velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/WebappUberspector.java
Sat Feb 21 18:54:21 2009
@@ -0,0 +1,241 @@
+package org.apache.velocity.tools.view;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import org.apache.velocity.util.introspection.*;
+import org.apache.velocity.runtime.parser.node.AbstractExecutor;
+import org.apache.velocity.runtime.parser.node.SetExecutor;
+import org.apache.velocity.runtime.log.Log;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.servlet.ServletContext;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * <p>This custom uberspector allows getAttribute() and setAttribute() as standard
+ * getters and setters for the "request","session" and "application" keys.
+ * <p>It allows VTL statements like:
+ * <pre>
+ * #set($session.foo = 'youpi')
+ * session parameter 'foo' has value: $session.foo
+ * </pre>
+ * </p>
+ * <p>This uberspector requires Velocity 1.6+ ; to use it, you must specify <code>org.apache.velocity.tools.view.WebappUberspector</code>
+ * as the last uberspector to the <code>runtime.introspector.uberspect</code>
property in you <code>velocity.properties</code> file.</p>
+ *
+ * <p>For instance:</p>
+ *
+ * <p><code>runtime.introspector.uberspect = org.apache.velocity.util.introspection.UberspectImpl,org.apache.velocity.tools.view.WebappUberspector</code></p>
+ *
+ * @author <a href="mailto:cbrisson@apache.org">Claude Brisson</a>
+ * @version $Id: WebappUberspector.java $  */
+
+public class WebappUberspector extends AbstractChainableUberspector
+{
+
+    /**
+     * Property getter
+     * @param obj
+     * @param identifier
+     * @param i
+     * @return A Velocity Getter Method.
+     * @throws Exception
+     */
+    public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i)
+            throws Exception
+    {
+        VelPropertyGet ret = super.getPropertyGet(obj,identifier,i);
+        if(ret == null)
+        {
+            Class claz = obj.getClass();
+            if(obj instanceof HttpServletRequest
+                || obj instanceof HttpSession
+                || obj instanceof ServletContext)
+            {
+                AbstractExecutor executor = new GetAttributeExecutor(log, introspector, claz,
identifier);
+                ret = executor.isAlive() ? new VelGetterImpl(executor) : null;
+            }
+        }
+        return ret;
+    }
+
+    /**
+     * init method
+     * @throws Exception
+     */
+    public void init() throws Exception
+    {
+        super.init();
+        // we need our own introspector since the inner one is hidden by the Uberspect interface
+        introspector = new Introspector(log);
+    }
+
+    /**
+     * Property setter
+     * @param obj
+     * @param identifier
+     * @param arg
+     * @param i
+     * @return A Velocity Setter method.
+     * @throws Exception
+     */
+    public VelPropertySet getPropertySet(Object obj, String identifier,
+                                         Object arg, Info i)
+            throws Exception
+    {
+        VelPropertySet ret = super.getPropertySet(obj,identifier,arg,i);
+        if(ret == null) {
+            Class claz = obj.getClass();
+            if(obj instanceof HttpServletRequest
+                || obj instanceof HttpSession
+                || obj instanceof ServletContext)
+            {
+                SetExecutor executor = new SetAttributeExecutor(log, introspector, claz,
arg, identifier);
+                ret = executor.isAlive() ? new VelSetterImpl(executor) : null;
+            }
+        }
+        return ret;
+    }
+
+
+    /**
+     * Executor for getAttribute(name) method.
+     */
+    public class GetAttributeExecutor extends AbstractExecutor
+    {
+        private final Introspector introspector;
+
+        // This is still threadsafe because this object is only read except in the C'tor.
+        private Object [] params;
+
+        /**
+         * @param log
+         * @param introspector
+         * @param clazz
+         * @param property
+         */
+        public GetAttributeExecutor(final Log log, final Introspector introspector,
+                final Class clazz, final String property)
+        {
+            this.log = log;
+            this.introspector = introspector;
+            this.params = new Object[] { property };
+
+            discover(clazz);
+        }
+
+        protected void discover(final Class clazz)
+        {
+            try
+            {
+                setMethod(introspector.getMethod(clazz, "getAttribute", params));
+            }
+            /**
+             * pass through application level runtime exceptions
+             */
+            catch( RuntimeException e )
+            {
+                throw e;
+            }
+            catch(Exception e)
+            {
+                log.error("While looking for getAttribute('" + params[0] + "') method:",
e);
+            }
+        }
+
+        /**
+         * @see org.apache.velocity.runtime.parser.node.AbstractExecutor#execute(java.lang.Object)
+         */
+        public Object execute(final Object o)
+            throws IllegalAccessException, InvocationTargetException
+        {
+            return isAlive() ? getMethod().invoke(o, params) : null;
+        }
+    }
+
+    /**
+     * Executor for setAttribute(name,value) method
+     */
+    public class SetAttributeExecutor extends SetExecutor
+    {
+        private final Introspector introspector;
+        private final String property;
+
+        /**
+         * @param log
+         * @param introspector
+         * @param clazz
+         * @param arg
+         * @param property
+         */
+        public SetAttributeExecutor(final Log log, final Introspector introspector,
+                final Class clazz, final Object arg, final String property)
+        {
+            this.log = log;
+            this.introspector = introspector;
+            this.property = property;
+
+            discover(clazz, arg);
+        }
+
+        /**
+         * @param clazz
+         * @param arg
+         */
+        protected void discover(final Class clazz, final Object arg)
+        {
+            Object [] params = new Object[] { property, arg };
+
+            try
+            {
+                setMethod(introspector.getMethod(clazz, "setAttribute", params));
+            }
+            /**
+             * pass through application level runtime exceptions
+             */
+            catch( RuntimeException e )
+            {
+                throw e;
+            }
+            catch(Exception e)
+            {
+                log.error("While looking for put('" + params[0] + "') method:", e);
+            }
+        }
+
+        /**
+         * @see org.apache.velocity.runtime.parser.node.SetExecutor#execute(java.lang.Object,
java.lang.Object)
+         */
+        public Object execute(final Object o, final Object value)
+            throws IllegalAccessException,  InvocationTargetException
+        {
+            Object [] params;
+
+            if (isAlive())
+            {
+                params = new Object [] { property, value };
+                return getMethod().invoke(o, params);
+            }
+
+            return null;
+        }
+    }
+}

Modified: velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/velocity.properties
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/velocity.properties?rev=746564&r1=746563&r2=746564&view=diff
==============================================================================
--- velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/velocity.properties
(original)
+++ velocity/tools/trunk/src/main/java/org/apache/velocity/tools/view/velocity.properties
Sat Feb 21 18:54:21 2009
@@ -22,3 +22,8 @@
 resource.loader = webapp,string
 webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader
 string.resource.loader.class = org.apache.velocity.runtime.resource.loader.StringResourceLoader
+
+# uncomment (or copy in your velocity.properties file) the following line if you have Velocity
1.6+
+# and want to access application, session and request attributes via standard setters, like
in:
+#   #set($session.foo = 'bar') foo is: $session.foo
+#runtime.introspector.uberspect = org.apache.velocity.util.introspection.UberspectImpl,org.apache.velocity.tools.view.WebappUberspector



Mime
View raw message