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/07/12 13:41:00 UTC

svn commit: r793334 [1/2] - in /tiles/framework/trunk: src/site/apt/ src/site/apt/tutorial/advanced/ src/site/xdoc/ tiles-core/ tiles-core/src/main/java/org/apache/tiles/evaluator/ tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/ tiles-core/sr...

Author: apetrelli
Date: Sun Jul 12 11:40:59 2009
New Revision: 793334

URL: http://svn.apache.org/viewvc?rev=793334&view=rev
Log:
TILES-422
Added OGNL support.
Added Selenium tests.
Added documentation.

Added:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractor.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessor.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessor.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectExtractor.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluator.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/PropertyAccessorDelegateFactory.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractor.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractor.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractor.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesContextPropertyAccessorDelegateFactory.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/package.html   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractorTest.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessorTest.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessorTest.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluatorTest.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractorTest.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractorTest.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractorTest.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/TilesContextPropertyAccessorDelegateFactoryTest.java   (with props)
    tiles/framework/trunk/tiles-test/src/main/webapp/freemarker/testinsertdefinition_ognl.ftl   (with props)
    tiles/framework/trunk/tiles-test/src/main/webapp/testinsertdefinition_ognl.jsp   (with props)
    tiles/framework/trunk/tiles-test/src/main/webapp/velocity/testinsertdefinition_ognl.vm
    tiles/framework/trunk/tiles-test/src/test/selenium/ConfiguredDefinitionOGNLTest.html   (with props)
    tiles/framework/trunk/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOGNLTest.html   (with props)
    tiles/framework/trunk/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOGNLTest.html   (with props)
Modified:
    tiles/framework/trunk/src/site/apt/tutorial/advanced/el-support.apt
    tiles/framework/trunk/src/site/apt/whats-new.apt
    tiles/framework/trunk/src/site/xdoc/index.xml
    tiles/framework/trunk/tiles-core/pom.xml
    tiles/framework/trunk/tiles-test/pom.xml
    tiles/framework/trunk/tiles-test/src/main/java/org/apache/tiles/test/factory/TestTilesContainerFactory.java
    tiles/framework/trunk/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs.xml
    tiles/framework/trunk/tiles-test/src/main/webapp/WEB-INF/tiles-defs.xml
    tiles/framework/trunk/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs.xml
    tiles/framework/trunk/tiles-test/src/main/webapp/index.jsp
    tiles/framework/trunk/tiles-test/src/test/selenium/TestSuite.html

Modified: tiles/framework/trunk/src/site/apt/tutorial/advanced/el-support.apt
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/src/site/apt/tutorial/advanced/el-support.apt?rev=793334&r1=793333&r2=793334&view=diff
==============================================================================
--- tiles/framework/trunk/src/site/apt/tutorial/advanced/el-support.apt (original)
+++ tiles/framework/trunk/src/site/apt/tutorial/advanced/el-support.apt Sun Jul 12 11:40:59 2009
@@ -27,7 +27,7 @@
   definition files.
 
   Currently supported languages are EL (as in javax.el), i.e. the language used in JSP code,
