EWSWsEndpointGenerator.java

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         // 1. Generation of wsdd server file
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             // force request scope
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         // 2. classpath creation
00145         J2EEArchive j2eeArchive = (J2EEArchive) getArchive();
00146         AbsModuleClassLoader cl = (AbsModuleClassLoader) j2eeArchive.getModuleClassloader();
00147         getConfig().setClasspath(getConfig().getClasspath() + cl.getClasspath());
00148 
00149         // 3. Remove existing servlets
00150         //  * remove the servlet used by the port (store security informations)
00151         //  * remove the associated servlet-mapping (store old url-pattern value)
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             // port-component linked to a servlet :
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                 // remove servlet mapping
00167                 urlPatternOld = getModifier().removeServletMapping(jax.getSibLink());
00168 
00169                 // remove old servlet but pick up its security role refs
00170                 //getModifier().removeServlet(jax.getSibLink());
00171                 securityRoleRefs = getModifier().removeServletWithSecurity(jax.getSibLink());
00172             }
00173 
00174             // in all case :
00175             // create a servlet with all needed configuration
00176             // and use our own
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                 // add the first element in the servletToSecurityRoleRefs map
00185                 // (currently consider that only one servlet with security
00186                 // constraints was removed !! - if there were more, keep the
00187                 // constraints of the last removed)
00188                 if (securityRoleRefs != null) {
00189                     getModifier().addServletSecurityRoleRefs(desc.getSibLink(), securityRoleRefs);
00190                 }
00191                 // update url-pattern
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             // */deploy-server-*.wsdd
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         // archive must be a WebApp
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 }

Generated on Tue Feb 15 15:06:01 2005 for JOnAS by  doxygen 1.3.9.1