KickJava   Java API By Example, From Geeks To Geeks.

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


1 /**
2  * JOnAS : Java(TM) OpenSource Application Server
3  * Copyright (C) 2004 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: EWSWsEndpointGenerator.java,v 1.10 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 import org.w3c.dom.NodeList JavaDoc;
32 import org.apache.axis.constants.Scope;
33 import org.apache.axis.wsdl.toJava.GeneratedFileInfo;
34 import org.apache.geronimo.ews.jaxrpcmapping.J2eeGeneratorFactory;
35 import org.apache.geronimo.ews.ws4j2ee.context.J2EEWebServiceContext;
36 import org.objectweb.jonas_lib.I18n;
37 import org.objectweb.jonas_lib.genbase.GenBaseException;
38 import org.objectweb.jonas_lib.genbase.archive.Archive;
39 import org.objectweb.jonas_lib.genbase.archive.J2EEArchive;
40 import org.objectweb.jonas_lib.genbase.archive.WebApp;
41 import org.objectweb.jonas_lib.genbase.generator.Config;
42 import org.objectweb.jonas_lib.loader.AbsModuleClassLoader;
43 import org.objectweb.jonas_ws.deployment.api.JaxRpcPortComponentDesc;
44 import org.objectweb.jonas_ws.deployment.api.PortComponentDesc;
45 import org.objectweb.jonas_ws.deployment.api.ServiceDesc;
46 import org.objectweb.jonas_ws.wsgen.WsGenException;
47 import org.objectweb.jonas_ws.wsgen.ddmodifier.WebServicesDDModifier;
48 import org.objectweb.jonas_ws.wsgen.ddmodifier.WsEndpointDDModifier;
49 import org.objectweb.jonas_ws.wsgen.generator.WsEndpointGenerator;
50 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.JOnASJ2EEWebServicesContext;
51 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.emitter.FullEmitter;
52 import org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.factory.JOnASEndpointGeneratorFactory;
53 import org.objectweb.jonas.common.Log;
54 import org.objectweb.util.monolog.api.BasicLevel;
55 import org.objectweb.util.monolog.api.Logger;
56
57 /**
58  * Generate Axis specific config files for Endpoint
59  * @author Guillaume Sauthier
60  */

