/*
 * 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 com.sun.jini.outrigger;

import net.jini.id.Uuid;

/**
 * Methods that recover the state of the space after a restart.
 *
 * 
 *
 * @see LogOps
 * @see OutriggerServerImpl
 */
public interface Recover {

    /**
     * Recover the session id from the previous session.
     *
     * @see LogOps#bootOp
     *
     * @param sessionId is the value of the session id recorded from
     *        the last call to <code>booOp</code>
     */
    public void recoverSessionId(long sessionId);

    /**
     * Recover the join state from the previous session.
     *
     * @see LogOps#joinStateOp
     *
     * @param state is the stored join state
     */
    public void recoverJoinState(StoredObject state) throws Exception;

    /**
     * Recover a write operation. The recovered <code>entry</code> is the
     * stored form of the entry passed into <code>writeOp</code>. If the
     * original write was done under a transaction, and the transaction
     * was prepared <code>txnId</code> will be non-null.
     *
     * @see LogOps#writeOp
     *
     * @param entry stored from of the written entry
     *
     * @param txnId transaction identifier or <code>null</code>
     *
     * @exception Exception is thrown if any error occurs recovering the
     *            write
     */
    public void recoverWrite(StoredResource entry, Long txnId)
	throws Exception;

    /**
     * Recover a take operation. If the original take was done under
     * a transaction, and the transaction was prepared, <code>txnId</code>
     * will be non-null.
     *
     * @see LogOps#takeOp
     *
     * @param cookie identifier of the entry to take
     *
     * @param txnId transaction identifier or <code>null</code>
     *
     * @exception Exception is thrown if any error occurs recovering the take
     */
    public void recoverTake(Uuid cookie, Long txnId) throws Exception;

    /**
     * Recover an event registration. The recovered
     * <code>registration</code> is the stored form of the
     * registration passed into <code>registerOp</code>. The recovered
     * <code>template</code> is the stored form of the template.
     *
     * @see LogOps#registerOp
     *
     * @param registration stored from of the logged registration
     *
     * @param type of registration, same value that was passed into
     *             corresponding <code>registerOp</code> call
     * 
     * @param templates stored from of the logged templates
     *
     * @exception Exception is thrown if any error occurs recovering the
     *            registration 
     */
    public void recoverRegister(StoredResource registration, String type,
				StoredObject[] templates)
	throws Exception;

    /**
     * Recover a prepared transaction. The recovered
     * <code>transaction</code> is the stored form of the transaction
     * passed into <code>prepareOp</code>.
     *
     * @see LogOps#prepareOp
     *
     * @param txnId transaction identifier
     *
     * @param transaction stored from of the prepared transaction
     *
     * @exception Exception is thrown if any error occurs recovering the
     *            transaction 
     */
    public void recoverTransaction(Long txnId, StoredObject transaction)
	throws Exception;

    /**
     * Recover the <code>Uuid</code> for the service as a whole.
     * Will only be called if a <code>Uuid</code> has be stored during
     * a previous incarnation.
     * @see LogOps#uuidOp
     * @param uuid The <code>Uuid</code> being recovered.
     */
    public void recoverUuid(Uuid uuid);
}

