001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: *
023: * Free Software Foundation, Inc.
024: * 59 Temple Place, Suite 330
025: * Boston, MA 02111-1307 USA
026: *
027: * @author Scott Ferguson
028: */
029:
030: package com.caucho.config.types;
031:
032: import com.caucho.config.program.ConfigProgram;
033: import com.caucho.config.Config;
034: import com.caucho.config.ConfigException;
035: import com.caucho.config.LineConfigException;
036: import com.caucho.loader.ClassLoaderListener;
037: import com.caucho.loader.DynamicClassLoader;
038: import com.caucho.loader.EnvironmentClassLoader;
039: import com.caucho.naming.Jndi;
040: import com.caucho.util.L10N;
041:
042: import javax.annotation.PostConstruct;
043: import javax.naming.InitialContext;
044: import javax.naming.NamingException;
045: import java.util.HashMap;
046: import java.util.Iterator;
047: import java.util.logging.Level;
048: import java.util.logging.Logger;
049:
050: /**
051: * Configuration for the init-param pattern.
052: */
053: public class ResourceRef implements Validator {
054: private static Logger log = Logger.getLogger(ResourceRef.class
055: .getName());
056: private static L10N L = new L10N(ResourceRef.class);
057:
058: private String _location = "";
059:
060: private String _name;
061: private Class _type;
062: private String _description;
063: private boolean _sharing;
064:
065: private ConfigProgram _init;
066: private HashMap<String, String> _params = new HashMap<String, String>();
067:
068: private InjectionTarget _injectionTarget;
069:
070: /**
071: * Sets the id
072: */
073: public void setId(String id) {
074: }
075:
076: /**
077: * Sets the configuration location.
078: */
079: public void setConfigLocation(String filename, int line) {
080: _location = filename + ":" + line + " ";
081: }
082:
083: /**
084: * Sets the description.
085: */
086: public void setDescription(String description) {
087: _description = description;
088: }
089:
090: /**
091: * Sets the injection-target
092: */
093: public void setInjectionTarget(InjectionTarget injectionTarget) {
094: _injectionTarget = injectionTarget;
095: }
096:
097: /**
098: * Sets the name
099: */
100: public void setResRefName(String name) {
101: _name = name;
102: }
103:
104: /**
105: * Gets the name
106: */
107: public String getResRefName() {
108: return _name;
109: }
110:
111: /**
112: * Sets the type
113: */
114: public void setResType(Class type) {
115: _type = type;
116: }
117:
118: /**
119: * Sets the auth
120: */
121: public void setResAuth(String auth) {
122: }
123:
124: /**
125: * Sets the sharing scope
126: */
127: public void setResSharingScope(String share) {
128: }
129:
130: /**
131: * Sets the type
132: */
133: public void setClassName(Class type) {
134: _type = type;
135: }
136:
137: /**
138: * Gets the injection-target
139: */
140: public InjectionTarget getInjectionTarget() {
141: return _injectionTarget;
142: }
143:
144: /**
145: * Gets the type;
146: */
147: public Class getResType() {
148: return _type;
149: }
150:
151: /**
152: * Sets the init program
153: */
154: public void setInit(ConfigProgram init) {
155: _init = init;
156: }
157:
158: /**
159: * Gets the init program;
160: */
161: public ConfigProgram getInit() {
162: return _init;
163: }
164:
165: /**
166: * Sets an init-parameter
167: */
168: public void setInitParam(InitParam initParam) {
169: _params.putAll(initParam.getParameters());
170: }
171:
172: /**
173: * Initialize the resource.
174: */
175: @PostConstruct
176: public void init() throws Throwable {
177: if (_init == null && _params.size() == 0) {
178: return;
179: }
180:
181: Class cl = _type;
182:
183: if (javax.sql.DataSource.class.equals(_type))
184: cl = com.caucho.sql.DBPool.class;
185: /*
186: else if (javax.sql.XADataSource.class.equals(_type))
187: cl = com.caucho.sql.XAPool.class;
188: */
189:
190: Object obj = cl.newInstance();
191:
192: if (_init != null)
193: _init.configure(obj);
194:
195: Iterator iter = _params.keySet().iterator();
196: while (iter.hasNext()) {
197: String key = (String) iter.next();
198: String value = (String) _params.get(key);
199:
200: Config.setAttribute(obj, key, value);
201: }
202:
203: if (obj instanceof ClassLoaderListener) {
204: ClassLoaderListener listener = (ClassLoaderListener) obj;
205:
206: ClassLoader loader = Thread.currentThread()
207: .getContextClassLoader();
208: for (; loader != null; loader = loader.getParent()) {
209: if (loader instanceof EnvironmentClassLoader) {
210: ((DynamicClassLoader) loader).addListener(listener);
211: break;
212: }
213: }
214: }
215:
216: Jndi.bindDeep(_name, obj);
217: }
218:
219: /**
220: * Validates the resource-ref, i.e. checking that it exists in
221: * JNDI.
222: */
223: public void validate() throws ConfigException {
224: Object obj = null;
225:
226: try {
227: obj = new InitialContext().lookup("java:comp/env/" + _name);
228: } catch (NamingException e) {
229: log.log(Level.FINEST, e.toString(), e);
230: }
231:
232: if (obj == null)
233: throw error(L
234: .l(
235: "resource-ref '{0}' was not configured. All resources defined by <resource-ref> tags must be defined in a configuration file.",
236: _name));
237: }
238:
239: public ConfigException error(String msg) {
240: if (_location != null)
241: return new LineConfigException(_location + msg);
242: else
243: return new ConfigException(msg);
244: }
245:
246: public String toString() {
247: return "ResourceRef[" + _name + "]";
248: }
249: }
|