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 018 package org.apache.geronimo.axis2.builder; 019 020 import java.io.FileNotFoundException; 021 import java.io.IOException; 022 import java.io.InputStream; 023 import java.net.URL; 024 import java.util.Collections; 025 import java.util.HashMap; 026 import java.util.Map; 027 import java.util.jar.JarFile; 028 029 import javax.xml.ws.http.HTTPBinding; 030 031 import org.apache.commons.logging.Log; 032 import org.apache.commons.logging.LogFactory; 033 import org.apache.geronimo.axis2.pojo.POJOWebServiceContainerFactoryGBean; 034 import org.apache.geronimo.common.DeploymentException; 035 import org.apache.geronimo.gbean.GBeanData; 036 import org.apache.geronimo.gbean.GBeanInfo; 037 import org.apache.geronimo.gbean.GBeanInfoBuilder; 038 import org.apache.geronimo.j2ee.deployment.Module; 039 import org.apache.geronimo.j2ee.deployment.WebServiceBuilder; 040 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 041 import org.apache.geronimo.jaxws.JAXWSUtils; 042 import org.apache.geronimo.jaxws.PortInfo; 043 import org.apache.geronimo.jaxws.builder.JAXWSServiceBuilder; 044 import org.apache.geronimo.jaxws.builder.WARWebServiceFinder; 045 import org.apache.geronimo.jaxws.builder.WsdlGenerator; 046 import org.apache.geronimo.kernel.repository.Environment; 047 import org.apache.geronimo.xbeans.javaee.PortComponentType; 048 import org.apache.geronimo.xbeans.javaee.ServiceImplBeanType; 049 import org.apache.geronimo.xbeans.javaee.WebserviceDescriptionType; 050 import org.apache.geronimo.xbeans.javaee.WebservicesDocument; 051 import org.apache.geronimo.xbeans.javaee.WebservicesType; 052 import org.apache.xmlbeans.XmlCursor; 053 import org.apache.xmlbeans.XmlObject; 054 055 /** 056 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $ 057 */ 058 public class Axis2Builder extends JAXWSServiceBuilder { 059 060 private static final Log log = LogFactory.getLog(Axis2Builder.class); 061 062 public Axis2Builder(Environment defaultEnviroment) { 063 super(defaultEnviroment); 064 this.webServiceFinder = new WARWebServiceFinder(); 065 } 066 067 public Axis2Builder(){ 068 super(null); 069 } 070 071 protected GBeanInfo getContainerFactoryGBeanInfo() { 072 return POJOWebServiceContainerFactoryGBean.GBEAN_INFO; 073 } 074 075 protected Map<String, PortInfo> parseWebServiceDescriptor(InputStream in, 076 URL wsDDUrl, 077 JarFile moduleFile, 078 boolean isEJB, 079 Map correctedPortLocations) 080 throws DeploymentException { 081 082 log.debug("Parsing descriptor " + wsDDUrl); 083 084 Map<String, PortInfo> map = null; 085 XmlCursor cursor = null; 086 087 try { 088 XmlObject xobj = XmlObject.Factory.parse(in); 089 090 cursor = xobj.newCursor(); 091 cursor.toStartDoc(); 092 cursor.toFirstChild(); 093 //the checking is needed as we also send JAX-RPC based webservices.xml here 094 if ("http://java.sun.com/xml/ns/javaee".equals(cursor.getName().getNamespaceURI())) { 095 WebservicesDocument wd = (WebservicesDocument)xobj.changeType(WebservicesDocument.type); 096 WebservicesType wst = wd.getWebservices(); 097 098 for (WebserviceDescriptionType desc : wst.getWebserviceDescriptionArray()) { 099 String wsdlFile = null; 100 if (desc.getWsdlFile() != null) { 101 wsdlFile = getString(desc.getWsdlFile().getStringValue()); 102 } 103 104 String serviceName = desc.getWebserviceDescriptionName().getStringValue(); 105 106 for (PortComponentType port : desc.getPortComponentArray()) { 107 108 PortInfo portInfo = new PortInfo(); 109 String serviceLink = null; 110 ServiceImplBeanType beanType = port.getServiceImplBean(); 111 if (beanType.getEjbLink() != null) { 112 serviceLink = beanType.getEjbLink().getStringValue(); 113 } else if (beanType.getServletLink().getStringValue() != null) { 114 serviceLink = beanType.getServletLink().getStringValue(); 115 } 116 portInfo.setServiceLink(serviceLink); 117 118 if (port.getServiceEndpointInterface() != null) { 119 String sei = port.getServiceEndpointInterface().getStringValue(); 120 portInfo.setServiceEndpointInterfaceName(sei); 121 } 122 123 String portName = port.getPortComponentName().getStringValue(); 124 portInfo.setPortName(portName); 125 126 portInfo.setProtocolBinding(port.getProtocolBinding()); 127 portInfo.setServiceName(serviceName); 128 portInfo.setWsdlFile(wsdlFile); 129 130 if (port.getEnableMtom() != null) { 131 portInfo.setEnableMTOM(port.getEnableMtom().getBooleanValue()); 132 } 133 134 if (port.getHandlerChains() != null) { 135 StringBuffer chains = new StringBuffer("<handler-chains xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"); 136 chains.append(port.getHandlerChains().xmlText()); 137 chains.append("</handler-chains>"); 138 portInfo.setHandlersAsXML(chains.toString()); 139 } 140 141 if (port.getWsdlPort() != null) { 142 portInfo.setWsdlPort(port.getWsdlPort().getQNameValue()); 143 } 144 145 if (port.getWsdlService() != null) { 146 portInfo.setWsdlService(port.getWsdlService().getQNameValue()); 147 } 148 149 String location = (String) correctedPortLocations.get(serviceLink); 150 portInfo.setLocation(location); 151 152 if (map == null) { 153 map = new HashMap<String, PortInfo>(); 154 } 155 156 map.put(serviceLink, portInfo); 157 } 158 } 159 } else { 160 log.debug("Descriptor ignored (not a Java EE 5 descriptor)"); 161 } 162 163 return map; 164 } catch (FileNotFoundException e) { 165 return Collections.emptyMap(); 166 } catch (IOException ex) { 167 throw new DeploymentException("Unable to read " + wsDDUrl, ex); 168 } catch (Exception ex) { 169 throw new DeploymentException("Unknown deployment error", ex); 170 } finally { 171 if (cursor != null) { 172 cursor.dispose(); 173 } 174 try { 175 in.close(); 176 } catch (IOException e) { 177 // ignore 178 } 179 } 180 } 181 182 private static String getString(String in) { 183 if (in != null) { 184 in = in.trim(); 185 if (in.length() == 0) { 186 return null; 187 } 188 } 189 return in; 190 } 191 192 @Override 193 protected void initialize(GBeanData targetGBean, Class serviceClass, PortInfo portInfo, Module module) 194 throws DeploymentException { 195 if (isWsdlSet(portInfo, serviceClass)) { 196 log.debug("Service " + portInfo.getServiceName() + " has WSDL."); 197 return; 198 } 199 200 if (isHTTPBinding(portInfo, serviceClass)) { 201 log.debug("Service " + portInfo.getServiceName() + " is HTTPBinding. Only SOAP 1.1 or 1.2 is supported."); 202 return; 203 } 204 205 log.debug("Service " + portInfo.getServiceName() + " does not have WSDL. Generating WSDL..."); 206 207 WsdlGenerator generator = new WsdlGenerator(); 208 generator.setAxis2SAAJ(); 209 210 // set wsdl service 211 if (portInfo.getWsdlService() == null) { 212 generator.setWsdlService(JAXWSUtils.getServiceQName(serviceClass)); 213 } else { 214 generator.setWsdlService(portInfo.getWsdlService()); 215 } 216 217 // set wsdl port 218 if (portInfo.getWsdlPort() != null) { 219 generator.setWsdlPort(portInfo.getWsdlPort()); 220 } 221 222 String wsdlFile = generator.generateWsdl(module, serviceClass.getName(), module.getEarContext(), portInfo); 223 portInfo.setWsdlFile(wsdlFile); 224 225 log.debug("Generated " + wsdlFile + " for service " + portInfo.getServiceName()); 226 } 227 228 private boolean isWsdlSet(PortInfo portInfo, Class serviceClass) { 229 return (portInfo.getWsdlFile() != null && !portInfo.getWsdlFile().trim().equals("")) 230 || JAXWSUtils.containsWsdlLocation(serviceClass, serviceClass.getClassLoader()); 231 } 232 233 private boolean isHTTPBinding(PortInfo portInfo, Class serviceClass) { 234 String bindingURI = ""; 235 String bindingURIFromAnnot; 236 237 if (portInfo.getProtocolBinding() != null) { 238 bindingURI = JAXWSUtils.getBindingURI(portInfo.getProtocolBinding()); 239 } 240 bindingURIFromAnnot = JAXWSUtils.getBindingURIFromAnnot(serviceClass, serviceClass.getClassLoader()); 241 242 if (bindingURI != null && !bindingURI.trim().equals("")) { 243 return bindingURI.equals(HTTPBinding.HTTP_BINDING); 244 } else if (bindingURIFromAnnot != null && !bindingURIFromAnnot.trim().equals("")) { 245 return bindingURIFromAnnot.equals(HTTPBinding.HTTP_BINDING); 246 } 247 248 return false; 249 } 250 251 public static final GBeanInfo GBEAN_INFO; 252 253 static { 254 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(Axis2Builder.class, NameFactory.MODULE_BUILDER); 255 infoBuilder.addInterface(WebServiceBuilder.class); 256 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true); 257 infoBuilder.setConstructor(new String[]{"defaultEnvironment"}); 258 GBEAN_INFO = infoBuilder.getBeanInfo(); 259 } 260 261 public static GBeanInfo getGBeanInfo() { 262 return GBEAN_INFO; 263 } 264 }