package org.jboss.jbossts.xts.recovery.participant.ba;

import com.arjuna.wst.BusinessAgreementWithParticipantCompletionParticipant;
import com.arjuna.wst.BusinessAgreementWithCoordinatorCompletionParticipant;

import java.io.ObjectInputStream;

/**
 * an interface implemented by applications which wish to be involved in recovering
 * saved participants after a crash.
 */
public interface XTSBARecoveryModule
{
    /**
     * called during recovery processing to allow an application to identify a participant id
     * belonging to one of its participants and recreate the participant by deserializing
     * it from the supplied object input stream. n.b. this is only appropriate in case the
     * original was a ParticipantCompletion participant saved using serialization.
     * @param id the id used when the participant was created
     * @param stream a stream from which the application should deserialise the participant
     * if it recognises that the id belongs to the module's application
     * @return the deserialized ParticipantCompletion participant
     * @throws Exception if an error occurs deserializing the ParticipantCompletion participant
     */
    public BusinessAgreementWithParticipantCompletionParticipant
    deserializeParticipantCompletionParticipant(String id, ObjectInputStream stream) throws Exception;


    /**
     * called during recovery processing to allow an application to identify a participant id
     * belonging to one of its participants and use the saved recovery state to recreate the
     * participant. n.b. this is only appropriate in case the original was a ParticipantCompletion
     * participant saved after being converted to a byte array using the PersistibleBAParticipant
     * interface.
     * @param id the id used when the participant was created
     * @param recoveryState a byte array returned form the original participant via a call to
     * method getRecoveryState of interface PersistableBAParticipant
     * @return the recreated ParticipantCompletion participant
     * @throws Exception if an error occurs converting the recoveryState back to a
     * ParticipantCompletion participant
     */
    public BusinessAgreementWithParticipantCompletionParticipant
    recreateParticipantCompletionParticipant(String id, byte[] recoveryState) throws Exception;

    /**
     * called during recovery processing to allow an application to identify a participant id
     * belonging to one of its participants and recreate the participant by deserializing
     * it from the supplied object input stream. n.b. this is only appropriate in case the
     * original was a CoordinatorCompletion participant saved using serialization.
     * @param id the id used when the participant was created
     * @param stream a stream from which the application should deserialise the participant
     * if it recognises that the id belongs to the module's application
     * @return the deserialized ParticipantCompletion participant
     * @throws Exception if an error occurs deserializing the CoordinatorCompletion participant
     */
    public BusinessAgreementWithCoordinatorCompletionParticipant
    deserializeCoordinatorCompletionParticipant(String id, ObjectInputStream stream) throws Exception;

    /**
     * called during recovery processing to allow an application to identify a participant id
     * belonging to one of its participants and use the saved recovery state to recreate the
     * participant. n.b. this is only appropriate in case the original was a CoordinatorCompletion
     * participant saved after being converted to a byte array using the PersistibleBAParticipant
     * interface.
     * @param id the id used when the participant was created
     * @param recoveryState a byte array returned form the original participant via a call to
     * method getRecoveryState of interface PersistableBAParticipant
     * @return the recreated ParticipantCompletion participant
     * @throws Exception if an error occurs converting the recoveryState back to a
     * CoordinatorCompletion participant
     */
    public BusinessAgreementWithCoordinatorCompletionParticipant
    recreateCoordinatorCompletionParticipant(String id, byte[] recoveryState) throws Exception;
}