001    /**
002     *
003     * Copyright 2003-2004 The Apache Software Foundation
004     *
005     *  Licensed under the Apache License, Version 2.0 (the "License");
006     *  you may not use this file except in compliance with the License.
007     *  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.client;
018    
019    import java.io.IOException;
020    import java.io.ObjectInputStream;
021    import java.io.Serializable;
022    import java.net.URL;
023    import java.rmi.Remote;
024    import java.util.Iterator;
025    import java.util.Map;
026    import javax.xml.namespace.QName;
027    import javax.xml.rpc.Call;
028    import javax.xml.rpc.ServiceException;
029    import javax.xml.rpc.encoding.TypeMappingRegistry;
030    import javax.xml.rpc.handler.HandlerRegistry;
031    
032    import org.apache.axis.SimpleTargetedChain;
033    import org.apache.axis.client.Service;
034    import org.apache.axis.configuration.SimpleProvider;
035    import org.apache.axis.encoding.TypeMappingRegistryImpl;
036    import org.apache.axis.transport.http.HTTPSender;
037    
038    
039    /**
040     * @version $Revision: 430508 $ $Date: 2006-08-10 12:56:47 -0700 (Thu, 10 Aug 2006) $
041     */
042    public class ServiceImpl implements javax.xml.rpc.Service, Serializable {
043        private static final long serialVersionUID = 8657993237680414470L;
044    
045        private transient Service delegate;
046        private final Map seiClassNameToFactoryMap;
047        private final Map portToImplementationMap;
048    
049        public ServiceImpl(Map portToImplementationMap, Map seiClassNameToFactoryMap) {
050            this.portToImplementationMap = portToImplementationMap;
051            this.seiClassNameToFactoryMap = seiClassNameToFactoryMap;
052            buildDelegateService();
053        }
054    
055        private void buildDelegateService() {
056            TypeMappingRegistryImpl typeMappingRegistry = new TypeMappingRegistryImpl();
057            typeMappingRegistry.doRegisterFromVersion("1.3");
058    
059            SimpleProvider engineConfiguration = new SimpleProvider(typeMappingRegistry);
060            engineConfiguration.deployTransport("http", new SimpleTargetedChain(new HTTPSender()));
061    
062            GeronimoAxisClient engine = new GeronimoAxisClient(engineConfiguration, portToImplementationMap);
063    
064            delegate = new Service(engineConfiguration, engine);
065        }
066    
067        public Remote getPort(QName qName, Class portClass) throws ServiceException {
068            if (qName != null) {
069                String portName = qName.getLocalPart();
070                Remote port = internalGetPort(portName);
071                return port;
072            }
073            return getPort(portClass);
074        }
075    
076        public Remote getPort(Class portClass) throws ServiceException {
077            String fqcn = portClass.getName();
078            Remote port = internalGetPortFromClassName(fqcn);
079            return port;
080        }
081    
082        public Call[] getCalls(QName portName) throws ServiceException {
083    
084            if (portName == null)
085                throw new ServiceException("Portname cannot be null");
086    
087            SEIFactory factory = (SEIFactory) portToImplementationMap.get(portName.getLocalPart());
088            if( factory == null )
089                throw new ServiceException("No port for portname: " + portName);
090    
091            OperationInfo[] operationInfos = factory.getOperationInfos();
092            javax.xml.rpc.Call[] array = new javax.xml.rpc.Call[operationInfos.length];
093            for (int i = 0; i < operationInfos.length; i++) {
094                OperationInfo operation = operationInfos[i];
095                array[i] = delegate.createCall(factory.getPortQName(), operation.getOperationName());
096            }
097            return array;
098        }
099    
100        public Call createCall(QName qName) throws ServiceException {
101            return delegate.createCall(qName);
102        }
103    
104        public Call createCall(QName qName, QName qName1) throws ServiceException {
105            return delegate.createCall(qName, qName1);
106        }
107    
108        public Call createCall(QName qName, String s) throws ServiceException {
109            return delegate.createCall(qName, s);
110        }
111    
112        public Call createCall() throws ServiceException {
113            return delegate.createCall();
114        }
115    
116        public QName getServiceName() {
117            Iterator iterator = portToImplementationMap.values().iterator();
118            if( !iterator.hasNext() )
119                return null;
120            SEIFactory factory = (SEIFactory)iterator.next();
121            return factory.getServiceName();
122        }
123    
124        public Iterator getPorts() throws ServiceException {
125            return portToImplementationMap.values().iterator();
126        }
127    
128        public URL getWSDLDocumentLocation() {
129            Iterator iterator = portToImplementationMap.values().iterator();
130            if( !iterator.hasNext() )
131                return null;
132            SEIFactory factory = (SEIFactory)iterator.next();
133            return factory.getWSDLDocumentLocation();
134        }
135    
136        public TypeMappingRegistry getTypeMappingRegistry() {
137            throw new UnsupportedOperationException();
138            //return delegate.getTypeMappingRegistry();
139        }
140    
141        public HandlerRegistry getHandlerRegistry() {
142            throw new UnsupportedOperationException();
143        }
144    
145        Remote internalGetPort(String portName) throws ServiceException {
146            if (portToImplementationMap.containsKey(portName)) {
147                SEIFactory seiFactory = (SEIFactory) portToImplementationMap.get(portName);
148                Remote port = seiFactory.createServiceEndpoint();
149                return port;
150            }
151            throw new ServiceException("No port for portname: " + portName);
152        }
153    
154        Remote internalGetPortFromClassName(String className) throws ServiceException {
155            if (seiClassNameToFactoryMap.containsKey(className)) {
156                SEIFactory seiFactory = (SEIFactory) seiClassNameToFactoryMap.get(className);
157                Remote port = seiFactory.createServiceEndpoint();
158                return port;
159            }
160            throw new ServiceException("no port for class " + className);
161        }
162    
163        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
164            in.defaultReadObject();
165            buildDelegateService();
166        }
167    
168        Service getService() {
169            return delegate;
170        }
171    }