Deal with destruction callbacks
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 6 Nov 2012 16:17:12 +0000 (16:17 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 6 Nov 2012 16:17:12 +0000 (16:17 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@5713 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

demo/log4j.properties
demo/slc_demo_rcp.properties
runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionStack.java
runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/ExecutionScope.java
runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/ExecutionThread.java
runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/execution/ExecutionStack.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/JcrTestResult.java

index d034a2afba8af0f79e066e19de012d368603c372..bdb2d65751fc5b417f0dc6a41d77e82beaa4b0c6 100644 (file)
@@ -7,6 +7,9 @@ log4j.logger.org.argeo.jackrabbit.remote.ExtendedDispatcherServlet=ERROR
 log4j.logger.org.springframework.web.servlet.PageNotFound=ERROR
 log4j.logger.org.argeo.server.webextender.TomcatDeployer=WARN
 
+#log4j.logger.org.apache=DEBUG
+#log4j.logger.org.springframework.security=DEBUG
+
 log4j.logger.org.apache.coyote=INFO
 log4j.logger.org.apache.catalina.core.ContainerBase=INFO
 log4j.logger.org.apache.directory.server=ERROR
index e711309935274ce0ce4bd0c6d4572b999d4b3903..99c953672466b11ffdb344ca31873a68785fa821 100644 (file)
@@ -8,6 +8,9 @@ org.argeo.slc.agent,\
 org.argeo.slc.agent.jcr,\
 org.argeo.slc.support.maven,\
 org.argeo.slc.server.repo,\
+org.argeo.dep.osgi.catalina.start,\
+org.springframework.osgi.web.extender,\
+org.argeo.jackrabbit.webapp,\
 
 # Start internal web server
 #org.argeo.dep.osgi.catalina.start,\
index 3f01b372e24a5849034221f1de2bcf785cf72048..06c71e73d165274be73d0e61fb8a29d42e9e7bab 100644 (file)
@@ -27,6 +27,7 @@ import org.argeo.slc.execution.ExecutionFlow;
 import org.argeo.slc.execution.ExecutionSpecAttribute;
 import org.argeo.slc.execution.ExecutionStack;
 
+/** Canonical implementation of an execution stack. */
 public class DefaultExecutionStack implements ExecutionStack {
 
        private final static Log log = LogFactory
index 3605d03a31892893464edded4395f3158f857e2c..42fc59522e4cb16e7def6765913e45a6bfe5d8e4 100644 (file)
@@ -131,8 +131,11 @@ public class ExecutionScope implements Scope {
        }
 
        public void registerDestructionCallback(String name, Runnable callback) {
-               // TODO: implement it
-               // throw new UnsupportedOperationException();
+               if (Thread.currentThread() instanceof ExecutionThread) {
+                       ExecutionThread executionThread = (ExecutionThread) Thread
+                                       .currentThread();
+                       executionThread.registerDestructionCallback(name, callback);
+               }
        }
 
        public Object remove(String name) {
index 190481b7104a4ce703b3bcc11e4a3649e53d77a4..bf92c1c60afd02adaba2b182c3051d7172e57218 100644 (file)
@@ -15,6 +15,9 @@
  */
 package org.argeo.slc.core.execution;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.SlcException;
@@ -33,6 +36,8 @@ public class ExecutionThread extends Thread {
        private final RealizedFlow realizedFlow;
        private final ProcessThread processThread;
 
+       private List<Runnable> destructionCallbacks = new ArrayList<Runnable>();
+
        public ExecutionThread(ProcessThread processThread,
                        RealizedFlow realizedFlow) {
                super(processThread.getProcessThreadGroup(), "Flow "
@@ -49,12 +54,6 @@ public class ExecutionThread extends Thread {
                        throw new SlcException("Can only execute authenticated threads");
                SecurityContextHolder.getContext().setAuthentication(authentication);
 
-               if (getContextClassLoader() != null) {
-                       if (log.isTraceEnabled())
-                               log.trace("Context class loader set to "
-                                               + getContextClassLoader());
-               }
-
                // Retrieve execution flow descriptor
                ExecutionFlowDescriptor executionFlowDescriptor = realizedFlow
                                .getFlowDescriptor();
@@ -84,6 +83,7 @@ public class ExecutionThread extends Thread {
                        processThread.flowCompleted();
                        dispatchAddStep(new ExecutionStep(realizedFlow.getModuleName(),
                                        ExecutionStep.PHASE_END, "Flow " + flowName));
+                       processDestructionCallbacks();
                }
        }
 
@@ -91,6 +91,25 @@ public class ExecutionThread extends Thread {
                processThread.getProcessThreadGroup().dispatchAddStep(step);
        }
 
+       private synchronized void processDestructionCallbacks() {
+               for (int i = destructionCallbacks.size() - 1; i >= 0; i--) {
+                       try {
+                               destructionCallbacks.get(i).run();
+                       } catch (Exception e) {
+                               log.warn("Could not process destruction callback " + i
+                                               + " in thread " + getName(), e);
+                       }
+               }
+       }
+
+       /**
+        * Gather object destruction callback to be called in reverse order at the
+        * end of the thread
+        */
+       synchronized void registerDestructionCallback(String name, Runnable callback) {
+               destructionCallbacks.add(callback);
+       }
+
        protected ProcessThreadGroup getProcessThreadGroup() {
                return processThread.getProcessThreadGroup();
        }
index 26e4fded6a30a4ad7f1bde56dc618311deee34ca..7459ea964c985a8fedc8ad10bbd21286af910a4b 100644 (file)
@@ -15,6 +15,7 @@
  */
 package org.argeo.slc.execution;
 
+/** Deal with nested level of executions using different vartiables. */
 public interface ExecutionStack {
        /**
         * @param name
index 3006266f3ceb6a93c0e42715f5216070663a5213..d7f0b434d5d74b0c7814f93144573b504d9b86d1 100644 (file)
@@ -30,6 +30,8 @@ import javax.jcr.Session;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryManager;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.core.attachment.Attachment;
@@ -44,6 +46,8 @@ import org.argeo.slc.test.TestStatus;
  * {@link SlcTypes#SLC_TEST_RESULT}.
  */
 public class JcrTestResult implements TestResult, SlcNames, AttachmentsEnabled {
+       private final static Log log = LogFactory.getLog(JcrTestResult.class);
+
        /** Should only be set for an already existing result. */
        private String uuid;
        private Repository repository;
@@ -79,6 +83,8 @@ public class JcrTestResult implements TestResult, SlcNames, AttachmentsEnabled {
                                        resultNode.setProperty(property, attributes.get(attr));
                                }
                                session.save();
+                               if (log.isDebugEnabled())
+                                       log.debug("Created test result " + uuid);
                        }
                } catch (Exception e) {
                        JcrUtils.discardQuietly(session);
@@ -88,6 +94,8 @@ public class JcrTestResult implements TestResult, SlcNames, AttachmentsEnabled {
 
        public void destroy() {
                JcrUtils.logoutQuietly(session);
+               if (log.isTraceEnabled())
+                       log.trace("Logged out session for result " + uuid);
        }
 
        public Node getNode() {
@@ -111,6 +119,10 @@ public class JcrTestResult implements TestResult, SlcNames, AttachmentsEnabled {
        }
 
        public void notifyTestRun(TestRun testRun) {
+               // TODO store meta data about the test running
+               // if (log.isDebugEnabled())
+               // log.debug("Running test "
+               // + testRun.getTestDefinition().getClass().getName() + "...");
        }
 
        public void addResultPart(TestResultPart testResultPart) {
@@ -213,9 +225,4 @@ public class JcrTestResult implements TestResult, SlcNames, AttachmentsEnabled {
        public void setCredentials(Credentials credentials) {
                this.credentials = credentials;
        }
-
-       // public void setLogoutWhenDestroyed(Boolean logoutWhenDestroyed) {
-       // this.logoutWhenDestroyed = logoutWhenDestroyed;
-       // }
-
 }