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/12/01 15:53:08 UTC

svn commit: r1209110 - in /karaf/trunk: shell/dev/src/main/java/org/apache/karaf/shell/dev/ shell/dev/src/main/resources/OSGI-INF/blueprint/ system/commands/src/main/java/org/apache/karaf/system/commands/ system/core/src/main/java/org/apache/karaf/syst...

Author: jbonofre
Date: Thu Dec  1 14:53:06 2011
New Revision: 1209110

URL: http://svn.apache.org/viewvc?rev=1209110&view=rev
Log:
[KARAF-1073] Add support of -r (reboot) and -h (halt) options to the system:shutdown.
system:shutdown command replaces the dev:reboot command.

Removed:
    karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java
Modified:
    karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
    karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java
    karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java
    karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java
    karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java
    karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java

Modified: karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml?rev=1209110&r1=1209109&r2=1209110&view=diff
==============================================================================
--- karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml (original)
+++ karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml Thu Dec  1 14:53:06 2011
@@ -33,9 +33,6 @@
             <action class="org.apache.karaf.shell.dev.PrintStackTraces" />
         </command>
         <command>
-            <action class="org.apache.karaf.shell.dev.Restart" />
-        </command>
-        <command>
             <action class="org.apache.karaf.shell.dev.SystemProperty" />
         </command>
         <command>

Modified: karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java
URL: http://svn.apache.org/viewvc/karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java?rev=1209110&r1=1209109&r2=1209110&view=diff
==============================================================================
--- karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java (original)
+++ karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java Thu Dec  1 14:53:06 2011
@@ -31,6 +31,15 @@ public class Shutdown extends OsgiComman
     @Option(name = "-f", aliases = "--force", description = "Force the shutdown without confirmation message.", required = false, multiValued = false)
     boolean force = false;
 
