EWSWsClientGenerator.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.Document;
00033 import org.w3c.dom.Element;
00034 
00035 import org.apache.axis.wsdl.toJava.GeneratedFileInfo;
00036 import org.apache.geronimo.ews.ws4j2ee.context.webservices.client.ServiceReferanceImpl;
00037 import org.apache.geronimo.ews.ws4j2ee.context.webservices.client.interfaces.ServiceReferanceContext;
00038 
00039 import org.objectweb.jonas_lib.I18n;
00040 import org.objectweb.jonas_lib.deployment.api.HandlerDesc;
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.EjbJar;
00044 import org.objectweb.jonas_lib.genbase.archive.J2EEArchive;
00045 import org.objectweb.jonas_lib.genbase.archive.WebApp;
00046 import org.objectweb.jonas_lib.genbase.generator.Config;
00047 import org.objectweb.jonas_lib.genbase.utils.XMLUtils;
00048 import org.objectweb.jonas_lib.loader.AbsModuleClassLoader;
00049 
00050 import org.objectweb.jonas_ws.deployment.api.ServiceRefDesc;
00051 import org.objectweb.jonas_ws.wsgen.WsGenException;
00052 import org.objectweb.jonas_ws.wsgen.ddmodifier.WsClientDDModifier;
00053 import org.objectweb.jonas_ws.wsgen.generator.WsClientGenerator;
00054 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.JOnASJ2EEWebServicesContext;
00055 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.emitter.FullEmitter;
00056 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.factory.JOnASClientGeneratorFactory;
00057 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.wscf.JOnASWSCFHandler;
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 
00070 public class EWSWsClientGenerator extends WsClientGenerator {
00071 
00075     private static Logger logger = Log.getLogger(Log.JONAS_WSGEN_EWS_PREFIX);
00076 
00080     private static final String CLIENT_CONFIG = "axis.clientConfigFile";
00081 
00083     private File generated = null;
00084 
00088     private static final String WEB_PREFIX = "WEB-INF/";
00089 
00093     private static I18n i18n = I18n.getInstance(EWSWsClientGenerator.class);
00094 
00104     public EWSWsClientGenerator(Config config, ServiceRefDesc srd, WsClientDDModifier ddm, Archive archive)
00105             throws GenBaseException, WsGenException {
00106         super(config, srd, ddm, archive);
00107     }
00108 
00113     public void generate() throws WsGenException {
00114 
00115         // the source generation is possible only when a
00116         // WSDL Definition is provided
00117         // we need :
00118         // - a: wsdl-file
00119         // - b: jaxrpc-mapping-file
00120         // - c: service-interface != javax.xml.rpc.Service
00121         // - d: some port-component-ref
00122         // = ((a && b) && (c || d))
00123 
00124         boolean hasWSDL = getRef().getWsdlFileName() != null;
00125 
00126         if (hasWSDL) {
00127             // classpath creation
00128             J2EEArchive j2eeArchive = (J2EEArchive) getArchive();
00129             AbsModuleClassLoader cl = (AbsModuleClassLoader) j2eeArchive.getModuleClassloader();
00130             getConfig().setClasspath(getConfig().getClasspath() + cl.getClasspath());
00131 
00132             try {
00133                 // WSDL + mapping file
00134                 FullEmitter wsEmitter = new FullEmitter();
00135                 wsEmitter.setMappingFileInputStream(getRef().getMappingFileURL().openStream());
00136                 JOnASClientGeneratorFactory factory = new JOnASClientGeneratorFactory();
00137                 factory.setEmitter(wsEmitter);
00138 
00139                 // Classloader to use to check if classes are present before
00140                 // generating java classes
00141                 wsEmitter.setClassLoader(cl);
00142 
00143                 wsEmitter.setFactory(factory);
00144                 //wsEmitter.setNowrap(true);
00145 
00146                 wsEmitter.setJOnASWsContext(prepareJ2EEWebServicesContext(getRef()));
00147 
00148                 wsEmitter.setOutputDir(this.getSources().getCanonicalPath());
00149                 wsEmitter.setAllowInvalidURL(true);
00150 
00151                 wsEmitter.run(getRef().getLocalWSDLURL().toExternalForm());
00152 
00153                 generated = new File(findClientConfigFile(wsEmitter.getGeneratedFileInfo()));
00154 
00155                 getLogger().log(BasicLevel.INFO, "Web Services Classes successfully generated by EWS.");
00156                 getLogger().log(BasicLevel.INFO,
00157                         "Webservice client WSDD file '" + generated + "' sucessfully generated by EWS.");
00158             } catch (Exception e) {
00159                 String err = getI18n().getMessage("EWSWsClientGenerator.generate.WSDL2Java", e.getMessage());
00160                 logger.log(BasicLevel.ERROR, err, e);
00161                 throw new WsGenException(err, e);
00162             }
00163 
00164         }
00165 
00166     }
00167 
00172     private static String findClientConfigFile(GeneratedFileInfo generatedFileInfo) {
00173         List generated = generatedFileInfo.getFileNames();
00174         boolean found = false;
00175         String filename = null;
00176         for (Iterator i = generated.iterator(); i.hasNext() && !found;) {
00177             String entry = (String) i.next();
00178             // */deploy-client-*.wsdd
00179             if (entry.matches(".*/deploy-client-\\d+\\.wsdd$")) {
00180                 found = true;
00181                 filename = entry;
00182             }
00183         }
00184         return filename;
00185     }
00186 
00191     private JOnASJ2EEWebServicesContext prepareJ2EEWebServicesContext(ServiceRefDesc ref) {
00192 
00193         JOnASJ2EEWebServicesContext wsCtx = new JOnASJ2EEWebServicesContext();
00194         ServiceReferanceContext sRefCtx = new ServiceReferanceImpl();
00195         sRefCtx.setServcieQName(ref.getServiceQName());
00196 
00197         for (Iterator i = ref.getHandlerRefs().iterator(); i.hasNext();) {
00198             HandlerDesc handler = (HandlerDesc) i.next();
00199             sRefCtx.addHandler(new JOnASWSCFHandler(handler));
00200         }
00201         wsCtx.addServiceReferanceContext(sRefCtx);
00202         return wsCtx;
00203     }
00204 
00210     public void addFiles(Archive archive) throws WsGenException {
00211         if (archive instanceof WebApp) {
00212             archive.addDirectoryIn("WEB-INF/classes/", getClasses());
00213 
00214             if (generated != null) {
00215                 archive.addFileIn("WEB-INF/", generated);
00216 
00217                 // ensure the optionnal descriptor exists
00218                 if (!getModifier().hasJonasServiceRef()) {
00219                     if (!getArchive().getContainedFiles().contains("WEB-INF/jonas-web.xml")) {
00220                         // jonas-web.xml doesn't exists
00221                         createEmptyJonasWeb((J2EEArchive) archive);
00222                     }
00223                     Element jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
00224                     // update
00225                     getModifier().setElement(jsr);
00226 
00227                 }
00228 
00229                 // add init param
00230                 getModifier().addJonasInitParam(CLIENT_CONFIG, WEB_PREFIX + generated.getName());
00231             }
00232         } else if (archive instanceof EjbJar) {
00233             archive.addDirectory(getClasses());
00234 
00235             if (generated != null) {
00236                 archive.addFileIn("META-INF/", generated);
00237 
00238                 // ensure the optionnal descriptor exists
00239                 if (!getModifier().hasJonasServiceRef()) {
00240                     Element jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
00241                     // update
00242                     getModifier().setElement(jsr);
00243                 }
00244 
00245                 // add init param
00246                 getModifier().addJonasInitParam(CLIENT_CONFIG, "META-INF/" + generated.getName());
00247             }
00248         } else {
00249             archive.addDirectory(getClasses());
00250 
00251             if (generated != null) {
00252                 archive.addFileIn("META-INF/", generated);
00253 
00254                 // ensure the optionnal descriptor exists
00255                 if (!getModifier().hasJonasServiceRef()) {
00256                     if (!getArchive().getContainedFiles().contains("META-INF/jonas-client.xml")) {
00257                         // jonas-client.xml doesn't exists
00258                         createEmptyJonasClient((J2EEArchive) archive);
00259                     }
00260                     Element jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
00261                     // update
00262                     getModifier().setElement(jsr);
00263 
00264                 }
00265 
00266                 // add init param
00267                 getModifier().addJonasInitParam(CLIENT_CONFIG, "META-INF/" + generated.getName());
00268             }
00269         }
00270     }
00271 
00276     private void createEmptyJonasWeb(J2EEArchive archive) {
00277         Document doc = XMLUtils.newJonasWeb();
00278         archive.getDescriptors().put("WEB-INF/jonas-web.xml", doc);
00279         getModifier().setDocument(doc);
00280     }
00281 
00286     private void createEmptyJonasClient(J2EEArchive archive) {
00287         Document doc = XMLUtils.newJonasClient();
00288         archive.getDescriptors().put("META-INF/jonas-client.xml", doc);
00289         getModifier().setDocument(doc);
00290     }
00291 
00295     public static I18n getI18n() {
00296         return i18n;
00297     }
00298 }

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