package ilarkesto.persistence;
import ilarkesto.core.logging.Log;
import ilarkesto.fp.Predicate;
import ilarkesto.id.IdentifiableResolver;
import java.util.Collection;
import java.util.List;
import java.util.Set;
public class TransactionService implements IdentifiableResolver<AEntity> {
private static final Log LOG = Log.get(TransactionService.class);
public TransactionService() {}
private Transaction createTransaction() {
Transaction t = new Transaction(entityStore);
LOG.debug("Transaction created: " + t);
return t;
}
private ThreadLocal<Transaction> threadLocalTransaction = new ThreadLocal<Transaction>();
private Transaction getCurrentTransaction(boolean autocreate) {
Transaction t = threadLocalTransaction.get();
if (t == null && autocreate) {
t = createTransaction();
threadLocalTransaction.set(t);
}
return t;
}
private Transaction getCurrentTransaction() {
return getCurrentTransaction(true);
}
public synchronized void commit() {
Transaction t = getCurrentTransaction(false);
if (t == null) {
// LOG.debug("No transaction to commit.");
return;
}
try {
t.commit();
} finally {
threadLocalTransaction.set(null);
}
}
public synchronized void cancel() {
Transaction t = getCurrentTransaction(false);
if (t == null) return;
LOG.debug("Cancelling transaction:", t);
threadLocalTransaction.set(null);
}
public boolean isPersistent(String id) {
return entityStore.getById(id) != null;
}
// --- delegations ---
@Override
public AEntity getById(String id) {
Transaction transaction = getCurrentTransaction(false);
if (transaction == null) {
return entityStore.getById(id);
} else {
return transaction.getById(id);
}
}
public AEntity getEntity(Predicate<Class> typeFilter, Predicate<AEntity> entityFilter) {
Transaction transaction = getCurrentTransaction(false);
if (transaction == null) {
return entityStore.getEntity(typeFilter, entityFilter);
} else {
return transaction.getEntity(typeFilter, entityFilter);
}
}
@Override
public List<AEntity> getByIds(Collection<String> ids) {
Transaction transaction = getCurrentTransaction(false);
if (transaction == null) {
return entityStore.getByIds(ids);
} else {
return transaction.getByIds(ids);
}
}
public Set<AEntity> getEntities(Predicate<Class> typeFilter, Predicate<AEntity> entityFilter) {
Transaction transaction = getCurrentTransaction(false);
if (transaction == null) {
return entityStore.getEntities(typeFilter, entityFilter);
} else {
return transaction.getEntities(typeFilter, entityFilter);
}
}
public int getEntitiesCount(Predicate<Class> typeFilter, Predicate<AEntity> entityFilter) {
Transaction transaction = getCurrentTransaction(false);
if (transaction == null) {
return entityStore.getEntitiesCount(typeFilter, entityFilter);
} else {
return transaction.getEntitiesCount(typeFilter, entityFilter);
}
}
public void deleteEntity(AEntity entity) {
getCurrentTransaction().deleteEntity(entity);
}
public void saveEntity(AEntity entity) {
getCurrentTransaction().saveEntity(entity);
}
public void registerEntity(AEntity entity) {
getCurrentTransaction().registerEntity(entity);
}
// --- dependencies ---
private EntityStore entityStore;
public void setEntityStore(EntityStore entityStore) {
this.entityStore = entityStore;
}
}