001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package org.apache.geronimo.axis.builder;
020
021 import java.net.URI;
022 import java.net.URISyntaxException;
023 import java.util.ArrayList;
024 import java.util.HashMap;
025 import java.util.HashSet;
026 import java.util.List;
027 import java.util.Map;
028 import java.util.Set;
029
030 import javax.xml.namespace.QName;
031
032 import org.apache.geronimo.common.DeploymentException;
033 import org.apache.geronimo.gbean.GBeanInfo;
034 import org.apache.geronimo.gbean.GBeanInfoBuilder;
035 import org.apache.geronimo.j2ee.deployment.HandlerInfoInfo;
036 import org.apache.geronimo.j2ee.deployment.Module;
037 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
038 import org.apache.geronimo.kernel.ClassLoading;
039 import org.apache.geronimo.kernel.config.Configuration;
040 import org.apache.geronimo.kernel.repository.Environment;
041 import org.apache.geronimo.naming.deployment.AbstractNamingBuilder;
042 import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefDocument;
043 import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
044 import org.apache.geronimo.xbeans.j2ee.ParamValueType;
045 import org.apache.geronimo.xbeans.j2ee.PortComponentRefType;
046 import org.apache.geronimo.xbeans.j2ee.ServiceRefHandlerType;
047 import org.apache.geronimo.xbeans.j2ee.ServiceRefType;
048 import org.apache.geronimo.xbeans.j2ee.XsdQNameType;
049 import org.apache.xmlbeans.QNameSet;
050 import org.apache.xmlbeans.XmlObject;
051
052 /**
053 * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
054 */
055 public class AxisServiceRefBuilder extends AbstractNamingBuilder {
056 private final QNameSet serviceRefQNameSet;
057 private static final QName GER_SERVICE_REF_QNAME = GerServiceRefDocument.type.getDocumentElementName();
058 private static final QNameSet GER_SERVICE_REF_QNAME_SET = QNameSet.singleton(GER_SERVICE_REF_QNAME);
059
060 private final AxisBuilder axisBuilder;
061
062 public AxisServiceRefBuilder(Environment defaultEnvironment, String[] eeNamespaces, AxisBuilder axisBuilder) {
063 super(defaultEnvironment);
064 this.axisBuilder = axisBuilder;
065 serviceRefQNameSet = buildQNameSet(eeNamespaces, "service-ref");
066 }
067
068 protected boolean willMergeEnvironment(XmlObject specDD, XmlObject plan) {
069 return getServiceRefs(specDD).length > 0;
070 }
071
072 public void buildNaming(XmlObject specDD, XmlObject plan, Configuration localConfiguration, Configuration remoteConfiguration, Module module, Map componentContext) throws DeploymentException {
073 XmlObject[] serviceRefsUntyped = getServiceRefs(specDD);
074 XmlObject[] gerServiceRefsUntyped = plan == null? NO_REFS: plan.selectChildren(GER_SERVICE_REF_QNAME_SET);
075 Map serviceRefMap = mapServiceRefs(gerServiceRefsUntyped);
076 ClassLoader cl = module.getEarContext().getClassLoader();
077
078 for (int i = 0; i < serviceRefsUntyped.length; i++) {
079 ServiceRefType serviceRef = (ServiceRefType) serviceRefsUntyped[i];
080 String name = getStringValue(serviceRef.getServiceRefName());
081 GerServiceRefType serviceRefType = (GerServiceRefType) serviceRefMap.get(name);
082 // Map credentialsNameMap = (Map) serviceRefCredentialsNameMap.get(name);
083 String serviceInterfaceName = getStringValue(serviceRef.getServiceInterface());
084 assureInterface(serviceInterfaceName, "javax.xml.rpc.Service", "[Web]Service", cl);
085 Class serviceInterface;
086 try {
087 serviceInterface = cl.loadClass(serviceInterfaceName);
088 } catch (ClassNotFoundException e) {
089 throw new DeploymentException("Could not load service interface class: " + serviceInterfaceName, e);
090 }
091 URI wsdlURI = null;
092 if (serviceRef.isSetWsdlFile()) {
093 try {
094 wsdlURI = new URI(serviceRef.getWsdlFile().getStringValue().trim());
095 } catch (URISyntaxException e) {
096 throw new DeploymentException("could not construct wsdl uri from " + serviceRef.getWsdlFile().getStringValue(), e);
097 }
098 }
099 URI jaxrpcMappingURI = null;
100 if (serviceRef.isSetJaxrpcMappingFile()) {
101 try {
102 jaxrpcMappingURI = new URI(getStringValue(serviceRef.getJaxrpcMappingFile()));
103 } catch (URISyntaxException e) {
104 throw new DeploymentException("Could not construct jaxrpc mapping uri from " + serviceRef.getJaxrpcMappingFile(), e);
105 }
106 }
107 QName serviceQName = null;
108 if (serviceRef.isSetServiceQname()) {
109 serviceQName = serviceRef.getServiceQname().getQNameValue();
110 }
111 Map portComponentRefMap = new HashMap();
112 PortComponentRefType[] portComponentRefs = serviceRef.getPortComponentRefArray();
113 if (portComponentRefs != null) {
114 for (int j = 0; j < portComponentRefs.length; j++) {
115 PortComponentRefType portComponentRef = portComponentRefs[j];
116 String portComponentLink = getStringValue(portComponentRef.getPortComponentLink());
117 String serviceEndpointInterfaceType = getStringValue(portComponentRef.getServiceEndpointInterface());
118 assureInterface(serviceEndpointInterfaceType, "java.rmi.Remote", "ServiceEndpoint", cl);
119 Class serviceEndpointClass;
120 try {
121 serviceEndpointClass = cl.loadClass(serviceEndpointInterfaceType);
122 } catch (ClassNotFoundException e) {
123 throw new DeploymentException("could not load service endpoint class " + serviceEndpointInterfaceType, e);
124 }
125 portComponentRefMap.put(serviceEndpointClass, portComponentLink);
126 }
127 }
128 ServiceRefHandlerType[] handlers = serviceRef.getHandlerArray();
129 List handlerInfos = buildHandlerInfoList(handlers, cl);
130
131 //we could get a Reference or the actual serializable Service back.
132 Object ref = axisBuilder.createService(serviceInterface, wsdlURI, jaxrpcMappingURI, serviceQName, portComponentRefMap, handlerInfos, serviceRefType, module, cl);
133 getJndiContextMap(componentContext).put(ENV + name, ref);
134 }
135
136 }
137
138 private XmlObject[] getServiceRefs(XmlObject specDD) {
139 return convert(specDD.selectChildren(serviceRefQNameSet), J2EE_CONVERTER, ServiceRefType.type);
140 }
141
142 public QNameSet getSpecQNameSet() {
143 return serviceRefQNameSet;
144 }
145
146 public QNameSet getPlanQNameSet() {
147 return GER_SERVICE_REF_QNAME_SET;
148 }
149
150
151 private static List buildHandlerInfoList(ServiceRefHandlerType[] handlers, ClassLoader classLoader) throws DeploymentException {
152 List handlerInfos = new ArrayList();
153 for (int i = 0; i < handlers.length; i++) {
154 ServiceRefHandlerType handler = handlers[i];
155 org.apache.geronimo.xbeans.j2ee.String[] portNameArray = handler.getPortNameArray();
156 List portNames = new ArrayList();
157 for (int j = 0; j < portNameArray.length; j++) {
158 portNames.add(portNameArray[j].getStringValue().trim());
159
160 }
161 // Set portNames = new HashSet(Arrays.asList(portNameArray));
162 String handlerClassName = handler.getHandlerClass().getStringValue().trim();
163 Class handlerClass;
164 try {
165 handlerClass = ClassLoading.loadClass(handlerClassName, classLoader);
166 } catch (ClassNotFoundException e) {
167 throw new DeploymentException("Could not load handler class", e);
168 }
169 Map config = new HashMap();
170 ParamValueType[] paramValues = handler.getInitParamArray();
171 for (int j = 0; j < paramValues.length; j++) {
172 ParamValueType paramValue = paramValues[j];
173 String paramName = paramValue.getParamName().getStringValue().trim();
174 String paramStringValue = paramValue.getParamValue().getStringValue().trim();
175 config.put(paramName, paramStringValue);
176 }
177 XsdQNameType[] soapHeaderQNames = handler.getSoapHeaderArray();
178 QName[] headerQNames = new QName[soapHeaderQNames.length];
179 for (int j = 0; j < soapHeaderQNames.length; j++) {
180 XsdQNameType soapHeaderQName = soapHeaderQNames[j];
181 headerQNames[j] = soapHeaderQName.getQNameValue();
182 }
183 Set soapRoles = new HashSet();
184 for (int j = 0; j < handler.getSoapRoleArray().length; j++) {
185 String soapRole = handler.getSoapRoleArray(j).getStringValue().trim();
186 soapRoles.add(soapRole);
187 }
188 HandlerInfoInfo handlerInfoInfo = new HandlerInfoInfo(new HashSet(portNames), handlerClass, config, headerQNames, soapRoles);
189 handlerInfos.add(handlerInfoInfo);
190 }
191 return handlerInfos;
192 }
193
194
195 private static Map mapServiceRefs(XmlObject[] refs) {
196 Map refMap = new HashMap();
197 if (refs != null) {
198 for (int i = 0; i < refs.length; i++) {
199 GerServiceRefType ref = (GerServiceRefType) refs[i].copy().changeType(GerServiceRefType.type);
200 String serviceRefName = ref.getServiceRefName().trim();
201 refMap.put(serviceRefName, ref);
202 }
203 }
204 return refMap;
205 }
206
207 public static final GBeanInfo GBEAN_INFO;
208
209 static {
210 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(AxisServiceRefBuilder.class, NameFactory.MODULE_BUILDER);
211 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true);
212 infoBuilder.addAttribute("eeNamespaces", String[].class, true, true);
213 infoBuilder.addReference("AxisBuilder", AxisBuilder.class, NameFactory.MODULE_BUILDER);
214
215 infoBuilder.setConstructor(new String[] {"defaultEnvironment", "eeNamespaces", "AxisBuilder"});
216
217 GBEAN_INFO = infoBuilder.getBeanInfo();
218 }
219
220 public static GBeanInfo getGBeanInfo() {
221 return GBEAN_INFO;
222 }
223 }