001: /*
002: * ====================================================================
003: * JAFFA - Java Application Framework For All
004: *
005: * Copyright (C) 2002 JAFFA Development Group
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * Redistribution and use of this software and associated documentation ("Software"),
022: * with or without modification, are permitted provided that the following conditions are met:
023: * 1. Redistributions of source code must retain copyright statements and notices.
024: * Redistributions must also contain a copy of this document.
025: * 2. Redistributions in binary form must reproduce the above copyright notice,
026: * this list of conditions and the following disclaimer in the documentation
027: * and/or other materials provided with the distribution.
028: * 3. The name "JAFFA" must not be used to endorse or promote products derived from
029: * this Software without prior written permission. For written permission,
030: * please contact mail to: jaffagroup@yahoo.com.
031: * 4. Products derived from this Software may not be called "JAFFA" nor may "JAFFA"
032: * appear in their names without prior written permission.
033: * 5. Due credit should be given to the JAFFA Project (http://jaffa.sourceforge.net).
034: *
035: * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: */
049:
050: package org.jaffa.util;
051:
052: import javax.naming.Context;
053: import javax.naming.InitialContext;
054: import org.apache.log4j.Logger;
055: import javax.naming.NamingException;
056:
057: /** Settings refers to configuration 'values' that need to be made available in the
058: * application. This class which should be extended, provided access to setting values
059: * that are defined in web.xml as environment parameters.
060: * <p>
061: * An example of an entry in web.xml
062: * <pre>
063: * <env-entry>
064: * <env-entry-name>myapp.email.smtpHost</env-entry-name>
065: * <env-entry-value>mail.yahoo.com</env-entry-value>
066: * <env-entry-type>java.lang.String</env-entry-type>
067: * </env-entry>
068: * </pre>
069: * <p>
070: * An example of a method in a sub-class that access this setting
071: * <pre>
072: * public static String getEmailHost() {
073: * return (String) getProperty("myapp.email.smtpHost", String.class, null);
074: * }
075: * </pre>
076: *
077: * @version 1.0
078: * @author PaulE
079: * @since 1.3
080: */
081: public abstract class SettingsBase {
082:
083: private static Logger log = Logger.getLogger(SettingsBase.class);
084:
085: protected static String JNDIBase = "java:comp/env";
086:
087: // Cache the context, so each call doesn't need to look it up
088: private static Context envCtx = null;
089:
090: /** Return the value of the property from the JNDI resource
091: * @param name Name of the property
092: */
093: protected static Object getProperty(String name) {
094: if (getContext() == null)
095: return null;
096: try {
097: return envCtx.lookup(name);
098: } catch (NamingException e) {
099: return null;
100: }
101: }
102:
103: /** Return the value of the property from the JNDI resource.
104: * @param name Name of the property
105: * @param class Specify the class of the return type, if the returned object does not match the
106: * specified type a runtime error is raised!
107: */
108: protected static Object getProperty(String name, Class type) {
109: if (getContext() == null)
110: return null;
111: try {
112: Object o = envCtx.lookup(name);
113: if (o != null)
114: return null;
115: else if (type.isInstance(o))
116: return o;
117: else
118: throw new RuntimeException(
119: "Type Mismatch in JNDI Setting. Object "
120: + JNDIBase + "/" + name
121: + " was of type "
122: + o.getClass().getName() + " expected "
123: + type.getName());
124: } catch (NamingException e) {
125: return null;
126: }
127: }
128:
129: /** Return the value of the property from the JNDI resource.
130: * @param name Name of the property
131: * @param class Specify the class of the return type, if the returned object does not match the
132: * @param defValue Specify the default laue to be returned if the property is not found or is Null
133: * specified type a runtime error is raised!
134: */
135: protected static Object getProperty(String name, Class type,
136: Object defValue) {
137: if (getContext() == null) {
138: log.warn("Failed to set conext for : " + JNDIBase);
139: return defValue;
140: }
141: try {
142: Object o = envCtx.lookup(name);
143: log.debug("Found Entry : " + name);
144: if (o != null) {
145: return o;
146: } else
147: log.debug("Entry Was Null!");
148: } catch (NamingException e) {
149: log.debug("No Entry : " + name);
150: }
151: return defValue;
152: }
153:
154: /** Get the JNDI context and cache it */
155: private static synchronized Context getContext() {
156: if (envCtx == null) {
157: try {
158: Context initCtx = new InitialContext();
159: envCtx = (Context) initCtx.lookup(JNDIBase);
160: } catch (NamingException e) {
161: // not found
162: }
163: if (envCtx == null)
164: log.fatal("Can't Find JNDI Context " + JNDIBase);
165: }
166: return envCtx;
167: }
168: }
|