001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.axis.builder;
018
019 import java.lang.reflect.Method;
020 import java.net.MalformedURLException;
021 import java.net.URI;
022 import java.net.URISyntaxException;
023 import java.net.URL;
024 import java.util.ArrayList;
025 import java.util.Collection;
026 import java.util.Collections;
027 import java.util.HashMap;
028 import java.util.HashSet;
029 import java.util.Iterator;
030 import java.util.List;
031 import java.util.Map;
032 import java.util.Set;
033 import java.util.jar.JarFile;
034
035 import javax.jws.WebService;
036 import javax.wsdl.Binding;
037 import javax.wsdl.BindingOperation;
038 import javax.wsdl.Definition;
039 import javax.wsdl.Operation;
040 import javax.wsdl.Port;
041 import javax.wsdl.PortType;
042 import javax.wsdl.extensions.soap.SOAPAddress;
043 import javax.wsdl.extensions.soap.SOAPBinding;
044 import javax.xml.namespace.QName;
045 import javax.xml.rpc.handler.HandlerInfo;
046 import javax.xml.ws.WebServiceProvider;
047
048 import org.apache.axis.constants.Style;
049 import org.apache.axis.description.JavaServiceDesc;
050 import org.apache.axis.handlers.HandlerInfoChainFactory;
051 import org.apache.axis.handlers.soap.SOAPService;
052 import org.apache.axis.providers.java.RPCProvider;
053 import org.apache.axis.soap.SOAPConstants;
054 import org.apache.commons.logging.Log;
055 import org.apache.commons.logging.LogFactory;
056 import org.apache.geronimo.axis.client.AxisServiceReference;
057 import org.apache.geronimo.axis.client.OperationInfo;
058 import org.apache.geronimo.axis.client.SEIFactory;
059 import org.apache.geronimo.axis.client.SEIFactoryImpl;
060 import org.apache.geronimo.axis.server.AxisWebServiceContainer;
061 import org.apache.geronimo.axis.server.POJOProvider;
062 import org.apache.geronimo.axis.server.ServiceInfo;
063 import org.apache.geronimo.common.DeploymentException;
064 import org.apache.geronimo.gbean.GBeanData;
065 import org.apache.geronimo.gbean.GBeanInfo;
066 import org.apache.geronimo.gbean.GBeanInfoBuilder;
067 import org.apache.geronimo.gbean.AbstractName;
068 import org.apache.geronimo.j2ee.deployment.Module;
069 import org.apache.geronimo.j2ee.deployment.WebServiceBuilder;
070 import org.apache.geronimo.j2ee.deployment.HandlerInfoInfo;
071 import org.apache.geronimo.j2ee.deployment.WebModule;
072 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
073 import org.apache.geronimo.xbeans.geronimo.naming.GerPortCompletionType;
074 import org.apache.geronimo.xbeans.geronimo.naming.GerPortType;
075 import org.apache.geronimo.xbeans.geronimo.naming.GerServiceCompletionType;
076 import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
077 import org.apache.geronimo.xbeans.j2ee.JavaWsdlMappingType;
078 import org.apache.geronimo.xbeans.j2ee.JavaXmlTypeMappingType;
079 import org.apache.geronimo.xbeans.j2ee.ServiceEndpointInterfaceMappingType;
080 import org.apache.geronimo.xbeans.j2ee.ServiceEndpointMethodMappingType;
081 import org.apache.geronimo.deployment.util.DeploymentUtil;
082 import org.apache.geronimo.deployment.DeploymentContext;
083 import org.apache.geronimo.deployment.service.EnvironmentBuilder;
084 import org.apache.geronimo.webservices.SerializableWebServiceContainerFactoryGBean;
085 import org.apache.geronimo.webservices.builder.DescriptorVersion;
086 import org.apache.geronimo.webservices.builder.PortInfo;
087 import org.apache.geronimo.webservices.builder.SchemaInfoBuilder;
088 import org.apache.geronimo.webservices.builder.WSDescriptorParser;
089 import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
090 import org.apache.geronimo.kernel.repository.Environment;
091
092 /**
093 * @version $Rev: 561670 $ $Date: 2007-08-01 01:59:34 -0400 (Wed, 01 Aug 2007) $
094 */
095 public class AxisBuilder implements WebServiceBuilder {
096
097 private static final Log LOG = LogFactory.getLog(AxisBuilder.class);
098
099 private static final SOAPConstants SOAP_VERSION = SOAPConstants.SOAP11_CONSTANTS;
100
101 private final Environment defaultEnvironment;
102 private static final String KEY = AxisBuilder.class.getName();
103
104 public AxisBuilder() {
105 defaultEnvironment = null;
106 }
107
108 public AxisBuilder(Environment defaultEnvironment) {
109 this.defaultEnvironment = defaultEnvironment;
110 }
111
112 public void findWebServices(Module module, boolean isEJB, Map servletLocations, Environment environment, Map sharedContext) throws DeploymentException {
113 findWebServices(module.getModuleFile(), isEJB, servletLocations, environment, sharedContext);
114 }
115
116 public void findWebServices(JarFile moduleFile, boolean isEJB, Map servletLocations, Environment environment, Map sharedContext) throws DeploymentException {
117 final String path = isEJB ? "META-INF/webservices.xml" : "WEB-INF/webservices.xml";
118 try {
119 URL wsDDUrl = DeploymentUtil.createJarURL(moduleFile, path);
120 Map portMap = WSDescriptorParser.parseWebServiceDescriptor(wsDDUrl, moduleFile, isEJB, servletLocations);
121 if (portMap != null) {
122 if (defaultEnvironment != null) {
123 EnvironmentBuilder.mergeEnvironments(environment, defaultEnvironment);
124 }
125 sharedContext.put(KEY, portMap);
126 } else {
127 sharedContext.put(KEY, Collections.EMPTY_MAP);
128 }
129 } catch (MalformedURLException e) {
130 // The webservices.xml file doesn't exist.
131 }
132 }
133
134 public boolean configurePOJO(GBeanData targetGBean, String servletName, Module module, String servletClassName, DeploymentContext context) throws DeploymentException {
135 Map sharedContext = ((WebModule) module).getSharedContext();
136 Map portInfoMap = (Map) sharedContext.get(KEY);
137 PortInfo portInfo = (PortInfo) portInfoMap.get(servletName);
138 if (portInfo == null) {
139 //not ours
140 return false;
141 }
142
143 ClassLoader cl = context.getClassLoader();
144 Class serviceClass = loadClass(servletClassName, cl);
145 if (isJAXWSWebService(serviceClass)) {
146 if (DescriptorVersion.J2EE.equals(portInfo.getDescriptorVersion())) {
147 // This is a JAX-WS web service in J2EE descriptor so throw an exception
148 throw new DeploymentException("JAX-WS web service '" + portInfo.getPortComponentName()
149 + "' cannot be specified in J2EE webservices.xml descriptor.");
150 } else {
151 // This is a JAX-WS web service in JAVAEE descriptor so ignore
152 return false;
153 }
154 }
155
156 portInfo.initialize(module.getModuleFile());
157
158 LOG.debug("Publishing JAX-RPC '" + portInfo.getPortComponentName()
159 + "' service at " + portInfo.getContextURI());
160
161 ServiceInfo serviceInfo = AxisServiceBuilder.createServiceInfo(portInfo, cl);
162 JavaServiceDesc serviceDesc = serviceInfo.getServiceDesc();
163
164 targetGBean.setAttribute("pojoClassName", servletClassName);
165 RPCProvider provider = new POJOProvider();
166
167 SOAPService service = new SOAPService(null, provider, null);
168 service.setServiceDescription(serviceDesc);
169 service.setOption("className", servletClassName);
170
171 HandlerInfoChainFactory handlerInfoChainFactory = new HandlerInfoChainFactory(serviceInfo.getHandlerInfos());
172 service.setOption(org.apache.axis.Constants.ATTR_HANDLERINFOCHAIN, handlerInfoChainFactory);
173
174 URI location;
175 try {
176 location = new URI(serviceDesc.getEndpointURL());
177 } catch (URISyntaxException e) {
178 throw new DeploymentException("Invalid webservice endpoint URI", e);
179 }
180 URI wsdlURI;
181 try {
182 wsdlURI = new URI(serviceDesc.getWSDLFile());
183 } catch (URISyntaxException e) {
184 throw new DeploymentException("Invalid wsdl URI", e);
185
186 }
187
188 AxisWebServiceContainer axisWebServiceContainer = new AxisWebServiceContainer(location, wsdlURI, service, serviceInfo.getWsdlMap(), cl);
189 AbstractName webServiceContainerFactoryName = context.getNaming().createChildName(targetGBean.getAbstractName(), "webServiceContainer", NameFactory.GERONIMO_SERVICE);
190 GBeanData webServiceContainerFactoryGBean = new GBeanData(webServiceContainerFactoryName, SerializableWebServiceContainerFactoryGBean.GBEAN_INFO);
191 webServiceContainerFactoryGBean.setAttribute("webServiceContainer", axisWebServiceContainer);
192 try {
193 context.addGBean(webServiceContainerFactoryGBean);
194 } catch (GBeanAlreadyExistsException e) {
195 throw new DeploymentException("Could not add webServiceContainerFactoryGBean", e);
196 }
197 targetGBean.setReferencePattern("WebServiceContainerFactory", webServiceContainerFactoryName);
198 return true;
199 }
200
201 public boolean configureEJB(GBeanData targetGBean, String ejbName, Module module, Map sharedContext, ClassLoader classLoader) throws DeploymentException {
202 Map portInfoMap = (Map) sharedContext.get(KEY);
203 PortInfo portInfo = (PortInfo) portInfoMap.get(ejbName);
204 if (portInfo == null) {
205 //not ours
206 return false;
207 }
208
209 String beanClassName = (String)targetGBean.getAttribute("ejbClass");
210 Class serviceClass = loadClass(beanClassName, classLoader);
211 if (isJAXWSWebService(serviceClass)) {
212 if (DescriptorVersion.J2EE.equals(portInfo.getDescriptorVersion())) {
213 // This is a JAX-WS web service in J2EE descriptor so throw an exception
214 throw new DeploymentException("JAX-WS web service '" + portInfo.getPortComponentName()
215 + "' cannot be specified in J2EE webservices.xml descriptor.");
216 } else {
217 // This is a JAX-WS web service in JAVAEE descriptor so ignore
218 return false;
219 }
220 }
221
222 portInfo.initialize(module.getModuleFile());
223
224 LOG.debug("Publishing EJB JAX-RPC '" + portInfo.getPortComponentName()
225 + "' service at " + portInfo.getContextURI());
226
227 ServiceInfo serviceInfo = AxisServiceBuilder.createServiceInfo(portInfo, classLoader);
228 targetGBean.setAttribute("serviceInfo", serviceInfo);
229 JavaServiceDesc serviceDesc = serviceInfo.getServiceDesc();
230 URI location = portInfo.getContextURI();
231 targetGBean.setAttribute("location", location);
232 URI wsdlURI;
233 try {
234 wsdlURI = new URI(serviceDesc.getWSDLFile());
235 } catch (URISyntaxException e) {
236 throw new DeploymentException("Invalid wsdl URI", e);
237 }
238 targetGBean.setAttribute("wsdlURI", wsdlURI);
239 return true;
240 }
241
242
243 //ServicereferenceBuilder
244 public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlerInfos, Object serviceRefType, Module module, ClassLoader classLoader) throws DeploymentException {
245 GerServiceRefType gerServiceRefType = (GerServiceRefType) serviceRefType;
246 JarFile moduleFile = module.getModuleFile();
247 SchemaInfoBuilder schemaInfoBuilder = null;
248 JavaWsdlMappingType mapping = null;
249 if (wsdlURI != null) {
250 schemaInfoBuilder = new SchemaInfoBuilder(moduleFile, wsdlURI);
251
252 mapping = WSDescriptorParser.readJaxrpcMapping(moduleFile, jaxrpcMappingURI);
253 }
254
255 return createService(serviceInterface, schemaInfoBuilder, mapping, serviceQName, SOAP_VERSION, handlerInfos, gerServiceRefType, module, classLoader);
256 }
257
258 public Object createService(Class serviceInterface, SchemaInfoBuilder schemaInfoBuilder, JavaWsdlMappingType mapping, QName serviceQName, SOAPConstants soapVersion, List handlerInfos, GerServiceRefType serviceRefType, Module module, ClassLoader classloader) throws DeploymentException {
259 Map seiPortNameToFactoryMap = new HashMap();
260 Map seiClassNameToFactoryMap = new HashMap();
261 if (schemaInfoBuilder != null) {
262 buildSEIFactoryMap(schemaInfoBuilder, serviceRefType, mapping, handlerInfos, serviceQName, soapVersion, seiPortNameToFactoryMap, seiClassNameToFactoryMap, classloader);
263 }
264 return new AxisServiceReference(serviceInterface.getName(), seiPortNameToFactoryMap, seiClassNameToFactoryMap);
265 }
266
267 public void buildSEIFactoryMap(SchemaInfoBuilder schemaInfoBuilder, GerServiceRefType serviceRefType, JavaWsdlMappingType mapping, List handlerInfos, QName serviceQName, SOAPConstants soapVersion, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, ClassLoader classLoader) throws DeploymentException {
268 Map exceptionMap = WSDescriptorParser.getExceptionMap(mapping);
269
270 Definition definition = schemaInfoBuilder.getDefinition();
271 //check for consistency
272 if (definition.getServices().size() == 0) {
273 //partial wsdl
274 if (serviceRefType == null || !serviceRefType.isSetServiceCompletion()) {
275 throw new DeploymentException("Partial wsdl, but no service completion supplied");
276 }
277 GerServiceCompletionType serviceCompletion = serviceRefType.getServiceCompletion();
278 String serviceLocalName = serviceCompletion.getServiceName().trim();
279 String namespace = definition.getTargetNamespace();
280 serviceQName = new QName(namespace, serviceLocalName);
281 javax.wsdl.Service service = definition.createService();
282 service.setQName(serviceQName);
283 GerPortCompletionType[] portCompletions = serviceCompletion.getPortCompletionArray();
284 for (int i = 0; i < portCompletions.length; i++) {
285 GerPortCompletionType portCompletion = portCompletions[i];
286 GerPortType port = portCompletion.getPort();
287 URL location = getLocation(port);
288 String portName = port.getPortName().trim();
289 String bindingName = portCompletion.getBindingName().trim();
290 QName bindingQName = new QName(namespace, bindingName);
291 Binding binding = definition.getBinding(bindingQName);
292 if (binding == null) {
293 throw new DeploymentException("No binding found with qname: " + bindingQName);
294 }
295 String credentialsName = port.isSetCredentialsName() ? port.getCredentialsName().trim() : null;
296 mapBinding(binding, mapping, serviceQName, classLoader, soapVersion, schemaInfoBuilder, portName, location, handlerInfos, seiPortNameToFactoryMap, seiClassNameToFactoryMap, credentialsName, exceptionMap);
297
298 }
299 } else {
300 //full wsdl
301 if (serviceRefType != null && serviceRefType.isSetServiceCompletion()) {
302 throw new DeploymentException("Full wsdl, but service completion supplied");
303 }
304 //organize the extra port info
305 Map portMap = new HashMap();
306 if (serviceRefType != null) {
307 GerPortType[] ports = serviceRefType.getPortArray();
308 for (int i = 0; i < ports.length; i++) {
309 GerPortType port = ports[i];
310 String portName = port.getPortName().trim();
311 portMap.put(portName, port);
312 }
313 }
314
315 //find the service we are working with
316 javax.wsdl.Service service = getService(serviceQName, schemaInfoBuilder.getDefinition());
317 if (serviceQName == null) {
318 serviceQName = service.getQName();
319 }
320
321 Map wsdlPortMap = service.getPorts();
322 for (Iterator iterator = wsdlPortMap.entrySet().iterator(); iterator.hasNext();) {
323 Map.Entry entry = (Map.Entry) iterator.next();
324 String portName = (String) entry.getKey();
325 Port port = (Port) entry.getValue();
326
327 GerPortType gerPort = (GerPortType) portMap.get(portName);
328
329 URL location = gerPort == null ? getAddressLocation(port) : getLocation(gerPort);
330 //skip non-soap ports
331 if (location == null) {
332 continue;
333 }
334 String credentialsName = gerPort == null || gerPort.getCredentialsName() == null ? null : gerPort.getCredentialsName().trim();
335
336 Binding binding = port.getBinding();
337
338 mapBinding(binding, mapping, serviceQName, classLoader, soapVersion, schemaInfoBuilder, portName, location, handlerInfos, seiPortNameToFactoryMap, seiClassNameToFactoryMap, credentialsName, exceptionMap);
339 }
340 }
341 }
342
343 private void mapBinding(Binding binding, JavaWsdlMappingType mapping, QName serviceQName, ClassLoader classLoader, SOAPConstants soapVersion, SchemaInfoBuilder schemaInfoBuilder, String portName, URL location, List handlerInfos, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, String credentialsName, Map exceptionMap) throws DeploymentException {
344 Style portStyle = getStyle(binding);
345
346 PortType portType = binding.getPortType();
347
348 ServiceEndpointInterfaceMappingType[] endpointMappings = mapping.getServiceEndpointInterfaceMappingArray();
349
350 //port type corresponds to SEI
351 List operations = portType.getOperations();
352 OperationInfo[] operationInfos = new OperationInfo[operations.size()];
353 if (endpointMappings.length == 0) {
354 doLightweightMapping(serviceQName, portType, mapping, classLoader, operations, binding, portStyle, soapVersion, operationInfos, schemaInfoBuilder, portName, location, handlerInfos, seiPortNameToFactoryMap, seiClassNameToFactoryMap, credentialsName);
355 } else {
356 doHeavyweightMapping(serviceQName, portType, endpointMappings, classLoader, operations, binding, portStyle, soapVersion, exceptionMap, schemaInfoBuilder, mapping, operationInfos, portName, location, handlerInfos, seiPortNameToFactoryMap, seiClassNameToFactoryMap, credentialsName);
357 }
358 }
359
360 private URL getLocation(GerPortType port) throws DeploymentException {
361 String protocol = port.getProtocol().trim();
362 String host = port.getHost().trim();
363 int portNum = port.getPort();
364 String uri = port.getUri().trim();
365 String locationURIString = protocol + "://" + host + ":" + portNum + uri;
366 URL location;
367 try {
368 location = new URL(locationURIString);
369 } catch (MalformedURLException e) {
370 throw new DeploymentException("Could not construct web service location URL from " + locationURIString, e);
371 }
372 return location;
373 }
374
375 private javax.wsdl.Service getService(QName serviceQName, Definition definition) throws DeploymentException {
376 javax.wsdl.Service service;
377 if (serviceQName != null) {
378 service = definition.getService(serviceQName);
379 if (service == null) {
380 throw new DeploymentException("No service wsdl for supplied service qname " + serviceQName);
381 }
382 } else {
383 Map services = definition.getServices();
384 if (services.size() > 1) {
385 throw new DeploymentException("no serviceQName supplied, and there are " + services.size() + " services");
386 }
387 if (services.size() == 0) {
388 throw new DeploymentException("No service in wsdl, and no service completion supplied!");
389 } else {
390 service = (javax.wsdl.Service) services.values().iterator().next();
391 }
392 }
393 return service;
394 }
395
396 private Style getStyle(Binding binding) throws DeploymentException {
397 SOAPBinding soapBinding = (SOAPBinding) SchemaInfoBuilder.getExtensibilityElement(SOAPBinding.class, binding.getExtensibilityElements());
398 // String transportURI = soapBinding.getTransportURI();
399 String portStyleString = soapBinding.getStyle();
400 return Style.getStyle(portStyleString);
401 }
402
403 private URL getAddressLocation(Port port) throws DeploymentException {
404 SOAPAddress soapAddress;
405 try {
406 soapAddress = (SOAPAddress) SchemaInfoBuilder.getExtensibilityElement(SOAPAddress.class, port.getExtensibilityElements());
407 } catch (DeploymentException e) {
408 //a http: protocol REST service. Skip it.
409 return null;
410 }
411 String locationURIString = soapAddress.getLocationURI();
412 URL location;
413 try {
414 location = new URL(locationURIString);
415 } catch (MalformedURLException e) {
416 throw new DeploymentException("Could not construct web service location URL from " + locationURIString, e);
417 }
418 return location;
419 }
420
421 private void doHeavyweightMapping(QName serviceName, PortType portType, ServiceEndpointInterfaceMappingType[] endpointMappings, ClassLoader classLoader, List operations, Binding binding, Style portStyle, SOAPConstants soapVersion, Map exceptionMap, SchemaInfoBuilder schemaInfoBuilder, JavaWsdlMappingType mapping, OperationInfo[] operationInfos, String portName, URL location, List handlerInfos, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, String credentialsName) throws DeploymentException {
422 Class serviceEndpointInterface;
423 SEIFactory seiFactory;
424 //complete jaxrpc mapping file supplied
425 QName portTypeQName = portType.getQName();
426 ServiceEndpointInterfaceMappingType endpointMapping = WSDescriptorParser.getServiceEndpointInterfaceMapping(endpointMappings, portTypeQName);
427 String fqcn = endpointMapping.getServiceEndpointInterface().getStringValue();
428 try {
429 serviceEndpointInterface = classLoader.loadClass(fqcn);
430 } catch (ClassNotFoundException e) {
431 throw new DeploymentException("Could not load service endpoint interface", e);
432 }
433 // Class enhancedServiceEndpointClass = enhanceServiceEndpointInterface(serviceEndpointInterface, context, module, classLoader);
434
435 Collection operationDescs = new ArrayList();
436 ServiceEndpointMethodMappingType[] methodMappings = endpointMapping.getServiceEndpointMethodMappingArray();
437 int i = 0;
438 Set wrapperElementQNames = new HashSet();
439 JavaXmlTypeMappingType[] javaXmlTypeMappings = mapping.getJavaXmlTypeMappingArray();
440 boolean hasEncoded = false;
441 for (Iterator ops = operations.iterator(); ops.hasNext();) {
442 Operation operation = (Operation) ops.next();
443 String operationName = operation.getName();
444 //the obvious method seems to be buggy
445 // BindingOperation bindingOperation = binding.getBindingOperation(operationName, operation.getInput().getName(), operation.getOutput() == null ? null : operation.getOutput().getName());
446 BindingOperation bindingOperation = null;
447 List bops = binding.getBindingOperations();
448 for (Iterator iterator = bops.iterator(); iterator.hasNext();) {
449 BindingOperation bindingOperation1 = (BindingOperation) iterator.next();
450 if (bindingOperation1.getOperation().equals(operation)) {
451 bindingOperation = bindingOperation1;
452 break;
453 }
454 }
455 if (bindingOperation == null) {
456 throw new DeploymentException("No BindingOperation for operation: " + operationName + ", input: " + operation.getInput().getName() + ", output: " + (operation.getOutput() == null ? "<none>" : operation.getOutput().getName()));
457 }
458 ServiceEndpointMethodMappingType methodMapping = WSDescriptorParser.getMethodMappingForOperation(operationName, methodMappings);
459 HeavyweightOperationDescBuilder operationDescBuilder = new HeavyweightOperationDescBuilder(bindingOperation, mapping, methodMapping, portStyle, exceptionMap, schemaInfoBuilder, javaXmlTypeMappings, classLoader, serviceEndpointInterface);
460 OperationInfo operationInfo = operationDescBuilder.buildOperationInfo(soapVersion);
461 operationInfos[i++] = operationInfo;
462 operationDescs.add(operationInfo.getOperationDesc());
463 wrapperElementQNames.addAll(operationDescBuilder.getWrapperElementQNames());
464 hasEncoded |= operationDescBuilder.isEncoded();
465 }
466 HeavyweightTypeInfoBuilder builder = new HeavyweightTypeInfoBuilder(classLoader, schemaInfoBuilder.getSchemaTypeKeyToSchemaTypeMap(), wrapperElementQNames, operationDescs, hasEncoded);
467 List typeInfo = builder.buildTypeInfo(mapping);
468
469 seiFactory = createSEIFactory(serviceName, portName, serviceEndpointInterface.getName(), typeInfo, location, operationInfos, handlerInfos, credentialsName);
470 seiPortNameToFactoryMap.put(portName, seiFactory);
471 seiClassNameToFactoryMap.put(serviceEndpointInterface.getName(), seiFactory);
472 }
473
474 private void doLightweightMapping(QName serviceName, PortType portType, JavaWsdlMappingType mapping, ClassLoader classLoader, List operations, Binding binding, Style portStyle, SOAPConstants soapVersion, OperationInfo[] operationInfos, SchemaInfoBuilder schemaInfoBuilder, String portName, URL location, List handlerInfos, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, String credentialsName) throws DeploymentException {
475 Class serviceEndpointInterface;
476 SEIFactory seiFactory;
477 //lightweight jaxrpc mapping supplied
478 serviceEndpointInterface = getServiceEndpointInterfaceLightweight(portType, mapping, classLoader);
479 // Class enhancedServiceEndpointClass = enhanceServiceEndpointInterface(serviceEndpointInterface, context, module, classLoader);
480
481 int i = 0;
482 for (Iterator ops = operations.iterator(); ops.hasNext();) {
483 Operation operation = (Operation) ops.next();
484 Method method = WSDescriptorParser.getMethodForOperation(serviceEndpointInterface, operation);
485 BindingOperation bindingOperation = binding.getBindingOperation(operation.getName(), operation.getInput().getName(), operation.getOutput() == null ? null : operation.getOutput().getName());
486 operationInfos[i++] = buildOperationInfoLightweight(method, bindingOperation, portStyle, soapVersion);
487 }
488 LightweightTypeInfoBuilder builder = new LightweightTypeInfoBuilder(classLoader, schemaInfoBuilder.getSchemaTypeKeyToSchemaTypeMap(), Collections.EMPTY_SET);
489 List typeInfo = builder.buildTypeInfo(mapping);
490
491 seiFactory = createSEIFactory(serviceName, portName, serviceEndpointInterface.getName(), typeInfo, location, operationInfos, handlerInfos, credentialsName);
492 seiPortNameToFactoryMap.put(portName, seiFactory);
493 seiClassNameToFactoryMap.put(serviceEndpointInterface.getName(), seiFactory);
494 }
495
496 private Class getServiceEndpointInterfaceLightweight(PortType portType, JavaWsdlMappingType mappings, ClassLoader classLoader) throws DeploymentException {
497 QName portTypeQName = portType.getQName();
498 String portTypeNamespace = portTypeQName.getNamespaceURI();
499 String portTypePackage = WSDescriptorParser.getPackageFromNamespace(portTypeNamespace, mappings);
500 StringBuffer shortInterfaceName = new StringBuffer(portTypeQName.getLocalPart());
501 shortInterfaceName.setCharAt(0, Character.toUpperCase(shortInterfaceName.charAt(0)));
502 //TODO just use one buffer!
503 String fqcn = portTypePackage + "." + shortInterfaceName.toString();
504 try {
505 return classLoader.loadClass(fqcn);
506 } catch (ClassNotFoundException e) {
507 throw new DeploymentException("Could not load service endpoint interface type", e);
508 }
509 }
510
511
512 public SEIFactory createSEIFactory(QName serviceName, String portName, String enhancedServiceEndpointClassName, List typeInfo, URL location, OperationInfo[] operationInfos, List handlerInfoInfos, String credentialsName) throws DeploymentException {
513 List handlerInfos = buildHandlerInfosForPort(portName, handlerInfoInfos);
514 return new SEIFactoryImpl(serviceName, portName, enhancedServiceEndpointClassName, operationInfos, typeInfo, location, handlerInfos, credentialsName);
515 }
516
517 private List buildHandlerInfosForPort(String portName, List handlerInfoInfos) {
518 List handlerInfos = new ArrayList();
519 for (Iterator iterator = handlerInfoInfos.iterator(); iterator.hasNext();) {
520 HandlerInfoInfo handlerInfoInfo = (HandlerInfoInfo) iterator.next();
521 Set portNames = handlerInfoInfo.getPortNames();
522 if (portNames.isEmpty() || portNames.contains(portName)) {
523 HandlerInfo handlerInfo = new HandlerInfo(handlerInfoInfo.getHandlerClass(), handlerInfoInfo.getHandlerConfig(), handlerInfoInfo.getSoapHeaders());
524 handlerInfos.add(handlerInfo);
525
526 //TODO what about the soap roles??
527 }
528 }
529 return handlerInfos;
530 }
531
532 public OperationInfo buildOperationInfoLightweight(Method method, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion) throws DeploymentException {
533 LightweightOperationDescBuilder operationDescBuilder = new LightweightOperationDescBuilder(bindingOperation, method);
534 return operationDescBuilder.buildOperationInfo(soapVersion);
535 }
536
537
538 Class<?> loadClass(String className, ClassLoader loader) throws DeploymentException {
539 try {
540 return loader.loadClass(className);
541 } catch (ClassNotFoundException ex) {
542 throw new DeploymentException("Unable to load Web Service class: " + className);
543 }
544 }
545
546 static boolean isJAXWSWebService(Class clazz) {
547 return (clazz.isAnnotationPresent(WebService.class) ||
548 clazz.isAnnotationPresent(WebServiceProvider.class));
549 }
550
551 public static final GBeanInfo GBEAN_INFO;
552
553 static {
554 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(AxisBuilder.class, NameFactory.MODULE_BUILDER);
555 infoBuilder.addInterface(WebServiceBuilder.class);
556 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true);
557
558 infoBuilder.setConstructor(new String[]{"defaultEnvironment"});
559
560 GBEAN_INFO = infoBuilder.getBeanInfo();
561 }
562
563 public static GBeanInfo getGBeanInfo() {
564 return GBEAN_INFO;
565 }
566
567 }