/*
 * 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.dao;

import org.w3c.dom.Element;

import javax.xml.namespace.QName;
import java.util.Date;
import java.util.Set;

/**
 * Data access object for a message exchange.
 */
public interface MessageExchangeDAO {

    public static final char DIR_BPEL_INVOKES_PARTNERROLE = 'P';

    public static final char DIR_PARTNER_INVOKES_MYROLE = 'M';

    /**
     * Instance id of the message exchange.
     *
     * @return message exchange id.
     */
    String getMessageExchangeId();

    /**
     * Get output message (could be fault message)
     *
     * @return output message DAO
     */
    MessageDAO getResponse();

    /**
     * Creation time of the message exchange
     *
     * @return create time
     */
    Date getCreateTime();

    /**
     * Get the input message.
     *
     * @return input message DAO
     */
    MessageDAO getRequest();

    /**
     * Get the operation name of this message exchange.
     *
     * @return operation name.
     */
    String getOperation();

    /**
     * The qualified name of the WSDL port type.
     *
     * @return port type name
     */
    QName getPortType();

    /**
     * Set the port type.
     *
     * @param porttype
     *          port type
     */
    void setPortType(QName porttype);

    /**
     * Set state of last message sent/received.
     *
     * @param status state to be set
     */
    void setStatus(String status);

    /**
     * Get state of last message sent/received.
     *
     * @return the state
     */
    String getStatus();

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

    /**
     * Creates an input message DAO.
     */
    void setRequest(MessageDAO msg);

    /**
     * Creates an output message DAO.
     */
    void setResponse(MessageDAO msg);

    /**
     * Get the model id for the partner link to which this message exchange
     * relates.
     *
     * @return
     */
    int getPartnerLinkModelId();

    /**
     * Set the model id for the partner link to which this message exchange
     * relates
     *
     * @param modelId
     */
    void setPartnerLinkModelId(int modelId);

    /**
     * Get the correlation identifier/client id
     *
     * @return correlation identifier
     */
    String getCorrelationId();

    /**
     * Set the correlation identifier/client id
     *
     * @param correlationId
     *          identifier
     */
    void setCorrelationId(String correlationId);

    void setPattern(String string);

    void setOperation(String opname);

    void setEPR(Element epr);

    Element getEPR();

    String getPattern();

    /**
     * Get the response channel.
     *
     * @return response channel.
     */
    String getChannel();

    /**
     * Set the response channel.
     *
     * @param string
     *          response channel
     */
    void setChannel(String string);

    boolean getPropagateTransactionFlag();

    QName getFault();

    void setFault(QName faultType);

    public String getFaultExplanation();

    public void setFaultExplanation(String explanation);

    void setCorrelationStatus(String cstatus);

    String getCorrelationStatus();

    /**
     * Get the process associate with this message exchange. The process should
     * always be available for partnerRole message exchanges. However, for myRole
     * message exchanges, it is possible that no process is associated with the
     * message exchange (i.e. if the EPR routing fails).
     *
     * @return process associated with the message exchange
     */
    ProcessDAO getProcess();

    void setProcess(ProcessDAO process);

    void setInstance(ProcessInstanceDAO dao);

    ProcessInstanceDAO getInstance();

    /**
     * Get the direction of the message exchange.
     *
     * @return
     */
    char getDirection();

    /**
     * Get the "callee"--the id of the process being invoked in a myRole
     * exchange.
     * @return
     */
    QName getCallee();

    /**
     * Set the "callee"--the id of the process being invoked in a myRole
     * exchange.
     * @param callee
     */
    void setCallee(QName callee);

    String getProperty(String key);

    void setProperty(String key, String value);

    Set<String> getPropertyNames();

    void setPartnerLink(PartnerLinkDAO plinkDAO);

    PartnerLinkDAO getPartnerLink();

    /**
     * Gets the mex id for the message exchange that has been piped with
     * this one in a process to process interaction. 
     * @return
     */
    String getPipedMessageExchangeId();
    void setPipedMessageExchangeId(String mexId);
    
    int getSubscriberCount();
    void setSubscriberCount(int subscriberCount);

    void release(boolean doClean);

}
