package org.webpieces.plugins.hibernate.app;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.persistence.EntityManager;
import org.webpieces.plugins.hibernate.Em;
import org.webpieces.plugins.hibernate.app.dbo.UserTestDbo;
import org.webpieces.router.api.actions.Actions;
import org.webpieces.router.api.actions.Redirect;
import org.webpieces.router.api.actions.Render;
import org.webpieces.util.logging.Logger;
import org.webpieces.util.logging.LoggerFactory;
@Singleton
public class HibernateAsyncController {
private static final Logger log = LoggerFactory.getLogger(HibernateController.class);
private final Executor exec;
@Inject
public HibernateAsyncController(Executor exec) {
this.exec = exec;
}
public CompletableFuture<Redirect> save() {
EntityManager mgr = Em.get();
CompletableFuture<Integer> future = new CompletableFuture<Integer>();
kickOffAsyncResponse(future);
return future.thenApply(intVal -> runSave(mgr));
}
public Redirect runSave(EntityManager mgr) {
UserTestDbo user = new UserTestDbo();
user.setEmail("dean@async.xsoftware.biz");
user.setName("SomeName");
mgr.persist(user);
mgr.flush();
return Actions.redirect(HibernateRouteId.ASYNC_DISPLAY_ENTITY, "id", user.getId());
}
public CompletableFuture<Render> display(Integer id) {
EntityManager mgr = Em.get();
CompletableFuture<Integer> future = new CompletableFuture<Integer>();
kickOffAsyncResponse(future);
return future.thenApply(intVal -> runDisplay(mgr, id));
}
private Render runDisplay(EntityManager mgr, Integer id) {
UserTestDbo user = mgr.find(UserTestDbo.class, id);
return Actions.renderThis("user", user);
}
public CompletableFuture<Render> entityLoad(Integer id) {
EntityManager mgr = Em.get();
CompletableFuture<Integer> future = new CompletableFuture<Integer>();
kickOffAsyncResponse(future);
return future.thenApply(intVal -> runEntityLoad(mgr, id));
}
private Render runEntityLoad(EntityManager mgr, Integer id) {
UserTestDbo user = mgr.find(UserTestDbo.class, id);
log.info("user loaded");
return Actions.renderThis("user", user);
}
private void kickOffAsyncResponse(CompletableFuture<Integer> future) {
exec.execute(new Runnable() {
@Override
public void run() {
future.complete(1);
}
});
}
}