KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > cache > GenericTransactionManagerLookup


1 package org.jboss.cache;
2
3 import org.apache.commons.logging.Log;
4 import org.apache.commons.logging.LogFactory;
5 import org.jboss.cache.transaction.DummyTransactionManager;
6
7 import javax.naming.InitialContext JavaDoc;
8 import javax.naming.NamingException JavaDoc;
9 import javax.transaction.TransactionManager JavaDoc;
10 import java.lang.reflect.Method JavaDoc;
11
12 /**
13  * A generic class that chooses the best-fit TransactionManager. Tries a number of well-known appservers
14  *
15  * @author Markus Plesser
16  * @version $Id: GenericTransactionManagerLookup.java,v 1.4 2005/07/08 11:09:20 bela Exp $
17  */

18 public class GenericTransactionManagerLookup implements TransactionManagerLookup {
19
20    /**
21     * our logger
22     */

23    private static Log log=LogFactory.getLog(GenericTransactionManagerLookup.class);
24
25    /**
26     * lookups performed?
27     */

28    private static boolean lookupDone=false;
29
30    /**
31     * no lookup available?
32     */

33    private static boolean lookupFailed=false;
34
35    /**
36     * the (final) used TransactionManager
37     */

38    private static TransactionManager tm=null;
39
40    /**
41     * JNDI locations for TransactionManagers we know of
42     */

43    private static String JavaDoc[][] knownJNDIManagers={
44       {"java:/TransactionManager", "JBoss, JRun4"},
45       {"java:comp/UserTransaction", "Resin, Orion, JOnAS (JOTM)"},
46       {"javax.transaction.TransactionManager", "BEA WebLogic"}
47    };
48
49    /**
50     * WebSphere 5.1 TransactionManagerFactory
51     */

52    private static final String JavaDoc WS_FACTORY_CLASS_5_1="com.ibm.ws.Transaction.TransactionManagerFactory";
53
54    /**
55     * WebSphere 5.0 TransactionManagerFactory
56     */

57    private static final String JavaDoc WS_FACTORY_CLASS_5_0="com.ibm.ejs.jts.jta.TransactionManagerFactory";
58
59    /**
60     * WebSphere 4.0 TransactionManagerFactory
61     */

62    private static final String JavaDoc WS_FACTORY_CLASS_4="com.ibm.ejs.jts.jta.JTSXA";
63
64    /**
65     * Get the systemwide used TransactionManager
66     *
67     * @return TransactionManager
68     */

69    public TransactionManager getTransactionManager() {
70       if(!lookupDone)
71          doLookups();
72       if(tm != null)
73          return tm;
74       if(lookupFailed) {
75          //fall back to a dummy from JBossCache
76
tm=DummyTransactionManager.getInstance();
77          log.warn("Falling back to DummyTransactionManager from JBossCache");
78       }
79       return tm;
80    }
81
82
83    /**
84     * Try to figure out which TransactionManager to use
85     */

86    private static void doLookups() {
87       if(lookupFailed)
88          return;
89       InitialContext JavaDoc ctx;
90       try {
91          ctx=new InitialContext JavaDoc();
92       }
93       catch(NamingException JavaDoc e) {
94          log.error("Could not create an initial JNDI context!", e);
95          lookupFailed=true;
96          return;
97       }
98       //probe jndi lookups first
99
Object JavaDoc jndiObject=null;
100       for(int i=0; i < knownJNDIManagers.length; i++) {
101          try {
102             if(log.isDebugEnabled()) log.debug("Trying to lookup TransactionManager for " + knownJNDIManagers[i][1]);
103             jndiObject=ctx.lookup(knownJNDIManagers[i][0]);
104          }
105          catch(NamingException JavaDoc e) {
106             log.info("Failed to perform a lookup for [" + knownJNDIManagers[i][0] + " (" + knownJNDIManagers[i][1] + ")]");
107          }
108          if(jndiObject instanceof TransactionManager) {
109             tm=(TransactionManager)jndiObject;
110             log.info("Found TransactionManager for " + knownJNDIManagers[i][1]);
111             return;
112          }
113       }
114       //try to find websphere lookups since we came here
115
Class JavaDoc clazz;
116       try {
117          log.debug("Trying WebSphere 5.1: " + WS_FACTORY_CLASS_5_1);
118          clazz=Class.forName(WS_FACTORY_CLASS_5_1);
119          log.info("Found WebSphere 5.1: " + WS_FACTORY_CLASS_5_1);
120       }
121       catch(ClassNotFoundException JavaDoc ex) {
122          try {
123             log.debug("Trying WebSphere 5.0: " + WS_FACTORY_CLASS_5_0);
124             clazz=Class.forName(WS_FACTORY_CLASS_5_0);
125             log.info("Found WebSphere 5.0: " + WS_FACTORY_CLASS_5_0);
126          }
127          catch(ClassNotFoundException JavaDoc ex2) {
128             try {
129                log.debug("Trying WebSphere 4: " + WS_FACTORY_CLASS_4);
130                clazz=Class.forName(WS_FACTORY_CLASS_4);
131                log.info("Found WebSphere 4: " + WS_FACTORY_CLASS_4);
132             }
133             catch(ClassNotFoundException JavaDoc ex3) {
134                log.info("Couldn't find any WebSphere TransactionManager factory class, neither for WebSphere version 5.1 nor 5.0 nor 4");
135                lookupFailed=true;
136                return;
137             }
138          }
139       }
140       try {
141          Class JavaDoc[] signature=null;
142          Object JavaDoc[] args=null;
143          Method JavaDoc method=clazz.getMethod("getTransactionManager", signature);
144          tm=(TransactionManager)method.invoke(null, args);
145       }
146       catch(Exception JavaDoc ex) {
147          log.error("Found WebSphere TransactionManager factory class [" + clazz.getName() +
148                    "], but couldn't invoke its static 'getTransactionManager' method", ex);
149       }
150    }
151
152 }
153
Popular Tags