61 public class EWSWsEndpointGenerator extends WsEndpointGenerator {
62
63     /**
64      * logger
65      */

66     private static Logger logger = Log.getLogger(Log.JONAS_WSGEN_EWS_PREFIX);
67
68     /**
69      * Axis Servlet classname
70      */

71     private static final String JavaDoc AXIS_SERVLET_CLASS = "org.objectweb.jonas.ws.axis.JAxisServlet";
72
73     /**
74      * init-param name for declaring server configuration file
75      */

76     private static final String JavaDoc SERVER_CONFIG = "axis.serverConfigFile";
77
78     /**
79      * generated server-config file
80      */

81     private File JavaDoc generatedServerConfig;
82
83     /**
84      * I18n
85      */

86     private static I18n i18n = I18n.getInstance(EWSWsClientGenerator.class);
87
88     /**
89      * Creates a new AxisWsEndpointGenerator
90      * @param config Generator Configuration
91      * @param serviceDesc WebService Endpoint description
92      * @param ddm Web DD Modifier
93      * @param wsddm webservices.xml DD modifier
94      * @param arch base archive
95      * @throws GenBaseException When instanciation fails
96      * @throws WsGenException When instanciation fails.
97      */

98     public EWSWsEndpointGenerator(Config config, ServiceDesc serviceDesc, WsEndpointDDModifier ddm,
99             WebServicesDDModifier wsddm, Archive arch) throws GenBaseException, WsGenException {
100         super(config, serviceDesc, ddm, wsddm, arch);
101     }
102
103     /**
104      * Generate server side configuration file
105      * @throws WsGenException When generation fails
106      */

107     public void generate() throws WsGenException {
108
109         // 1. Generation of wsdd server file
110
String JavaDoc filename = null;
111         try {
112             FullEmitter emitter = new FullEmitter();
113
114             emitter.setWscontext(prepareJ2EEWebServicesContext(getService()));
115             emitter.setMappingFileInputStream(getService().getMappingFileURL().openStream());
116             emitter.setOutputDir(this.getSources().getCanonicalPath());
117             J2eeGeneratorFactory factory = new JOnASEndpointGeneratorFactory();
118             factory.setEmitter(emitter);
119             emitter.setFactory(factory);
120             emitter.setTypeMappingVersion("1.3");
121             emitter.setScope(Scope.REQUEST);
122             emitter.setWrapArrays(true);
123
124             emitter.setServerSide(true);
125             emitter.run(getService().getLocalWSDLURL().toExternalForm());
126
127             generatedServerConfig = new File JavaDoc(findServerConfigFile(emitter.getGeneratedFileInfo()));
128             filename = generatedServerConfig.getName();
129             getLogger().log(BasicLevel.INFO,
130                     "Webservice endpoint WSDD file '" + filename + "' sucessfully generated by EWS.");
131         } catch (Exception JavaDoc e) {
132             String JavaDoc err = i18n.getMessage("EWSWsEndpointGenerator.generate.WSDL2Java", getService().getName(), e
133                     .getMessage());
134             logger.log(BasicLevel.ERROR, err, e);
135             throw new WsGenException(err, e);
136         }
137
138         // 2. classpath creation
139
J2EEArchive j2eeArchive = (J2EEArchive) getArchive();
140         AbsModuleClassLoader cl = (AbsModuleClassLoader) j2eeArchive.getModuleClassloader();
141         getConfig().setClasspath(getConfig().getClasspath() + cl.getClasspath());
142
143         // 3. Remove existing servlets
144
// * remove the servlet used by the port (store security informations)
145
// * remove the associated servlet-mapping (store old url-pattern value)
146
for (Iterator JavaDoc i = getService().getPortComponents().iterator(); i.hasNext();) {
147             PortComponentDesc desc = (PortComponentDesc) i.next();
148
149             String JavaDoc urlPatternOld = null;
150             NodeList JavaDoc securityRoleRefs = null;
151
152             // port-component linked to a servlet :
153
if (desc.hasJaxRpcImpl()) {
154                 JaxRpcPortComponentDesc jax = (JaxRpcPortComponentDesc) desc;
155
156                 if (logger.isLoggable(BasicLevel.DEBUG)) {
157                     logger.log(BasicLevel.DEBUG, "Removing servlet '" + jax.getSibLink() + "'");
158                 }
159
160                 // remove servlet mapping
161
urlPatternOld = getModifier().removeServletMapping(jax.getSibLink());
162
163                 // remove old servlet but pick up its security role refs
164
//getModifier().removeServlet(jax.getSibLink());
165
securityRoleRefs = getModifier().removeServletWithSecurity(jax.getSibLink());
166             }
167
168             // in all case :
169
// create a servlet with all needed configuration
170
// and use our own
171
getModifier().addServlet(desc.getSibLink(), AXIS_SERVLET_CLASS);
172             getModifier().addServletParam(desc.getSibLink(), SERVER_CONFIG, filename);
173             getModifier().addServletParam(desc.getSibLink(), "axis.development.system", "true");
174
175             String JavaDoc mapping = "/" + desc.getName() + "/*";
176             getModifier().addServletMapping(desc.getSibLink(), mapping);
177
178             if (desc.hasJaxRpcImpl()) {
179                 // add the first element in the servletToSecurityRoleRefs map
180
// (currently consider that only one servlet with security
181
// constraints was removed !! - if there were more, keep the
182
// constraints of the last removed)
183
if (securityRoleRefs != null) {
184                     getModifier().addServletSecurityRoleRefs(desc.getSibLink(), securityRoleRefs);
185                 }
186                 // update url-pattern
187
getModifier().updateSecurityConstraint(urlPatternOld, mapping);
188             }
189         }
190     }
191
192     /**
193      * @param generatedFileInfo files generated by Axis
194      * @return Returns the first filename that matches "deploy-server-*.wsdd"
195      */

196     private static String JavaDoc findServerConfigFile(GeneratedFileInfo generatedFileInfo) {
197         List JavaDoc generated = generatedFileInfo.getFileNames();
198         boolean found = false;
199         String JavaDoc filename = null;
200         for (Iterator JavaDoc i = generated.iterator(); i.hasNext() && !found;) {
201             String JavaDoc entry = (String JavaDoc) i.next();
202             // */deploy-server-*.wsdd
203
if (entry.matches(".*deploy-server-\\d+\\.wsdd$")) {
204                 found = true;
205                 filename = entry;
206             }
207         }
208         return filename;
209     }
210
211     /**
212      * @param service the ServiceDesc to be used in J2EE WS Context
213      * @return Returns a configured J2EEWebServiceContext
214      */

215     private J2EEWebServiceContext prepareJ2EEWebServicesContext(ServiceDesc service) {
216         JOnASJ2EEWebServicesContext ctx = new JOnASJ2EEWebServicesContext();
217         ctx.setServiceDesc(service);
218         return ctx;
219     }
220
221     /**
222      * Add generated files in given Archive
223      * @param archive WebApp archive
224      * @throws WsGenException When cannot add files in archive
225      */

226     public void addFiles(Archive archive) throws WsGenException {
227         // archive must be a WebApp
228
if (!(archive instanceof WebApp)) {
229             String JavaDoc err = getI18n().getMessage("AxisWsEndpointGenerator.addFiles.illegal", archive.getRootFile());
230             throw new IllegalArgumentException JavaDoc(err);
231         }
232
233         WebApp web = (WebApp) archive;
234         web.addFileIn("WEB-INF/", generatedServerConfig);
235
236         web.addDirectoryIn("WEB-INF/classes/", getClasses());
237         web.addDirectoryIn("WEB-INF/sources/", getSources());
238     }
239 }
Popular Tags