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();
+ }
+
}