/*
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2001 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Axis" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */
package javax.xml.rpc;

import javax.xml.namespace.QName;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * The <code>javax.xml.rpc.Call</code> interface provides support
 * for the dynamic invocation of a service endpoint. The
 * <code>javax.xml.rpc.Service</code> interface acts as a factory
 * for the creation of <code>Call</code> instances.
 * <p>
 * Once a <code>Call</code> instance is created, various setter
 * and getter methods may be used to configure this <code>Call</code>
 * instance.
 *
 * @version 1.0
 */
public interface Call {

    /**
     * Standard property: User name for authentication
     * <p>Type: <code>java.lang.String
     */
    public static final String USERNAME_PROPERTY =
        "javax.xml.rpc.security.auth.username";

    /**
     * Standard property: Password for authentication
     * <p>Type: <code>java.lang.String</code>
     */
    public static final String PASSWORD_PROPERTY =
        "javax.xml.rpc.security.auth.password";

    /**
     * Standard property for operation style. This property is
     * set to "rpc" if the operation style is rpc; "document"
     * if the operation style is document.
     * <p>Type: <code>java.lang.String</code>
     */
    public static final String OPERATION_STYLE_PROPERTY =
        "javax.xml.rpc.soap.operation.style";

    /**
     * Standard property for SOAPAction. This boolean property
     * indicates whether or not SOAPAction is to be used. The
     * default value of this property is false indicating that
     * the SOAPAction is not used.
     * <p>Type: <code>java.lang.Boolean</code>
     */
    public static final String SOAPACTION_USE_PROPERTY =
        "javax.xml.rpc.soap.http.soapaction.use";

    /**
     * Standard property for SOAPAction. Indicates the SOAPAction
     * URI if the <code>javax.xml.rpc.soap.http.soapaction.use</code>
     * property is set to <code>true</code>.
     * <p>Type: <code>java.lang.String</code>
     */
    public static final String SOAPACTION_URI_PROPERTY =
        "javax.xml.rpc.soap.http.soapaction.uri";

    /**
     * Standard property for encoding Style:  Encoding style specified
     * as a namespace URI. The default value is the SOAP 1.1 encoding
     * <code>http://schemas.xmlsoap.org/soap/encoding/</code>
     * <p>Type: <code>java.lang.String</code>
     */
    public static final String ENCODINGSTYLE_URI_PROPERTY =
        "javax.xml.rpc.encodingstyle.namespace.uri";

    /**
     * Standard property: This boolean property is used by a service
     * client to indicate whether or not it wants to participate in
     * a session with a service endpoint. If this property is set to
     * true, the service client indicates that it wants the session
     * to be maintained. If set to false, the session is not maintained.
     * The default value for this property is <code>false</code>.
     * <p>Type: <code>java.lang.Boolean</code>
     */
    public static final String SESSION_MAINTAIN_PROPERTY =
        "javax.xml.rpc.http.session.maintain";

    /**
     * Indicates whether <code>addParameter</code> and
     * <code>setReturnType</code> methods
     * are to be invoked to specify the parameter and return type
     * specification for a specific operation.
     *
     * @param operationName Qualified name of the operation
     *
     * @return Returns true if the Call implementation class
     *      requires addParameter and setReturnType to be
     *      invoked in the client code for the specified
     *      operation. This method returns false otherwise.
     */
    public boolean isParameterAndReturnSpecRequired(QName operationName);

    /**
     * Adds a parameter type and mode for a specific  operation.
     * Note that the client code may not call any
     * <code>addParameter</code> and <code>setReturnType</code>
     * methods before calling the <code>invoke</code> method. In
     * this case, the Call implementation class determines the
     * parameter types by using reflection on parameters, using
     * the WSDL description and configured type mapping registry.
     *
     * @param paramName Name of the parameter
     * @param xmlType XML datatype of the parameter
     * @param parameterMode Mode of the parameter-whether
     *                <code>ParameterMode.IN</code>,
     *                <code>ParameterMode.OUT</code>,
     *                or <code>ParameterMode.INOUT
     * @throws JAXRPCException This exception may
     *     be thrown if the method <code>isParameterAndReturnSpecRequired</code>
     *     returns <code>false</code> for this operation.
     * @throws java.lang.IllegalArgumentException If any illegal
     *     parameter name or XML type is specified
     */
    public void addParameter(String paramName, QName xmlType,
                             ParameterMode parameterMode);

