Author: apetrelli
Date: Wed Jan 10 08:41:39 2007
New Revision: 494885

URL: http://svn.apache.org/viewvc?view=rev&rev=494885
Log:
Added the concept of "KeyExtractor"

Added:
    
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java
   (with props)
Modified:
    
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/KeyedDefinitionsFactoryTilesContainerFactory.java
    
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/TilesContainerFactory.java
    
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainer.java
    
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainerTest.java

Modified: 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/KeyedDefinitionsFactoryTilesContainerFactory.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/KeyedDefinitionsFactoryTilesContainerFactory.java?view=diff&rev=494885&r1=494884&r2=494885
==============================================================================
--- 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/KeyedDefinitionsFactoryTilesContainerFactory.java
 (original)
+++ 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/KeyedDefinitionsFactoryTilesContainerFactory.java
 Wed Jan 10 08:41:39 2007
@@ -29,8 +29,10 @@
 import org.apache.tiles.definition.DefinitionsFactory;
 import org.apache.tiles.impl.BasicTilesContainer;
 import org.apache.tiles.impl.KeyedDefinitionsFactoryTilesContainer;
+import 
org.apache.tiles.impl.KeyedDefinitionsFactoryTilesContainer.KeyExtractor;
 import 
org.apache.tiles.impl.mgmt.CachingKeyedDefinitionsFactoryTilesContainerFactory;
 import org.apache.tiles.mgmt.MutableTilesContainer;
+import org.apache.tiles.util.ClassUtil;
 
 /**
  * Factory that creates instances of container that will extend the
@@ -47,6 +49,9 @@
      */
     public static final String CONTAINER_KEYS_INIT_PARAM =
         "org.apache.tiles.CONTAINER.keys";
+    
+    public static final String KEY_EXTRACTOR_CLASS_INIT_PARAM =
+        "org.apache.tiles.CONTAINER.keyExtractor";
 
     @Override
     public MutableTilesContainer createMutableTilesContainer(Object context) 
