package com.griddynamics.jagger.jaas.storage;
import java.io.Serializable;
import java.util.Collection;
/**
* Interface for generic CRUD operations on a repository for a specific type.
*/
public interface CrudDao<T, ID extends Serializable> {
/**
* Saves a given entity.
*
* @param entity entity to create.
*/
void create(T entity);
/**
* Saves all given entities.
*
* @param entities entities to create.
* @throws IllegalArgumentException in case the given entity is {@literal null}.
*/
void create(Iterable<T> entities);
/**
* Retrieves an entity by its id.
*
* @param id must not be {@literal null}.
* @return the entity with the given id or {@literal null} if none found
* @throws IllegalArgumentException if {@code id} is {@literal null}
*/
T read(ID id);
/**
* Returns all instances of the type.
*
* @return all entities
*/
Collection<T> readAll();
/**
* Returns all instances of the type with the given IDs.
*
* @param ids ids of entities to read.
* @return all entities with given IDs.
*/
Collection<T> readAll(Iterable<ID> ids);
/**
* Updates a given entity.
*
* @param entity entity to update.
*/
void update(T entity);
/**
* Creates a given entity if it doesn't exist or updates it otherwise.
*
* @param entity entity to create or upddate.
*/
void createOrUpdate(T entity);
/**
* Deletes the entity with the given id.
*
* @param id must not be {@literal null}.
* @throws IllegalArgumentException in case the given {@code id} is {@literal null}
*/
void delete(ID id);
/**
* Deletes a given entity.
*
* @param entity entity to delete.
* @throws IllegalArgumentException in case the given entity is {@literal null}.
*/
void delete(T entity);
/**
* Deletes the given entities.
*
* @param entities entities to delete.
* @throws IllegalArgumentException in case the given {@link Iterable} is {@literal null}.
*/
void delete(Iterable<T> entities);
/**
* Deletes all entities managed by the repository.
*/
void deleteAll();
/**
* Returns whether an entity with the given id exists.
*
* @param id must not be {@literal null}.
* @return true if an entity with the given id exists, {@literal false} otherwise
* @throws IllegalArgumentException if {@code id} is {@literal null}
*/
boolean exists(ID id);
/**
* Returns the number of entities available.
*
* @return the number of entities
*/
long count();
}