Author: apetrelli Date: Wed Dec 20 05:06:46 2006 New Revision: 489080 URL: http://svn.apache.org/viewvc?view=rev&rev=489080 Log: SB-101 Initialization of keyed definitions factory must happen after they are set. Added connection between the request and the key of the chosen definitions factory.
Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/KeyedDefinitionsFactoryTilesContainer.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingKeyedDefinitionsFactoryTilesContainerFactory.java 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=489080&r1=489079&r2=489080 ============================================================================== --- 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 Dec 20 05:06:46 2006 @@ -26,29 +26,20 @@ import java.util.Map; import org.apache.tiles.TilesException; +import org.apache.tiles.context.TilesRequestContext; +import org.apache.tiles.definition.ComponentDefinition; import org.apache.tiles.definition.DefinitionsFactory; +import org.apache.tiles.definition.DefinitionsFactoryException; public class KeyedDefinitionsFactoryTilesContainer extends BasicTilesContainer { + + public static final String DEFINITIONS_FACTORY_KEY_ATTRIBUTE_NAME = + "org.apache.tiles.DEFINITIONS_FACTORY.key"; protected Map<String, DefinitionsFactory> key2definitionsFactory; - - protected Map<String, Map<String, String>> key2initParams; public KeyedDefinitionsFactoryTilesContainer() { key2definitionsFactory = new HashMap<String, DefinitionsFactory>(); - key2initParams = new HashMap<String, Map<String,String>>(); - } - - @Override - public void init(Map<String, String> initParameters) throws TilesException { - super.init(initParameters); - - for (Map.Entry<String, DefinitionsFactory> entry: - key2definitionsFactory.entrySet()) { - String key = entry.getKey(); - initializeDefinitionsFactory(entry.getValue(), - getResourceString(initParameters), key2initParams.get(key)); - } } /** @@ -74,16 +65,48 @@ * that the container has not yet been initialized. * * @param definitionsFactory the definitions factory for this instance. + * @throws TilesException If something goes wrong during initialization of + * the definitions factory. */ public void setDefinitionsFactory(String key, DefinitionsFactory definitionsFactory, - Map<String, String> initParameters) { + Map<String, String> initParameters) throws TilesException { if (key != null) { - checkInit(); key2definitionsFactory.put(key, definitionsFactory); - key2initParams.put(key, initParameters); + initializeDefinitionsFactory(definitionsFactory, + getResourceString(initParameters), initParameters); } else { setDefinitionsFactory(definitionsFactory); } + } + + @Override + protected ComponentDefinition getDefinition(String definitionName, + TilesRequestContext request) throws DefinitionsFactoryException { + ComponentDefinition retValue = null; + String key = getDefinitionsFactoryKey(request); + if (key != null) { + DefinitionsFactory definitionsFactory = + key2definitionsFactory.get(key); + if (definitionsFactory != null) { + retValue = definitionsFactory.getDefinition(definitionName, + request); + } + } + if (retValue == null) { + retValue = super.getDefinition(definitionName, request); + } + return retValue; + } + + 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; } } Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingKeyedDefinitionsFactoryTilesContainerFactory.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingKeyedDefinitionsFactoryTilesContainerFactory.java?view=diff&rev=489080&r1=489079&r2=489080 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingKeyedDefinitionsFactoryTilesContainerFactory.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingKeyedDefinitionsFactoryTilesContainerFactory.java Wed Dec 20 05:06:46 2006 @@ -52,6 +52,8 @@ protected ComponentDefinition getDefinition(String definition, TilesRequestContext context) throws DefinitionsFactoryException { + DefinitionManager mgr = getAppropriateDefinitionManager( + getDefinitionsFactoryKey(context)); return mgr.getDefinition(definition, context); } @@ -62,12 +64,8 @@ @Override public DefinitionsFactory getDefinitionsFactory(String key) { - DefinitionsFactory factory = key2definitionsFactory.get(key); - if (factory == null) { - factory = mgr.getFactory(); - } - - return factory; + DefinitionManager mgr = getAppropriateDefinitionManager(key); + return mgr.getFactory(); } @Override @@ -78,12 +76,30 @@ @Override public void setDefinitionsFactory(String key, DefinitionsFactory definitionsFactory, Map<String, String> initParameters) { + DefinitionManager mgr = getOrCreateDefinitionManager(key); + mgr.setFactory(definitionsFactory); + } + + protected DefinitionManager getOrCreateDefinitionManager(String key) { DefinitionManager mgr = key2definitionManager.get(key); if (mgr == null) { mgr = new DefinitionManager(); key2definitionManager.put(key, mgr); } - mgr.setFactory(definitionsFactory); + + return mgr; + } + + protected DefinitionManager getAppropriateDefinitionManager(String key) { + DefinitionManager mgr = null; + + if (key != null) { + mgr = key2definitionManager.get(key); + } + if (mgr == null) { + mgr = this.mgr; + } + + return mgr; } - }