View Javadoc

1   package org.apache.ojb.broker.cache;
2   
3   /* Copyright 2003-2005 The Apache Software Foundation
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License");
6    * you may not use this file except in compliance with the License.
7    * You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  import org.apache.ojb.broker.Identity;
19  import org.apache.ojb.broker.PersistenceBroker;
20  import org.apache.ojb.broker.util.logging.LoggerFactory;
21  
22  import java.util.HashMap;
23  import java.util.Iterator;
24  import java.util.Map;
25  import java.util.Properties;
26  
27  /**
28   * A global {@link ObjectCache} implementation using a JCS region for
29   * each class. Each class name was associated with a dedicated
30   * {@link ObjectCacheJCSImpl} instance to cache given objects.
31   * This allows to define JCS cache region configuration properties
32   * for each used class in JCS configuration files.
33   *
34   * <br/>
35   * More info see <a href="http://jakarta.apache.org/turbine/jcs/index.html">
36   * turbine-JCS</a>.
37   *
38   * <p>
39   * Implementation configuration properties:
40   * </p>
41   *
42   * <table cellspacing="2" cellpadding="2" border="3" frame="box">
43   * <tr>
44   *     <td><strong>Property Key</strong></td>
45   *     <td><strong>Property Values</strong></td>
46   * </tr>
47   * <tr>
48   *     <td> - </td>
49   *     <td>
50   *          -
51   *    </td>
52   * </tr>
53   * </table>
54   *
55   * @author  Matthew Baird  (mattbaird@yahoo.com)
56   * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>
57   * @version $Id: ObjectCacheJCSPerClassImpl.java,v 1.1 2007-08-24 22:17:29 ewestfal Exp $
58   */
59  
60  public class ObjectCacheJCSPerClassImpl extends AbstractMetaCache
61  {
62      private static Map cachesByClass = new HashMap();
63  
64      /**
65       * Constructor for the MetaObjectCachePerClassImpl object
66       */
67      public ObjectCacheJCSPerClassImpl(PersistenceBroker broker, Properties prop)
68      {
69      }
70  
71      public ObjectCache getCache(Identity oid, Object obj, int methodCall)
72      {
73          if (oid.getObjectsRealClass() == null)
74          {
75              LoggerFactory.getDefaultLogger().info("[" + this.getClass()
76                      + "] Can't get JCS cache, real class was 'null' for Identity: " + oid);
77              return null;
78          }
79          return getCachePerClass(oid.getObjectsRealClass(), methodCall);
80      }
81  
82      /**
83       * Clears the cache
84       */
85      public void clear()
86      {
87          Iterator it = cachesByClass.values().iterator();
88          while (it.hasNext())
89          {
90              ObjectCache cache = (ObjectCache) it.next();
91              if (cache != null)
92              {
93                  cache.clear();
94              }
95              else
96              {
97                  it.remove();
98              }
99          }
100     }
101 
102     /**
103      * Gets the cache for the given class
104      *
105      * @param objectClass  The class to look up the cache for
106      * @return             The cache
107      */
108     private ObjectCache getCachePerClass(Class objectClass, int methodCall)
109     {
110         ObjectCache cache = (ObjectCache) cachesByClass.get(objectClass.getName());
111         if (cache == null && methodCall == AbstractMetaCache.METHOD_CACHE)
112         {
113             /**
114              * the cache wasn't found, and the cachesByClass didn't contain the key with a
115              * null value, so create a new cache for this classtype
116              */
117             cache = new ObjectCacheJCSImpl(objectClass.getName());
118             cachesByClass.put(objectClass.getName(), cache);
119         }
120         return cache;
121     }
122 }