001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.jndi;
018:
019: import javax.naming.NamingException;
020:
021: import org.springframework.util.Assert;
022:
023: /**
024: * Convenient superclass for classes that can locate any number of JNDI objects.
025: * Derives from JndiAccessor to inherit the "jndiTemplate" and "jndiEnvironment"
026: * bean properties.
027: *
028: * <p>JNDI names may or may not include the "java:comp/env/" prefix expected
029: * by J2EE applications when accessing a locally mapped (ENC - Environmental
030: * Naming Context) resource. If it doesn't, the "java:comp/env/" prefix will
031: * be prepended if the "resourceRef" property is true (the default is
032: * <strong>false</strong>) and no other scheme (e.g. "java:") is given.
033: *
034: * @author Juergen Hoeller
035: * @since 1.1
036: * @see #setJndiTemplate
037: * @see #setJndiEnvironment
038: * @see #setResourceRef
039: */
040: public abstract class JndiLocatorSupport extends JndiAccessor {
041:
042: /** JNDI prefix used in a J2EE container */
043: public static final String CONTAINER_PREFIX = "java:comp/env/";
044:
045: private boolean resourceRef = false;
046:
047: /**
048: * Set whether the lookup occurs in a J2EE container, i.e. if the prefix
049: * "java:comp/env/" needs to be added if the JNDI name doesn't already
050: * contain it. Default is "false".
051: * <p>Note: Will only get applied if no other scheme (e.g. "java:") is given.
052: */
053: public void setResourceRef(boolean resourceRef) {
054: this .resourceRef = resourceRef;
055: }
056:
057: /**
058: * Return whether the lookup occurs in a J2EE container.
059: */
060: public boolean isResourceRef() {
061: return this .resourceRef;
062: }
063:
064: /**
065: * Perform an actual JNDI lookup for the given name via the JndiTemplate.
066: * <p>If the name doesn't begin with "java:comp/env/", this prefix is added
067: * if "resourceRef" is set to "true".
068: * @param jndiName the JNDI name to look up
069: * @return the obtained object
070: * @throws NamingException if the JNDI lookup failed
071: * @see #setResourceRef
072: */
073: protected Object lookup(String jndiName) throws NamingException {
074: return lookup(jndiName, null);
075: }
076:
077: /**
078: * Perform an actual JNDI lookup for the given name via the JndiTemplate.
079: * <p>If the name doesn't begin with "java:comp/env/", this prefix is added
080: * if "resourceRef" is set to "true".
081: * @param jndiName the JNDI name to look up
082: * @param requiredType the required type of the object
083: * @return the obtained object
084: * @throws NamingException if the JNDI lookup failed
085: * @see #setResourceRef
086: */
087: protected Object lookup(String jndiName, Class requiredType)
088: throws NamingException {
089: Assert.notNull(jndiName, "'jndiName' must not be null");
090: String jndiNameToUse = convertJndiName(jndiName);
091: Object jndiObject = getJndiTemplate().lookup(jndiNameToUse,
092: requiredType);
093: if (logger.isDebugEnabled()) {
094: logger.debug("Located object with JNDI name ["
095: + jndiNameToUse + "]");
096: }
097: return jndiObject;
098: }
099:
100: /**
101: * Convert the given JNDI name into the actual JNDI name to use.
102: * <p>The default implementation applies the "java:comp/env/" prefix if
103: * "resourceRef" is "true" and no other scheme (e.g. "java:") is given.
104: * @param jndiName the original JNDI name
105: * @return the JNDI name to use
106: * @see #CONTAINER_PREFIX
107: * @see #setResourceRef
108: */
109: protected String convertJndiName(String jndiName) {
110: // Prepend container prefix if not already specified and no other scheme given.
111: if (isResourceRef() && !jndiName.startsWith(CONTAINER_PREFIX)
112: && jndiName.indexOf(':') == -1) {
113: jndiName = CONTAINER_PREFIX + jndiName;
114: }
115: return jndiName;
116: }
117:
118: }
|