You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2015/12/29 15:17:48 UTC

svn commit: r1722138 - /sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java

Author: bdelacretaz
Date: Tue Dec 29 14:17:48 2015
New Revision: 1722138

URL: http://svn.apache.org/viewvc?rev=1722138&view=rev
Log:
SLING-4728 - cleanup thread

Modified:
    sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java

Modified: sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java?rev=1722138&r1=1722137&r2=1722138&view=diff
==============================================================================
--- sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java (original)
+++ sling/trunk/contrib/crankstart/launcher/src/main/java/org/apache/sling/crankstart/junit/CrankstartSetup.java Tue Dec 29 14:17:48 2015
@@ -24,10 +24,12 @@ import org.junit.rules.ExternalResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** Setup a Crankstart-launched instance for our tests */ 
+/** JUnit Rule that starts a Crankstart instance, using a set of provisioning
+ *  models. See our integration tests for examples. 
+ */
 public class CrankstartSetup extends ExternalResource {
     
-    private final Logger log = LoggerFactory.getLogger(getClass());
+    private static final Logger log = LoggerFactory.getLogger(CrankstartSetup.class);
     private final int port = getAvailablePort();
     private final String storagePath = getOsgiStoragePath(); 
     private Thread crankstartThread;
@@ -35,16 +37,34 @@ public class CrankstartSetup extends Ext
     private final Properties replacementProps = new Properties();
     
     private static List<CrankstartSetup> toCleanup = new ArrayList<CrankstartSetup>();
+    private static Thread shutdownHook;
     
     private VariableResolver variablesResolver = new PropertiesVariableResolver(replacementProps, Launcher.VARIABLE_OVERRIDE_PREFIX);
     
     private String [] classpathModelPaths;
     
+    
     @Override
     public String toString() {
         return getClass().getSimpleName() + ", port " + port + ", OSGi storage " + storagePath;
     }
     
+    public CrankstartSetup() {
+        synchronized (getClass()) {
+            if(shutdownHook == null) {
+                shutdownHook = new Thread(CrankstartSetup.class.getSimpleName() + " shutdown thread") {
+                    @Override
+                    public void run() {
+                        log.info("Starting cleanup");
+                        cleanup();
+                        log.info("Cleanup done");
+                    }
+                };
+                Runtime.getRuntime().addShutdownHook(shutdownHook);
+            }
+        }
+    }
+    
     public CrankstartSetup withModelResources(String ... classpathModelPaths) {
         this.classpathModelPaths = classpathModelPaths;
         return this;
@@ -84,22 +104,28 @@ public class CrankstartSetup extends Ext
         return baseUrl;
     }
     
-    @Override
-    protected void before() throws Throwable {
-        if(crankstartThread != null) {
-            log.debug("Already running");
-            return;
-        }
-        
+    private static void cleanup() {
         synchronized (toCleanup) {
-            if(!toCleanup.isEmpty()) {
-                log.info("Stopping other Crankstart instances before starting this one...");
+            if(toCleanup.isEmpty()) {
+                log.info("No Crankstart instances to cleanup");
+                return;
             }
+            log.info("Stopping {} running Crankstart instances...", toCleanup.size());
             for(CrankstartSetup s : toCleanup) {
                 s.stopCrankstartInstance();
             }
             toCleanup.clear();
         }
+    }
+    
+    @Override
+    protected void before() throws Throwable {
+        if(crankstartThread != null) {
+            log.debug("Already running");
+            return;
+        }
+        
+        cleanup();
         
         log.info("Starting {}", this);