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 org.apache.commons.logging.Log;
021 import org.apache.commons.logging.LogFactory;
022 import org.apache.geronimo.jaxws.builder.EndpointInfoBuilder;
023 import org.apache.geronimo.jaxws.builder.JAXWSServiceRefBuilder;
024 import org.apache.geronimo.jaxws.client.EndpointInfo;
025 import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
026 import org.apache.geronimo.kernel.GBeanNotFoundException;
027 import org.apache.geronimo.kernel.repository.Environment;
028 import org.apache.geronimo.xbeans.javaee.PortComponentRefType;
029 import org.apache.geronimo.xbeans.javaee.ServiceRefHandlerChainsType;
030 import org.apache.geronimo.xbeans.javaee.ServiceRefType;
031 import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
032 import org.apache.geronimo.j2ee.deployment.EARContext;
033 import org.apache.geronimo.j2ee.deployment.Module;
034 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
035 import org.apache.geronimo.axis2.client.Axis2ConfigGBean;
036 import org.apache.geronimo.axis2.client.Axis2ServiceReference;
037 import org.apache.geronimo.common.DeploymentException;
038 import org.apache.geronimo.gbean.AbstractName;
039 import org.apache.geronimo.gbean.GBeanData;
040 import org.apache.geronimo.gbean.GBeanInfo;
041 import org.apache.geronimo.gbean.GBeanInfoBuilder;
042 import org.apache.geronimo.naming.deployment.ServiceRefBuilder;
043 import org.apache.xmlbeans.XmlOptions;
044
045 import javax.xml.namespace.QName;
046
047 import java.io.IOException;
048 import java.io.StringWriter;
049 import java.net.URI;
050 import java.util.Map;
051
052 public class Axis2ServiceRefBuilder extends JAXWSServiceRefBuilder {
053
054 private static final Log log = LogFactory.getLog(Axis2ServiceRefBuilder.class);
055
056 public Axis2ServiceRefBuilder(Environment defaultEnvironment,
057 String[] eeNamespaces) {
058 super(defaultEnvironment, eeNamespaces);
059 }
060
061 public Object createService(ServiceRefType serviceRef, GerServiceRefType gerServiceRef,
062 Module module, ClassLoader cl, Class serviceInterfaceClass,
063 QName serviceQName, URI wsdlURI, Class serviceReferenceType,
064 Map<Class, PortComponentRefType> portComponentRefMap) throws DeploymentException {
065 registerConfigGBean(module);
066 EndpointInfoBuilder builder = new EndpointInfoBuilder(serviceInterfaceClass,
067 gerServiceRef, portComponentRefMap, module.getModuleFile(),
068 wsdlURI, serviceQName);
069 builder.build();
070
071 wsdlURI = builder.getWsdlURI();
072 serviceQName = builder.getServiceQName();
073 Map<Object, EndpointInfo> seiInfoMap = builder.getEndpointInfo();
074
075 String handlerChainsXML = null;
076 try {
077 handlerChainsXML = getHandlerChainAsString(serviceRef.getHandlerChains());
078 } catch (IOException e) {
079 // this should not happen
080 log.warn("Failed to serialize handler chains", e);
081 }
082
083 String serviceReferenceName = (serviceReferenceType == null) ? null : serviceReferenceType.getName();
084 return new Axis2ServiceReference(serviceInterfaceClass.getName(), serviceReferenceName, wsdlURI,
085 serviceQName, module.getModuleName(), handlerChainsXML, seiInfoMap);
086 }
087
088 private static String getHandlerChainAsString(ServiceRefHandlerChainsType handlerChains)
089 throws IOException {
090 String xml = null;
091 if (handlerChains != null) {
092 StringWriter w = new StringWriter();
093 XmlOptions options = new XmlOptions();
094 options.setSaveSyntheticDocumentElement(new QName("http://java.sun.com/xml/ns/javaee",
095 "handler-chains"));
096 handlerChains.save(w, options);
097 xml = w.toString();
098 }
099 return xml;
100 }
101
102 private void registerConfigGBean(Module module) throws DeploymentException {
103 EARContext context = module.getEarContext();
104 AbstractName containerFactoryName = context.getNaming().createChildName(
105 module.getModuleName(), Axis2ConfigGBean.GBEAN_INFO.getName(),
106 NameFactory.GERONIMO_SERVICE);
107
108 try {
109 context.getGBeanInstance(containerFactoryName);
110 } catch (GBeanNotFoundException e1) {
111 GBeanData configGBeanData = new GBeanData(containerFactoryName, Axis2ConfigGBean.GBEAN_INFO);
112 configGBeanData.setAttribute("moduleName", module.getModuleName());
113
114 try {
115 context.addGBean(configGBeanData);
116 } catch (GBeanAlreadyExistsException e) {
117 throw new DeploymentException("Could not add config gbean", e);
118 }
119 }
120 }
121
122 public static final GBeanInfo GBEAN_INFO;
123
124 static {
125 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(
126 Axis2ServiceRefBuilder.class, NameFactory.MODULE_BUILDER);
127 infoBuilder.addInterface(ServiceRefBuilder.class);
128 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true,
129 true);
130 infoBuilder.addAttribute("eeNamespaces", String[].class, true, true);
131
132 infoBuilder.setConstructor(new String[] { "defaultEnvironment",
133 "eeNamespaces" });
134
135 GBEAN_INFO = infoBuilder.getBeanInfo();
136 }
137
138 public static GBeanInfo getGBeanInfo() {
139 return Axis2ServiceRefBuilder.GBEAN_INFO;
140 }
141 }