KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > ipanema > jdo > JDOObjectID2PCClassMap


1 /*
2  * Created on May 7, 2005
3  */

4 package com.nightlabs.ipanema.jdo;
5
6 import java.util.HashMap JavaDoc;
7 import java.util.Map JavaDoc;
8
9 import org.apache.log4j.Logger;
10
11 import com.nightlabs.ipanema.base.login.Login;
12
13 /**
14  * @author Marco Schulze - marco at nightlabs dot de
15  */

16 public class JDOObjectID2PCClassMap
17 {
18     public static final Logger LOGGER = Logger.getLogger(JDOObjectID2PCClassMap.class);
19
20     private static JDOObjectID2PCClassMap _sharedInstance = null;
21
22     public static JDOObjectID2PCClassMap sharedInstance()
23     {
24         if (_sharedInstance == null)
25             _sharedInstance = new JDOObjectID2PCClassMap();
26
27         return _sharedInstance;
28     }
29     
30     private JDOManager jdoManager = null;
31
32     /**
33      * key: JDOObjectID objectID<br/>
34      * value: Class objectClass
35      */

36     private Map JavaDoc objectID2PCClassMap = new HashMap JavaDoc();
37
38     /**
39      * You should not use this method if you don't really need it. The
40      * method {@link #getPersistenceCapableClass(Object)} finds out the
41      * class itself by querying the server if necessary.
42      * <p>
43      * This method exists only for efficiency reasons and is called by the
44      * {@link com.nightlabs.ipanema.jdo.cache.Cache} whenever a new instance
45      * is put into it.
46      * <p>
47      * This method silently returns without any action, if the <tt>objectID</tt>
48      * is already known.
49      *
50      * @param objectID The ID of a persistance-capable JDO object.
51      * @param clazz The <tt>Class</tt> of the instance which is represented
52      * by <tt>objectID</tt>.
53      */

54     public synchronized void initPersistenceCapableClass(Object JavaDoc objectID, Class JavaDoc clazz)
55     {
56         if (objectID2PCClassMap.containsKey(objectID)) {
57             if (LOGGER.isDebugEnabled())
58                 LOGGER.debug("Won't do anything, because there is already a mapping for this objectID: " + objectID);
59
60             return;
61         }
62
63         if (LOGGER.isDebugEnabled())
64             LOGGER.debug("Storing mapping on class \"" + clazz.getName() + "\" for objectID: " + objectID);
65
66         objectID2PCClassMap.put(objectID, clazz);
67     }
68
69     /**
70      * This method finds the class of the JDO object specified by the given
71      * <tt>objectID</tt>.
72      *
73      * @param objectID A JDO object ID pointing to a persistent object.
74      * @return The class of the persistent object.
75      */

76     public synchronized Class JavaDoc getPersistenceCapableClass(Object JavaDoc objectID)
77     {
78         Class JavaDoc jdoObjectClass = (Class JavaDoc) objectID2PCClassMap.get(objectID);
79         if (jdoObjectClass == null) {
80             int retry = 0;
81             String JavaDoc clazzName = null;
82             while (clazzName == null && retry < 2) {
83                 try {
84                     if (jdoManager == null)
85                         jdoManager = JDOManagerUtil.getHome(Login.getLogin().getInitialContextProperties()).create();
86
87                     clazzName = jdoManager.getPersistenceCapableClassName(objectID);
88                 } catch (Throwable JavaDoc t) {
89                     if (++retry >= 2)
90                         throw new RuntimeException JavaDoc(t);
91                     clazzName = null;
92                     jdoManager = null;
93                 }
94             }
95
96             if (clazzName == null)
97                 throw new IllegalStateException JavaDoc("How the hell can clazzName be null?");
98
99             try {
100                 jdoObjectClass = Class.forName(clazzName);
101             } catch (ClassNotFoundException JavaDoc e) {
102                 throw new RuntimeException JavaDoc(e);
103             }
104
105             objectID2PCClassMap.put(objectID, jdoObjectClass);
106         } // if (jdoObjectClass == null) {
107

108         return jdoObjectClass;
109     }
110 }
111
Popular Tags