You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2011/05/23 10:42:07 UTC

svn commit: r1126382 - /karaf/trunk/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java

Author: jbonofre
Date: Mon May 23 08:42:07 2011
New Revision: 1126382

URL: http://svn.apache.org/viewvc?rev=1126382&view=rev
Log:
[KARAF-614] Add a force option and a time argument. The osgi:shutdown command now looks like the Unix shutdown command.

Modified:
    karaf/trunk/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java

Modified: karaf/trunk/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java?rev=1126382&r1=1126381&r2=1126382&view=diff
==============================================================================
--- karaf/trunk/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java (original)
+++ karaf/trunk/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java Mon May 23 08:42:07 2011
@@ -16,22 +16,71 @@
  */
 package org.apache.karaf.shell.osgi;
 
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.apache.felix.gogo.commands.Command;
 import org.osgi.framework.Bundle;
 
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
 /**
  * Command to shut down Karaf
  */
 @Command(scope = "osgi", name = "shutdown", description = "Shuts the framework down.")
 public class Shutdown extends OsgiCommandSupport {
 
+    @Option(name = "-f", aliases = "--force", description = "Force the shutdown without confirmation message.", required = false, multiValued = false)
+    boolean force = false;
+
+    @Argument(name = "time", index = 0, description = "Shutdown after a specified delay. The time argument can have different" +
+            " formats. First, it can be an abolute time in the format hh:mm, in which hh is the hour (1 or 2 digits) and mm" +
+            " is the minute of the hour (in two digits). Second, it can be in the format +m, in which m is the number of minutes" +
+            " to wait. The word now is an alias for +0.", required = false, multiValued = false)
+    String time;
+
     protected Object doExecute() throws Exception {
-        for (;;) {
+
+        long sleep = 0;
+        if (time != null) {
+            if (!time.equals("now")) {
+                if (time.startsWith("+")) {
+                    // delay in number of minutes provided
+                    time = time.substring(1);
+                    try {
+                        sleep = Long.parseLong(time) * 60 * 1000;
+                    } catch (Exception e) {
+                        System.err.println("Invalid time argument.");
+                        return null;
+                    }
+                } else {
+                    // try to parse the date in hh:mm
+                    String[] strings = time.split(":");
+                    if (strings.length != 2) {
+                        System.err.println("Invalid time argument.");
+                        return null;
+                    }
+                    GregorianCalendar currentDate = new GregorianCalendar();
+                    GregorianCalendar shutdownDate = new GregorianCalendar(currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE), Integer.parseInt(strings[0]), Integer.parseInt(strings[1]));
+                    if (shutdownDate.before(currentDate)) {
+                        shutdownDate.set(Calendar.DATE, shutdownDate.get(Calendar.DATE) + 1);
+                    }
+                    sleep = shutdownDate.getTimeInMillis() - currentDate.getTimeInMillis();
+                }
+            }
+        }
+
+        if (force) {
+            this.shutdown(sleep);
+            return null;
+        }
+
+        for (; ; ) {
             StringBuffer sb = new StringBuffer();
             System.err.println("Do you really want to shutdown (yes/no): ");
             System.err.flush();
-            for (;;) {
+            for (; ; ) {
                 int c = session.getKeyboard().read();
                 if (c < 0) {
                     return null;
@@ -44,19 +93,27 @@ public class Shutdown extends OsgiComman
             }
             String str = sb.toString();
             if (str.equals("yes")) {
-                new Thread() {
-                    public void run() {
-                        try {
-                            Bundle bundle = getBundleContext().getBundle(0);
-                            bundle.stop();
-                        } catch (Exception e) {
-                            log.error("Error when shutting down Apache Karaf", e);
-                        }
-                    }
-                }.start();
+                this.shutdown(sleep);
             }
             return null;
         }
     }
 
+    private void shutdown(final long sleep) {
+        new Thread() {
+            public void run() {
+                try {
+                    if (sleep > 0) {
+                        System.err.println("Shutdown in " + sleep/1000/60 + " minute(s).");
+                    }
+                    Thread.sleep(sleep);
+                    Bundle bundle = getBundleContext().getBundle(0);
+                    bundle.stop();
+                } catch (Exception e) {
+                    log.error("Error when shutting down", e);
+                }
+            }
+        }.start();
+    }
+
 }