package regexgolf2.services.persistence;
import javax.swing.JOptionPane;
import regexgolf2.model.ObservableObject;
import regexgolf2.model.containers.ContainerChangedEvent;
import regexgolf2.model.containers.ContainerChangedListener;
import regexgolf2.services.persistence.changetracking.PersistenceInformation;
import com.google.java.contract.Requires;
/**
* An instance of this class can be attached to a {@link Container}.
* It will delete any Item from the database that is removed from the container.
*/
public class DeleteHandler<T extends ObservableObject> implements ContainerChangedListener<T>
{
/**
* The actual strategy to delete an item from the database
*/
public static interface DeleteStrategy<T>
{
void delete(T item) throws PersistenceException;
}
private final PersistenceInformation _pss;
private final DeleteStrategy<T> _deleteStrategy;
@Requires(
{ "pss != null", "deleteStrategy != null" })
public DeleteHandler(PersistenceInformation pss, DeleteStrategy<T> deleteStrategy)
{
_pss = pss;
_deleteStrategy = deleteStrategy;
}
@Override
public void containerChanged(ContainerChangedEvent<? extends T> event)
{
T item = event.getRemovedItem();
if (item == null)
return;
if (_pss.isTracked(item))
{
boolean needsDBDelete = !_pss.isNew(item);
if (needsDBDelete)
performDBDelete(item);
}
}
private void performDBDelete(T item)
{
try
{
_deleteStrategy.delete(item);
} catch (PersistenceException e)
{
//TODO use proper error handler
JOptionPane.showMessageDialog(null, "DB Error while deleting");
}
}
}