/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.ode.bpel.iapi;

import javax.wsdl.Operation;
import javax.wsdl.PortType;
import javax.xml.namespace.QName;
import java.util.Set;

/**
 * A representation of a communication (message-exchange) between the BPEL 
 * BPEL engine and an  external "partner".
 * 
 * @author mszefler
 */
public interface MessageExchange {

    /**
     * Enumeration of message exchange patterns.
     */
    public enum MessageExchangePattern {
        REQUEST_ONLY,
        REQUEST_RESPONSE,
        UNKNOWN
    }

    /**
     * Enumeration of the possible states for the message exchange.
     */
    public enum Status {
        /** New message exchange, has not been "invoked" */
        NEW,

        /** The request is being sent to the "server" */
        REQUEST,

        /** Waiting for an asynchronous response from the "server" */
        ASYNC,

        /** The one way request has been sent to the server. */
        ONE_WAY,

        /** Processing the response received from the "server". */
        RESPONSE,

        /** Processing the fault received from the "server". */
        FAULT,

        /** Processing a failure. */
        FAILURE,

        /** Message exchange completed succesfully. */
        COMPLETED_OK,

        /** Message exchange completed with a fault. */
        COMPLETED_FAULT,

        /** Message exchange completed with a failure. */
        COMPLETED_FAILURE,
    }

    /**
     * Enumeration of the types of failures.
     */
    public enum FailureType {
        /** Requested endpoint is invalid. */
        INVALID_ENDPOINT,

        /** Requested endpoint is unknown/unavailable. */
        UNKNOWN_ENDPOINT,

        /** Requested operation is unknown/unimplemented. */
        UNKNOWN_OPERATION,

        /** Network / IPC errror. */
        COMMUNICATION_ERROR,

        /** Request message was of an invalid/unrecognized format. */
        FORMAT_ERROR,

        /** An internal failure: no response was provided. */
        NO_RESPONSE,

        /** Message exchange processing was aborted. */
        ABORTED,

        /** Other failure. */
        OTHER, NOMATCH
    }

    /**
     * Get the message exchange identifier. This identifier should be globally
     * unique as the BPEL engine may keep identifiers for extended periods of
     * time.
     * @return unique message exchange identifier
     */
    String getMessageExchangeId()
            throws BpelEngineException;

    /**
     * Get the name of the operation (WSDL 1.1) / message exchange (WSDL 1.2?).
     *
     * @return name of the operation (WSDL 1.1) /message exchange (WSDL 1.2?).
     */
    String getOperationName()
            throws BpelEngineException;


    /**
     * Get a reference to the end-point targeted by this message exchange.
     * @return end-point reference for this message exchange
     */
    EndpointReference getEndpointReference()
            throws BpelEngineException;



    /**
     * Return the type of message-exchange that resulted form this invocation
     * (request only/request-respone). If a
     * {@link MessageExchangePattern#REQUEST_RESPONSE} message-exchange was
     * created, then the caller should expect a response in the future.
     * @return type of message exchange created by the invocation
     */
    MessageExchangePattern getMessageExchangePattern();

    /**
     * Create a message associated with this exchange.
     * @param msgType message type
     * @return a new {@link Message}
     */
    Message createMessage(QName msgType);

    boolean isTransactionPropagated()
            throws BpelEngineException;

    /**
     * Get the message exchange status.
     * @return
     */
    Status getStatus();

    /**
     * Get the request message.
     * @return request message
     */
    Message getRequest();

    /**
     * Get the response message.
     * @return response message (or null if not avaiable)
     */
    Message getResponse();

    /**
     * Get the fault type.
     * @return fault type, or <code>null</code> if not available/applicable.
     */
    String getFault();

    String getFaultExplanation();

    /**
     * Get the fault resposne message.
     * @return fault response, or <code>null</code> if not available/applicable.
     */
    Message getFaultResponse();

    /**
     * Get the operation description for this message exchange.
     * It is possible that the description cannot be resolved, for example if
     * the EPR is unknown or if the operation does not exist.
     * TODO: How to get rid of the WSDL4j dependency?
     * @return WSDL operation description or <code>null</code> if not availble
     */
    Operation getOperation();

    /**
     * Get the port type description for this message exchange.
     * It is possible that the description cannot be resolved, for example if
     * the EPR is unknown or if the operation does not exist.
     * TODO: How to get rid of the WSDL4j dependency?
     * @return WSDL port type description or <code>null</code> if not available.
     */
    PortType getPortType();

    /**
     * Set a message exchange property. Message exchange properties are not
     * interpreted by the engine--they exist to enable the integration layer
     * to persist information about the exchange.
     * @param key property key
     * @param value property value
     */
    void setProperty(String key, String value);

    /**
     * Get a message exchange property.
     * @param key property key
     * @return property value
     */
    String getProperty(String key);


    /**
     * Get a set containing the names of the defined properties.
     * @return set of property names.
     */
    public Set<String> getPropertyNames();


    public static final String PROPERTY_SEP_MYROLE_SESSIONID = "org.apache.ode.bpel.myRoleSessionId";
    public static final String PROPERTY_SEP_PARTNERROLE_SESSIONID = "org.apache.ode.bpel.partnerRoleSessionId";
    public static final String PROPERTY_SEP_PARTNERROLE_EPR = "org.apache.ode.bpel.partnerRoleEPR";
}

@@ -1730,16 +1730,19 @@
 %0A       
+ //
  ONE_WAY
@@ -1742,16 +1742,84 @@
 ONE_WAY,
+ - supported as ASYNC + getMessageExchangePatter() - See JIRA ODE-54
 %0A%0A      

Fix ODE-54