throws TilesException {
@@ -86,10 +91,18 @@
 
     @Override
     protected void storeContainerDependencies(Object context,
-            BasicTilesContainer container) throws TilesException {
-        super.storeContainerDependencies(context, container);
-        String keysString = getInitParameter(context,
-                CONTAINER_KEYS_INIT_PARAM);
+            Map<String, String> initParameters, Map<String, String> 
configuration, BasicTilesContainer container) throws TilesException {
+        super.storeContainerDependencies(context, initParameters, 
configuration, container);
+        
+        String keyExtractorClassName = configuration.get(
+                KEY_EXTRACTOR_CLASS_INIT_PARAM);
+        if (keyExtractorClassName != null
+                && container instanceof KeyedDefinitionsFactoryTilesContainer) 
{
+            ((KeyedDefinitionsFactoryTilesContainer) 
container).setKeyExtractor(
+                    (KeyExtractor) 
ClassUtil.instantiate(keyExtractorClassName));
+        }
+        
+        String keysString = initParameters.get(CONTAINER_KEYS_INIT_PARAM);
         if (keysString != null
                 && container instanceof KeyedDefinitionsFactoryTilesContainer) 
{
             String[] keys = keysString.split(",");
@@ -97,7 +110,7 @@
             config.putAll(getInitParameterMap(context));
             for (int i=0; i < keys.length; i++) {
                 Map<String, String> initParams = new HashMap<String, String>();
-                String param = getInitParameter(context,
+                String param = initParameters.get(
                         BasicTilesContainer.DEFINITIONS_CONFIG + "@" + 
keys[i]);
                 if (param != null) {
                     initParams.put(BasicTilesContainer.DEFINITIONS_CONFIG,

Modified: 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/TilesContainerFactory.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/TilesContainerFactory.java?view=diff&rev=494885&r1=494884&r2=494885
==============================================================================
--- 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/TilesContainerFactory.java
 (original)
+++ 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/factory/TilesContainerFactory.java
 Wed Jan 10 08:41:39 2007
@@ -162,17 +162,19 @@
     protected void initializeContainer(Object context,
                                        BasicTilesContainer container)
         throws TilesException {
-        storeContainerDependencies(context, container);
-        container.init(getInitParameterMap(context));
-
+        Map <String, String> initParameterMap;
+        
+        initParameterMap = getInitParameterMap(context);
+        Map<String, String> configuration = new HashMap<String, 
String>(defaultConfiguration);
+        configuration.putAll(initParameterMap);
+        storeContainerDependencies(context, initParameterMap, configuration, 
container);
+        container.init(initParameterMap);
     }
 
     protected void storeContainerDependencies(Object context,
+                                              Map<String, String> 
initParameters,
+                                              Map<String, String> 
configuration,
                                               BasicTilesContainer container) 
throws TilesException {
-
-        Map<String, String> configuration = new HashMap<String, 
String>(defaultConfiguration);
-        configuration.putAll(getInitParameterMap(context));
-
         TilesContextFactory contextFactory =
             (TilesContextFactory) createFactory(configuration,
                 CONTEXT_FACTORY_INIT_PARAM);

Modified: 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainer.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainer.java?view=diff&rev=494885&r1=494884&r2=494885
==============================================================================
--- 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainer.java
 (original)
+++ 
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainer.java
 Wed Jan 10 08:41:39 2007
@@ -50,6 +50,8 @@
         * Maps definition factories to their keys.
         */
        protected Map<String, DefinitionsFactory> key2definitionsFactory;
+    
+    protected KeyExtractor keyExtractor;
 
        /**
         * Constructor.
@@ -57,6 +59,37 @@
        public KeyedDefinitionsFactoryTilesContainer() {
                key2definitionsFactory = new HashMap<String, 
DefinitionsFactory>();
        }
+    
+    public interface KeyExtractor {
+
+        /**
+         * Returns the definitions factory key.
+         *
+         * @param request The request object.
+         * @return The needed factory key.
+         */
+        public String getDefinitionsFactoryKey(TilesRequestContext request);
+    }
+    
+    protected class DefaultKeyExtractor implements KeyExtractor {
+        
+        /**
+         * Returns the definitions factory key.
+         *
+         * @param request The request object.
+         * @return The needed factory key.
+         */
+        public String getDefinitionsFactoryKey(TilesRequestContext request) {
+            String retValue = null;
+            Map requestScope = request.getRequestScope();
+            if (requestScope != null) { // Probably the request scope does not 
exist
+                retValue = (String) requestScope.get(
+                        DEFINITIONS_FACTORY_KEY_ATTRIBUTE_NAME);
+            }
+            
+            return retValue;
+        }
+    }
 
        /**
      * Standard Getter
@@ -114,6 +147,10 @@
                setDefinitionsFactory(definitionsFactory);
        }
     }
+    
+    public void setKeyExtractor(KeyExtractor keyExtractor) {
+        this.keyExtractor = keyExtractor;
+    }
 
     @Override
     protected ComponentDefinition getDefinition(String definitionName,
@@ -141,13 +178,10 @@
      * @return The needed factory key.
      */
     protected String getDefinitionsFactoryKey(TilesRequestContext request) {
-        String retValue = null;
-        Map requestScope = request.getRequestScope();
-        if (requestScope != null) { // Probably the request scope does not 
exist
-            retValue = (String) requestScope.get(
-                    DEFINITIONS_FACTORY_KEY_ATTRIBUTE_NAME);
-        }
         
-        return retValue;
+        if (keyExtractor == null) {
+            keyExtractor = new DefaultKeyExtractor();
+        }
+        return keyExtractor.getDefinitionsFactoryKey(request);
     }
 }

Modified: 
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainerTest.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainerTest.java?view=diff&rev=494885&r1=494884&r2=494885
==============================================================================
--- 
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainerTest.java
 (original)
+++ 
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainerTest.java
 Wed Jan 10 08:41:39 2007
@@ -37,6 +37,7 @@
 import org.apache.tiles.definition.DefinitionsFactory;
 import org.apache.tiles.factory.KeyedDefinitionsFactoryTilesContainerFactory;
 import org.apache.tiles.factory.TilesContainerFactory;
+import org.apache.tiles.util.RollingVectorEnumeration;
 import org.easymock.EasyMock;
 
 
@@ -57,6 +58,9 @@
         ServletContext context = EasyMock.createMock(ServletContext.class);
         
         Vector<String> v = new Vector<String>();
+        
v.add(KeyedDefinitionsFactoryTilesContainerFactory.CONTAINER_KEYS_INIT_PARAM);
+        v.add(BasicTilesContainer.DEFINITIONS_CONFIG + "@one");
+        v.add(BasicTilesContainer.DEFINITIONS_CONFIG + "@two");
 
         
EasyMock.expect(context.getInitParameter(TilesContainerFactory.CONTAINER_FACTORY_INIT_PARAM)).andReturn(null);
         
EasyMock.expect(context.getInitParameter(TilesContainerFactory.CONTEXT_FACTORY_INIT_PARAM)).andReturn(null);
@@ -69,7 +73,7 @@
         
EasyMock.expect(context.getInitParameter(BasicTilesContainer.DEFINITIONS_CONFIG 
+ "@two"))
                 .andReturn("/WEB-INF/tiles-two.xml").anyTimes();
         
EasyMock.expect(context.getInitParameter(EasyMock.isA(String.class))).andReturn(null).anyTimes();
-        
EasyMock.expect(context.getInitParameterNames()).andReturn(v.elements()).anyTimes();
+        EasyMock.expect(context.getInitParameterNames()).andReturn(new 
RollingVectorEnumeration<String>(v)).anyTimes();
         try {
             URL url = 
getClass().getResource("/org/apache/tiles/factory/test-defs.xml");
             
EasyMock.expect(context.getResource("/WEB-INF/tiles.xml")).andReturn(url);

Added: 
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java?view=auto&rev=494885
==============================================================================
--- 
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java
 (added)
+++ 
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java
 Wed Jan 10 08:41:39 2007
@@ -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.util;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class RollingVectorEnumeration<E> implements Enumeration<E> {
+    
+    private Vector<E> vector;
+    
+    private Enumeration<E> elements;
+    
+    public RollingVectorEnumeration(Vector<E> vector) {
+        this.vector = vector;
+    }
+
+    public boolean hasMoreElements() {
+        if (elements == null) {
+            elements = vector.elements();
+            return false;
+        }
+        return elements.hasMoreElements();
+    }
+
+    public E nextElement() {
+        E retValue = elements.nextElement();
+        
+        if (!elements.hasMoreElements()) {
+            elements = null;
+        }
+        
+        return retValue;
+    }
+
+}

Propchange: 
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/sandbox/trunk/tiles/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL


Reply via email to