X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.detached%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fdetached%2FDetachedExecutionServerImpl.java;h=1a601310b309fdf99e22e979158671245f6874e3;hb=2c5e642009d14c2ca4faf74e8b137de478b237f0;hp=5d168675c9a766cb888b1c2e84d146573cf3f9c6;hpb=63799a559f90483285001a6807ea2f1df120bf37;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java index 5d168675c..1a601310b 100644 --- a/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java +++ b/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java @@ -20,24 +20,15 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer { private int skipCount = 0; private BundleContext bundleContext; - //private DetachedDriver driver; - - //private boolean active = false; - -// public void setDriver(DetachedDriver driver) { -// this.driver = driver; -// } public DetachedExecutionServerImpl() { detachedContext = new DetachedContextImpl(); sessions = new Vector(); } - public synchronized DetachedAnswer executeStep(DetachedRequest request) { + public synchronized DetachedAnswer executeRequest(DetachedRequest request) { DetachedAnswer answer = null; try { - DetachedStep step = null; - // Find action ServiceReference[] refs = bundleContext.getAllServiceReferences( StaticRefProvider.class.getName(), null); @@ -57,90 +48,101 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer { // Execute actions if (obj instanceof DetachedStep) { - if (getCurrentSession() == null) - throw new DetachedException("No open session."); - - StringBuffer skippedLog = new StringBuffer(); - boolean execute = true; - if (getPreviousSession() != null - && !getPreviousSession().isClosed()) { - if (getCurrentSession().getDoItAgainPolicy().equals( - DetachedSession.SKIP_UNTIL_ERROR)) { - // Skip execution of already successful steps - if (getPreviousSession().getAnswers().size() > skipCount) { - DetachedAnswer previousAnswer = (DetachedAnswer) getPreviousSession() - .getAnswers().get(skipCount); - DetachedRequest previousRequest = (DetachedRequest) getPreviousSession() - .getRequests().get(skipCount); - // Check paths - if (!previousRequest.getPath().equals( - request.getPath())) { - String msg = "New request is not consistent with previous path. previousPath=" - + previousRequest.getPath() - + ", newPath=" - + request.getPath() - + "\n"; - skippedLog.append(msg); - log.warn(msg); - } - - if (previousAnswer.getStatus() != DetachedAnswer.ERROR) { - execute = false; - } - } else { - // went further as skip count, doing nothing. - } - } - } - - if (execute) { - step = (DetachedStep) obj; - answer = step.execute(detachedContext, request); - } else { - skippedLog.append("Skipped path " + request.getPath() - + " (skipCount=" + skipCount + ")"); - answer = new DetachedAnswer(request); - answer.setStatus(DetachedAnswer.SKIPPED); - answer.setLog(skippedLog.toString()); - } + answer = processStep((DetachedStep) obj, request); } else if (obj instanceof DetachedAdminCommand) { - if (obj instanceof OpenSession) { - if (getCurrentSession() != null) - throw new DetachedException( - "There is already an open session #" - + getCurrentSession().getUuid()); - sessions.add(((OpenSession) obj).execute(request, - bundleContext)); - answer = new DetachedAnswer(request, "Session #" - + getCurrentSession().getUuid() + " open."); - } else if (obj instanceof CloseSession) { - if (getCurrentSession() == null) - throw new DetachedException( - "There is no open session to close"); - answer = new DetachedAnswer(request, "Session #" - + getCurrentSession().getUuid() + " closed."); - answer.setStatus(DetachedAnswer.CLOSED_SESSION); - } + answer = processAdminCommand((DetachedAdminCommand) obj, + request); } - if (answer == null) + if (answer == null) { throw new DetachedException("Unknown action type " + obj.getClass() + " for action with ref " + request.getRef()); - - } catch (DetachedException e) { + } + } catch (Exception e) { answer = new DetachedAnswer(request); answer.setStatus(DetachedAnswer.ERROR); answer.setLog(e.getMessage()); - } catch (Exception e) { - e.printStackTrace(); - throw new DetachedException( - "Unexpected exception while executing request " + request, - e); } getCurrentSession().getRequests().add(request); getCurrentSession().getAnswers().add(answer); + if (log.isDebugEnabled()) + log.debug("Processed '" + request.getRef() + "' (status=" + + answer.getStatusAsString() + ", path=" + + request.getPath() + ")"); + return answer; + } + + protected DetachedAnswer processStep(DetachedStep obj, + DetachedRequest request) { + DetachedAnswer answer; + if (getCurrentSession() == null) + throw new DetachedException("No open session."); + + StringBuffer skippedLog = new StringBuffer(); + boolean execute = true; + if (getPreviousSession() != null && !getPreviousSession().isClosed()) { + if (getCurrentSession().getDoItAgainPolicy().equals( + DetachedSession.SKIP_UNTIL_ERROR)) { + // Skip execution of already successful steps + if (getPreviousSession().getAnswers().size() > skipCount) { + DetachedAnswer previousAnswer = (DetachedAnswer) getPreviousSession() + .getAnswers().get(skipCount); + DetachedRequest previousRequest = (DetachedRequest) getPreviousSession() + .getRequests().get(skipCount); + // Check paths + if (!previousRequest.getPath().equals(request.getPath())) { + String msg = "New request is not consistent with previous path. previousPath=" + + previousRequest.getPath() + + ", newPath=" + + request.getPath() + "\n"; + skippedLog.append(msg); + log.warn(msg); + } + + if (previousAnswer.getStatus() != DetachedAnswer.ERROR) { + execute = false; + } + } else { + // went further as skip count, doing nothing. + } + } + } + + if (execute) { + DetachedStep step = (DetachedStep) obj; + answer = step.execute(detachedContext, request); + } else { + skippedLog.append("Skipped path " + request.getPath() + + " (skipCount=" + skipCount + ")"); + answer = new DetachedAnswer(request); + answer.setStatus(DetachedAnswer.SKIPPED); + answer.setLog(skippedLog.toString()); + } + return answer; + } + + protected DetachedAnswer processAdminCommand(DetachedAdminCommand obj, + DetachedRequest request) { + DetachedAnswer answer; + if (obj instanceof OpenSession) { + if (getCurrentSession() != null) + throw new DetachedException( + "There is already an open session #" + + getCurrentSession().getUuid()); + sessions.add(((OpenSession) obj).execute(request, bundleContext)); + answer = new DetachedAnswer(request, "Session #" + + getCurrentSession().getUuid() + " open."); + } else if (obj instanceof CloseSession) { + if (getCurrentSession() == null) + throw new DetachedException("There is no open session to close"); + answer = new DetachedAnswer(request, "Session #" + + getCurrentSession().getUuid() + " closed."); + answer.setStatus(DetachedAnswer.CLOSED_SESSION); + } else { + answer = null; + } return answer; } @@ -171,28 +173,6 @@ public class DetachedExecutionServerImpl implements DetachedExecutionServer { public void init(BundleContext bundleContext) { this.bundleContext = bundleContext; -// Thread driverThread = new Thread(new Runnable() { -// -// public void run() { -// while (active) { -// try { -// DetachedRequest request = driver.receiveRequest(); -// DetachedAnswer answer = executeStep(request); -// driver.sendAnswer(answer); -// } catch (Exception e) { -// if (e instanceof RuntimeException) -// throw (RuntimeException) e; -// else -// e.printStackTrace(); -// } -// } -// -// } -// }, "driverThread"); -// -// active = true; -// -// driverThread.start(); } }