blob: 72df6dc7cc2df15b964a11f4bad5cf68086e1d3e [file] [log] [blame]
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.axis.client;
import org.apache.axis.AxisFault;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.axis.utils.Messages;
import javax.xml.namespace.QName;
import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.Properties;
import java.util.Vector;
/**
* This class is the base for all generated stubs.
*/
public abstract class Stub implements javax.xml.rpc.Stub {
protected Service service = null;
// If maintainSessionSet is true, then setMaintainSession
// was called and it set the value of maintainSession.
// Use that value when getting the new Call object.
// If maintainSession HAS NOT been set, then the
// Call object uses the default maintainSession
// from the Service.
protected boolean maintainSessionSet = false;
protected boolean maintainSession = false;
protected Properties cachedProperties = new Properties();
protected String cachedUsername = null;
protected String cachedPassword = null;
protected URL cachedEndpoint = null;
protected Integer cachedTimeout = null;
protected QName cachedPortName = null;
// Support for Header
private Vector headers = new Vector();
// Support for Attachments
private Vector attachments = new Vector();
// Flag to determine whether this is the first call to register type mappings.
// This need not be synchronized because firstCall is ONLY called from within
// a synchronized block in the generated stub code.
private boolean firstCall = true;
// The last call object
protected Call _call = null;
/**
* Is this the first time the type mappings are being registered?
*/
protected boolean firstCall() {
boolean ret = firstCall;
firstCall = false;
return ret;
} // firstCall
/**
* Sets the value for a named property. JAX-RPC 1.0 specification
* specifies a standard set of properties that may be passed
* to the Stub._setProperty method. These properties include:
* <UL>
* <LI>javax.xml.rpc.security.auth.username: Username for the HTTP Basic Authentication
* <LI>javax.xml.rpc.security.auth.password: Password for the HTTP Basic Authentication
* <LI>javax.xml.rpc.service.endpoint.address: Target service endpoint address.
* <LI>[TBD: Additional properties]
* </UL>
*
* @param name - Name of the property
* @param value - Value of the property
*/
public void _setProperty(String name, Object value) {
if (name == null || value == null) {
throw new JAXRPCException(
Messages.getMessage(name == null ?
"badProp03" : "badProp04"));
}
else if (name.equals(Call.USERNAME_PROPERTY)) {
if (!(value instanceof String)) {
throw new JAXRPCException(
Messages.getMessage("badProp00", new String[] {
name, "java.lang.String", value.getClass().getName()}));
}
cachedUsername = (String) value;
}
else if (name.equals(Call.PASSWORD_PROPERTY)) {
if (!(value instanceof String)) {
throw new JAXRPCException(
Messages.getMessage("badProp00", new String[] {
name, "java.lang.String", value.getClass().getName()}));
}
cachedPassword = (String) value;
}
else if (name.equals(Stub.ENDPOINT_ADDRESS_PROPERTY)) {
if (!(value instanceof String)) {
throw new JAXRPCException(
Messages.getMessage("badProp00", new String[] {
name, "java.lang.String", value.getClass().getName()}));
}
try {
cachedEndpoint = new URL ((String) value);
}
catch (MalformedURLException mue) {
throw new JAXRPCException(mue.getMessage());
}
}
else if (name.equals(Call.SESSION_MAINTAIN_PROPERTY)) {
if (!(value instanceof Boolean)) {
throw new JAXRPCException(
Messages.getMessage("badProp00", new String[]
{name,
"java.lang.Boolean",
value.getClass().getName()}));
}
maintainSessionSet = true;
maintainSession = ((Boolean) value).booleanValue();
}
else if (name.startsWith("java.") || name.startsWith("javax.")) {
throw new JAXRPCException(
Messages.getMessage("badProp05", name));
}
else {
cachedProperties.put(name, value);
}
} // _setProperty
/**
* Gets the value of a named property.
*
* @param name
*
* @return the value of a named property.
*/
public Object _getProperty(String name) {
if (name == null) {
throw new JAXRPCException(
Messages.getMessage("badProp05", name));
}
else {
if (name.equals(Call.USERNAME_PROPERTY)) {
return cachedUsername;
}
else if (name.equals(Call.PASSWORD_PROPERTY)) {
return cachedPassword;
}
else if (name.equals(Stub.ENDPOINT_ADDRESS_PROPERTY)) {
return cachedEndpoint.toString();
}
else if (name.equals(Call.SESSION_MAINTAIN_PROPERTY)) {
return maintainSessionSet ? (maintainSession ? Boolean.TRUE : Boolean.FALSE) : null;
}
else if (name.startsWith("java.") || name.startsWith("javax.")) {
throw new JAXRPCException(
Messages.getMessage("badProp05", name));
}
else {
return cachedProperties.get(name);
}
}
} // _getProperty
/**
* Remove a property from this instance of the Stub
* NOTE: This is NOT part of JAX-RPC and is an Axis extension.
*
* @param name the name of the property to remove
* @return the value to which the key had been mapped, or null if the key did not have a mapping.
*/
public Object removeProperty(String name) {
return cachedProperties.remove(name);
}
/**
* Return the names of configurable properties for this stub class.
*/
public Iterator _getPropertyNames() {
return cachedProperties.keySet().iterator();
} // _getPropertyNames
/**
* Set the username.
*/
public void setUsername(String username) {
cachedUsername = username;
} // setUsername
/**
* Get the user name
*/
public String getUsername() {
return cachedUsername;
} // getUsername
/**
* Set the password.
*/
public void setPassword(String password) {
cachedPassword = password;
} // setPassword
/**
* Get the password
*/
public String getPassword() {
return cachedPassword;
} // getPassword
/**
* Get the timeout value in milliseconds. 0 means no timeout.
*/
public int getTimeout() {
return cachedTimeout == null ? 0 : cachedTimeout.intValue();
} // getTimeout
/**
* Set the timeout in milliseconds.
*/
public void setTimeout(int timeout) {
cachedTimeout = new Integer(timeout);
} // setTimeout
/**
* Get the port name.
*/
public QName getPortName() {
return cachedPortName;
} // getPortName
/**
* Set the port QName.
*/
public void setPortName(QName portName) {
cachedPortName = portName;
} // setPortName
/**
* Set the port name.
*/
public void setPortName(String portName) {
setPortName(new QName(portName));
} // setPortName
/**
* If set to true, session is maintained; if false, it is not.
*/
public void setMaintainSession(boolean session) {
maintainSessionSet = true;
maintainSession = session;
cachedProperties.put(Call.SESSION_MAINTAIN_PROPERTY, session ? Boolean.TRUE : Boolean.FALSE);
} // setmaintainSession
/**
* Set the header
* @param namespace
* @param partName that uniquely identify a header object.
* @param headerValue Object that is sent in the request as a SOAPHeader
*/
public void setHeader(String namespace, String partName, Object headerValue) {
headers.add(new SOAPHeaderElement(namespace, partName, headerValue));
}
/**
* Set the header
*/
public void setHeader(SOAPHeaderElement header) {
headers.add(header);
}
/**
* Extract attachments
* @param call
*/
public void extractAttachments(Call call) {
attachments.clear();
if(call.getResponseMessage() != null) {
Iterator iterator = call.getResponseMessage().getAttachments();
while(iterator.hasNext()){
attachments.add(iterator.next());
}
}
}
/**
* Add an attachment
* @param handler
*/
public void addAttachment(Object handler) {
attachments.add(handler);
}
/**
* Get the header element
*/
public SOAPHeaderElement getHeader(String namespace, String partName) {
for(int i=0;i<headers.size();i++) {
SOAPHeaderElement header = (SOAPHeaderElement)headers.get(i);
if(header.getNamespaceURI().equals(namespace) &&
header.getName().equals(partName))
return header;
}
return null;
}
/**
* Get a response header element
*/
public SOAPHeaderElement getResponseHeader(String namespace, String partName) {
try
{
if (_call == null)
return null;
return _call.getResponseMessage().getSOAPEnvelope().getHeaderByName(namespace, partName);
}
catch (Exception e)
{
return null;
}
}
/**
* Get the array of header elements
*/
public SOAPHeaderElement[] getHeaders() {
SOAPHeaderElement[] array = new SOAPHeaderElement[headers.size()];
headers.copyInto(array);
return array;
}
/**
* Get the array of response header elements
*/
public SOAPHeaderElement[] getResponseHeaders() {
SOAPHeaderElement[] array = new SOAPHeaderElement[0];
try
{
if (_call == null)
return array;
Vector h = _call.getResponseMessage().getSOAPEnvelope().getHeaders();
array = new SOAPHeaderElement[h.size()];
h.copyInto(array);
return array;
}
catch (Exception e)
{
return array;
}
}
/**
* Get the array of attachments
* The attachment array is cleared after this, so it is a destructive operation.
* @return the array of attachments that was in the message, or an empty array if
* there were none
*/
public Object[] getAttachments() {
Object[] array = new Object[attachments.size()];
attachments.copyInto(array);
attachments.clear();
return array;
}
/**
* This method clears both requestHeaders and responseHeaders hashtables.
*/
public void clearHeaders() {
headers.clear();
}
/**
* This method clears the request attachments.
*/
public void clearAttachments() {
attachments.clear();
}
protected void setRequestHeaders(org.apache.axis.client.Call call) throws AxisFault {
// Set the call headers.
SOAPHeaderElement[] headers = getHeaders();
for(int i=0;i<headers.length;i++){
call.addHeader(headers[i]);
}
}
/**
* copy the attachments from the stub to the call object. After doing so,
* the local set of attachments are cleared.
* @param call call object to configure
* @throws AxisFault
*/
protected void setAttachments(org.apache.axis.client.Call call) throws AxisFault {
// Set the attachments.
Object[] attachments = getAttachments();
for(int i=0;i<attachments.length;i++){
call.addAttachmentPart(attachments[i]);
}
clearAttachments();
}
/**
* Provide access to the service object. Not part of JAX-RPC
*
* @return the service object for this stub
*/
public Service _getService() {
return service;
}
/**
* Creates a call from the service.
* @return
*/
public Call _createCall() throws ServiceException {
// A single stub instance may be used concurrently by multiple threads; therefore we need
// to return the value of the local call variable instead of reading the _call attribute.
Call call = (Call) service.createCall();
_call = call;
// TODO: There is a lot of code in the generated stubs that
// can be moved here.
return call;
}
/**
* Returns last Call object associated with this stub.
*/
public Call _getCall() {
return _call;
}
/**
* Helper method for updating headers from the response.
*
* Deprecated, since response headers should not be
* automatically reflected back into the stub list.
*
*
* @deprecated This method has been changed to a no-op but remains
* in the code to keep compatibility with pre-1.1
* generated stubs.
*/
protected void getResponseHeaders(org.apache.axis.client.Call call) throws AxisFault {
}
}