KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > jonas_ws > wsgen > generator > ews > EWSWsClientGenerator


1 /**
2  * JOnAS : Java(TM) OpenSource Application Server
3  * Copyright (C) 2004-2005 Bull S.A.
4  * Contact: jonas-team@objectweb.org
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19  * USA
20  *
21  * --------------------------------------------------------------------------
22  * $Id: EWSWsClientGenerator.java,v 1.11 2005/05/27 15:01:23 sauthieg Exp $
23  * --------------------------------------------------------------------------
24  */

25
26 package org.objectweb.jonas_ws.wsgen.generator.ews;
27
28 import java.io.File JavaDoc;
29 import java.util.Iterator JavaDoc;
30 import java.util.List JavaDoc;
31
32 import org.w3c.dom.Document JavaDoc;
33 import org.w3c.dom.Element JavaDoc;
34
35 import org.apache.axis.constants.Scope;
36 import org.apache.axis.wsdl.toJava.GeneratedFileInfo;
37 import org.apache.geronimo.ews.ws4j2ee.context.webservices.client.ServiceReferanceImpl;
38 import org.apache.geronimo.ews.ws4j2ee.context.webservices.client.interfaces.ServiceReferanceContext;
39
40 import org.objectweb.jonas_lib.I18n;
41 import org.objectweb.jonas_lib.deployment.api.HandlerDesc;
42 import org.objectweb.jonas_lib.genbase.GenBaseException;
43 import org.objectweb.jonas_lib.genbase.archive.Archive;
44 import org.objectweb.jonas_lib.genbase.archive.EjbJar;
45 import org.objectweb.jonas_lib.genbase.archive.J2EEArchive;
46 import org.objectweb.jonas_lib.genbase.archive.WebApp;
47 import org.objectweb.jonas_lib.genbase.generator.Config;
48 import org.objectweb.jonas_lib.genbase.utils.XMLUtils;
49 import org.objectweb.jonas_lib.loader.AbsModuleClassLoader;
50
51 import org.objectweb.jonas_ws.deployment.api.ServiceRefDesc;
52 import org.objectweb.jonas_ws.wsgen.WsGenException;
53 import org.objectweb.jonas_ws.wsgen.ddmodifier.WsClientDDModifier;
54 import org.objectweb.jonas_ws.wsgen.generator.WsClientGenerator;
55 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.JOnASJ2EEWebServicesContext;
56 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.emitter.FullEmitter;
57 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.factory.JOnASClientGeneratorFactory;
58 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.wscf.JOnASWSCFHandler;
59
60 import org.objectweb.jonas.common.Log;
61
62 import org.objectweb.util.monolog.api.BasicLevel;
63 import org.objectweb.util.monolog.api.Logger;
64
65 /**
66  * Generate WebServices client files dedicated to axis. <ul><li>
67  * client-config.wsdd : if needed</li><li>java sources : from WSDL</li>
68  * </ul>
69  * @author Guillaume sauthier
70  */

