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
00116
00117
00118
00119
00120
00121
00122
00123
00124 boolean hasWSDL = getRef().getWsdlFileName() != null;
00125
00126 if (hasWSDL) {
00127
00128 J2EEArchive j2eeArchive = (J2EEArchive) getArchive();
00129 AbsModuleClassLoader cl = (AbsModuleClassLoader) j2eeArchive.getModuleClassloader();
00130 getConfig().setClasspath(getConfig().getClasspath() + cl.getClasspath());
00131
00132 try {
00133
00134 FullEmitter wsEmitter = new FullEmitter();
00135 wsEmitter.setMappingFileInputStream(getRef().getMappingFileURL().openStream());
00136 JOnASClientGeneratorFactory factory = new JOnASClientGeneratorFactory();
00137 factory.setEmitter(wsEmitter);
00138
00139
00140
00141 wsEmitter.setClassLoader(cl);
00142
00143 wsEmitter.setFactory(factory);
00144
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
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
00218 if (!getModifier().hasJonasServiceRef()) {
00219 if (!getArchive().getContainedFiles().contains("WEB-INF/jonas-web.xml")) {
00220
00221 createEmptyJonasWeb((J2EEArchive) archive);
00222 }
00223 Element jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
00224
00225 getModifier().setElement(jsr);
00226
00227 }
00228
00229
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
00239 if (!getModifier().hasJonasServiceRef()) {
00240 Element jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
00241
00242 getModifier().setElement(jsr);
00243 }
00244
00245
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
00255 if (!getModifier().hasJonasServiceRef()) {
00256 if (!getArchive().getContainedFiles().contains("META-INF/jonas-client.xml")) {
00257
00258 createEmptyJonasClient((J2EEArchive) archive);
00259 }
00260 Element jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
00261
00262 getModifier().setElement(jsr);
00263
00264 }
00265
00266
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 }