/*
 * 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.apache.ode.bpel.evt.ProcessInstanceEvent;
import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
import org.w3c.dom.Element;

import java.util.Collection;
import java.util.Date;
import java.util.Set;

import javax.xml.namespace.QName;


/**
 * BPEL process instance data access object. This object serves as the root
 * object for data related to a particular process instance; this state
 * includes auditing events, scopes, pick/received waiters, and the
 * serialized process instance image.
 */
public interface ProcessInstanceDAO {

    /**
     * Get the time when the process instance was created.
     * @return time of instance creation
     */
    public Date getCreateTime();

    /**
     * Get the time when the process instance was last active (re-hydrated).
     * @return time of activity
     */
    public Date getLastActiveTime();

    /**
     * Set last activity time for the process instance
     * @param dt tiem of activity
     */
    void setLastActiveTime(Date dt);

    /**
     * The un-caught fault associated with the process. This will be
     * <code>null</code> if no fault occurred or if all faults are caught and
     * processed.
     * @param fault the fault
     */
    void setFault(FaultDAO fault);

    void setFault(QName faultName, String explanation, int faultLineNo, int activityId, Element faultMessage);

    /**
     * The un-caught fault associated with the process. This will be
     * <code>null</code> if no fault occurred or if all faults are caught and
     * processed.
     *
     * @return the fault
     */
    FaultDAO getFault();

    /**
     * Get the (opaque) instance execution state.
     * @return opaque execution state
     */
    byte[] getExecutionState();

    /**
     * Set the (opaque) instance execution state.
     * @param execState execuction state
     */
    void setExecutionState(byte[] execState);

    /**
     * Get the process.
     *
     * @return process reference.
     */
    ProcessDAO getProcess();

    /**
     * Get the root (global) scope for the process.
     *
     * @return the root scope
     */
    ScopeDAO getRootScope();

    /**
     * Set the state of the process instance; one of the <code>STATE_XXX</code>
     * constants defined in ProcessState.
     *
     * This should automatically populate the previous state.
     *
     * @param state new state of the process instance
     */
    void setState(short state);

    /**
     * Get the state of the process instance; one of the <code>STATE_XXX</code>
     * constants defined in ProcessState.
     *
     * @return state of process instance
     */
    short getState();

    /**
     * Returns the next to last state.
     * @return
     */
    short getPreviousState();

    /**
     * Creates a new scope.
     *
     * @param parentScope parent scope of the new scope, or null if this is the
     *        root scope.
     * @param name scope name
     *
     * @return the newly created scope
     */
    ScopeDAO createScope(ScopeDAO parentScope, String name, int scopeModelId);

    /**
     * Get the instance identifier.
     * @return the instance identifier
     */
    Long getInstanceId();

    /**
     * Returns a scope using its instance id.
     * @param scopeInstanceId
     * @return
     */
    ScopeDAO getScope(Long scopeInstanceId);

    /**
     * Returns all the scopes with the associated name.
     * @param scopeName
     * @return
     */
    Collection<ScopeDAO> getScopes(String scopeName);

    /**
     * Returns all the scopes belonging to this isntance.
     * @param scopeName
     * @return
     */
    Collection<ScopeDAO> getScopes();

    /**
     * Return the correlator which results in the instantiation of the process instance.
     * @return
     */
    CorrelatorDAO getInstantiatingCorrelator();

    /**
     * Returns all variable instances matching the variable name for a specified scope.
     */
    XmlDataDAO[] getVariables(String variableName, int scopeModelId);

    /**
     * Get all the correlation sets for this process.
     * @return {@link Set} of {@link CorrelationSetDAO} objects
     */
    Set<CorrelationSetDAO> getCorrelationSets();

    /**
     * Get a correlation set by its name from this process
     * @param name
     * @return a {@link CorrelationSetDAO} object
     */
    CorrelationSetDAO getCorrelationSet(String name);

    /**
     * A simple callback to allow the ProcessInstance to perform post-completion duties.
     * The DAO's state indicates whether any fault has occured.
     */
    void finishCompletion();

    /**
     * Delete the process instance object from the database.
     */
    void delete(Set<CLEANUP_CATEGORY> cleanupCategories);

    /**
     * Delete the process instance object from the database.
     * @param cleanupCategories the categories of entities to delete
     * @param deleteMyRoleMex will clean up the my role mex if set to true
     */
    void delete(Set<CLEANUP_CATEGORY> cleanupCategories, boolean deleteMyRoleMex);

    /**
     * Insert a BPEL event to the database (associating with this process).
     * @param event BPEL event
     */
    void insertBpelEvent(ProcessInstanceEvent event);

    /**
     * Get a triple containing the first
     * @return
     */
    EventsFirstLastCountTuple getEventsFirstLastCount();

    /**
     * Get the next number from a monotonically increasing sequence.
     * @return next number in seqeunce
     */
    public long genMonotonic();

    public BpelDAOConnection getConnection();

    /**
     * Get number of activities in the failure state.
     */
    int getActivityFailureCount();

    /**
     * Get date/time of last activity failure.
     */
    Date getActivityFailureDateTime();

    /**
     * Returns all activity recovery objects for this process instance.
     */
    Collection<ActivityRecoveryDAO> getActivityRecoveries();

    /**
     * Create an activity recovery object for a given activity instance.
     * Specify the reason and optional data associated with the failure.
     * Date/time failure occurred, and the recovery channel and available
     * recovery actions.
     */
    void createActivityRecovery(String channel, long activityId, String reason, Date dateTime, Element data, String[] actions, int retries);

    /**
     * Delete previously registered activity recovery.
     */
    void deleteActivityRecovery(String channel);

    /**
     * Transport object holding the date of the first and last instance event
     * along with the number events.
     */
    public class EventsFirstLastCountTuple {
        public Date first;
        public Date last;
        public int count;
    }

    Collection<String> getMessageExchangeIds();
}