71 public class EWSWsClientGenerator extends WsClientGenerator {
72
73     /**
74      * logger
75      */

76     private static Logger logger = Log.getLogger(Log.JONAS_WSGEN_EWS_PREFIX);
77
78     /**
79      * jonas-init-param name for client configuration file declaration
80      */

81     private static final String JavaDoc CLIENT_CONFIG = "axis.clientConfigFile";
82
83     /** generated config file */
84     private File JavaDoc generated = null;
85
86     /**
87      * WEB-INF/ prefix
88      */

89     private static final String JavaDoc WEB_PREFIX = "WEB-INF/";
90
91     /**
92      * I18n
93      */

94     private static I18n i18n = I18n.getInstance(EWSWsClientGenerator.class);
95
96     /**
97      * Creates a new AxisWsClientGenerator
98      * @param config Generator Configuration
99      * @param srd WebService Endpoint description
100      * @param ddm Web DD Modifier
101      * @param archive client archive containing WSDL
102      * @throws GenBaseException When instanciation fails
103      * @throws WsGenException When instanciation fails
104      */

105     public EWSWsClientGenerator(Config config, ServiceRefDesc srd, WsClientDDModifier ddm, Archive archive)
106             throws GenBaseException, WsGenException {
107         super(config, srd, ddm, archive);
108     }
109
110     /**
111      * generate axis specific files
112      * @throws WsGenException if WSDL cannot be found in archive
113      */

114     public void generate() throws WsGenException {
115
116         // the source generation is possible only when a
117
// WSDL Definition is provided
118
// we need :
119
// - a: wsdl-file
120
// - b: jaxrpc-mapping-file
121
// - c: service-interface != javax.xml.rpc.Service
122
// - d: some port-component-ref
123
// = ((a && b) && (c || d))
124

125         boolean hasWSDL = getRef().getWsdlFileName() != null;
126
127         if (hasWSDL) {
128             // classpath creation
129
J2EEArchive j2eeArchive = (J2EEArchive) getArchive();
130             AbsModuleClassLoader cl = (AbsModuleClassLoader) j2eeArchive.getModuleClassloader();
131             getConfig().setClasspath(getConfig().getClasspath() + cl.getClasspath());
132
133             try {
134                 // WSDL + mapping file
135
FullEmitter wsEmitter = new FullEmitter();
136                 wsEmitter.setMappingFileInputStream(getRef().getMappingFileURL().openStream());
137                 JOnASClientGeneratorFactory factory = new JOnASClientGeneratorFactory();
138                 factory.setEmitter(wsEmitter);
139
140                 wsEmitter.setTypeMappingVersion("1.3");
141                 wsEmitter.setScope(Scope.REQUEST);
142                 wsEmitter.setWrapArrays(true);
143
144                 // Classloader to use to check if classes are present before
145
// generating java classes
146
wsEmitter.setClassLoader(cl);
147
148                 wsEmitter.setFactory(factory);
149                 //wsEmitter.setNowrap(true);
150

151                 wsEmitter.setJOnASWsContext(prepareJ2EEWebServicesContext(getRef()));
152
153                 wsEmitter.setOutputDir(this.getSources().getCanonicalPath());
154                 wsEmitter.setAllowInvalidURL(true);
155
156                 wsEmitter.run(getRef().getLocalWSDLURL().toExternalForm());
157
158                 generated = new File JavaDoc(findClientConfigFile(wsEmitter.getGeneratedFileInfo()));
159
160                 getLogger().log(BasicLevel.INFO, "Web Services Classes successfully generated by EWS.");
161                 getLogger().log(BasicLevel.INFO,
162                         "Webservice client WSDD file '" + generated + "' sucessfully generated by EWS.");
163             } catch (Exception JavaDoc e) {
164                 String JavaDoc err = getI18n().getMessage("EWSWsClientGenerator.generate.WSDL2Java", e.getMessage());
165                 logger.log(BasicLevel.ERROR, err, e);
166                 throw new WsGenException(err, e);
167             }
168
169         }
170
171     }
172
173     /**
174      * @param generatedFileInfo files generated by Axis
175      * @return Returns the first filename that matches "deploy-client-*.wsdd"
176      */

177     private static String JavaDoc findClientConfigFile(GeneratedFileInfo generatedFileInfo) {
178         List JavaDoc generated = generatedFileInfo.getFileNames();
179         boolean found = false;
180         String JavaDoc filename = null;
181         for (Iterator JavaDoc i = generated.iterator(); i.hasNext() && !found;) {
182             String JavaDoc entry = (String JavaDoc) i.next();
183             // */deploy-client-*.wsdd
184
if (entry.matches(".*deploy-client-\\d+\\.wsdd$")) {
185                 found = true;
186                 filename = entry;
187             }
188         }
189         return filename;
190     }
191
192     /**
193      * @param ref the ServiceRefDesc to be used in J2EE WS Context
194      * @return Returns a configured J2EEWebServiceContext
195      */

196     private JOnASJ2EEWebServicesContext prepareJ2EEWebServicesContext(ServiceRefDesc ref) {
197
198         JOnASJ2EEWebServicesContext wsCtx = new JOnASJ2EEWebServicesContext();
199         ServiceReferanceContext sRefCtx = new ServiceReferanceImpl();
200         sRefCtx.setServcieQName(ref.getServiceQName());
201
202         for (Iterator JavaDoc i = ref.getHandlerRefs().iterator(); i.hasNext();) {
203             HandlerDesc handler = (HandlerDesc) i.next();
204             sRefCtx.addHandler(new JOnASWSCFHandler(handler));
205         }
206         wsCtx.addServiceReferanceContext(sRefCtx);
207         return wsCtx;
208     }
209
210     /**
211      * Add generated files in given archive
212      * @param archive archive where generated fils will be added.
213      * @throws WsGenException when files cannot be added
214      */

215     public void addFiles(Archive archive) throws WsGenException {
216         if (archive instanceof WebApp) {
217             archive.addDirectoryIn("WEB-INF/classes/", getClasses());
218             archive.addDirectoryIn("WEB-INF/sources/", getSources());
219
220             if (generated != null) {
221                 archive.addFileIn("WEB-INF/", generated);
222
223                 // ensure the optionnal descriptor exists
224
if (!getModifier().hasJonasServiceRef()) {
225                     if (!getArchive().getContainedFiles().contains("WEB-INF/jonas-web.xml")) {
226                         // jonas-web.xml doesn't exists
227
createEmptyJonasWeb((J2EEArchive) archive);
228                     }
229                     Element JavaDoc jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
230                     // update
231
getModifier().setElement(jsr);
232
233                 }
234
235                 // add init param
236
getModifier().addJonasInitParam(CLIENT_CONFIG, WEB_PREFIX + generated.getName());
237             }
238         } else if (archive instanceof EjbJar) {
239             archive.addDirectory(getClasses());
240
241             if (generated != null) {
242                 archive.addFileIn("META-INF/", generated);
243
244                 // ensure the optionnal descriptor exists
245
if (!getModifier().hasJonasServiceRef()) {
246                     Element JavaDoc jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
247                     // update
248
getModifier().setElement(jsr);
249                 }
250
251                 // add init param
252
getModifier().addJonasInitParam(CLIENT_CONFIG, "META-INF/" + generated.getName());
253             }
254         } else {
255             archive.addDirectory(getClasses());
256
257             if (generated != null) {
258                 archive.addFileIn("META-INF/", generated);
259
260                 // ensure the optionnal descriptor exists
261
if (!getModifier().hasJonasServiceRef()) {
262                     if (!getArchive().getContainedFiles().contains("META-INF/jonas-client.xml")) {
263                         // jonas-client.xml doesn't exists
264
createEmptyJonasClient((J2EEArchive) archive);
265                     }
266                     Element JavaDoc jsr = getModifier().createJonasServiceRef(getRef().getServiceRefName());
267                     // update
268
getModifier().setElement(jsr);
269
270                 }
271
272                 // add init param
273
getModifier().addJonasInitParam(CLIENT_CONFIG, "META-INF/" + generated.getName());
274             }
275         }
276     }
277
278     /**
279      * Add an empty jonas-web.xml in given J2EEArchive.
280      * @param archive archive to be updated
281      */

282     private void createEmptyJonasWeb(J2EEArchive archive) {
283         Document JavaDoc doc = XMLUtils.newJonasWeb();
284         archive.getDescriptors().put("WEB-INF/jonas-web.xml", doc);
285         getModifier().setDocument(doc);
286     }
287
288     /**
289      * Add an empty jonas-client.xml in given J2EEArchive.
290      * @param archive archive to be updated
291      */

292     private void createEmptyJonasClient(J2EEArchive archive) {
293         Document JavaDoc doc = XMLUtils.newJonasClient();
294         archive.getDescriptors().put("META-INF/jonas-client.xml", doc);
295         getModifier().setDocument(doc);
296     }
297
298     /**
299      * @return Returns the i18n.
300      */

301     public static I18n getI18n() {
302         return i18n;
303     }
304 }
Popular Tags