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.cxf.builder; 019 020 import java.io.IOException; 021 import java.io.StringWriter; 022 import java.net.URI; 023 import java.util.Map; 024 025 import javax.xml.namespace.QName; 026 027 import org.apache.commons.logging.Log; 028 import org.apache.commons.logging.LogFactory; 029 import org.apache.geronimo.common.DeploymentException; 030 import org.apache.geronimo.cxf.client.CXFServiceReference; 031 import org.apache.geronimo.gbean.GBeanInfo; 032 import org.apache.geronimo.gbean.GBeanInfoBuilder; 033 import org.apache.geronimo.j2ee.deployment.Module; 034 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 035 import org.apache.geronimo.jaxws.builder.EndpointInfoBuilder; 036 import org.apache.geronimo.jaxws.builder.JAXWSServiceRefBuilder; 037 import org.apache.geronimo.jaxws.client.EndpointInfo; 038 import org.apache.geronimo.kernel.repository.Environment; 039 import org.apache.geronimo.naming.deployment.ServiceRefBuilder; 040 import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType; 041 import org.apache.geronimo.xbeans.javaee.PortComponentRefType; 042 import org.apache.geronimo.xbeans.javaee.ServiceRefHandlerChainsType; 043 import org.apache.geronimo.xbeans.javaee.ServiceRefType; 044 import org.apache.xmlbeans.XmlOptions; 045 046 public class CXFServiceRefBuilder extends JAXWSServiceRefBuilder { 047 048 private static final Log LOG = LogFactory.getLog(CXFServiceRefBuilder.class); 049 050 public CXFServiceRefBuilder(Environment defaultEnvironment, 051 String[] eeNamespaces) { 052 super(defaultEnvironment, eeNamespaces); 053 } 054 055 public Object createService(ServiceRefType serviceRef, GerServiceRefType gerServiceRef, 056 Module module, ClassLoader cl, Class serviceInterface, 057 QName serviceQName, URI wsdlURI, Class serviceReference, 058 Map<Class, PortComponentRefType> portComponentRefMap) throws DeploymentException { 059 EndpointInfoBuilder builder = new EndpointInfoBuilder(serviceInterface, 060 gerServiceRef, portComponentRefMap, module.getModuleFile(), 061 wsdlURI, serviceQName); 062 builder.build(); 063 064 wsdlURI = builder.getWsdlURI(); 065 serviceQName = builder.getServiceQName(); 066 Map<Object, EndpointInfo> seiInfoMap = builder.getEndpointInfo(); 067 068 String handlerChainsXML = null; 069 try { 070 handlerChainsXML = getHandlerChainAsString(serviceRef.getHandlerChains()); 071 } catch (IOException e) { 072 // this should not happen 073 LOG.warn("Failed to serialize handler chains", e); 074 } 075 076 String serviceReferenceName = (serviceReference == null) ? null : serviceReference.getName(); 077 078 return new CXFServiceReference(serviceInterface.getName(), serviceReferenceName, wsdlURI, 079 serviceQName, module.getModuleName(), handlerChainsXML, seiInfoMap); 080 } 081 082 private static String getHandlerChainAsString(ServiceRefHandlerChainsType handlerChains) 083 throws IOException { 084 String xml = null; 085 if (handlerChains != null) { 086 StringWriter w = new StringWriter(); 087 XmlOptions options = new XmlOptions(); 088 options.setSaveSyntheticDocumentElement(new QName("http://java.sun.com/xml/ns/javaee", 089 "handler-chains")); 090 handlerChains.save(w, options); 091 xml = w.toString(); 092 } 093 return xml; 094 } 095 096 public static final GBeanInfo GBEAN_INFO; 097 098 static { 099 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic( 100 CXFServiceRefBuilder.class, NameFactory.MODULE_BUILDER); 101 infoBuilder.addInterface(ServiceRefBuilder.class); 102 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, 103 true); 104 infoBuilder.addAttribute("eeNamespaces", String[].class, true, true); 105 106 infoBuilder.setConstructor(new String[] { "defaultEnvironment", 107 "eeNamespaces"}); 108 109 GBEAN_INFO = infoBuilder.getBeanInfo(); 110 } 111 112 public static GBeanInfo getGBeanInfo() { 113 return GBEAN_INFO; 114 } 115 }