geoportal-data-viewer-app/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/ContextRequest.java

57 lines
1.5 KiB
Java

package org.gcube.portlets.user.geoportaldataviewer.server.util;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.gcube.portlets.user.geoportaldataviewer.shared.faults.ControlledError;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class ContextRequest<T> {
private static final Logger LOG = LoggerFactory.getLogger(ContextRequest.class);
private static List<Runnable> preoperations = new ArrayList<>();
public static void addPreoperation(Runnable preoperation) {
preoperations.add(preoperation);
}
protected HttpServletRequest request;
private T result = null;
public ContextRequest(HttpServletRequest httpRequest) {
this.request = httpRequest;
}
public ContextRequest<T> execute() throws Exception, ControlledError {
try {
if (!preoperations.isEmpty()) {
LOG.trace("Running preops (size : {} )", preoperations.size());
for (Runnable r : preoperations)
r.run();
}
LOG.debug("Context is " + SessionUtil.getCurrentContext(request, true));
LOG.debug("Context is " + SessionUtil.getCurrentToken(request, true) == null ? null : "***");
LOG.trace("Executing actual method..");
result = run();
return this;
} catch (ControlledError e) {
throw e;
} catch (Throwable t) {
LOG.error("Unexpected error ", t);
throw new Exception("Unexpected error contacting the infrastructure", t);
}
}
public T getResult() {
return result;
}
protected abstract T run() throws Exception, ControlledError;
}