View Javadoc

1   /*
2    * $Header: /usr/local/cvsroot/dev/madcache/src/com/macvu/tiles/xmlDefinition/CacheFactorySet.java,v 1.1 2004/04/08 06:24:44 macvu Exp $
3    * $Revision: 1.1 $
4    * $Date: 2004/04/08 06:24:44 $
5    *
6    * ====================================================================
7    *
8    * The Apache Software License, Version 1.1
9    *
10   * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
11   * reserved.
12   *
13   * Redistribution and use in source and binary forms, with or without
14   * modification, are permitted provided that the following conditions
15   * are met:
16   *
17   * 1. Redistributions of source code must retain the above copyright
18   *    notice, this list of conditions and the following disclaimer.
19   *
20   * 2. Redistributions in binary form must reproduce the above copyright
21   *    notice, this list of conditions and the following disclaimer in
22   *    the documentation and/or other materials provided with the
23   *    distribution.
24   *
25   * 3. The end-user documentation included with the redistribution, if
26   *    any, must include the following acknowlegement:
27   *       "This product includes software developed by the
28   *        Apache Software Foundation (http://www.apache.org/)."
29   *    Alternately, this acknowlegement may appear in the software itself,
30   *    if and wherever such third-party acknowlegements normally appear.
31   *
32   * 4. The names "The Jakarta Project", "Struts", and "Apache Software
33   *    Foundation" must not be used to endorse or promote products derived
34   *    from this software without prior written permission. For written
35   *    permission, please contact apache@apache.org.
36   *
37   * 5. Products derived from this software may not be called "Apache"
38   *    nor may "Apache" appear in their names without prior written
39   *    permission of the Apache Group.
40   *
41   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52   * SUCH DAMAGE.
53   * ====================================================================
54   *
55   * This software consists of voluntary contributions made by many
56   * individuals on behalf of the Apache Software Foundation.  For more
57   * information on the Apache Software Foundation, please see
58   * <http://www.apache.org/>.
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             // synchronize creation to avoid double creation by separate threads.
116             // Also, check if factory hasn't been created while waiting for synchronized
117             // section.
118             synchronized (factories) {
119                 factory = factories.get(key);
120                 if (factory == null) {
121                     factory = createFactory(key, request, servletContext);
122                     factories.put(key, factory);
123                 } // end if
124             } // end synchronized
125         } // end if
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 }