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.commons.proxy.provider.remoting;
019
020 import org.apache.commons.proxy.ObjectProvider;
021 import org.apache.commons.proxy.exception.ObjectProviderException;
022
023 import javax.xml.namespace.QName;
024 import javax.xml.rpc.Service;
025 import javax.xml.rpc.ServiceException;
026 import javax.xml.rpc.ServiceFactory;
027 import java.net.MalformedURLException;
028 import java.net.URL;
029
030 /**
031 * Returns a proxy for a JAX-RPC-based service.
032 *
033 * <p>
034 * <b>Dependencies</b>:
035 * <ul>
036 * <li>A JAX-RPC implementation</li>
037 * </ul>
038 * </p>
039 * @author James Carman
040 * @since 1.0
041 */
042 public class JaxRpcProvider implements ObjectProvider
043 {
044 //----------------------------------------------------------------------------------------------------------------------
045 // Fields
046 //----------------------------------------------------------------------------------------------------------------------
047
048 private Class serviceInterface;
049 private String wsdlUrl;
050 private String serviceNamespaceUri;
051 private String serviceLocalPart;
052 private String servicePrefix;
053 private String portNamespaceUri;
054 private String portLocalPart;
055 private String portPrefix;
056
057 //----------------------------------------------------------------------------------------------------------------------
058 // Constructors
059 //----------------------------------------------------------------------------------------------------------------------
060
061 public JaxRpcProvider()
062 {
063 }
064
065 public JaxRpcProvider( Class serviceInterface )
066 {
067 this.serviceInterface = serviceInterface;
068 }
069
070 //----------------------------------------------------------------------------------------------------------------------
071 // ObjectProvider Implementation
072 //----------------------------------------------------------------------------------------------------------------------
073
074 public Object getObject()
075 {
076 try
077 {
078 final Service service = ( wsdlUrl == null ?
079 ServiceFactory.newInstance().createService( getServiceQName() ) : ServiceFactory
080 .newInstance().createService( new URL( wsdlUrl ), getServiceQName() ) );
081 final QName portQName = getPortQName();
082 return portQName == null ? service.getPort( serviceInterface ) :
083 service.getPort( portQName, serviceInterface );
084 }
085 catch( ServiceException e )
086 {
087 throw new ObjectProviderException( "Unable to create JAX-RPC service proxy.", e );
088 }
089 catch( MalformedURLException e )
090 {
091 throw new ObjectProviderException( "Invalid URL given.", e );
092 }
093 }
094
095 //----------------------------------------------------------------------------------------------------------------------
096 // Getter/Setter Methods
097 //----------------------------------------------------------------------------------------------------------------------
098
099 public void setPortLocalPart( String portLocalPart )
100 {
101 this.portLocalPart = portLocalPart;
102 }
103
104 public void setPortNamespaceUri( String portNamespaceUri )
105 {
106 this.portNamespaceUri = portNamespaceUri;
107 }
108
109 public void setPortPrefix( String portPrefix )
110 {
111 this.portPrefix = portPrefix;
112 }
113
114 public void setServiceInterface( Class serviceInterface )
115 {
116 this.serviceInterface = serviceInterface;
117 }
118
119 public void setServiceLocalPart( String serviceLocalPart )
120 {
121 this.serviceLocalPart = serviceLocalPart;
122 }
123
124 public void setServiceNamespaceUri( String serviceNamespaceUri )
125 {
126 this.serviceNamespaceUri = serviceNamespaceUri;
127 }
128
129 public void setServicePrefix( String servicePrefix )
130 {
131 this.servicePrefix = servicePrefix;
132 }
133
134 public void setWsdlUrl( String wsdlUrl )
135 {
136 this.wsdlUrl = wsdlUrl;
137 }
138
139 //----------------------------------------------------------------------------------------------------------------------
140 // Other Methods
141 //----------------------------------------------------------------------------------------------------------------------
142
143 private QName getPortQName()
144 {
145 return getQName( portNamespaceUri, portLocalPart, portPrefix );
146 }
147
148 private QName getQName( String namespaceUri, String localPart, String prefix )
149 {
150 if( namespaceUri != null && localPart != null && prefix != null )
151 {
152 return new QName( namespaceUri, localPart, prefix );
153 }
154 else if( namespaceUri != null && localPart != null )
155 {
156 return new QName( namespaceUri, localPart );
157 }
158 else if( localPart != null )
159 {
160 return new QName( localPart );
161 }
162 return null;
163 }
164
165 private QName getServiceQName()
166 {
167 return getQName( serviceNamespaceUri, serviceLocalPart, servicePrefix );
168 }
169 }
170