Improve node deployment
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / CmsShutdown.java
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsShutdown.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsShutdown.java
new file mode 100644 (file)
index 0000000..a62ee7f
--- /dev/null
@@ -0,0 +1,70 @@
+package org.argeo.cms.internal.kernel;
+
+import java.io.IOException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.launch.Framework;
+
+/** Shutdowns the OSGi framework */
+class CmsShutdown extends Thread {
+       public final int EXIT_OK = 0;
+       public final int EXIT_ERROR = 1;
+       public final int EXIT_TIMEOUT = 2;
+       public final int EXIT_UNKNOWN = 3;
+
+       private final Log log = LogFactory.getLog(CmsShutdown.class);
+       // private final BundleContext bc =
+       // FrameworkUtil.getBundle(CmsShutdown.class).getBundleContext();
+       private final Framework framework;
+
+       /** Shutdown timeout in ms */
+       private long timeout = 10 * 60 * 1000;
+
+       public CmsShutdown() {
+               super("CMS Shutdown Hook");
+               framework = (Framework) FrameworkUtil.getBundle(CmsShutdown.class).getBundleContext().getBundle(0);
+       }
+
+       @Override
+       public void run() {
+               if (framework.getState() != Bundle.ACTIVE) {
+                       return;
+               }
+               
+               if (log.isDebugEnabled())
+                       log.debug("Shutting down OSGi framework...");
+               try {
+                       // shutdown framework
+                       framework.stop();
+                       // wait for shutdown
+                       FrameworkEvent shutdownEvent = framework.waitForStop(timeout);
+                       int stoppedType = shutdownEvent.getType();
+                       Runtime runtime = Runtime.getRuntime();
+                       if (stoppedType == FrameworkEvent.STOPPED) {
+                               // close VM
+                               //System.exit(EXIT_OK);
+                       } else if (stoppedType == FrameworkEvent.ERROR) {
+                               log.error("The OSGi framework stopped with an error");
+                               runtime.halt(EXIT_ERROR);
+                       } else if (stoppedType == FrameworkEvent.WAIT_TIMEDOUT) {
+                               log.error("The OSGi framework hasn't stopped after " + timeout + "ms."
+                                               + " Forcibly terminating the JVM...");
+                               runtime.halt(EXIT_TIMEOUT);
+                       } else {
+                               log.error("Unknown state of OSGi framework after " + timeout + "ms."
+                                               + " Forcibly terminating the JVM... (" + shutdownEvent + ")");
+                               runtime.halt(EXIT_UNKNOWN);
+                       }
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       log.error("Unexpected exception " + e + " in shutdown hook. " + " Forcibly terminating the JVM...");
+                       Runtime.getRuntime().halt(EXIT_UNKNOWN);
+               }
+       }
+
+}