You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tiles.apache.org by ap...@apache.org on 2009/11/27 12:23:09 UTC

svn commit: r884837 - in /tiles/sandbox/trunk: tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/ tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ tiles-request/tiles-request-api/src/main/java/org/apach...

Author: apetrelli
Date: Fri Nov 27 11:23:06 2009
New Revision: 884837

URL: http://svn.apache.org/viewvc?rev=884837&view=rev
Log:
TILESSB-16
Added "ScopeOrder" annotation and modified user code accordingly.
Fixed tiles-mvel and tiles-el but not tiles-ognl (to do).

Added:
    tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ScopeOrder.java   (with props)
    tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java   (with props)
    tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java   (with props)
Modified:
    tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractRequest.java
    tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java
    tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ContextResolver.java
    tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java
    tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/TilesRequestContextWrapper.java
    tiles/sandbox/trunk/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerTilesRequestContext.java
    tiles/sandbox/trunk/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java
    tiles/sandbox/trunk/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/portlet/context/PortletTilesRequestContext.java
    tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletTilesRequestContext.java
    tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletTilesRequestContextTest.java
    tiles/sandbox/trunk/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/velocity/context/VelocityTilesRequestContext.java
    tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java
    tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java
    tiles/sandbox/trunk/tiles3/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
    tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java
    tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactory.java
    tiles/sandbox/trunk/tiles3/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractRequest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractRequest.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractRequest.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractRequest.java Fri Nov 27 11:23:06 2009
@@ -23,4 +23,14 @@
         ContextResolver resolver = ApplicationAccess.getContextResolver(applicationContext);
         return resolver.getContext(this, scope);
     }
+
+    @Override
+    public String[] getAvailableScopes() {
+        ContextResolver resolver = ApplicationAccess.getContextResolver(applicationContext);
+        return resolver.getAvailableScopes(this);
+    }
+
+    public Map<String, Object> getApplicationScope() {
+        return applicationContext.getApplicationScope();
+    }
 }

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java Fri Nov 27 11:23:06 2009
@@ -55,6 +55,8 @@
 
     Map<String, Object> getContext(String scope);
 