-  and {{{http://mvel.codehaus.org/}MVEL}}.
+  {{{http://mvel.codehaus.org/}MVEL}} and {{{http://www.opensymphony.com/ognl/}OGNL}}.
 
 * Configuration
 
@@ -140,7 +140,7 @@
 
   * The body will be taken from the "body" attribute in request scope.
 
-* MVEL Support
+* {MVEL Support}
 
   To use MVEL support you need to register an instance of
   {{{../../apidocs/org/apache/tiles/evaluator/mvel/MVELAttributeEvaluator.html} MVELAttributeEvaluator}}
@@ -176,7 +176,66 @@
         preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
       <put-attribute name="title"  value="This is a configured composite definition."/>
       <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   expression="${requestScope.body}"/>
+      <put-attribute name="body"   expression="MVEL:requestScope.body"/>
+  </definition>
+------------------------------------
+
+  Before rendering the definition:
+
+  * The template name will be taken from the "layout" attribute, searched in every scope.
+
+  * The body will be taken from the "body" attribute in request scope.
+
+* {OGNL Support}
+
+  To use OGNL support you need to register an instance of
+  {{{../../apidocs/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluator.html} OGNLAttributeEvaluator}}
+  along with other supporting objects.
+
+------------------------------------
+@Override
+protected AttributeEvaluatorFactory createAttributeEvaluatorFactory(
+        TilesApplicationContext applicationContext,
+    TilesRequestContextFactory contextFactory, LocaleResolver resolver) {
+    try {
+        PropertyAccessor objectPropertyAccessor = OgnlRuntime.getPropertyAccessor(Object.class);
+        PropertyAccessor mapPropertyAccessor = OgnlRuntime.getPropertyAccessor(Map.class);
+        PropertyAccessor applicationContextPropertyAccessor = new NestedObjectDelegatePropertyAccessor<TilesRequestContext>(
+                new TilesApplicationContextNestedObjectExtractor(),
+                objectPropertyAccessor);
+        PropertyAccessor requestScopePropertyAccessor = new NestedObjectDelegatePropertyAccessor<TilesRequestContext>(
+                new RequestScopeNestedObjectExtractor(), mapPropertyAccessor);
+        PropertyAccessor sessionScopePropertyAccessor = new NestedObjectDelegatePropertyAccessor<TilesRequestContext>(
+                new SessionScopeNestedObjectExtractor(), mapPropertyAccessor);
+        PropertyAccessor applicationScopePropertyAccessor = new NestedObjectDelegatePropertyAccessor<TilesRequestContext>(
+                new ApplicationScopeNestedObjectExtractor(), mapPropertyAccessor);
+        PropertyAccessorDelegateFactory<TilesRequestContext> factory = new TilesContextPropertyAccessorDelegateFactory(
+                objectPropertyAccessor, applicationContextPropertyAccessor,
+                requestScopePropertyAccessor, sessionScopePropertyAccessor,
+                applicationScopePropertyAccessor);
+        PropertyAccessor tilesRequestAccessor = new DelegatePropertyAccessor<TilesRequestContext>(factory);
+        OgnlRuntime.setPropertyAccessor(TilesRequestContext.class, tilesRequestAccessor);
+    } catch (OgnlException e) {
+        throw new TilesTestRuntimeException("Cannot initialize OGNL evaluator", e);
+    }
+
+    BasicAttributeEvaluatorFactory attributeEvaluatorFactory = new BasicAttributeEvaluatorFactory(
+            new DirectAttributeEvaluator());
+    attributeEvaluatorFactory.registerAttributeEvaluator("MVEL", new OGNLAttributeEvaluator());
+    return attributeEvaluatorFactory;
+}
+------------------------------------
+
+** Usage
+
+  Let's use this example:
+
+------------------------------------
+  <definition name="test.composite.mvel.definition" templateExpression="OGNL:layout"
+        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
+      <put-attribute name="title"  value="This is a configured composite definition."/>
+      <put-attribute name="header" value="/header.jsp"/>
+      <put-attribute name="body"   expression="OGNL:requestScope.body"/>
   </definition>
 ------------------------------------
 

Modified: tiles/framework/trunk/src/site/apt/whats-new.apt
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/src/site/apt/whats-new.apt?rev=793334&r1=793333&r2=793334&view=diff
==============================================================================
--- tiles/framework/trunk/src/site/apt/whats-new.apt (original)
+++ tiles/framework/trunk/src/site/apt/whats-new.apt Sun Jul 12 11:40:59 2009
@@ -38,9 +38,9 @@
   * Support for wildcard mathing using
   {{{tutorial/advanced/wildcard.html}regular expressions}}.
 
-  * {{{tutorial/advanced/ognl-support.html}OGNL support}}
+  * {{{tutorial/advanced/el-support.html#OGNL_Support}OGNL support}}
   and
-  {{{tutorial/advanced/mvel-support.html}MVEL support}}
+  {{{tutorial/advanced/el-support.html#MVEL_Support}MVEL support}}
   in Tiles definition files, when specifying attributes and templates.
 
 * New features in Tiles 2.1

Modified: tiles/framework/trunk/src/site/xdoc/index.xml
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/src/site/xdoc/index.xml?rev=793334&r1=793333&r2=793334&view=diff
==============================================================================
--- tiles/framework/trunk/src/site/xdoc/index.xml (original)
+++ tiles/framework/trunk/src/site/xdoc/index.xml Sun Jul 12 11:40:59 2009
@@ -41,13 +41,13 @@
         elements or embedded within other tiles to develop a series of reusable
         templates. These templates streamline the development of a consistent
         look and feel across an entire application.</p>
-        
+
         <p><a href="/download-21.html">Download Tiles</a></p>
         <p><a href="security/index.html">Security bulletins</a></p>
-        
+
         <subsection name="Documentation">
           <ul>
-            <li><a href="whats-new.html"><strong>What's new in Tiles 2.1</strong></a></li>
+            <li><a href="whats-new.html"><strong>What's new in Tiles 2.2</strong></a></li>
             <li><a href="getting_started.html">Getting Started</a></li>
             <li><a href="tutorial/index.html">Tutorial</a></li>
             <li><a href="migration/index.html">Migration from Struts-Tiles</a></li>

Modified: tiles/framework/trunk/tiles-core/pom.xml
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/pom.xml?rev=793334&r1=793333&r2=793334&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/pom.xml (original)
+++ tiles/framework/trunk/tiles-core/pom.xml Sun Jul 12 11:40:59 2009
@@ -152,6 +152,13 @@
     </dependency>
 
     <dependency>
+      <groupId>org.easymock</groupId>
+      <artifactId>easymockclassextension</artifactId>
+      <version>2.4</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.shale</groupId>
       <artifactId>shale-test</artifactId>
       <version>1.0.5</version>
@@ -170,6 +177,12 @@
       <version>2.0.11</version>
       <optional>true</optional>
     </dependency>
+    <dependency>
+      <groupId>ognl</groupId>
+      <artifactId>ognl</artifactId>
+      <version>2.7.3</version>
+      <optional>true</optional>
+    </dependency>
 
   </dependencies>
 

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,72 @@
+/*
+ * $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.evaluator;
+
+import org.apache.tiles.TilesException;
+
+/**
+ * Exception raised when an expression language evaluation fails.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class EvaluationException extends TilesException {
+
+    /**
+     * Constructor.
+     *
+     * @since 2.2.0
+     */
+    public EvaluationException() {
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param message The message-
+     * @since 2.2.0
+     */
+    public EvaluationException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param e The cause.
+     * @since 2.2.0
+     */
+    public EvaluationException(Exception e) {
+        super(e);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param message The message-
+     * @param e The cause.
+     * @since 2.2.0
+     */
+    public EvaluationException(String message, Exception e) {
+        super(message, e);
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractor.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractor.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractor.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractor.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,41 @@
+/*
+ * $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.evaluator.ognl;
+
+import java.util.Map;
+
+import org.apache.tiles.context.TilesRequestContext;
+
+/**
+ * Extracts the application scope from a Tiles request.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class ApplicationScopeNestedObjectExtractor implements
+        NestedObjectExtractor<TilesRequestContext> {
+
+    /** {@inheritDoc} */
+    public Map<String, Object> getNestedObject(TilesRequestContext obj) {
+        return obj.getApplicationContext().getApplicationScope();
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessor.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessor.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessor.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessor.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,88 @@
+/*
+ * $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.evaluator.ognl;
+
+import java.util.Map;
+
+import ognl.OgnlContext;
+import ognl.OgnlException;
+import ognl.PropertyAccessor;
+
+/**
+ * Uses a {@link PropertyAccessorDelegateFactory} to delegate the methods to
+ * another {@link PropertyAccessor}.
+ *
+ * @param <T> The type of the accessed root object.
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class DelegatePropertyAccessor<T> implements PropertyAccessor {
+
+    /**
+     * The property accessor factory.
+     *
+     * @since 2.2.0
+     */
+    private PropertyAccessorDelegateFactory<T> factory;
+
+    /**
+     * Constructor.
+     *
+     * @param factory The property accessor factory.
+     * @since 2.2.0
+     */
+    public DelegatePropertyAccessor(PropertyAccessorDelegateFactory<T> factory) {
+        this.factory = factory;
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    public Object getProperty(Map context, Object target, Object name)
+            throws OgnlException {
+        return factory.getPropertyAccessor((String) name, (T) target).getProperty(
+                context, target, name);
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    public void setProperty(Map context, Object target, Object name,
+            Object value) throws OgnlException {
+        factory.getPropertyAccessor((String) name, (T) target).setProperty(context,
+                target, name, value);
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    public String getSourceAccessor(OgnlContext context, Object target,
+            Object index) {
+        return factory.getPropertyAccessor((String) index, (T) target)
+                .getSourceAccessor(context, target, index);
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    public String getSourceSetter(OgnlContext context, Object target,
+            Object index) {
+        return factory.getPropertyAccessor((String) index, (T) target)
+                .getSourceSetter(context, target, index);
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessor.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessor.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessor.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessor.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,101 @@
+/*
+ * $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.evaluator.ognl;
+
+import java.util.Map;
+
+import ognl.OgnlContext;
+import ognl.OgnlException;
+import ognl.PropertyAccessor;
+
+/**
+ * Uses a {@link PropertyAccessor} as a delegate, but passing a nested object as
+ * target.
+ *
+ * @param <T> The root object type from which the target object will be
+ * extracted.
+ * @since 2.2.0
+ * @version $Rev$ $Date$
+ */
+public class NestedObjectDelegatePropertyAccessor<T> implements
+        PropertyAccessor {
+
+    /**
+     * The extractor of the nested object.
+     *
+     * @since 2.2.0
+     */
+    private NestedObjectExtractor<T> nestedObjectExtractor;
+
+    /**
+     * The delegated property accessor.
+     *
+     * @since 2.2.0
+     */
+    private PropertyAccessor propertyAccessor;
+
+    /**
+     * Constructor.
+     *
+     * @param nestedObjectExtractor The extractor of the nested object.
+     * @param propertyAccessor The delegated property accessor.
+     * @since 2.2.0
+     */
+    public NestedObjectDelegatePropertyAccessor(
+            NestedObjectExtractor<T> nestedObjectExtractor,
+            PropertyAccessor propertyAccessor) {
+        this.nestedObjectExtractor = nestedObjectExtractor;
+        this.propertyAccessor = propertyAccessor;
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    public Object getProperty(Map context, Object target, Object name)
+            throws OgnlException {
+        return propertyAccessor.getProperty(context, nestedObjectExtractor
+                .getNestedObject((T) target), name);
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    public void setProperty(Map context, Object target, Object name,
+            Object value) throws OgnlException {
+        propertyAccessor.setProperty(context, nestedObjectExtractor
+                .getNestedObject((T) target), name, value);
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    public String getSourceAccessor(OgnlContext context, Object target,
+            Object index) {
+        return propertyAccessor.getSourceAccessor(context,
+                nestedObjectExtractor.getNestedObject((T) target), index);
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    public String getSourceSetter(OgnlContext context, Object target,
+            Object index) {
+        return propertyAccessor.getSourceSetter(context, nestedObjectExtractor
+                .getNestedObject((T) target), index);
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectExtractor.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectExtractor.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectExtractor.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectExtractor.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,41 @@
+/*
+ * $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.evaluator.ognl;
+
+/**
+ * Extracts an object using another object as a basis.
+ *
+ * @param <T> The type of the root object.
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public interface NestedObjectExtractor<T> {
+
+    /**
+     * Extracts the nested object.
+     *
+     * @param obj The root object.
+     * @return The extracted nested object.
+     * @since 2.2.0
+     */
+    Object getNestedObject(T obj);
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/NestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluator.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluator.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluator.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluator.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,58 @@
+/*
+ * $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.evaluator.ognl;
+
+import java.util.Map;
+
+import ognl.Ognl;
+import ognl.OgnlException;
+
+import org.apache.tiles.context.TilesRequestContext;
+import org.apache.tiles.evaluator.AbstractAttributeEvaluator;
+import org.apache.tiles.evaluator.EvaluationException;
+
+/**
+ * Evaluates attribute expressions and expressions with OGNL language.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class OGNLAttributeEvaluator extends AbstractAttributeEvaluator {
+
+    /** {@inheritDoc} */
+    public Object evaluate(String expression, TilesRequestContext request) {
+        if (expression == null) {
+            throw new IllegalArgumentException("The expression parameter cannot be null");
+        }
+        try {
+            return Ognl.getValue(expression, request);
+        } catch (OgnlException e) {
+            throw new EvaluationException("Cannot evaluate OGNL expression '"
+                    + expression + "'", e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void init(Map<String, String> initParameters) {
+        // Nothing to initialize.
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/PropertyAccessorDelegateFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/PropertyAccessorDelegateFactory.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/PropertyAccessorDelegateFactory.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/PropertyAccessorDelegateFactory.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,46 @@
+/*
+ * $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.evaluator.ognl;
+
+import ognl.PropertyAccessor;
+
+/**
+ * Decides a {@link PropertyAccessor} depending on the property name and the
+ * object to evaluate.
+ *
+ * @param <T> The type of the root object to evaluate.
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public interface PropertyAccessorDelegateFactory<T> {
+
+    /**
+     * Returns a prooerty accessor appropriate for the property name and the
+     * object passed.
+     *
+     * @param propertyName The name of the property.
+     * @param obj The root object to evaluate.
+     * @return The appropriate property accessor.
+     * @since 2.2.0
+     */
+    PropertyAccessor getPropertyAccessor(String propertyName, T obj);
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/PropertyAccessorDelegateFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/PropertyAccessorDelegateFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractor.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractor.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractor.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractor.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,41 @@
+/*
+ * $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.evaluator.ognl;
+
+import java.util.Map;
+
+import org.apache.tiles.context.TilesRequestContext;
+
+/**
+ * Extracts the request scope from a Tiles request.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class RequestScopeNestedObjectExtractor implements
+        NestedObjectExtractor<TilesRequestContext> {
+
+    /** {@inheritDoc} */
+    public Map<String, Object> getNestedObject(TilesRequestContext obj) {
+        return obj.getRequestScope();
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractor.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractor.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractor.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractor.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,41 @@
+/*
+ * $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.evaluator.ognl;
+
+import java.util.Map;
+
+import org.apache.tiles.context.TilesRequestContext;
+
+/**
+ * Extracts the session scope from a Tiles request.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class SessionScopeNestedObjectExtractor implements
+        NestedObjectExtractor<TilesRequestContext> {
+
+    /** {@inheritDoc} */
+    public Map<String, Object> getNestedObject(TilesRequestContext obj) {
+        return obj.getSessionScope();
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractor.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractor.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractor.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractor.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,40 @@
+/*
+ * $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.evaluator.ognl;
+
+import org.apache.tiles.TilesApplicationContext;
+import org.apache.tiles.context.TilesRequestContext;
+
+/**
+ * Extracts the application context from a Tiles request.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class TilesApplicationContextNestedObjectExtractor implements
+        NestedObjectExtractor<TilesRequestContext> {
+
+    /** {@inheritDoc} */
+    public TilesApplicationContext getNestedObject(TilesRequestContext obj) {
+        return obj.getApplicationContext();
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesContextPropertyAccessorDelegateFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesContextPropertyAccessorDelegateFactory.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesContextPropertyAccessorDelegateFactory.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesContextPropertyAccessorDelegateFactory.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,130 @@
+/*
+ * $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.evaluator.ognl;
+
+import java.util.Map;
+
+import ognl.PropertyAccessor;
+
+import org.apache.tiles.context.TilesRequestContext;
+import org.apache.tiles.evaluator.el.TilesRequestContextBeanInfo;
+
+/**
+ * Decides the appropriate {@link PropertyAccessor} for the given property name
+ * and {@link TilesRequestContext}.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class TilesContextPropertyAccessorDelegateFactory implements
+        PropertyAccessorDelegateFactory<TilesRequestContext> {
+
+    /**
+     * The plain object property accessor, to be used directly for
+     * {@link TilesRequestContext}.
+     */
+    private PropertyAccessor objectPropertyAccessor;
+
+    /**
+     * The application context property accessor.
+     */
+    private PropertyAccessor applicationContextPropertyAccessor;
+
+    /**
+     * The request scope property accessor.
+     */
+    private PropertyAccessor requestScopePropertyAccessor;
+
+    /**
+     * The session scope property accessor.
+     */
+    private PropertyAccessor sessionScopePropertyAccessor;
+
+    /**
+     * The application scope property accessor.
+     */
+    private PropertyAccessor applicationScopePropertyAccessor;
+
+    /**
+     * The bean info of {@link TilesRequestContext} and
+     * {@link org.apache.tiles.TilesApplicationContext}.
+     */
+    private TilesRequestContextBeanInfo beanInfo;
+
+    /**
+     * Constructor.
+     *
+     * @param objectPropertyAccessor The plain object property accessor, to be
+     * used directly for {@link TilesRequestContext}.
+     * @param applicationContextPropertyAccessor The application context
+     * property accessor.
+     * @param requestScopePropertyAccessor The request scope property accessor.
+     * @param sessionScopePropertyAccessor The session scope property accessor.
+     * @param applicationScopePropertyAccessor The application scope property
+     * accessor.
+     * @since 2.2.0
+     */
+    public TilesContextPropertyAccessorDelegateFactory(
+            PropertyAccessor objectPropertyAccessor,
+            PropertyAccessor applicationContextPropertyAccessor,
+            PropertyAccessor requestScopePropertyAccessor,
+            PropertyAccessor sessionScopePropertyAccessor,
+            PropertyAccessor applicationScopePropertyAccessor) {
+        beanInfo = new TilesRequestContextBeanInfo();
+        this.objectPropertyAccessor = objectPropertyAccessor;
+        this.applicationContextPropertyAccessor = applicationContextPropertyAccessor;
+        this.requestScopePropertyAccessor = requestScopePropertyAccessor;
+        this.sessionScopePropertyAccessor = sessionScopePropertyAccessor;
+        this.applicationScopePropertyAccessor = applicationScopePropertyAccessor;
+    }
+
+    /** {@inheritDoc} */
+    public PropertyAccessor getPropertyAccessor(String propertyName,
+            TilesRequestContext request) {
+        PropertyAccessor retValue;
+        if (beanInfo.getRequestDescriptors().containsKey(propertyName)) {
+            retValue = objectPropertyAccessor;
+        } else if (beanInfo.getApplicationDescriptors().containsKey(
+                propertyName)) {
+            retValue = applicationContextPropertyAccessor;
+        } else {
+            Map<String, Object> scopeMap = request.getRequestScope();
+            if (scopeMap.containsKey(propertyName)) {
+                retValue = requestScopePropertyAccessor;
+            } else {
+                scopeMap = request.getSessionScope();
+                if (scopeMap.containsKey(propertyName)) {
+                    retValue = sessionScopePropertyAccessor;
+                } else {
+                    scopeMap = request.getApplicationContext()
+                            .getApplicationScope();
+                    if (scopeMap.containsKey(propertyName)) {
+                        retValue = applicationScopePropertyAccessor;
+                    } else {
+                        retValue = requestScopePropertyAccessor;
+                    }
+                }
+            }
+        }
+        return retValue;
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesContextPropertyAccessorDelegateFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/TilesContextPropertyAccessorDelegateFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/package.html
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/package.html?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/package.html (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/package.html Sun Jul 12 11:40:59 2009
@@ -0,0 +1,30 @@
+<!--
+/*
+ * $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.
+ */
+-->
+<html>
+<head>
+    <title>Tiles attribute evaluator OGNL implementation</title>
+</head>
+<body>
+Attribute evaluator classes that can perform OGNL evaluation for attributes.
+</body>
+</html>
\ No newline at end of file

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/package.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/evaluator/ognl/package.html
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractorTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractorTest.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractorTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractorTest.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,59 @@
+/*
+ * $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.evaluator.ognl;
+
+import static org.junit.Assert.*;
+import static org.easymock.EasyMock.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tiles.TilesApplicationContext;
+import org.apache.tiles.context.TilesRequestContext;
+import org.junit.Test;
+
+/**
+ * Tests {@link ApplicationScopeNestedObjectExtractor}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ApplicationScopeNestedObjectExtractorTest {
+
+    /**
+     * Tests {@link ApplicationScopeNestedObjectExtractor#getNestedObject(TilesRequestContext)}.
+     */
+    @Test
+    public void testGetNestedObject() {
+        TilesRequestContext request = createMock(TilesRequestContext.class);
+        TilesApplicationContext applicationContext = createMock(TilesApplicationContext.class);
+        expect(request.getApplicationContext()).andReturn(applicationContext);
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("attribute1", "value1");
+        expect(applicationContext.getApplicationScope()).andReturn(map);
+
+        replay(request, applicationContext);
+        NestedObjectExtractor<TilesRequestContext> extractor = new ApplicationScopeNestedObjectExtractor();
+        assertEquals(map, extractor.getNestedObject(request));
+        verify(request, applicationContext);
+    }
+
+}

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/ApplicationScopeNestedObjectExtractorTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessorTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessorTest.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessorTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessorTest.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,115 @@
+/*
+ * $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.evaluator.ognl;
+
+import static org.junit.Assert.*;
+import static org.easymock.classextension.EasyMock.*;
+
+import java.util.Map;
+
+import ognl.OgnlContext;
+import ognl.OgnlException;
+import ognl.PropertyAccessor;
+
+import org.junit.Test;
+
+/**
+ * Tests {@link DelegatePropertyAccessor}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DelegatePropertyAccessorTest {
+
+    /**
+     * Test method for {@link DelegatePropertyAccessor#getProperty(java.util.Map, Object, Object)}.
+     * @throws OgnlException If something goes wrong.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetProperty() throws OgnlException {
+        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
+        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
+        Map<String, Object> context = createMock(Map.class);
+        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
+        expect(mockAccessor.getProperty(context, 1, "property")).andReturn("value");
+
+        replay(factory, mockAccessor, context);
+        PropertyAccessor accessor = new DelegatePropertyAccessor<Integer>(factory);
+        assertEquals("value", accessor.getProperty(context, 1, "property"));
+        verify(factory, mockAccessor, context);
+    }
+
+    /**
+     * Test method for {@link DelegatePropertyAccessor#setProperty(java.util.Map, Object, Object, Object)}.
+     * @throws OgnlException If something goes wrong.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testSetProperty() throws OgnlException {
+        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
+        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
+        Map<String, Object> context = createMock(Map.class);
+        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
+        mockAccessor.setProperty(context, 1, "property", "value");
+
+        replay(factory, mockAccessor, context);
+        PropertyAccessor accessor = new DelegatePropertyAccessor<Integer>(factory);
+        accessor.setProperty(context, 1, "property", "value");
+        verify(factory, mockAccessor, context);
+    }
+
+    /**
+     * Test method for {@link DelegatePropertyAccessor#getSourceAccessor(ognl.OgnlContext, Object, Object)}.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetSourceAccessor() {
+        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
+        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
+        OgnlContext context = createMock(OgnlContext.class);
+        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
+        expect(mockAccessor.getSourceAccessor(context, 1, "property")).andReturn("method");
+
+        replay(factory, mockAccessor, context);
+        PropertyAccessor accessor = new DelegatePropertyAccessor<Integer>(factory);
+        assertEquals("method", accessor.getSourceAccessor(context, 1, "property"));
+        verify(factory, mockAccessor, context);
+    }
+
+    /**
+     * Test method for {@link DelegatePropertyAccessor#getSourceSetter(ognl.OgnlContext, Object, Object)}.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetSourceSetter() {
+        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
+        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
+        OgnlContext context = createMock(OgnlContext.class);
+        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
+        expect(mockAccessor.getSourceSetter(context, 1, "property")).andReturn("method");
+
+        replay(factory, mockAccessor, context);
+        PropertyAccessor accessor = new DelegatePropertyAccessor<Integer>(factory);
+        assertEquals("method", accessor.getSourceSetter(context, 1, "property"));
+        verify(factory, mockAccessor, context);
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/DelegatePropertyAccessorTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessorTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessorTest.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessorTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessorTest.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,120 @@
+/*
+ * $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.evaluator.ognl;
+
+import static org.junit.Assert.*;
+import static org.easymock.classextension.EasyMock.*;
+
+import java.util.Map;
+
+import ognl.OgnlContext;
+import ognl.OgnlException;
+import ognl.PropertyAccessor;
+
+import org.junit.Test;
+
+/**
+ * Tests {@link NestedObjectDelegatePropertyAccessor}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NestedObjectDelegatePropertyAccessorTest {
+
+    /**
+     * Test method for {@link NestedObjectDelegatePropertyAccessor#getProperty(java.util.Map, Object, Object)}.
+     * @throws OgnlException If something goes wrong.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetProperty() throws OgnlException {
+        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
+        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
+        Map<String, Object> context = createMock(Map.class);
+        expect(propertyAccessor.getProperty(context, "nested", "property")).andReturn("value");
+        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
+
+        replay(nestedObjectExtractor, propertyAccessor, context);
+        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<Integer>(
+                nestedObjectExtractor, propertyAccessor);
+        assertEquals("value", accessor.getProperty(context, 1, "property"));
+        verify(nestedObjectExtractor, propertyAccessor, context);
+    }
+
+    /**
+     * Test method for {@link NestedObjectDelegatePropertyAccessor#setProperty(java.util.Map, Object, Object, Object)}.
+     * @throws OgnlException If something goes wrong.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testSetProperty() throws OgnlException {
+        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
+        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
+        Map<String, Object> context = createMock(Map.class);
+        propertyAccessor.setProperty(context, "nested", "property", "value");
+        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
+
+        replay(nestedObjectExtractor, propertyAccessor, context);
+        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<Integer>(
+                nestedObjectExtractor, propertyAccessor);
+        accessor.setProperty(context, 1, "property", "value");
+        verify(nestedObjectExtractor, propertyAccessor, context);
+    }
+
+    /**
+     * Test method for {@link NestedObjectDelegatePropertyAccessor#getSourceAccessor(ognl.OgnlContext, Object, Object)}.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetSourceAccessor() {
+        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
+        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
+        OgnlContext context = createMock(OgnlContext.class);
+        expect(propertyAccessor.getSourceAccessor(context, "nested", "property")).andReturn("method");
+        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
+
+        replay(nestedObjectExtractor, propertyAccessor, context);
+        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<Integer>(
+                nestedObjectExtractor, propertyAccessor);
+        assertEquals("method", accessor.getSourceAccessor(context, 1, "property"));
+        verify(nestedObjectExtractor, propertyAccessor, context);
+    }
+
+    /**
+     * Test method for {@link NestedObjectDelegatePropertyAccessor#getSourceSetter(ognl.OgnlContext, Object, Object)}.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetSourceSetter() {
+        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
+        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
+        OgnlContext context = createMock(OgnlContext.class);
+        expect(propertyAccessor.getSourceSetter(context, "nested", "property")).andReturn("method");
+        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
+
+        replay(nestedObjectExtractor, propertyAccessor, context);
+        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<Integer>(
+                nestedObjectExtractor, propertyAccessor);
+        assertEquals("method", accessor.getSourceSetter(context, 1, "property"));
+        verify(nestedObjectExtractor, propertyAccessor, context);
+    }
+
+}

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/NestedObjectDelegatePropertyAccessorTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluatorTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluatorTest.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluatorTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluatorTest.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,187 @@
+/*
+ * $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.evaluator.ognl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import ognl.OgnlRuntime;
+import ognl.PropertyAccessor;
+
+import org.apache.tiles.Attribute;
+import org.apache.tiles.Expression;
+import org.apache.tiles.TilesApplicationContext;
+import org.apache.tiles.context.TilesRequestContext;
+import org.easymock.EasyMock;
+
+/**
+ * Tests {@link OGNLAttributeEvaluator}.
+ *
+ * @version $Rev$ $Date$$
+ */
+public class OGNLAttributeEvaluatorTest extends TestCase {
+
+    /**
+     * The evaluator to test.
+     */
+    private OGNLAttributeEvaluator evaluator;
+
+    /**
+     * The request object to use.
+     */
+    private TilesRequestContext request;
+
+    /** {@inheritDoc} */
+    protected void setUp() throws Exception {
+        super.setUp();
+        PropertyAccessor objectPropertyAccessor = OgnlRuntime.getPropertyAccessor(Object.class);
+        PropertyAccessor mapPropertyAccessor = OgnlRuntime.getPropertyAccessor(Map.class);
+        PropertyAccessor applicationContextPropertyAccessor =
+            new NestedObjectDelegatePropertyAccessor<TilesRequestContext>(
+                new TilesApplicationContextNestedObjectExtractor(),
+                objectPropertyAccessor);
+        PropertyAccessor requestScopePropertyAccessor = new NestedObjectDelegatePropertyAccessor<TilesRequestContext>(
+                new RequestScopeNestedObjectExtractor(), mapPropertyAccessor);
+        PropertyAccessor sessionScopePropertyAccessor = new NestedObjectDelegatePropertyAccessor<TilesRequestContext>(
+                new SessionScopeNestedObjectExtractor(), mapPropertyAccessor);
+        PropertyAccessor applicationScopePropertyAccessor =
+            new NestedObjectDelegatePropertyAccessor<TilesRequestContext>(
+                new ApplicationScopeNestedObjectExtractor(), mapPropertyAccessor);
+        PropertyAccessorDelegateFactory<TilesRequestContext> factory = new TilesContextPropertyAccessorDelegateFactory(
+                objectPropertyAccessor, applicationContextPropertyAccessor,
+                requestScopePropertyAccessor, sessionScopePropertyAccessor,
+                applicationScopePropertyAccessor);
+        PropertyAccessor tilesRequestAccessor = new DelegatePropertyAccessor<TilesRequestContext>(factory);
+        OgnlRuntime.setPropertyAccessor(TilesRequestContext.class, tilesRequestAccessor);
+        evaluator = new OGNLAttributeEvaluator();
+        Map<String, Object> requestScope = new HashMap<String, Object>();
+        Map<String, Object> sessionScope = new HashMap<String, Object>();
+        Map<String, Object> applicationScope = new HashMap<String, Object>();
+        requestScope.put("object1", "value");
+        sessionScope.put("object2", new Integer(1));
+        applicationScope.put("object3", new Float(2.0));
+        requestScope.put("paulaBean", new PaulaBean());
+        request = EasyMock.createMock(TilesRequestContext.class);
+        EasyMock.expect(request.getRequestScope()).andReturn(requestScope)
+                .anyTimes();
+        EasyMock.expect(request.getSessionScope()).andReturn(sessionScope)
+                .anyTimes();
+        TilesApplicationContext applicationContext = EasyMock
+                .createMock(TilesApplicationContext.class);
+        EasyMock.expect(request.getApplicationContext()).andReturn(
+                applicationContext).anyTimes();
+        EasyMock.expect(applicationContext.getApplicationScope()).andReturn(
+                applicationScope).anyTimes();
+        EasyMock.replay(request, applicationContext);
+    }
+
+    /**
+     * Tests
+     * {@link OGNLAttributeEvaluator#evaluate(Attribute, TilesRequestContext)}.
+     */
+    public void testEvaluate() {
+        Attribute attribute = new Attribute();
+        attribute.setExpressionObject(new Expression("requestScope.object1"));
+        assertEquals("The value is not correct", "value", evaluator.evaluate(
+                attribute, request));
+        attribute.setExpressionObject(new Expression("sessionScope.object2"));
+        assertEquals("The value is not correct", new Integer(1), evaluator
+                .evaluate(attribute, request));
+        attribute.setExpressionObject(new Expression("applicationScope.object3"));
+        assertEquals("The value is not correct", new Float(2.0), evaluator
+                .evaluate(attribute, request));
+        attribute.setExpressionObject(new Expression("object1"));
+        assertEquals("The value is not correct", "value", evaluator.evaluate(
+                attribute, request));
+        attribute.setExpressionObject(new Expression("object2"));
+        assertEquals("The value is not correct", new Integer(1), evaluator
+                .evaluate(attribute, request));
+        attribute.setExpressionObject(new Expression("object3"));
+        assertEquals("The value is not correct", new Float(2.0), evaluator
+                .evaluate(attribute, request));
+        attribute.setExpressionObject(new Expression("paulaBean.paula"));
+        assertEquals("The value is not correct", "Brillant", evaluator
+                .evaluate(attribute, request));
+        attribute.setExpressionObject(new Expression("'String literal'"));
+        assertEquals("The value is not correct", "String literal", evaluator
+                .evaluate(attribute, request));
+        attribute.setValue(new Integer(2));
+        assertEquals("The value is not correct", new Integer(2), evaluator
+                .evaluate(attribute, request));
+        attribute.setValue("object1");
+        assertEquals("The value has been evaluated", "object1", evaluator
+                .evaluate(attribute, request));
+    }
+
+    /**
+     * Tests {@link OGNLAttributeEvaluator#evaluate(String, TilesRequestContext)}.
+     */
+    public void testEvaluateString() {
+        String expression = "requestScope.object1";
+        assertEquals("The value is not correct", "value", evaluator.evaluate(
+                expression, request));
+        expression = "sessionScope.object2";
+        assertEquals("The value is not correct", new Integer(1), evaluator
+                .evaluate(expression, request));
+        expression = "applicationScope.object3";
+        assertEquals("The value is not correct", new Float(2.0), evaluator
+                .evaluate(expression, request));
+        expression = "object1";
+        assertEquals("The value is not correct", "value", evaluator.evaluate(
+                expression, request));
+        expression = "object2";
+        assertEquals("The value is not correct", new Integer(1), evaluator
+                .evaluate(expression, request));
+        expression = "object3";
+        assertEquals("The value is not correct", new Float(2.0), evaluator
+                .evaluate(expression, request));
+        expression = "paulaBean.paula";
+        assertEquals("The value is not correct", "Brillant", evaluator
+                .evaluate(expression, request));
+        expression = "'String literal'";
+        assertEquals("The value is not correct", "String literal", evaluator
+                .evaluate(expression, request));
+    }
+
+    /**
+     * This is The Brillant Paula Bean (sic) just like it was posted to:
+     * http://thedailywtf.com/Articles/The_Brillant_Paula_Bean.aspx I hope that
+     * there is no copyright on it.
+     */
+    public static class PaulaBean {
+
+        /**
+         * Paula is brillant, really.
+         */
+        private String paula = "Brillant";
+
+        /**
+         * Returns brillant.
+         *
+         * @return "Brillant".
+         */
+        public String getPaula() {
+            return paula;
+        }
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluatorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/OGNLAttributeEvaluatorTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractorTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractorTest.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractorTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractorTest.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,56 @@
+/*
+ * $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.evaluator.ognl;
+
+import static org.junit.Assert.*;
+import static org.easymock.EasyMock.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tiles.context.TilesRequestContext;
+import org.junit.Test;
+
+/**
+ * Tests {@link RequestScopeNestedObjectExtractor}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class RequestScopeNestedObjectExtractorTest {
+
+    /**
+     * Tests {@link SessionScopeNestedObjectExtractor#getNestedObject(TilesRequestContext)}.
+     */
+    @Test
+    public void testGetNestedObject() {
+        TilesRequestContext request = createMock(TilesRequestContext.class);
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("attribute1", "value1");
+        expect(request.getSessionScope()).andReturn(map);
+
+        replay(request);
+        NestedObjectExtractor<TilesRequestContext> extractor = new SessionScopeNestedObjectExtractor();
+        assertEquals(map, extractor.getNestedObject(request));
+        verify(request);
+    }
+
+}

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/RequestScopeNestedObjectExtractorTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractorTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractorTest.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractorTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractorTest.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,56 @@
+/*
+ * $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.evaluator.ognl;
+
+import static org.junit.Assert.*;
+import static org.easymock.EasyMock.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tiles.context.TilesRequestContext;
+import org.junit.Test;
+
+/**
+ * Tests {@link SessionScopeNestedObjectExtractor}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class SessionScopeNestedObjectExtractorTest {
+
+    /**
+     * Tests {@link RequestScopeNestedObjectExtractor#getNestedObject(TilesRequestContext)}.
+     */
+    @Test
+    public void testGetNestedObject() {
+        TilesRequestContext request = createMock(TilesRequestContext.class);
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("attribute1", "value1");
+        expect(request.getRequestScope()).andReturn(map);
+
+        replay(request);
+        NestedObjectExtractor<TilesRequestContext> extractor = new RequestScopeNestedObjectExtractor();
+        assertEquals(map, extractor.getNestedObject(request));
+        verify(request);
+    }
+
+}

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/SessionScopeNestedObjectExtractorTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractorTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractorTest.java?rev=793334&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractorTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractorTest.java Sun Jul 12 11:40:59 2009
@@ -0,0 +1,52 @@
+/*
+ * $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.evaluator.ognl;
+
+import static org.junit.Assert.*;
+import static org.easymock.EasyMock.*;
+
+import org.apache.tiles.TilesApplicationContext;
+import org.apache.tiles.context.TilesRequestContext;
+import org.junit.Test;
+
+/**
+ * Tests {@link TilesApplicationContextNestedObjectExtractor}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TilesApplicationContextNestedObjectExtractorTest {
+
+    /**
+     * Tests {@link TilesApplicationContextNestedObjectExtractor#getNestedObject(TilesRequestContext)}.
+     */
+    @Test
+    public void testGetNestedObject() {
+        TilesRequestContext request = createMock(TilesRequestContext.class);
+        TilesApplicationContext applicationContext = createMock(TilesApplicationContext.class);
+        expect(request.getApplicationContext()).andReturn(applicationContext);
+
+        replay(request, applicationContext);
+        NestedObjectExtractor<TilesRequestContext> extractor = new TilesApplicationContextNestedObjectExtractor();
+        assertEquals(applicationContext, extractor.getNestedObject(request));
+        verify(request, applicationContext);
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/evaluator/ognl/TilesApplicationContextNestedObjectExtractorTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL