1 package org.apache.commons.jcs3.auxiliary.disk.jdbc.dsfactory;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.sql.SQLException;
23 import java.util.Hashtable;
24 import java.util.Map;
25
26 import javax.naming.Context;
27 import javax.naming.InitialContext;
28 import javax.naming.NamingException;
29 import javax.sql.DataSource;
30
31 import org.apache.commons.jcs3.auxiliary.disk.jdbc.JDBCDiskCacheAttributes;
32 import org.apache.commons.jcs3.log.Log;
33 import org.apache.commons.jcs3.log.LogManager;
34
35
36
37
38
39
40
41
42
43
44
45 public class JndiDataSourceFactory implements DataSourceFactory
46 {
47
48 private static final Log log = LogManager.getLog(JndiDataSourceFactory.class);
49
50
51 private String name;
52
53
54 private String path;
55
56
57 private Context ctx;
58
59
60 private DataSource ds;
61
62
63 private long lastLookup;
64
65
66 private long ttl;
67
68
69
70
71 @Override
72 public String getName()
73 {
74 return name;
75 }
76
77
78
79
80 @Override
81 public DataSource getDataSource() throws SQLException
82 {
83 final long time = System.currentTimeMillis();
84
85 if (ds == null || time - lastLookup > ttl)
86 {
87 try
88 {
89 synchronized (ctx)
90 {
91 ds = (DataSource) ctx.lookup(path);
92 }
93 lastLookup = time;
94 }
95 catch (final NamingException e)
96 {
97 throw new SQLException(e);
98 }
99 }
100
101 return ds;
102 }
103
104
105
106
107 @Override
108 public void initialize(final JDBCDiskCacheAttributes config) throws SQLException
109 {
110 this.name = config.getConnectionPoolName();
111 initJNDI(config);
112 }
113
114
115
116
117
118
119
120 private void initJNDI(final JDBCDiskCacheAttributes config) throws SQLException
121 {
122 log.debug("Starting initJNDI");
123
124 try
125 {
126 this.path = config.getJndiPath();
127 log.debug("JNDI path: {0}", path);
128
129 this.ttl = config.getJndiTTL();
130 log.debug("Time between context lookups: {0}", ttl);
131
132 final Hashtable<String, Object> env = new Hashtable<>();
133 ctx = new InitialContext(env);
134
135 if (log.isTraceEnabled())
136 {
137 log.trace("Created new InitialContext");
138 debugCtx(ctx);
139 }
140 }
141 catch (final NamingException e)
142 {
143 throw new SQLException(e);
144 }
145 }
146
147
148
149
150
151 @Override
152 public void close()
153 {
154
155 }
156
157
158
159
160
161
162 private static void debugCtx(final Context ctx) throws NamingException
163 {
164 log.trace("InitialContext -------------------------------");
165 final Map<?, ?> env = ctx.getEnvironment();
166 log.trace("Environment properties: {0}", env.size());
167 env.forEach((key, value) -> log.trace(" {0}: {1}", key, value));
168 log.trace("----------------------------------------------");
169 }
170 }