    /**
     * Adds a parameter type and mode for a specific  operation.
     * This method is used to specify the Java type for either
     * OUT or INOUT parameters.
     *
     * @param paramName Name of the parameter
     * @param xmlType XML datatype of the parameter
     * @param javaType The Java class of the parameter
     * @param parameterMode Mode of the parameter-whether
     *                ParameterMode.IN, OUT or INOUT
     * @throws JAXRPCException <ul>
     *
     *     <li>This exception may be thrown if this method is
     *     invoked when the method <code>isParameterAndReturnSpecRequired</code>
     *     returns <code>false</code>.
     *     <li>If specified XML type and Java type mapping
     *     is not valid. For example, <code>TypeMappingRegistry</code>
     *     has no serializers for this mapping.
     *     </ul>
     * @throws java.lang.IllegalArgumentException  If any illegal
     *     parameter name or XML type is specified
     * @throws java.lang.UnsupportedOperationException If this
     *     method is not supported
     */
    public void addParameter(String paramName, QName xmlType, Class javaType,
                             ParameterMode parameterMode);

    /**
     * Gets the XML type of a parameter by name
     *
     * @param paramName Name of the parameter.
     *
     * @return Returns XML type for the specified parameter
     */
    public QName getParameterTypeByName(String paramName);

    /**
     * Sets the return type for a specific operation. Invoking
     * <code>setReturnType(null)</code> removes the return
     * type for this Call object.
     *
     * @param xmlType XML data type of the return value
     * @throws JAXRPCException This exception
     *     may be thrown when the method
     *     <code>isParameterAndReturnSpecRequired</code> returns
     *     <code>false</code>.
     * @throws java.lang.IllegalArgumentException If an illegal
     *     XML type is specified
     */
    public void setReturnType(QName xmlType);

    /**
     * Sets the return type for a specific operation.
     *
     * @param xmlType XML data type of the return value
     * @param javaType Java class of the return value
     * @throws JAXRPCException <ul>
     *     <li>This exception may be thrown if this method is
     *     invoked when the method <code>isParameterAndReturnSpecRequired</code>
     *     returns <code>false</code>.
     *     <li>If XML type and Java type cannot be mapped
     *     using the standard type mapping or TypeMapping
     *     registry
     *     </ul>
     * @throws java.lang.UnsupportedOperationException If this
     *     method is not supported
     * @throws java.lang.IllegalArgumentException If an illegal
     *     XML type is specified
     */
    public void setReturnType(QName xmlType, Class javaType);

    /**
     * Gets the return type for a specific operation
     *
     * @return  Returns the XML type for the return value
     */
    public QName getReturnType();

    /**
     * Removes all specified parameters from this <code>Call</code> instance.
     * Note that this method removes only the parameters and not
     * the return type. The <code>setReturnType(null)</code> is
     * used to remove the return type.
     *
     * @throws JAXRPCException This exception may be
     *     thrown If this method is called when the method
     *     <code>isParameterAndReturnSpecRequired</code>
     *     returns <code>false</code> for this Call's operation.
     */
    public void removeAllParameters();

    /**
     * Gets the name of the operation to be invoked using this Call instance.
     *
     * @return Qualified name of the operation
     */
    public QName getOperationName();

    /**
     * Sets the name of the operation to be invoked using this
     * <code>Call</code> instance.
     *
     * @param operationName QName of the operation to be
     *                   invoked using the Call instance
     */
    public void setOperationName(QName operationName);

    /**
     * Gets the qualified name of the port type.
     *
     * @return Qualified name of the port type
     */
    public QName getPortTypeName();

    /**
     * Sets the qualified name of the port type.
     *
     * @param portType Qualified name of the port type
     */
    public void setPortTypeName(QName portType);

    /**
     * Sets the address of the target service endpoint.
     * This address must correspond to the transport specified
     * in the binding for this <code>Call</code> instance.
     *
     * @param address Address of the target service endpoint;
     *             specified as an URI
     */
    public void setTargetEndpointAddress(String address);

    /**
     * Gets the address of a target service endpoint.
     *
     * @return Endpoint address of the target service port as an URI
     */
    public String getTargetEndpointAddress();

