package io.fathom.cloud.persist;
import com.google.common.base.Preconditions;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.google.inject.persist.PersistService;
import com.google.inject.persist.UnitOfWork;
@Singleton
class ZookeeperPersistService implements Provider<ZookeeperEntityManager>, UnitOfWork, PersistService {
private final ThreadLocal<ZookeeperEntityManager> entityManager = new ThreadLocal<ZookeeperEntityManager>();
// private final String persistenceUnitName;
// private final Properties persistenceProperties;
//
// @Inject
// public ZookeeperPersistService(@Jpa String persistenceUnitName,
// @Nullable @Jpa Properties persistenceProperties) {
// this.persistenceUnitName = persistenceUnitName;
// this.persistenceProperties = persistenceProperties;
// }
@Override
public ZookeeperEntityManager get() {
if (!isWorking()) {
begin();
}
ZookeeperEntityManager em = entityManager.get();
Preconditions.checkState(null != em, "Requested EntityManager outside work unit. "
+ "Try calling UnitOfWork.begin() first, or use a PersistFilter if you "
+ "are inside a servlet environment.");
return em;
}
public boolean isWorking() {
return entityManager.get() != null;
}
@Override
public void begin() {
Preconditions.checkState(null == entityManager.get(),
"Work already begun on this thread. Looks like you have called UnitOfWork.begin() twice"
+ " without a balancing call to end() in between.");
entityManager.set(emFactory.createEntityManager());
}
@Override
public void end() {
ZookeeperEntityManager em = entityManager.get();
// Let's not penalize users for calling end() multiple times.
if (null == em) {
return;
}
em.close();
entityManager.remove();
}
private volatile ZookeeperEntityManagerFactory emFactory = new ZookeeperEntityManagerFactory();
@Override
public synchronized void start() {
// if (this.emFactory == null) {
// Preconditions.checkState(null == emFactory,
// "Persistence service was already initialized.");
//
// // if (null != persistenceProperties) {
// // this.emFactory = Persistence.createEntityManagerFactory(
// // persistenceUnitName, persistenceProperties);
// // } else {
// // this.emFactory = Persistence
// // .createEntityManagerFactory(persistenceUnitName);
// // }
//
// this.emFactory = new ZookeeperEntityManagerFactory();
// }
}
@Override
public synchronized void stop() {
// Preconditions.checkState(emFactory.isOpen(),
// "Persistence service was already shut down.");
// emFactory.close();
}
@Singleton
public static class EntityManagerFactoryProvider implements Provider<ZookeeperEntityManagerFactory> {
private final ZookeeperPersistService emProvider;
@Inject
public EntityManagerFactoryProvider(ZookeeperPersistService emProvider) {
this.emProvider = emProvider;
}
@Override
public ZookeeperEntityManagerFactory get() {
assert null != emProvider.emFactory;
return emProvider.emFactory;
}
}
}