]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedExecutionServerImpl.java
Clean requests and answers from previous builds
[gpl/argeo-slc.git] / org.argeo.slc.detached / src / main / java / org / argeo / slc / detached / DetachedExecutionServerImpl.java
index 5d168675c9a766cb888b1c2e84d146573cf3f9c6..1a601310b309fdf99e22e979158671245f6874e3 100644 (file)
@@ -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();
        }
 
 }