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
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;
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
00136 serverConfigFile = cfg.getInitParameter(AXIS_SERVER_CONFIG_PARAM);
00137
00138 logger.log(BasicLevel.DEBUG, "serverConfigFile=" + serverConfigFile);
00139
00140
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
00152
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
00197 if (deploy == null) {
00198 return delegate.getServerEngineConfig();
00199 }
00200
00201
00202 ClassLoader cl = Thread.currentThread().getContextClassLoader();
00203 InputStream is = cl.getResourceAsStream(SERVER_CONFIG_WSDD);
00204 Document base = XMLUtils.newDocument(is);
00205
00206
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
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 }