1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. 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
19 package org.apache.naming.factory;
20
21 import java.util.Hashtable;
22 import javax.naming.Name;
23 import javax.naming.Context;
24 import javax.naming.NamingException;
25 import javax.naming.Reference;
26 import javax.naming.RefAddr;
27 import javax.naming.spi.ObjectFactory;
28 import org.apache.naming.TransactionRef;
29
30 /**
31 * Object factory for User trasactions.
32 *
33 * @author Remy Maucherat
34 * @version $Revision: 467222 $ $Date: 2006-10-24 05:17:11 +0200 (mar., 24 oct. 2006) $
35 */
36
37 public class TransactionFactory
38 implements ObjectFactory {
39
40
41 // ----------------------------------------------------------- Constructors
42
43
44 // -------------------------------------------------------------- Constants
45
46
47 // ----------------------------------------------------- Instance Variables
48
49
50 // --------------------------------------------------------- Public Methods
51
52
53 // -------------------------------------------------- ObjectFactory Methods
54
55
56 /**
57 * Crete a new User transaction instance.
58 *
59 * @param obj The reference object describing the DataSource
60 */
61 public Object getObjectInstance(Object obj, Name name, Context nameCtx,
62 Hashtable environment)
63 throws Exception {
64
65 if (obj instanceof TransactionRef) {
66 Reference ref = (Reference) obj;
67 ObjectFactory factory = null;
68 RefAddr factoryRefAddr = ref.get(Constants.FACTORY);
69 if (factoryRefAddr != null) {
70 // Using the specified factory
71 String factoryClassName =
72 factoryRefAddr.getContent().toString();
73 // Loading factory
74 ClassLoader tcl =
75 Thread.currentThread().getContextClassLoader();
76 Class factoryClass = null;
77 if (tcl != null) {
78 try {
79 factoryClass = tcl.loadClass(factoryClassName);
80 } catch(ClassNotFoundException e) {
81 NamingException ex = new NamingException
82 ("Could not load resource factory class");
83 ex.initCause(e);
84 throw ex;
85 }
86 } else {
87 try {
88 factoryClass = Class.forName(factoryClassName);
89 } catch(ClassNotFoundException e) {
90 NamingException ex = new NamingException
91 ("Could not load resource factory class");
92 ex.initCause(e);
93 throw ex;
94 }
95 }
96 if (factoryClass != null) {
97 try {
98 factory = (ObjectFactory) factoryClass.newInstance();
99 } catch(Throwable t) {
100 if (t instanceof NamingException)
101 throw (NamingException) t;
102 NamingException ex = new NamingException
103 ("Could not create resource factory instance");
104 ex.initCause(t);
105 throw ex;
106 }
107 }
108 }
109 if (factory != null) {
110 return factory.getObjectInstance
111 (obj, name, nameCtx, environment);
112 } else {
113 throw new NamingException
114 ("Cannot create resource instance");
115 }
116
117 }
118
119 return null;
120
121 }
122
123
124 }
125