package org.infinispan.client.hotrod.event;

/**
 * The events generated by default contain just enough information to make the
 * event relevant, but they avoid cramming too much information in order to reduce
 * the cost of sending them. Optionally, the information shipped in the events
 * can be customised in order to contain more information, such as values, or to
 * contain even less information. This customization is done with org.infinispan.notifications.cachelistener.filter.CacheEventConverter
 * instances generated by an org.infinispan.notifications.cachelistener.filter.CacheEventConverterFactory.
 *
 * As a result of this conversion, custom events are represented by this class,
 * and are expected in methods annotation with either
 * {@link org.infinispan.client.hotrod.annotation.ClientCacheEntryCreated},
 * {@link org.infinispan.client.hotrod.annotation.ClientCacheEntryModified} or,
 * {@link org.infinispan.client.hotrod.annotation.ClientCacheEntryRemoved}.
 * The event parameter for any of these callbacks is always a {@link ClientCacheEntryCustomEvent},
 * and if needed, the event's {@link org.infinispan.client.hotrod.event.ClientCacheEntryCustomEvent#getType()}
 * can be queried to find out whether the originating event was the result of create,
 * modified or removed.
 *
 * @param <T> Type of customized event data. It needs to be marshallable.
 */
public interface ClientCacheEntryCustomEvent<T> extends ClientEvent {

   /**
    * Customized event data. It can be any type as long as it can be converted
    * to binary format for shipping between the server and client.
    *
    * @return an instance of the customised event data.
    */
   T getEventData();

   /**
    * This will be true if the write command that caused this had to be retried
    * again due to a topology change.  This could be a sign that this event
    * has been duplicated or another event was dropped and replaced
    * (eg: ModifiedEvent replaced CreateEvent)
    *
    * @return Whether the command that caused this event was retried
    */
   boolean isCommandRetried();

}