+    @Option(name = "-r", aliases = "--reboot", description = "Reboot the Karaf container.", required = false, multiValued = false)
+    boolean reboot = false;
+
+    @Option(name = "-h", aliases = "--halt", description = "Halt the Karaf container.", required = false, multiValued = false)
+    boolean halt = false;
+
+    @Option(name = "-c", aliases = "--clean", description = "Clean the Karaf container (working directory) during reboot.", required = false, multiValued = false)
+    boolean clean = 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" +
@@ -44,15 +53,24 @@ public class Shutdown extends OsgiComman
     }
 
     protected Object doExecute() throws Exception {
+
         if (force) {
-            systemService.shutdown(time);
+            if (reboot) {
+                systemService.reboot(time, clean);
+            } else {
+                systemService.halt(time);
+            }
             return null;
         }
 
         for (; ; ) {
             StringBuffer sb = new StringBuffer();
             String karafName = System.getProperty("karaf.name");
-            System.err.println(String.format("Confirm: shutdown instance %s (yes/no): ",karafName));
+            if (reboot) {
+                System.err.println(String.format("Confirm: reboot instance %s (yes/no): ",karafName));
+            } else {
+                System.err.println(String.format("Confirm: halt instance %s (yes/no): ",karafName));
+            }
             System.err.flush();
             for (; ; ) {
                 int c = session.getKeyboard().read();
@@ -68,7 +86,11 @@ public class Shutdown extends OsgiComman
             }
             String str = sb.toString();
             if (str.equals("yes")) {
-                systemService.shutdown(time);
+                if (reboot) {
+                    systemService.reboot(time, clean);
+                } else {
+                    systemService.halt(time);
+                }
             }
             return null;
         }

Modified: karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java
URL: http://svn.apache.org/viewvc/karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java?rev=1209110&r1=1209109&r2=1209110&view=diff
==============================================================================
--- karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java (original)
+++ karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java Thu Dec  1 14:53:06 2011
@@ -22,19 +22,37 @@ package org.apache.karaf.system;
 public interface SystemService {
 
     /**
-     * Shutdown the Karaf container.
+     * Halt the Karaf container.
      */
-    void shutdown() throws Exception;
+    void halt() throws Exception;
 
     /**
-     * Shutdown the Karaf container.
+     * Halt the Karaf container.
      *
      * @param time shutdown 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
+     *  First, it can be an absolute 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.
      */
-    void shutdown(String time) throws Exception;
+    void halt(String time) throws Exception;
+
+    /**
+     * Reboot the Karaf container.
+     *
+     * @throws Exception
+     */
+    void reboot() throws Exception;
+
+    /**
+     * Reboot the Karaf container.
+     *
+     * @param time reboot delay. The time argument can have different formats.
+     *  First, it can be an absolute 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.
+     *  @param clean Force a clean restart by deleting the working directory.
+     */
+    void reboot(String time, boolean clean) throws Exception;
 
     /**
      * Set the system start level.

Modified: karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java?rev=1209110&r1=1209109&r2=1209110&view=diff
==============================================================================
--- karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java (original)
+++ karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java Thu Dec  1 14:53:06 2011
@@ -43,38 +43,20 @@ public class SystemServiceImpl implement
         return this.bundleContext;
     }
 
-    public void shutdown() throws Exception {
-        shutdown(null);
+    public void halt() throws Exception {
+        halt(null);
     }
 
-    public void shutdown(String time) throws Exception {
-        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) {
-                        throw new IllegalArgumentException("Time " + time + " is not valid");
-                    }
-                } else {
-                    // try to parse the date in hh:mm
-                    String[] strings = time.split(":");
-                    if (strings.length != 2) {
-                        throw new IllegalArgumentException("Time " + time + " is not valid");
-                    }
-                    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();
-                }
-            }
-        }
-        shutdown(sleep);
+    public void halt(String time) throws Exception {
+        shutdown(timeToSleep(time));
+    }
+
+    public void reboot() throws Exception {
+        reboot(null, false);
+    }
+
+    public void reboot(String time, boolean cleanup) throws Exception {
+        reboot(timeToSleep(time), true);
     }
 
     private void shutdown(final long sleep) {
@@ -83,12 +65,32 @@ public class SystemServiceImpl implement
                 try {
                     if (sleep > 0) {
                         LOGGER.info("Shutdown in " + sleep / 1000 / 60 + " minute(s)");
+                        System.err.println("Shutdown in " + sleep / 1000 / 60 + " minutes(s)");
                     }
                     Thread.sleep(sleep);
                     Bundle bundle = getBundleContext().getBundle(0);
                     bundle.stop();
                 } catch (Exception e) {
-                    LOGGER.error("Error when shutting down", e);
+                    LOGGER.error("Halt error", e);
+                }
+            }
+        }.start();
+    }
+
+    private void reboot(final long sleep, final boolean clean) {
+        new Thread() {
+            public void run() {
+                try {
+                    if (sleep > 0) {
+                        LOGGER.info("Reboot in " + sleep / 1000 / 60 + " minute(s)");
+                        System.err.println("Reboot in " + sleep / 1000 / 60 + " minute(s)");
+                    }
+                    Thread.sleep(sleep);
+                    System.setProperty("karaf.restart", "true");
+                    System.setProperty("karaf.restart.clean", Boolean.toString(clean));
+                    bundleContext.getBundle(0).stop();
+                } catch (Exception e) {
+                    LOGGER.error("Reboot error", e);
                 }
             }
         }.start();
@@ -128,4 +130,40 @@ public class SystemServiceImpl implement
         }
     }
 
+    /**
+     * Convert a time string to sleep period (in millisecond).
+     *
+     * @param time the time string.
+     * @return the corresponding sleep period in millisecond.
+     */
+    private long timeToSleep(String time) throws Exception {
+        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) {
+                        throw new IllegalArgumentException("Time " + time + " is not valid");
+                    }
+                } else {
+                    // try to parse the date in hh:mm
+                    String[] strings = time.split(":");
+                    if (strings.length != 2) {
+                        throw new IllegalArgumentException("Time " + time + " is not valid");
+                    }
+                    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();
+                }
+            }
+        }
+        return sleep;
+    }
+
 }

Modified: karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java
URL: http://svn.apache.org/viewvc/karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java?rev=1209110&r1=1209109&r2=1209110&view=diff
==============================================================================
--- karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java (original)
+++ karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java Thu Dec  1 14:53:06 2011
@@ -21,8 +21,10 @@ package org.apache.karaf.system.manageme
  */
 public interface SystemMBean {
 
-    void shutdown() throws Exception;
-    void shutdown(String time) throws Exception;
+    void halt() throws Exception;
+    void halt(String time) throws Exception;
+    void reboot() throws Exception;
+    void reboot(String time, boolean clean) throws Exception;
 
     void setStartLevel(int startLevel) throws Exception;
     int getStartLevel() throws Exception;

Modified: karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java?rev=1209110&r1=1209109&r2=1209110&view=diff
==============================================================================
--- karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java (original)
+++ karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java Thu Dec  1 14:53:06 2011
@@ -41,12 +41,20 @@ public class SystemMBeanImpl extends Sta
         return this.systemService;
     }
 
