package org.gcube.application.geoportal.service.rest; import lombok.extern.slf4j.Slf4j; import org.gcube.application.geoportal.service.model.internal.faults.InvalidLockException; import org.gcube.application.geoportal.service.model.internal.faults.ProjectLockedException; import org.gcube.application.geoportal.service.model.internal.faults.ProjectNotFoundException; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response.Status; import java.util.ArrayList; import java.util.List; @Slf4j public abstract class GuardedMethod { private static List preoperations=new ArrayList<>(); public static void addPreoperation(Runnable preoperation){ preoperations.add(preoperation); } private T result=null; public GuardedMethod execute() throws WebApplicationException{ try { if(!preoperations.isEmpty()) { log.trace("Running preops (size : {} )", preoperations.size()); for (Runnable r : preoperations) r.run(); } log.trace("Executing actual method.."); result=run(); return this; }catch(WebApplicationException e) { log.error("Throwing Web Application Exception ", e); throw e; }catch(ProjectNotFoundException e){ throw new WebApplicationException("Project not found", e,Status.NOT_FOUND); }catch(ProjectLockedException e){ throw new WebApplicationException("Project is currently locked", e,Status.PRECONDITION_FAILED); }catch(InvalidLockException e){ log.error("Lock exception ",e); throw new WebApplicationException("Conflicts found in locks", e,Status.CONFLICT); }catch(Throwable t) { log.error("Unexpected error ",t); throw new WebApplicationException("Unexpected internal error", t,Status.INTERNAL_SERVER_ERROR); } } public T getResult() { return result; } protected abstract T run() throws Exception,WebApplicationException; }