blob: 2d09a1b87159fa77a7441e294261eb897d2e2ca3 [file] [log] [blame]
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.axis.server;
import org.apache.axis.AxisEngine;
import org.apache.axis.AxisFault;
import org.apache.axis.utils.Messages;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContext;
import java.util.Map;
/**
* Helper class for obtaining AxisServers, which hides the complexity
* of JNDI accesses, etc.
*
* !!! QUESTION : Does this class need to play any ClassLoader tricks?
*
* @author Glen Daniels (gdaniels@apache.org)
*/
public class JNDIAxisServerFactory extends DefaultAxisServerFactory {
/**
* Obtain an AxisServer reference, using JNDI if possible, otherwise
* creating one using the standard Axis configuration pattern. If we
* end up creating one and do have JNDI access, bind it to the passed
* name so we find it next time.
*
* NOTE : REQUIRES SERVLET 2.3 FOR THE GetServletContextName() CALL!
*
* @param environment The following is used, in addition to
* the keys used by the parent class:
* AxisEngine.ENV_SERVLET_CONTEXT
* [required, else default/parent behavior]
* - Instance of ServletContext
*/
public AxisServer getServer(Map environment)
throws AxisFault
{
log.debug("Enter: JNDIAxisServerFactory::getServer");
InitialContext context = null;
// First check to see if JNDI works
// !!! Might we need to set up context parameters here?
try {
context = new InitialContext();
} catch (NamingException e) {
log.warn(Messages.getMessage("jndiNotFound00"), e);
}
ServletContext servletContext = null;
try {
servletContext =
(ServletContext)environment.get(AxisEngine.ENV_SERVLET_CONTEXT);
} catch (ClassCastException e) {
log.warn(Messages.getMessage("servletContextWrongClass00"), e);
// Fall through
}
AxisServer server = null;
if (context != null && servletContext != null) {
// Figure out the name by looking in the servlet context (for now)
/**
* !!! WARNING - THIS CLASS NEEDS TO FIGURE OUT THE CORRECT
* NAMING SCHEME FOR GETTING/PUTTING SERVERS FROM/TO JNDI!
*
*/
// For servlet 2.3....?
// String name = servletContext.getServletContextName();
// THIS IS NOT ACCEPTABLE JNDI NAMING...
String name = servletContext.getRealPath("/WEB-INF/Server");
// The following was submitted as a patch, but I don't believe this
// is going to produce a valid JNDI name of ANY sort... yuck.
// This would produce a URL, not a path name.
//
// Since it appears, from comments above, that this entire scheme is
// broken, then for now I'll simply check for a null-name to prevent
// possible NPE on WebLogic.
//
// What ARE we doing here?!?!
//
// if (name == null) {
// try {
// name = servletContext.getResource("/WEB-INF/Server").toString();
// } catch (Exception e) {
// // ignore
// }
// }
// We've got JNDI, so try to find an AxisServer at the
// specified name.
if (name != null) {
try {
server = (AxisServer)context.lookup(name);
} catch (NamingException e) {
// Didn't find it.
server = super.getServer(environment);
try {
context.bind(name, server);
} catch (NamingException e1) {
// !!! Couldn't do it, what should we do here?
}
}
}
}
if (server == null) {
server = super.getServer(environment);
}
log.debug("Exit: JNDIAxisServerFactory::getServer");
return server;
}
}