package org.dcache.pinmanager; import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.jdbc.JdbcUpdateAffectedIncorrectNumberOfRowsException; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import javax.security.auth.Subject; import java.util.Date; import java.util.List; import diskCacheV111.util.PnfsId; import org.dcache.pinmanager.model.Pin; /** * Data Access Object abstraction for pin persistence. * * Provides a fluent API for CRUD operations. */ @ParametersAreNonnullByDefault public interface PinDao { /** * Returns a criterion builder. */ PinCriterion where(); /** * Returns a field value builder. */ PinUpdate set(); /** * Creates a new pin with the given field values. */ Pin create(PinUpdate update); /** * Returns the pins matching a selection criterion. */ List<Pin> get(PinCriterion criterion); /** * Returns the pins matching a selection criterion with an * upper limit on the number of pins returned. */ List<Pin> get(PinCriterion criterion, int limit); /** * Returns the pin matching a unique criterion. * * @return The matching pin or null if the criterion did not match a pin * @throws IncorrectResultSizeDataAccessException if more than one * pin has been found for the given criterion. */ @Nullable Pin get(UniquePinCriterion criterion); /** * Returns the number of pins matching a selection criterion. */ int count(PinCriterion criterion); /** * Updates a specific pin with the given field values. * * @return The updated pin or null if the criterion did not match a pin * @throws JdbcUpdateAffectedIncorrectNumberOfRowsException if more than one row is updated. */ @Nullable default Pin update(Pin pin, PinUpdate update) { return update(where().id(pin.getPinId()), update); } /** * Updates a pin matching a unique criterion with the given field * values. * * @return The updated pin or null if the criterion did not match a pin * @throws JdbcUpdateAffectedIncorrectNumberOfRowsException if more than one row is updated. */ @Nullable Pin update(UniquePinCriterion criterion, PinUpdate update); /** * Updates all pins matching a selection criterion with the given field * values. */ int update(PinCriterion criterion, PinUpdate update); /** * Deletes all pins matching a selection criterion. */ int delete(PinCriterion criterion); /** * Deletes a specific pin. */ default int delete(Pin pin) { return delete(where().id(pin.getPinId())); } /** * Performs the given action for every pin matching the selection criterion. */ void foreach(PinCriterion c, InterruptibleConsumer<Pin> f) throws InterruptedException; /** * Fluent interface to construct selection criteria. */ interface PinCriterion { UniquePinCriterion id(long id); PnfsIdPinCriterion pnfsId(PnfsId id); RequestIdPinCriterion requestId(String requestId); PinCriterion expirationTimeBefore(Date date); PinCriterion state(Pin.State state); PinCriterion stateIsNot(Pin.State state); PinCriterion pool(String pool); PinCriterion sticky(String sticky); UniquePinCriterion sameIdAs(UniquePinCriterion c); } /** * Fluent interface to construct selection criteria where the * PnfsId has been fixed. */ interface PnfsIdPinCriterion extends PinCriterion { UniquePinCriterion requestId(String requestId); PnfsIdPinCriterion expirationTimeBefore(Date date); PnfsIdPinCriterion state(Pin.State state); PnfsIdPinCriterion stateIsNot(Pin.State state); PnfsIdPinCriterion pool(String pool); PnfsIdPinCriterion sticky(String sticky); } /** * Fluent interface to construct selection criteria where the * request ID has been fixed. */ interface RequestIdPinCriterion extends PinCriterion { UniquePinCriterion pnfsId(PnfsId id); RequestIdPinCriterion expirationTimeBefore(Date date); RequestIdPinCriterion state(Pin.State state); RequestIdPinCriterion stateIsNot(Pin.State state); RequestIdPinCriterion pool(String pool); RequestIdPinCriterion sticky(String sticky); } /** * Fluent interface to construct selection criteria matching at * most a single pin. */ interface UniquePinCriterion extends PinCriterion, PnfsIdPinCriterion, RequestIdPinCriterion { UniquePinCriterion id(long id); UniquePinCriterion pnfsId(PnfsId id); UniquePinCriterion requestId(String requestId); UniquePinCriterion expirationTimeBefore(Date date); UniquePinCriterion state(Pin.State state); UniquePinCriterion stateIsNot(Pin.State state); UniquePinCriterion pool(String pool); UniquePinCriterion sticky(String sticky); } /** * Fluent interface to define pin field values. */ interface PinUpdate { PinUpdate expirationTime(@Nullable Date date); PinUpdate pool(@Nullable String pool); PinUpdate requestId(@Nullable String requestId); PinUpdate state(Pin.State state); PinUpdate sticky(@Nullable String sticky); PinUpdate subject(Subject subject); PinUpdate pnfsId(PnfsId pnfsId); } interface InterruptibleConsumer<T> { void accept(T v) throws InterruptedException; } }