View Javadoc

1   /*
2    * $Id: CachingKeyedDefinitionsFactoryTilesContainer.java 537196 2007-05-11 14:07:35Z apetrelli $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   * http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  package org.apache.tiles.impl.mgmt;
23  
24  import java.util.HashMap;
25  import java.util.Map;
26  
27  import org.apache.tiles.Definition;
28  import org.apache.tiles.TilesException;
29  import org.apache.tiles.context.TilesRequestContext;
30  import org.apache.tiles.definition.DefinitionsFactory;
31  import org.apache.tiles.definition.DefinitionsFactoryException;
32  import org.apache.tiles.impl.KeyedDefinitionsFactoryTilesContainer;
33  import org.apache.tiles.mgmt.MutableTilesContainer;
34  
35  /***
36   * Container that can be used to store multiple {@link DefinitionsFactory}
37   * instances mapped to different keys, with the addition of being "mutable",
38   * i.e.  caches (in memory) the definitions registered to it.  If a definition
39   * is not found in cache, it will revert back to it's definitions factory.
40   *
41   * @version $Rev: 537196 $ $Date: 2007-05-11 16:07:35 +0200 (Fri, 11 May 2007) $
42   */
43  public class CachingKeyedDefinitionsFactoryTilesContainer extends
44          KeyedDefinitionsFactoryTilesContainer implements MutableTilesContainer {
45  
46      /***
47       * The name prefix of the attribute that will contain custom definitions for
48       * the current request.
49       */
50      private static final String DEFINITIONS_ATTRIBUTE_NAME_BASE =
51          "org.apache.tiles.impl.mgmt.CachingKeyedDefinitionsFactoryTilesContainer.DEFINITIONS.";
52  
53      /***
54       * The default definition manager, when no key is identified.
55       */
56      private DefinitionManager mgr = new DefinitionManager();
57  
58      /***
59       * Maps a key to its definition manager.
60       */
61      private Map<String, DefinitionManager> key2definitionManager
62              = new HashMap<String, DefinitionManager>();
63  
64      /*** {@inheritDoc} */
65      public void register(Definition definition, Object... requestItems) throws TilesException {
66          TilesRequestContext requestContext = getContextFactory().createRequestContext(
67                  getApplicationContext(),
68                  requestItems
69              );
70          register(definition, requestContext);
71      }
72  
73      /*** {@inheritDoc} */
74      @Override
75      protected Definition getDefinition(String definition,
76                                                  TilesRequestContext context)
77          throws DefinitionsFactoryException {
78          DefinitionManager mgr = getProperDefinitionManager(
79                  getDefinitionsFactoryKey(context));
80          return mgr.getDefinition(definition, context);
81      }
82  
83      /*** {@inheritDoc} */
84      @Override
85      public DefinitionsFactory getDefinitionsFactory() {
86          return mgr.getFactory();
87      }
88  
89      /*** {@inheritDoc} */
90      @Override
91      public DefinitionsFactory getDefinitionsFactory(String key) {
92          DefinitionManager mgr = getProperDefinitionManager(key);
93          return mgr.getFactory();
94      }
95  
96      /*** {@inheritDoc} */
97      @Override
98      public void setDefinitionsFactory(DefinitionsFactory definitionsFactory) {
99          super.setDefinitionsFactory(definitionsFactory);
100         mgr.setFactory(definitionsFactory);
101     }
102 
103     /*** {@inheritDoc} */
104     @Override
105     public void setDefinitionsFactory(String key, DefinitionsFactory definitionsFactory,
106             Map<String, String> initParameters) throws TilesException {
107         if (key != null) {
108             initializeDefinitionsFactory(definitionsFactory,
109                     getResourceString(initParameters), initParameters);
110         }
111         DefinitionManager mgr = getOrCreateDefinitionManager(key);
112         mgr.setFactory(definitionsFactory);
113     }
114 
115     /***
116      * Registers a custom definition.
117      *
118      * @param definition The definition to register.
119      * @param request The request inside which the definition should be
120      * registered.
121      * @throws DefinitionsFactoryException If something goes wrong during adding
122      * a definition, such as missing parent definitions.
123      */
124     protected void register(Definition definition,
125             TilesRequestContext request) throws DefinitionsFactoryException {
126         DefinitionManager mgr = getProperDefinitionManager(
127                 getDefinitionsFactoryKey(request));
128         Definition def = new Definition(definition);
129         mgr.addDefinition(def, request);
130     }
131 
132     /***
133      * Returns a definition manager if found, otherwise it will create a new
134      * one.
135      *
136      * @param key The key of the definition manager.
137      * @return The needed definition manager.
138      */
139     protected DefinitionManager getOrCreateDefinitionManager(String key) {
140         DefinitionManager mgr = key2definitionManager.get(key);
141         if (mgr == null) {
142             mgr = new DefinitionManager(DEFINITIONS_ATTRIBUTE_NAME_BASE + key);
143             key2definitionManager.put(key, mgr);
144         }
145 
146         return mgr;
147     }
148 
149     /***
150      * Returns a definition manager if found.
151      *
152      * @param key The key of the definition manager.
153      * @return The needed definition manager.
154      */
155     protected DefinitionManager getProperDefinitionManager(String key) {
156         DefinitionManager mgr = null;
157 
158         if (key != null) {
159             mgr = key2definitionManager.get(key);
160         }
161         if (mgr == null) {
162             mgr = this.mgr;
163         }
164 
165         return mgr;
166     }
167 }