-    public void shutdown() throws Exception {
-        systemService.shutdown();
+    public void halt() throws Exception {
+        systemService.halt();
     }
 
-    public void shutdown(String time) throws Exception {
-        systemService.shutdown(time);
+    public void halt(String time) throws Exception {
+        systemService.halt(time);
+    }
+
+    public void reboot() throws Exception {
+        systemService.reboot();
+    }
+
+    public void reboot(String time, boolean clean) throws Exception {
+        systemService.reboot(time, clean);
     }
 
     public void setStartLevel(int startLevel) throws Exception {



Re: svn commit: r1209110 - in /karaf/trunk: shell/dev/src/main/java/org/apache/karaf/shell/dev/ shell/dev/src/main/resources/OSGI-INF/blueprint/ system/commands/src/main/java/org/apache/karaf/system/commands/ system/core/src/main/java/org/apache/karaf/syst...

Posted by Glen Mazza <gm...@talend.com>.
+    @Option(name = "-h", aliases = "--halt", description = "Halt the Karaf container.", required =


I'm not sure what "halt" means in this case. (What is the difference 
between system:shutdown and system:shutdown -h?)  "Halt" just means 
"stop", so it seems vague whether the Karaf process is being terminated 
with the -h option, or still running but no longer responsive to 
subsequent user input, or ?

@Option(name = "-r", aliases = "--reboot", description = "Reboot the Karaf container."


OK, but Karaf might be better off without a reboot option.  For systems 
that hold/run applications (Karaf, Tomcat, WebLogic, etc.) an admin IMO 
should do a clean shutdown followed by an explicit restart from an 
external script, rather than have it done internally by Karaf and risk 
the prior shutdown not being completely clean, or the subsequent startup 
not being initialized as if you restarted manually.  So I'm not sure 
many admins would use -reboot.  Just my $0.02.

Regards,
Glen


On 12/01/2011 09:53 AM, jbonofre@apache.org wrote:
> Author: jbonofre
> Date: Thu Dec  1 14:53:06 2011
> New Revision: 1209110
>
> URL: http://svn.apache.org/viewvc?rev=1209110&view=rev
> Log:
> [KARAF-1073] Add support of -r (reboot) and -h (halt) options to the system:shutdown.
> system:shutdown command replaces the dev:reboot command.
>
> Removed:
>      karaf/trunk/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java
> Modified:
>      karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
>      karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java
>      karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java
>      karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java
>      karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java
>      karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java
>
> Modified: karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
> URL: http://svn.apache.org/viewvc/karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml?rev=1209110&r1=1209109&r2=1209110&view=diff
> ==============================================================================
> --- karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml (original)
> +++ karaf/trunk/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml Thu Dec  1 14:53:06 2011
> @@ -33,9 +33,6 @@
>               <action class="org.apache.karaf.shell.dev.PrintStackTraces" />
>           </command>
>           <command>
> -<action class="org.apache.karaf.shell.dev.Restart" />
> -</command>
> -<command>
>               <action class="org.apache.karaf.shell.dev.SystemProperty" />
>           </command>
>           <command>
>
> Modified: karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java
> URL: http://svn.apache.org/viewvc/karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java?rev=1209110&r1=1209109&r2=1209110&view=diff
> ==============================================================================
> --- karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java (original)
> +++ karaf/trunk/system/commands/src/main/java/org/apache/karaf/system/commands/Shutdown.java Thu Dec  1 14:53:06 2011
> @@ -31,6 +31,15 @@ public class Shutdown extends OsgiComman
>       @Option(name = "-f", aliases = "--force", description = "Force the shutdown without confirmation message.", required = false, multiValued = false)
>       boolean force = false;
>
> +    @Option(name = "-r", aliases = "--reboot", description = "Reboot the Karaf container.", required = false, multiValued = false)
> +    boolean reboot = false;
> +
> +    @Option(name = "-h", aliases = "--halt", description = "Halt the Karaf container.", required = false, multiValued = false)
> +    boolean halt = false;
> +
> +    @Option(name = "-c", aliases = "--clean", description = "Clean the Karaf container (working directory) during reboot.", required = false, multiValued = false)
> +    boolean clean = 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" +
> @@ -44,15 +53,24 @@ public class Shutdown extends OsgiComman
>       }
>
>       protected Object doExecute() throws Exception {
> +
>           if (force) {
> -            systemService.shutdown(time);
> +            if (reboot) {
> +                systemService.reboot(time, clean);
> +            } else {
> +                systemService.halt(time);
> +            }
>               return null;
>           }
>
>           for (; ; ) {
>               StringBuffer sb = new StringBuffer();
>               String karafName = System.getProperty("karaf.name");
> -            System.err.println(String.format("Confirm: shutdown instance %s (yes/no): ",karafName));
> +            if (reboot) {
> +                System.err.println(String.format("Confirm: reboot instance %s (yes/no): ",karafName));
> +            } else {
> +                System.err.println(String.format("Confirm: halt instance %s (yes/no): ",karafName));
> +            }
>               System.err.flush();
>               for (; ; ) {
>                   int c = session.getKeyboard().read();
> @@ -68,7 +86,11 @@ public class Shutdown extends OsgiComman
>               }
>               String str = sb.toString();
>               if (str.equals("yes")) {
> -                systemService.shutdown(time);
> +                if (reboot) {
> +                    systemService.reboot(time, clean);
> +                } else {
> +                    systemService.halt(time);
> +                }
>               }
>               return null;
>           }
>
> Modified: karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java
> URL: http://svn.apache.org/viewvc/karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java?rev=1209110&r1=1209109&r2=1209110&view=diff
> ==============================================================================
> --- karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java (original)
> +++ karaf/trunk/system/core/src/main/java/org/apache/karaf/system/SystemService.java Thu Dec  1 14:53:06 2011
> @@ -22,19 +22,37 @@ package org.apache.karaf.system;
>   public interface SystemService {
>
>       /**
> -     * Shutdown the Karaf container.
> +     * Halt the Karaf container.
>        */
> -    void shutdown() throws Exception;
> +    void halt() throws Exception;
>
>       /**
> -     * Shutdown the Karaf container.
> +     * Halt the Karaf container.
>        *
>        * @param time shutdown 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
> +     *  First, it can be an absolute 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.
>        */
> -    void shutdown(String time) throws Exception;
> +    void halt(String time) throws Exception;
> +
> +    /**
> +     * Reboot the Karaf container.
> +     *
> +     * @throws Exception
> +     */
> +    void reboot() throws Exception;
> +
> +    /**
> +     * Reboot the Karaf container.
> +     *
> +     * @param time reboot delay. The time argument can have different formats.
> +     *  First, it can be an absolute 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.
> +     *  @param clean Force a clean restart by deleting the working directory.
> +     */
> +    void reboot(String time, boolean clean) throws Exception;
>
>       /**
>        * Set the system start level.
>
> Modified: karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java
> URL: http://svn.apache.org/viewvc/karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java?rev=1209110&r1=1209109&r2=1209110&view=diff
> ==============================================================================
> --- karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java (original)
> +++ karaf/trunk/system/core/src/main/java/org/apache/karaf/system/internal/SystemServiceImpl.java Thu Dec  1 14:53:06 2011
> @@ -43,38 +43,20 @@ public class SystemServiceImpl implement
>           return this.bundleContext;
>       }
>
> -    public void shutdown() throws Exception {
> -        shutdown(null);
> +    public void halt() throws Exception {
> +        halt(null);
>       }
>
> -    public void shutdown(String time) throws Exception {
> -        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) {
> -                        throw new IllegalArgumentException("Time " + time + " is not valid");
> -                    }
> -                } else {
> -                    // try to parse the date in hh:mm
> -                    String[] strings = time.split(":");
> -                    if (strings.length != 2) {
> -                        throw new IllegalArgumentException("Time " + time + " is not valid");
> -                    }
> -                    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();
> -                }
> -            }
> -        }
> -        shutdown(sleep);
> +    public void halt(String time) throws Exception {
> +        shutdown(timeToSleep(time));
> +    }
> +
> +    public void reboot() throws Exception {
> +        reboot(null, false);
> +    }
> +
> +    public void reboot(String time, boolean cleanup) throws Exception {
> +        reboot(timeToSleep(time), true);
>       }
>
>       private void shutdown(final long sleep) {
> @@ -83,12 +65,32 @@ public class SystemServiceImpl implement
>                   try {
>                       if (sleep>  0) {
>                           LOGGER.info("Shutdown in " + sleep / 1000 / 60 + " minute(s)");
> +                        System.err.println("Shutdown in " + sleep / 1000 / 60 + " minutes(s)");
>                       }
>                       Thread.sleep(sleep);
>                       Bundle bundle = getBundleContext().getBundle(0);
>                       bundle.stop();
>                   } catch (Exception e) {
> -                    LOGGER.error("Error when shutting down", e);
> +                    LOGGER.error("Halt error", e);
> +                }
> +            }
> +        }.start();
> +    }
> +
> +    private void reboot(final long sleep, final boolean clean) {
> +        new Thread() {
> +            public void run() {
> +                try {
> +                    if (sleep>  0) {
> +                        LOGGER.info("Reboot in " + sleep / 1000 / 60 + " minute(s)");
> +                        System.err.println("Reboot in " + sleep / 1000 / 60 + " minute(s)");
> +                    }
> +                    Thread.sleep(sleep);
> +                    System.setProperty("karaf.restart", "true");
> +                    System.setProperty("karaf.restart.clean", Boolean.toString(clean));
> +                    bundleContext.getBundle(0).stop();
> +                } catch (Exception e) {
> +                    LOGGER.error("Reboot error", e);
>                   }
>               }
>           }.start();
> @@ -128,4 +130,40 @@ public class SystemServiceImpl implement
>           }
>       }
>
> +    /**
> +     * Convert a time string to sleep period (in millisecond).
> +     *
> +     * @param time the time string.
> +     * @return the corresponding sleep period in millisecond.
> +     */
> +    private long timeToSleep(String time) throws Exception {
> +        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) {
> +                        throw new IllegalArgumentException("Time " + time + " is not valid");
> +                    }
> +                } else {
> +                    // try to parse the date in hh:mm
> +                    String[] strings = time.split(":");
> +                    if (strings.length != 2) {
> +                        throw new IllegalArgumentException("Time " + time + " is not valid");
> +                    }
> +                    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();
> +                }
> +            }
> +        }
> +        return sleep;
> +    }
> +
>   }
>
> Modified: karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java
> URL: http://svn.apache.org/viewvc/karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java?rev=1209110&r1=1209109&r2=1209110&view=diff
> ==============================================================================
> --- karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java (original)
> +++ karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/SystemMBean.java Thu Dec  1 14:53:06 2011
> @@ -21,8 +21,10 @@ package org.apache.karaf.system.manageme
>    */
>   public interface SystemMBean {
>
> -    void shutdown() throws Exception;
> -    void shutdown(String time) throws Exception;
> +    void halt() throws Exception;
> +    void halt(String time) throws Exception;
> +    void reboot() throws Exception;
> +    void reboot(String time, boolean clean) throws Exception;
>
>       void setStartLevel(int startLevel) throws Exception;
>       int getStartLevel() throws Exception;
>
> Modified: karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java
> URL: http://svn.apache.org/viewvc/karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java?rev=1209110&r1=1209109&r2=1209110&view=diff
> ==============================================================================
> --- karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java (original)
> +++ karaf/trunk/system/management/src/main/java/org/apache/karaf/system/management/internal/SystemMBeanImpl.java Thu Dec  1 14:53:06 2011
> @@ -41,12 +41,20 @@ public class SystemMBeanImpl extends Sta
>           return this.systemService;
>       }
>
> -    public void shutdown() throws Exception {
> -        systemService.shutdown();
> +    public void halt() throws Exception {
> +        systemService.halt();
>       }
>
> -    public void shutdown(String time) throws Exception {
> -        systemService.shutdown(time);
> +    public void halt(String time) throws Exception {
> +        systemService.halt(time);
> +    }
> +
> +    public void reboot() throws Exception {
> +        systemService.reboot();
> +    }
> +
> +    public void reboot(String time, boolean clean) throws Exception {
> +        systemService.reboot(time, clean);
>       }
>
>       public void setStartLevel(int startLevel) throws Exception {
>
>


-- 
Glen Mazza
Talend Community Coders
http://coders.talend.com
blog: http://www.jroller.com/gmazza