JServletEngineConfigurationFactory.java

00001 
00026 package org.objectweb.jonas.ws.axis;
00027 
00028 import java.io.File;
00029 import java.io.FileInputStream;
00030 import java.io.IOException;
00031 import java.io.InputStream;
00032 import java.io.StringWriter;
00033 
00034 import javax.servlet.ServletConfig;
00035 import javax.servlet.ServletContext;
00036 
00037 import org.w3c.dom.Document;
00038 
00039 import org.apache.axis.EngineConfiguration;
00040 import org.apache.axis.EngineConfigurationFactory;
00041 import org.apache.axis.configuration.EngineConfigurationFactoryServlet;
00042 import org.apache.axis.deployment.wsdd.WSDDDeployment;
00043 import org.apache.axis.encoding.SerializationContext;
00044 import org.apache.axis.utils.XMLUtils;
00045 
00046 import org.objectweb.jonas.common.Log;
00047 
00048 import org.objectweb.util.monolog.api.BasicLevel;
00049 import org.objectweb.util.monolog.api.Logger;
00050 
00051 
00059 public class JServletEngineConfigurationFactory
00060     implements EngineConfigurationFactory {
00061 
00063     public static final String AXIS_SERVER_CONFIG_PARAM = "axis.serverConfigFile";
00064 
00066     public static final String SERVER_CONFIG_WSDD = "org/objectweb/jonas/ws/axis/server-config.wsdd";
00067 
00069     private static Logger logger = Log.getLogger(Log.JONAS_WS_PREFIX);
00070 
00072     private String serverConfigFile;
00073 
00075     private EngineConfigurationFactory delegate;
00076 
00078     private ServletContext ctx;
00079 
00081     private ServletConfig cfg;
00082 
00083 
00090     protected JServletEngineConfigurationFactory(ServletConfig conf) {
00091         // get the axis delegate
00092         cfg = conf;
00093         ctx = conf.getServletContext();
00094         delegate = EngineConfigurationFactoryServlet.newFactory(conf);
00095     }
00096 
00109     public static EngineConfigurationFactory newFactory(Object param) {
00110 
00111         if (param == null) {
00112             return null; // not for us.
00113         }
00114 
00115         if (param instanceof ServletConfig) {
00116             return new JServletEngineConfigurationFactory((ServletConfig) param);
00117         } else {
00118             return null;
00119         }
00120     }
00121 
00129     public EngineConfiguration getServerEngineConfig() {
00130 
00131         logger.log(BasicLevel.DEBUG, "Entering getServerEngineConfig for servlet " + cfg.getServletName());
00132 
00133         try {
00134 
00135             // retrieve init param specifying server-config.wsdd filename to be loaded
00136             serverConfigFile = cfg.getInitParameter(AXIS_SERVER_CONFIG_PARAM);
00137 
00138             logger.log(BasicLevel.DEBUG, "serverConfigFile=" + serverConfigFile);
00139 
00140             // if no config file specified, delegate to Axis Servlet EngineConfigurationFactory
00141             if (serverConfigFile == null) {
00142                 return delegate.getServerEngineConfig();
00143             }
00144 
00145             if (logger.isLoggable(BasicLevel.DEBUG)) {
00146                 logger.log(BasicLevel.DEBUG,
00147                            "Loading server-config file '" + serverConfigFile + "'");
00148             }
00149 
00150             /*
00151              * Use the WEB-INF directory
00152              * (so the config files can't get snooped by a browser)
00153              */
00154             String appWebInfPath = "/WEB-INF";
00155 
00156             Document deploy = null;
00157 
00158             String realWebInfPath = ctx.getRealPath(appWebInfPath);
00159 
00165             if (realWebInfPath == null
00166                 || !(new File(realWebInfPath, serverConfigFile)).exists()) {
00167 
00168                 String name = appWebInfPath + "/" + serverConfigFile;
00169                 InputStream is = ctx.getResourceAsStream(name);
00170 
00171                 if (is != null) {
00172                     deploy = XMLUtils.newDocument(is);
00173                 }
00174 
00175                 if (deploy == null) {
00176                     String err = "Cannot get config file '" + serverConfigFile + "' as Resource.";
00177                     logger.log(BasicLevel.ERROR, err);
00178                 }
00179             }
00180 
00186             if (deploy == null  &&  realWebInfPath != null) {
00187                 try {
00188                     InputStream is = new FileInputStream(new File(realWebInfPath, serverConfigFile));
00189                     deploy = XMLUtils.newDocument(is);
00190                 } catch (IOException e) {
00191                     String err = "Cannot get config file '" + serverConfigFile + "' as File Resource.";
00192                     logger.log(BasicLevel.ERROR, err);
00193                 }
00194             }
00195 
00196             // if all attempts fails, delegate to Axis...
00197             if (deploy == null) {
00198                 return delegate.getServerEngineConfig();
00199             }
00200 
00201             // get Base Deployment desc as Resource of ClassLoader
00202             ClassLoader cl = Thread.currentThread().getContextClassLoader();
00203             InputStream is = cl.getResourceAsStream(SERVER_CONFIG_WSDD);
00204             Document base = XMLUtils.newDocument(is);
00205 
00206             // Combine the 2 DD
00207             WSDDDeployment deployWSDD = new WSDDDeployment(deploy.getDocumentElement());
00208             WSDDDeployment configWSDD = new WSDDDeployment(base.getDocumentElement());
00209 
00210             deployWSDD.deployToRegistry(configWSDD);
00211 
00212             if (logger.isLoggable(BasicLevel.DEBUG)) {
00213                 StringWriter sw = new StringWriter();
00214                 SerializationContext ctx = new SerializationContext(sw);
00215 
00216                 try {
00217                     configWSDD.writeToContext(ctx);
00218                 } catch (Exception ioe) {
00219                     logger.log(BasicLevel.DEBUG, "Cannot serialize Axis wsdd for servlet " + cfg.getServletName());
00220                 }
00221                 logger.log(BasicLevel.DEBUG, sw.getBuffer().toString());
00222             }
00223 
00224             return configWSDD;
00225         } catch (Exception e) {
00226             // if exception occurs, set a default server-config.wsdd
00227             String err = "Cannot configure axis server from '" + serverConfigFile + "'. Use axis default. Caused by : " + e.getMessage();
00228             e.printStackTrace();
00229             logger.log(BasicLevel.ERROR, err);
00230             return delegate.getServerEngineConfig();
00231         }
00232     }
00233 
00239     public EngineConfiguration getClientEngineConfig() {
00240         return null;
00241     }
00242 }

Generated on Tue Feb 15 15:05:36 2005 for JOnAS by  doxygen 1.3.9.1