/*
* 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.mercury;
import net.jini.id.Uuid;
import java.io.IOException;
import java.util.NoSuchElementException;
import net.jini.core.event.RemoteEvent;
/**
* Interface implemented by event storage objects.
* This class encapsulates the details of reading/writing events from/to
* some underlying persistence mechanism.
*
* This interface makes certain assumptions. First, the <tt>next</tt> and
* <tt>remove</tt> methods are intended to be called in pairs. If
* <tt>remove</tt> is not called, then subsequent calls to <tt>next</tt>
* will attempt to return the same object. Calling <tt>remove</tt>
* essentially advances the read pointer to the next object, if any.
* Second, if any <tt>IOExceptions</tt> are encountered during the reading
* or writing of an event the associated read/write pointer is advanced
* past the offending event. This means that events can be lost if I/O
* errors are encountered.
*
* @author Sun Microsystems, Inc.
*
* @since 1.1
*/
interface EventLog {
/**
* Initializes the state of this <tt>EventLog</tt> object.
* The required functionality can potentially throw an
* <tt>IOException</tt> and has therefore been separated from
* from object construction.
*
* @exception IOException if an I/O error occurs
*/
void init() throws IOException;
/**
* Writes the given <tt>RemoteEvent</tt> to the underlying
* storage mechanism, if possible. If an <tt>IOException</tt>
* occurs, then the write cannot be guaranteed.
*
* @exception IOException if an I/O error occurs
*/
void add(RemoteEvent event) throws IOException;
/**
* Return the next <tt>RemoteEvent</tt> to be read. Note that
* <tt>next</tt> is meant to be used in conjunction with
* <tt>remove</tt>. Subsequent calls to <tt>next</tt> will
* return the same event until <tt>remove</tt> is called, which
* actually updates the read pointer to the next event (indicating
* that the previously read event was successfully processed).
*
* @exception IOException if an I/O error occurs
*
* @exception ClassNotFoundException if a class for the serialized
* object could not be found
*
* @exception NoSuchElementException if no event is available
*/
RemoteEvent next() throws IOException, ClassNotFoundException;
/**
* Returns <tt>true</tt> if this log contains no events and
* false otherwise.
*/
boolean isEmpty() throws IOException;
/**
* Effectively removes the last read event from the log.
* It does this by advancing the read pointer to the
* next available event, if any.
*
* @exception NoSuchElementException if no events are available
*/
void remove() throws IOException;
/**
* Return an array of <tt>RemoteEventData</tt> with a limit of
* <tt>maxEvents</tt> elements. Note that
* <tt>readAhead</tt> is meant to be used in conjunction with
* <tt>moveAhead</tt>. Subsequent calls to <tt>readAhead</tt> with
* the same argument value will return the same set of events until
* <tt>moveAhead</tt> is called, which
* actually updates the read pointer to the next unread event (indicating
* that the previously read events were successfully processed).
*
* @param maxEvents maximum number of events/elements to return
*
* @exception IOException if an I/O error occurs
*
* @exception ClassNotFoundException if a class for the serialized
* object could not be found
*
* @exception NoSuchElementException if no event is available
*/
RemoteEventData[] readAhead(int maxEvents)
throws IOException, ClassNotFoundException;
/**
* Effectively removes the last set of read events from the log.
* It does this by advancing the read pointer to the
* next available event after the event associated with the provided
* cookie object.
*
* @param cookie object associated with event to read past. This object
* should have been obtained from a call to
* <code>getCookie()</code> on a <code>RemoteEventData</code> object
* obtained from a call to <code>readAhead</code> on this event log.
*
* @exception IOException if there was a problem advancing the read pointer.
* @exception NullPointerException if <code>cookie</code> is null.
* @exception ClassCastException if <code>cookie</code>
* is not an expected type.
*
*/
void moveAhead(Object cookie) throws IOException;
/**
* Close this log and release any associated runtime resources.
*/
void close() throws IOException;
/**
* Delete associated storage resources for this log.
*
* @exception IOException if an IO error occurs
*/
void delete() throws IOException;
}