1/*2 * $Id: CachingKeyedDefinitionsFactoryTilesContainer.java 797754 2009-07-25 11:42:03Z apetrelli $3 *4 * Licensed to the Apache Software Foundation (ASF) under one5 * or more contributor license agreements. See the NOTICE file6 * distributed with this work for additional information7 * regarding copyright ownership. The ASF licenses this file8 * to you under the Apache License, Version 2.0 (the9 * "License"); you may not use this file except in compliance10 * with the License. You may obtain a copy of the License at11 *12 * http://www.apache.org/licenses/LICENSE-2.013 *14 * Unless required by applicable law or agreed to in writing,15 * software distributed under the License is distributed on an16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY17 * KIND, either express or implied. See the License for the18 * specific language governing permissions and limitations19 * under the License.20 */2122package org.apache.tiles.impl.mgmt;
2324import java.util.HashMap;
25import java.util.Map;
2627import org.apache.tiles.Definition;
28import org.apache.tiles.context.TilesRequestContext;
29import org.apache.tiles.definition.DefinitionsFactory;
30import org.apache.tiles.impl.KeyedDefinitionsFactoryTilesContainer;
31import org.apache.tiles.mgmt.MutableTilesContainer;
3233/***34 * Container that can be used to store multiple {@link DefinitionsFactory}35 * instances mapped to different keys, with the addition of being "mutable",36 * i.e. caches (in memory) the definitions registered to it. If a definition37 * is not found in cache, it will revert back to it's definitions factory.38 *39 * @version $Rev: 797754 $ $Date: 2009-07-25 13:42:03 +0200 (sab, 25 lug 2009) $40 * @deprecated Register different containers using41 * {@link org.apache.tiles.access.TilesAccess#setContainer(42 * org.apache.tiles.TilesApplicationContext, org.apache.tiles.TilesContainer, String)}43 * and using {@link CachingTilesContainer} as container implementation.44 */45publicclassCachingKeyedDefinitionsFactoryTilesContainerextends46KeyedDefinitionsFactoryTilesContainer implements MutableTilesContainer {
4748/***49 * The name prefix of the attribute that will contain custom definitions for50 * the current request.51 */52privatestaticfinal String DEFINITIONS_ATTRIBUTE_NAME_BASE =
53"org.apache.tiles.impl.mgmt.CachingKeyedDefinitionsFactoryTilesContainer.DEFINITIONS.";
5455/***56 * The default definition manager, when no key is identified.57 */58privateDefinitionManager mgr = newDefinitionManager();
5960/***61 * Maps a key to its definition manager.62 */63private Map<String, DefinitionManager> key2definitionManager
64 = new HashMap<String, DefinitionManager>();
6566/*** {@inheritDoc} */67publicvoid register(Definition definition, Object... requestItems) {
68TilesRequestContext requestContext = getRequestContextFactory()
69 .createRequestContext(getApplicationContext(), requestItems);
70 register(definition, requestContext);
71 }
7273/*** {@inheritDoc} */74 @Override
75protected Definition getDefinition(String definition,
76TilesRequestContext context) {
77DefinitionManager mgr = getProperDefinitionManager(
78 getDefinitionsFactoryKey(context));
79return mgr.getDefinition(definition, context);
80 }
8182/*** {@inheritDoc} */83 @Override
84publicDefinitionsFactory getDefinitionsFactory() {
85return mgr.getFactory();
86 }
8788/*** {@inheritDoc} */89 @Override
90publicDefinitionsFactory getDefinitionsFactory(String key) {
91DefinitionManager mgr = getProperDefinitionManager(key);
92return mgr.getFactory();
93 }
9495/*** {@inheritDoc} */96 @Override
97publicvoid setDefinitionsFactory(DefinitionsFactory definitionsFactory) {
98super.setDefinitionsFactory(definitionsFactory);
99 mgr.setFactory(definitionsFactory);
100 }
101102/*** {@inheritDoc} */103 @Override
104 @Deprecated
105publicvoid setDefinitionsFactory(String key, DefinitionsFactory definitionsFactory,
106 Map<String, String> initParameters) {
107if (key != null) {
108 initializeDefinitionsFactory(definitionsFactory,
109 getResourceString(initParameters), initParameters);
110 }
111DefinitionManager mgr = getOrCreateDefinitionManager(key);
112 mgr.setFactory(definitionsFactory);
113 }
114115/***116 * Registers a custom definition.117 *118 * @param definition The definition to register.119 * @param request The request inside which the definition should be120 * registered.121 */122protectedvoid register(Definition definition, TilesRequestContext request) {
123DefinitionManager mgr = getProperDefinitionManager(
124 getDefinitionsFactoryKey(request));
125 mgr.addDefinition(definition, request);
126 }
127128/***129 * Returns a definition manager if found, otherwise it will create a new130 * one.131 *132 * @param key The key of the definition manager.133 * @return The needed definition manager.134 */135protectedDefinitionManager getOrCreateDefinitionManager(String key) {
136DefinitionManager mgr = key2definitionManager.get(key);
137if (mgr == null) {
138 mgr = newDefinitionManager(DEFINITIONS_ATTRIBUTE_NAME_BASE + key);
139 key2definitionManager.put(key, mgr);
140 }
141142return mgr;
143 }
144145/***146 * Returns a definition manager if found.147 *148 * @param key The key of the definition manager.149 * @return The needed definition manager.150 */151protectedDefinitionManager getProperDefinitionManager(String key) {
152DefinitionManager mgr = null;
153154if (key != null) {
155 mgr = key2definitionManager.get(key);
156 }
157if (mgr == null) {
158 mgr = this.mgr;
159 }
160161return mgr;
162 }
163 }