+    String[] getAvailableScopes();
+
     /**
      * Returns the associated application context.
      *

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ContextResolver.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ContextResolver.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ContextResolver.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ContextResolver.java Fri Nov 27 11:23:06 2009
@@ -7,4 +7,6 @@
 public interface ContextResolver {
 
     public Map<String, Object> getContext(Request request, String scope);
+
+    public String[] getAvailableScopes(Request request);
 }

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java Fri Nov 27 11:23:06 2009
@@ -2,13 +2,19 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.tiles.request.Request;
 import org.apache.tiles.request.util.TilesRequestContextWrapper;
 
 public class ReflectionContextResolver implements ContextResolver {
 
+    private Map<Class<? extends Request>, Set<String>> class2scopes = new HashMap<Class<? extends Request>, Set<String>>();
+
     @SuppressWarnings("unchecked")
     @Override
     public Map<String, Object> getContext(Request request, String scope) {
@@ -36,4 +42,36 @@
                             + scope + "' scope.", e);
         }
     }
+
+    @Override
+    public String[] getAvailableScopes(Request request) {
+        Set<String> scopes = new HashSet<String>();
+        boolean finished = false;
+        do {
+            scopes.addAll(getSpecificScopeSet(request));
+            if (request instanceof TilesRequestContextWrapper) {
+                request = ((TilesRequestContextWrapper) request)
+                        .getWrappedRequest();
+            } else {
+                finished = true;
+            }
+        } while(!finished);
+        String[] retValue = new String[scopes.size()];
+        return scopes.toArray(retValue);
+    }
+
+    private Set<String> getSpecificScopeSet(Request request) {
+        Set<String> scopes = class2scopes.get(request.getClass());
+        if (scopes == null) {
+            ScopeOrder order = request.getClass().getAnnotation(ScopeOrder.class);
+            scopes = new LinkedHashSet<String>();
+            if (order != null) {
+                for (String scopeName: order.value()) {
+                    scopes.add(scopeName);
+                }
+            }
+            class2scopes.put(request.getClass(), scopes);
+        }
+        return scopes;
+    }
 }

Added: tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ScopeOrder.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ScopeOrder.java?rev=884837&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ScopeOrder.java (added)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ScopeOrder.java Fri Nov 27 11:23:06 2009
@@ -0,0 +1,13 @@
+package org.apache.tiles.request.scope;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface ScopeOrder {
+
+    String[] value();
+}

Propchange: tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ScopeOrder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ScopeOrder.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/TilesRequestContextWrapper.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/TilesRequestContextWrapper.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/TilesRequestContextWrapper.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/TilesRequestContextWrapper.java Fri Nov 27 11:23:06 2009
@@ -78,6 +78,11 @@
         return context.getContext(scope);
     }
 
+    @Override
+    public String[] getAvailableScopes() {
+        return context.getAvailableScopes();
+    }
+
     /** {@inheritDoc} */
     public ApplicationContext getApplicationContext() {
         return context.getApplicationContext();

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerTilesRequestContext.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerTilesRequestContext.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerTilesRequestContext.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/freemarker/context/FreeMarkerTilesRequestContext.java Fri Nov 27 11:23:06 2009
@@ -32,6 +32,7 @@
 
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.Request;
+import org.apache.tiles.request.scope.ScopeOrder;
 import org.apache.tiles.request.servlet.ServletTilesRequestContext;
 import org.apache.tiles.request.util.TilesRequestContextWrapper;
 
@@ -44,6 +45,7 @@
  * @version $Rev$ $Date$
  * @since 2.2.0
  */
+@ScopeOrder({"page"})
 public class FreeMarkerTilesRequestContext extends TilesRequestContextWrapper
         implements Request {
 

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/jsp/context/JspTilesRequestContext.java Fri Nov 27 11:23:06 2009
@@ -32,6 +32,7 @@
 
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.Request;
+import org.apache.tiles.request.scope.ScopeOrder;
 import org.apache.tiles.request.servlet.ServletTilesRequestContext;
 import org.apache.tiles.request.servlet.ServletUtil;
 import org.apache.tiles.request.util.TilesRequestContextWrapper;
@@ -42,6 +43,7 @@
  *
  * @version $Rev$ $Date$
  */
+@ScopeOrder({"page", "request", "session", "application"})
 public class JspTilesRequestContext extends TilesRequestContextWrapper
     implements Request {
 

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/portlet/context/PortletTilesRequestContext.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/portlet/context/PortletTilesRequestContext.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/portlet/context/PortletTilesRequestContext.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/portlet/context/PortletTilesRequestContext.java Fri Nov 27 11:23:06 2009
@@ -39,12 +39,14 @@
 
 import org.apache.tiles.request.AbstractRequest;
 import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.scope.ScopeOrder;
 
 /**
  * Portlet-based TilesApplicationContext implementation.
  *
  * @version $Rev$ $Date$
  */
+@ScopeOrder({"request", "portletSession", "session", "application"})
 public class PortletTilesRequestContext extends AbstractRequest {
 
     /**

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletTilesRequestContext.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletTilesRequestContext.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletTilesRequestContext.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletTilesRequestContext.java Fri Nov 27 11:23:06 2009
@@ -34,12 +34,14 @@
 
 import org.apache.tiles.request.AbstractRequest;
 import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.scope.ScopeOrder;
 
 /**
  * Servlet-based implementation of the TilesApplicationContext interface.
  *
  * @version $Rev$ $Date$
  */
+@ScopeOrder({"request", "session", "application"})
 public class ServletTilesRequestContext extends AbstractRequest {
 
     /**

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletTilesRequestContextTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletTilesRequestContextTest.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletTilesRequestContextTest.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletTilesRequestContextTest.java Fri Nov 27 11:23:06 2009
@@ -182,8 +182,7 @@
      * Tests getting application scope attributes.
      */
     public void testGetApplicationScope() {
-        Map<String, Object> map = ((ApplicationContext) context)
-                .getApplicationScope();
+        Map<String, Object> map = context.getApplicationScope();
         assertTrue("The application scope does not contain a set value",
                 "applicationValue1".equals(map.get("applicationAttribute1")));
         assertTrue("The application scope does not contain a set value",
@@ -195,8 +194,7 @@
      * Tests getting init parameters.
      */
     public void testGetInitParams() {
-        Map<String, String> map = ((ApplicationContext) context)
-                .getInitParams();
+        Map<String, String> map = context.getApplicationContext().getInitParams();
         assertTrue("The init parameters do not contain a set value",
                 "initParameterValue1".equals(map.get("initParameter1")));
         doTestReadMap(map, String.class, String.class,

Modified: tiles/sandbox/trunk/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/velocity/context/VelocityTilesRequestContext.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/velocity/context/VelocityTilesRequestContext.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/velocity/context/VelocityTilesRequestContext.java (original)
+++ tiles/sandbox/trunk/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/velocity/context/VelocityTilesRequestContext.java Fri Nov 27 11:23:06 2009
@@ -33,9 +33,10 @@
 
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.Request;
+import org.apache.tiles.request.scope.ScopeOrder;
+import org.apache.tiles.request.servlet.ExternalWriterHttpServletResponse;
 import org.apache.tiles.request.servlet.ServletTilesRequestContext;
 import org.apache.tiles.request.servlet.ServletUtil;
-import org.apache.tiles.request.servlet.ExternalWriterHttpServletResponse;
 import org.apache.tiles.request.util.TilesRequestContextWrapper;
 import org.apache.velocity.context.Context;
 
@@ -45,6 +46,7 @@
  * @version $Rev$ $Date$
  * @since 2.2.0
  */
+@ScopeOrder({"page"})
 public class VelocityTilesRequestContext extends TilesRequestContextWrapper {
 
     /**

Modified: tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java Fri Nov 27 11:23:06 2009
@@ -146,4 +146,9 @@
     public Object[] getRequestObjects() {
         return null;
     }
+
+    @Override
+    public String[] getAvailableScopes() {
+        return null;
+    }
 }

Added: tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java?rev=884837&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java Fri Nov 27 11:23:06 2009
@@ -0,0 +1,127 @@
+/*
+ * $Id$
+ *
+ * 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.
+ */
+package org.apache.tiles.el;
+
+import java.beans.FeatureDescriptor;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.el.ELContext;
+import javax.el.ELResolver;
+
+import org.apache.tiles.request.Request;
+
+/**
+ * Resolves beans in request, session and application scope.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.1
+ */
+public class ScopeELResolver extends ELResolver {
+
+    /** {@inheritDoc} */
+    @Override
+    public Class<?> getCommonPropertyType(ELContext context, Object base) {
+        // only resolve at the root of the context
+        if (base != null) {
+            return null;
+        }
+
+        return Map.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
+            Object base) {
+        List<FeatureDescriptor> list = new ArrayList<FeatureDescriptor>();
+
+        Request request = (Request) context
+                .getContext(Request.class);
+        for (String scope: request.getAvailableScopes()) {
+            FeatureDescriptor descriptor = new FeatureDescriptor();
+            descriptor.setDisplayName(scope + "Scope");
+            descriptor.setExpert(false);
+            descriptor.setHidden(false);
+            descriptor.setName(scope + "Scope");
+            descriptor.setPreferred(true);
+            descriptor.setShortDescription("");
+            descriptor.setValue("type", Map.class);
+            descriptor.setValue("resolvableAtDesignTime", Boolean.FALSE);
+            list.add(descriptor);
+        }
+
+        return list.iterator();
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Class<?> getType(ELContext context, Object base, Object property) {
+        if (base != null || property == null || !(property instanceof String)
+                || !((String) property).endsWith("Scope")) {
+            return null;
+        }
+
+        return Map.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Object getValue(ELContext context, Object base, Object property) {
+        if (base != null) {
+            return null;
+        }
+
+        Object retValue = null;
+        String propertyString = (String) property;
+        if (property instanceof String && propertyString.endsWith("Scope")) {
+            Request request = (Request) context
+                    .getContext(Request.class);
+            retValue = request.getContext(propertyString.substring(0,
+                    propertyString.length() - 5));
+        }
+
+        if (retValue != null) {
+            context.setPropertyResolved(true);
+        }
+
+        return retValue;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean isReadOnly(ELContext context, Object base, Object property) {
+        if (context == null) {
+            throw new NullPointerException();
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void setValue(ELContext context, Object base, Object property,
+            Object value) {
+        // Does nothing for the moment.
+    }
+}

Propchange: tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java Fri Nov 27 11:23:06 2009
@@ -29,7 +29,6 @@
 import javax.el.ELContext;
 import javax.el.ELResolver;
 
-import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.Request;
 
 /**
@@ -59,12 +58,9 @@
 
         Request request = (Request) context
                 .getContext(Request.class);
-        collectBeanInfo(request.getContext("request"), list);
-        collectBeanInfo(request.getContext("session"), list);
-
-        ApplicationContext applicationContext = (ApplicationContext) context
-                .getContext(ApplicationContext.class);
-        collectBeanInfo(applicationContext.getApplicationScope(), list);
+        for (String scope: request.getAvailableScopes()) {
+            collectBeanInfo(request.getContext(scope), list);
+        }
         return list.iterator();
     }
 
@@ -159,16 +155,12 @@
 
         String prop = property.toString();
 
-        retValue = getObject(request.getContext("request"), prop);
-        if (retValue == null) {
-            retValue = getObject(request.getContext("session"), prop);
-            if (retValue == null) {
-                ApplicationContext applicationContext = (ApplicationContext) context
-                        .getContext(ApplicationContext.class);
-                retValue = getObject(applicationContext.getApplicationScope(),
-                        prop);
-            }
-        }
+        String[] scopes = request.getAvailableScopes();
+        int i = 0;
+        do {
+            retValue = getObject(request.getContext(scopes[i]), prop);
+            i++;
+        } while (retValue == null && i < scopes.length);
 
         return retValue;
     }

Modified: tiles/sandbox/trunk/tiles3/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java Fri Nov 27 11:23:06 2009
@@ -74,16 +74,19 @@
                 .anyTimes();
         EasyMock.expect(request.getContext("session")).andReturn(sessionScope)
                 .anyTimes();
+        EasyMock.expect(request.getContext("application")).andReturn(
+                applicationScope).anyTimes();
+        EasyMock.expect(request.getAvailableScopes()).andReturn(
+                new String[] { "request", "session", "application" }).anyTimes();
         ApplicationContext applicationContext = EasyMock
                 .createMock(ApplicationContext.class);
-        EasyMock.expect(applicationContext.getApplicationScope()).andReturn(
-                applicationScope).anyTimes();
         EasyMock.replay(request, applicationContext);
 
         evaluator.setApplicationContext(applicationContext);
         evaluator.setExpressionFactory(new ExpressionFactoryImpl());
         ELResolver elResolver = new CompositeELResolver() {
             {
+                add(new ScopeELResolver());
                 add(new TilesContextELResolver());
                 add(new TilesContextBeanELResolver());
                 add(new ArrayELResolver(false));

Modified: tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java Fri Nov 27 11:23:06 2009
@@ -53,6 +53,7 @@
 import org.apache.tiles.definition.pattern.wildcard.WildcardDefinitionPatternMatcherFactory;
 import org.apache.tiles.el.ELAttributeEvaluator;
 import org.apache.tiles.el.JspExpressionFactoryFactory;
+import org.apache.tiles.el.ScopeELResolver;
 import org.apache.tiles.el.TilesContextBeanELResolver;
 import org.apache.tiles.el.TilesContextELResolver;
 import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
@@ -268,6 +269,7 @@
         evaluator.setExpressionFactory(efFactory.getExpressionFactory());
         ELResolver elResolver = new CompositeELResolver() {
             {
+                add(new ScopeELResolver());
                 add(new TilesContextELResolver());
                 add(new TilesContextBeanELResolver());
                 add(new ArrayELResolver(false));

Added: tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java?rev=884837&view=auto
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java (added)
+++ tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java Fri Nov 27 11:23:06 2009
@@ -0,0 +1,169 @@
+/*
+ * $Id$
+ *
+ * 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.
+ */
+
+package org.apache.tiles.mvel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tiles.context.TilesRequestContextHolder;
+import org.apache.tiles.request.Request;
+import org.mvel2.UnresolveablePropertyException;
+import org.mvel2.integration.VariableResolver;
+import org.mvel2.integration.impl.BaseVariableResolverFactory;
+
+/**
+ * Resolves beans stored in request, session and application scopes.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class ScopeVariableResolverFactory extends
+        BaseVariableResolverFactory {
+
+    /**
+     * The Tiles request holder.
+     */
+    private TilesRequestContextHolder requestHolder;
+
+    /**
+     * Constructor.
+     *
+     * @param requestHolder The Tiles request holder.
+     * @since 2.2.0
+     */
+    public ScopeVariableResolverFactory(TilesRequestContextHolder requestHolder) {
+        this.requestHolder = requestHolder;
+        variableResolvers = new HashMap<String, VariableResolver>();
+    }
+
+    /** {@inheritDoc} */
+    public VariableResolver createVariable(String name, Object value) {
+        if (nextFactory != null) {
+            return nextFactory.createVariable(name, value);
+        }
+        throw new UnsupportedOperationException("This variable resolver factory is read only");
+    }
+
+    /** {@inheritDoc} */
+    public VariableResolver createVariable(String name, Object value,
+            Class<?> type) {
+        variableResolvers = new HashMap<String, VariableResolver>();
+        if (nextFactory != null) {
+            return nextFactory.createVariable(name, value, type);
+        }
+        throw new UnsupportedOperationException("This variable resolver factory is read only");
+    }
+
+    /** {@inheritDoc} */
+    public boolean isResolveable(String name) {
+        return isTarget(name) || isNextResolveable(name);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public VariableResolver getVariableResolver(String name) {
+        if (isResolveable(name)) {
+            if (variableResolvers != null && variableResolvers.containsKey(name)) {
+                return variableResolvers.get(name);
+            } else if (isTarget(name)) {
+                VariableResolver variableResolver = new ScopeVariableResolver(name);
+                variableResolvers.put(name, variableResolver);
+                return variableResolver;
+            } else if (nextFactory != null) {
+                return nextFactory.getVariableResolver(name);
+            }
+        }
+
+        throw new UnresolveablePropertyException("unable to resolve variable '" + name + "'");
+    }
+
+    /** {@inheritDoc} */
+    public boolean isTarget(String name) {
+        Request request = requestHolder.getTilesRequestContext();
+        if (name.endsWith("Scope")) {
+            String scopeName = name.substring(0, name.length() - 5);
+            for (String availableScope : request.getAvailableScopes()) {
+                if (scopeName.equals(availableScope)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Resolves a single attribute stored in request, session or application scope.
+     *
+     * @version $Rev$ $Date$
+     * @since 2.2.0
+     */
+    private class ScopeVariableResolver implements VariableResolver {
+
+        /**
+         * The name of the attribute.
+         */
+        private String name;
+
+        /**
+         * Constructor.
+         *
+         * @param name The name of the attribute.
+         * @since 2.2.0
+         */
+        public ScopeVariableResolver(String name) {
+            this.name = name;
+        }
+
+        /** {@inheritDoc} */
+        public int getFlags() {
+            return 0;
+        }
+
+        /** {@inheritDoc} */
+        public String getName() {
+            return name;
+        }
+
+        /** {@inheritDoc} */
+        @SuppressWarnings("unchecked")
+        public Class getType() {
+            return Map.class;
+        }
+
+        /** {@inheritDoc} */
+        public Object getValue() {
+            Request request = requestHolder.getTilesRequestContext();
+            return request.getContext(name.substring(0, name.length() - 5));
+        }
+
+        /** {@inheritDoc} */
+        @SuppressWarnings("unchecked")
+        public void setStaticType(Class type) {
+            // Does nothing for the moment.
+        }
+
+        /** {@inheritDoc} */
+        public void setValue(Object value) {
+            throw new UnsupportedOperationException("This resolver is read-only");
+        }
+    }
+}

Propchange: tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactory.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactory.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactory.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactory.java Fri Nov 27 11:23:06 2009
@@ -98,10 +98,12 @@
     /** {@inheritDoc} */
     public boolean isTarget(String name) {
         Request request = requestHolder.getTilesRequestContext();
-        return request.getContext("request").containsKey(name)
-                || request.getContext("session").containsKey(name)
-                || request.getApplicationContext().getApplicationScope()
-                        .containsKey(name);
+        for (String scope : request.getAvailableScopes()) {
+            if (request.getContext(scope).containsKey(name)) {
+                return true;
+            }
+        }
+        return false;
     }
 
     /**
@@ -150,15 +152,13 @@
         /** {@inheritDoc} */
         public Object getValue() {
             Request request = requestHolder.getTilesRequestContext();
-            Object value = request.getContext("request").get(name);
-            if (value == null) {
-                value = request.getContext("session").get(name);
-                if (value == null) {
-                    value = request.getApplicationContext()
-                            .getApplicationScope().get(name);
+            for (String scope : request.getAvailableScopes()) {
+                Object value = request.getContext(scope).get(name);
+                if (value != null) {
+                    return value;
                 }
             }
-            return value;
+            return null;
         }
 
         /** {@inheritDoc} */

Modified: tiles/sandbox/trunk/tiles3/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java
URL: http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java?rev=884837&r1=884836&r2=884837&view=diff
==============================================================================
--- tiles/sandbox/trunk/tiles3/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java (original)
+++ tiles/sandbox/trunk/tiles3/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java Fri Nov 27 11:23:06 2009
@@ -58,9 +58,12 @@
     protected void setUp() throws Exception {
         super.setUp();
         TilesRequestContextHolder requestHolder = new TilesRequestContextHolder();
-        VariableResolverFactory variableResolverFactory = new TilesContextVariableResolverFactory(
+        VariableResolverFactory variableResolverFactory = new ScopeVariableResolverFactory(
                 requestHolder);
         variableResolverFactory
+                .setNextFactory(new TilesContextVariableResolverFactory(
+                        requestHolder));
+        variableResolverFactory
                 .setNextFactory(new TilesContextBeanVariableResolverFactory(
                         requestHolder));
         evaluator = new MVELAttributeEvaluator(requestHolder,
@@ -77,12 +80,14 @@
                 .anyTimes();
         EasyMock.expect(request.getContext("session")).andReturn(sessionScope)
                 .anyTimes();
+        EasyMock.expect(request.getContext("application")).andReturn(applicationScope)
+                .anyTimes();
+        EasyMock.expect(request.getAvailableScopes()).andReturn(
+                new String[] { "request", "session", "application" }).anyTimes();
         ApplicationContext applicationContext = EasyMock
                 .createMock(ApplicationContext.class);
         EasyMock.expect(request.getApplicationContext()).andReturn(
                 applicationContext).anyTimes();
-        EasyMock.expect(applicationContext.getApplicationScope()).andReturn(
-                applicationScope).anyTimes();
         EasyMock.replay(request, applicationContext);
     }