00001
00026 package org.objectweb.jonas_ws.wsgen.generator.ews;
00027
00028 import java.io.File;
00029 import java.util.Iterator;
00030 import java.util.List;
00031
00032 import org.w3c.dom.Element;
00033 import org.w3c.dom.NodeList;
00034
00035 import org.apache.axis.constants.Scope;
00036 import org.apache.axis.wsdl.toJava.GeneratedFileInfo;
00037 import org.apache.geronimo.ews.jaxrpcmapping.J2eeGeneratorFactory;
00038 import org.apache.geronimo.ews.ws4j2ee.context.J2EEWebServiceContext;
00039
00040 import org.objectweb.jonas_lib.I18n;
00041 import org.objectweb.jonas_lib.genbase.GenBaseException;
00042 import org.objectweb.jonas_lib.genbase.archive.Archive;
00043 import org.objectweb.jonas_lib.genbase.archive.J2EEArchive;
00044 import org.objectweb.jonas_lib.genbase.archive.WebApp;
00045 import org.objectweb.jonas_lib.genbase.generator.Config;
00046 import org.objectweb.jonas_lib.loader.AbsModuleClassLoader;
00047
00048 import org.objectweb.jonas_ws.deployment.api.JaxRpcPortComponentDesc;
00049 import org.objectweb.jonas_ws.deployment.api.PortComponentDesc;
00050 import org.objectweb.jonas_ws.deployment.api.ServiceDesc;
00051 import org.objectweb.jonas_ws.wsgen.WsGenException;
00052 import org.objectweb.jonas_ws.wsgen.ddmodifier.WebServicesDDModifier;
00053 import org.objectweb.jonas_ws.wsgen.ddmodifier.WsEndpointDDModifier;
00054 import org.objectweb.jonas_ws.wsgen.generator.WsEndpointGenerator;
00055 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.JOnASJ2EEWebServicesContext;
00056 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.emitter.FullEmitter;
00057 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.factory.JOnASEndpointGeneratorFactory;
00058
00059 import org.objectweb.jonas.common.Log;
00060
00061 import org.objectweb.util.monolog.api.BasicLevel;
00062 import org.objectweb.util.monolog.api.Logger;
00063
00068 public class EWSWsEndpointGenerator extends WsEndpointGenerator {
00069
00073 private static Logger logger = Log.getLogger(Log.JONAS_WSGEN_EWS_PREFIX);
00074
00078 private static final String AXIS_SERVLET_CLASS = "org.objectweb.jonas.ws.axis.JAxisServlet";
00079
00083 private static final String SERVER_CONFIG = "axis.serverConfigFile";
00084
00088 private File generatedServerConfig;
00089
00093 private static I18n i18n = I18n.getInstance(EWSWsClientGenerator.class);
00094
00104 public EWSWsEndpointGenerator(Config config, ServiceDesc serviceDesc, WsEndpointDDModifier ddm,
00105 WebServicesDDModifier wsddm, Archive arch ) throws GenBaseException, WsGenException {
00106 super(config, serviceDesc, ddm, wsddm, arch );
00107 }
00108
00113 public void generate() throws WsGenException {
00114
00115
00116 String filename = null;
00117 try {
00118 FullEmitter emitter = new FullEmitter();
00119
00120 emitter.setWscontext(prepareJ2EEWebServicesContext(getService()));
00121 emitter.setMappingFileInputStream(getService().getMappingFileURL().openStream());
00122 emitter.setOutputDir(this.getSources().getCanonicalPath());
00123 J2eeGeneratorFactory factory = new JOnASEndpointGeneratorFactory();
00124 factory.setEmitter(emitter);
00125 emitter.setFactory(factory);
00126
00127
00128 emitter.setScope(Scope.REQUEST);
00129
00130 emitter.setServerSide(true);
00131 emitter.run(getService().getLocalWSDLURL().toExternalForm());
00132
00133 generatedServerConfig = new File(findServerConfigFile(emitter.getGeneratedFileInfo()));
00134 filename = generatedServerConfig.getName();
00135 getLogger().log(BasicLevel.INFO,
00136 "Webservice endpoint WSDD file '" + filename + "' sucessfully generated by EWS.");
00137 } catch (Exception e) {
00138 String err = i18n.getMessage("EWSWsEndpointGenerator.generate.WSDL2Java", getService().getName(), e
00139 .getMessage());
00140 logger.log(BasicLevel.ERROR, err, e);
00141 throw new WsGenException(err, e);
00142 }
00143
00144
00145 J2EEArchive j2eeArchive = (J2EEArchive) getArchive();
00146 AbsModuleClassLoader cl = (AbsModuleClassLoader) j2eeArchive.getModuleClassloader();
00147 getConfig().setClasspath(getConfig().getClasspath() + cl.getClasspath());
00148
00149
00150
00151
00152 for (Iterator i = getService().getPortComponents().iterator(); i.hasNext();) {
00153 PortComponentDesc desc = (PortComponentDesc) i.next();
00154
00155 String urlPatternOld = null;
00156 NodeList securityRoleRefs = null;
00157
00158
00159 if (desc.hasJaxRpcImpl()) {
00160 JaxRpcPortComponentDesc jax = (JaxRpcPortComponentDesc) desc;
00161
00162 if (logger.isLoggable(BasicLevel.DEBUG)) {
00163 logger.log(BasicLevel.DEBUG, "Removing servlet '" + jax.getSibLink() + "'");
00164 }
00165
00166
00167 urlPatternOld = getModifier().removeServletMapping(jax.getSibLink());
00168
00169
00170
00171 securityRoleRefs = getModifier().removeServletWithSecurity(jax.getSibLink());
00172 }
00173
00174
00175
00176
00177 getModifier().addServlet(desc.getSibLink(), AXIS_SERVLET_CLASS);
00178 getModifier().addServletParam(desc.getSibLink(), SERVER_CONFIG, filename);
00179
00180 String mapping = "/" + desc.getName() + "/*";
00181 getModifier().addServletMapping(desc.getSibLink(), mapping);
00182
00183 if (desc.hasJaxRpcImpl()) {
00184
00185
00186
00187
00188 if (securityRoleRefs != null) {
00189 getModifier().addServletSecurityRoleRefs(desc.getSibLink(), securityRoleRefs);
00190 }
00191
00192 getModifier().updateSecurityConstraint(urlPatternOld, mapping);
00193 }
00194 }
00195 }
00196
00201 private static String findServerConfigFile(GeneratedFileInfo generatedFileInfo) {
00202 List generated = generatedFileInfo.getFileNames();
00203 boolean found = false;
00204 String filename = null;
00205 for (Iterator i = generated.iterator(); i.hasNext() && !found;) {
00206 String entry = (String) i.next();
00207
00208 if (entry.matches(".*/deploy-server-\\d+\\.wsdd$")) {
00209 found = true;
00210 filename = entry;
00211 }
00212 }
00213 return filename;
00214 }
00215
00220 private J2EEWebServiceContext prepareJ2EEWebServicesContext(ServiceDesc service) {
00221 JOnASJ2EEWebServicesContext ctx = new JOnASJ2EEWebServicesContext();
00222 ctx.setServiceDesc(service);
00223 return ctx;
00224 }
00225
00231 public void addFiles(Archive archive) throws WsGenException {
00232
00233 if (!(archive instanceof WebApp)) {
00234 String err = getI18n().getMessage("AxisWsEndpointGenerator.addFiles.illegal", archive.getRootFile());
00235 throw new IllegalArgumentException(err);
00236 }
00237
00238 WebApp web = (WebApp) archive;
00239 web.addFileIn("WEB-INF/", generatedServerConfig);
00240
00241 web.addDirectoryIn("WEB-INF/classes/", getClasses());
00242 }
00243 }