    /**
     * Sets the value for a named property. JAX-RPC specification
     * specifies a standard set of properties that may be passed
     * to the <code>Call.setProperty</code> method.
     *
     * @param name Name of the property
     * @param value Value of the property
     * @throws JAXRPCException <ul>
     *     <li>If an optional standard property name is
     *         specified, however this <code>Call</code> implementation
     *         class does not support the configuration of
     *         this property.
     *     <li>If an invalid (or unsupported) property name is
     *         specified or if a value of mismatched property
     *         type is passed.
     *     <li>If there is any error in the configuration of
     *         a valid property.
     *     </ul>
     */
    public void setProperty(String name, Object value);

    /**
     * Gets the value of a named property.
     *
     * @param name Name of the property
     *
     * @return Value of the named property
     * @throws JAXRPCException if an invalid or
     *     unsupported property name is passed.
     */
    public Object getProperty(String name);

    /**
     * Removes a named property.
     *
     * @param name Name of the property
     * @throws if an invalid or
     *     unsupported property name is passed.
     */
    public void removeProperty(String name);

    /**
     * Gets the names of configurable properties supported by
     * this <code>Call</code> object.
     *
     * @return Iterator for the property names
     */
    public Iterator getPropertyNames();

    // Remote Method Invocation methods

    /**
     * Invokes a specific operation using a synchronous request-response
     * interaction mode.
     *
     * @param inputParams Object[]--Parameters for this invocation. This
     *     includes only the input params
     *
     * @return Returns the return value or <code>null</code>
     *
     * @throws java.rmi.RemoteException if there is any error in the remote
     *                                    method invocation or if the Call
     *                                    object is not configured properly.
     * @throws SOAPFaultException Indicates a SOAP fault
     * @throws JAXRPCException <ul>
     *
     *     <li>If there is an error in the configuration of the
     *         <code>Call</code> object
     *     <li>If <code>inputParams</code> do not match the required parameter
     *         set (as specified through the <code>addParameter</code>
     *         invocations or in the corresponding WSDL)
     *     <li>If parameters and return type are incorrectly
     *         specified
     *     </ul>
     */
    public Object invoke(Object[] inputParams) throws java.rmi.RemoteException;

    /**
     * Invokes a specific operation using a synchronous request-response
     * interaction mode.
     *
     * @param operationName QName of the operation
     * @param inputParams Object[]--Parameters for this invocation. This
     *     includes only the input params.
     *
     * @return Return value or null
     *
     * @throws java.rmi.RemoteException if there is any error in the
     *     remote method invocation.
     * @throws SOAPFaultException Indicates a SOAP fault
     * @throws JAXRPCException <ul>
     *     <li>If there is an error in the configuration of the
     *         <code>Cal</code>l object
     *     <li>If <code>inputParam</code>s do not match the required parameter
     *         set (as specified through the <code>addParameter</code>
     *         invocations or in the corresponding WSDL)
     *     <li>If parameters and return type are incorrectly
     *         specified
     *     </ul>
     */
    public Object invoke(QName operationName, Object[] inputParams)
        throws java.rmi.RemoteException;

    /**
     * Invokes a remote method using the one-way interaction mode. The
     * client thread does not block waiting for the completion of the
     * server processing for this remote method invocation. This method
     * must not throw any remote exceptions. This method may throw a
     * <code>JAXRPCException</code> during the processing of the one-way
     * remote call.
     *
     * @param inputParams  Object[]--Parameters for this invocation. This
     *     includes only the input params.
     *
     * @param params
     *
     * @throws JAXRPCException if there is an error in the
     *     configuration of the <code>Call</code> object (example: a
     *     non-void return type has been incorrectly specified for the
     *     one-way call) or if there is any error during the
     *     invocation of the one-way remote call
     */
    public void invokeOneWay(Object[] params);

    /**
     * Returns a <code>Map</code> of {name, value} for the output parameters of
     * the last invoked operation. The parameter names in the
     * returned Map are of type <code>java.lang.String</code>.
     *
     * @return Map Output parameters for the last <code>Call.invoke()</code>.
     *         Empty <code>Map</code> is returned if there are no output
     *         parameters.
     * @throws javax.xml.rpc.JAXRPCException If this method is invoked for a
     *     one-way operation or is invoked before any
     *     <code>invoke</code> method has been called.
     */
    public Map getOutputParams();

    /**
     * Returns a <code>List</code> values for the output parameters
     * of the last invoked operation.
     *
     * @return java.util.List Values for the output parameters. An
     *         empty <code>List</code> is returned if there are
     *         no output values.
     *
     * @throws JAXRPCException If this method is invoked for a
     *     one-way operation or is invoked before any
     *     <code>invoke</code> method has been called.
     */
    public List getOutputValues();
}

