1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 package com.macvu.tiles.xmlDefinition;
63
64 import org.apache.struts.tiles.*;
65
66 import javax.servlet.ServletContext;
67 import javax.servlet.ServletRequest;
68 import java.util.HashMap;
69 import java.util.Iterator;
70 import java.util.Map;
71
72 public abstract class CacheFactorySet implements ComponentDefinitionsFactory {
73
74 /***
75 * Loaded factories
76 */
77 protected Map factories = null;
78
79 /***
80 * Extract key that will be used to get the sub factory.
81 *
82 * @param name Name of requested definition.
83 * @param request Current servlet request.
84 * @param servletContext Current servlet context.
85 * @return Object.
86 */
87 abstract protected Object getDefinitionsFactoryKey(String name, ServletRequest request, ServletContext servletContext);
88
89 /***
90 * Get default factory.
91 *
92 * @return Default factory.
93 */
94 abstract protected CacheDefinitionFactory getDefaultFactory();
95
96 /***
97 * Get a factory by its key.
98 * If key is <code>null</code>, return defaultFactory.
99 * Search in loaded factories. If not found, create factory and store return value in
100 * loaded factories.
101 *
102 * @param key Key of requested definition.
103 * @param request Current servlet request.
104 * @param servletContext Current servlet context.
105 * @throws org.apache.struts.tiles.DefinitionsFactoryException
106 * If an error occur while creating factory.
107 */
108 protected CacheDefinitionFactory getFactory(Object key, ServletRequest request, ServletContext servletContext)
109 throws DefinitionsFactoryException {
110 if (key == null)
111 return getDefaultFactory();
112
113 Object factory = factories.get(key);
114 if (factory == null) {
115
116
117
118 synchronized (factories) {
119 factory = factories.get(key);
120 if (factory == null) {
121 factory = createFactory(key, request, servletContext);
122 factories.put(key, factory);
123 }
124 }
125 }
126 return (CacheDefinitionFactory) factory;
127 }
128
129 /***
130 * Get a definition by its name.
131 *
132 * @param name Name of requested definition.
133 * @param request Current servlet request.
134 * @param servletContext Current servlet context.
135 * @throws org.apache.struts.tiles.NoSuchDefinitionException
136 * No definition found for specified name
137 * @throws DefinitionsFactoryException General exception
138 */
139 public ComponentDefinition getDefinition(String name, ServletRequest request, ServletContext servletContext)
140 throws NoSuchDefinitionException, DefinitionsFactoryException {
141 if (factories == null)
142 throw new FactoryNotFoundException("No definitions factory defined");
143
144 Object key = getDefinitionsFactoryKey(name, request, servletContext);
145 CacheDefinitionFactory factory = getFactory(key, request, servletContext);
146 return factory.getDefinition(name, request, servletContext);
147 }
148
149 /***
150 * Create a factory for specified key.
151 * This method is called by getFactory() when the requested factory doesn't already exist.
152 * Must return a factory, or a default one.
153 * Real implementation needs to provide this method.
154 *
155 * @param key Key of requested definition.
156 * @param request Current servlet request.
157 * @param servletContext Current servlet context
158 * @throws DefinitionsFactoryException If an error occur while creating factory.
159 */
160 abstract protected CacheDefinitionFactory createFactory(Object key, ServletRequest request, ServletContext servletContext)
161 throws DefinitionsFactoryException;
162
163 /***
164 * Init factory set.
165 *
166 * @param servletContext Current servlet context
167 * @param properties properties used to initialized factory set;
168 */
169 abstract public void initFactory(ServletContext servletContext, Map properties)
170 throws DefinitionsFactoryException;
171
172 /***
173 * Constructor.
174 */
175 public CacheFactorySet() {
176 factories = new HashMap();
177 }
178
179 /***
180 * Return String representation.
181 *
182 * @return String representation.
183 */
184 public String toString() {
185 Iterator i = factories.values().iterator();
186 StringBuffer buff = new StringBuffer("all FactorySet's factory : \n");
187 while (i.hasNext()) {
188 buff.append(i.next().toString()).append("\n");
189 }
190 return buff.toString();
191 }
192
193 }