Author: mturk
Date: Mon Mar 15 09:20:00 2010
New Revision: 923123

URL: http://svn.apache.org/viewvc?rev=923123&view=rev
Log:
Fix DAEMON-128 by implementing failed native callback. It behaves like 
shutdown, but logs provided message/exception to the native error log

Modified:
    commons/proper/daemon/trunk/RELEASE-NOTES.txt
    
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonContext.java
    
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonController.java
    
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonListener.java
    
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonPermission.java
    
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/support/DaemonLoader.java
    commons/proper/daemon/trunk/src/native/unix/native/java.c

Modified: commons/proper/daemon/trunk/RELEASE-NOTES.txt
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/RELEASE-NOTES.txt?rev=923123&r1=923122&r2=923123&view=diff
==============================================================================
--- commons/proper/daemon/trunk/RELEASE-NOTES.txt (original)
+++ commons/proper/daemon/trunk/RELEASE-NOTES.txt Mon Mar 15 09:20:00 2010
@@ -35,7 +35,7 @@ NEW FEATURES:
 
 BUG FIXES:
 
-1.0.3: DAEMON-108, DAEMON-139
+1.0.3: DAEMON-108, DAEMON-128, DAEMON-139
 
 1.0.2: DAEMON-16, DAEMON-31, DAEMON-40, DAEMON-45, DAEMON-49, DAEMON-60,
        DAEMON-84, DAEMON-90, DAEMON-91, DAEMON-92, DAEMON-93, DAEMON-94,

Modified: 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonContext.java
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonContext.java?rev=923123&r1=923122&r2=923123&view=diff
==============================================================================
--- 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonContext.java
 (original)
+++ 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonContext.java
 Mon Mar 15 09:20:00 2010
@@ -23,7 +23,7 @@ package org.apache.commons.daemon;
  * communicate with the Daemon container.
  *
  * @author Pier Fumagalli
- * @version 1.0 <i>(CVS $Revision$)</i>
+ * @version 1.0 <i>(SVN $Revision$)</i>
  */
 public interface DaemonContext
 {

Modified: 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonController.java
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonController.java?rev=923123&r1=923122&r2=923123&view=diff
==============================================================================
--- 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonController.java
 (original)
+++ 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonController.java
 Mon Mar 15 09:20:00 2010
@@ -21,45 +21,46 @@ package org.apache.commons.daemon;
 /**
  *
  * @author Pier Fumagalli
- * @version 1.0 <i>(CVS $Revision$)</i>
+ * @version 1.0 <i>(SVN $Revision$)</i>
  */
 public interface DaemonController
 {
 
     /**
-     *
+     * Shutdown the daemon.     
      */
     public void shutdown()
         throws IllegalStateException;
 
     /**
-     *
+     * Reload daemon
      */
     public void reload()
         throws IllegalStateException;
 
     /**
-     *
+     * Shudown daemon and log failed message.
      */
     public void fail()
         throws IllegalStateException;
 
     /**
-     *
+     * Shudown daemon and log failed message.
      */
     public void fail(String message)
         throws IllegalStateException;
 
     /**
-     *
+     * Shudown daemon and log failed message.
      */
     public void fail(Exception exception)
         throws IllegalStateException;
 
     /**
-     *
+     * Shudown daemon and log failed message.
      */
     public void fail(String message, Exception exception)
         throws IllegalStateException;
 
+}
 

Modified: 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonListener.java
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonListener.java?rev=923123&r1=923122&r2=923123&view=diff
==============================================================================
--- 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonListener.java
 (original)
+++ 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonListener.java
 Mon Mar 15 09:20:00 2010
@@ -19,6 +19,10 @@ package org.apache.commons.daemon;
 
 import java.util.EventListener;
 
+/**
+ * EvenListener type wrapper.
+ * @version 1.0 <i>(SVN $Revision$)</i>
+ */
 public interface DaemonListener extends EventListener
 {
 

Modified: 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonPermission.java
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonPermission.java?rev=923123&r1=923122&r2=923123&view=diff
==============================================================================
--- 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonPermission.java
 (original)
+++ 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/DaemonPermission.java
 Mon Mar 15 09:20:00 2010
@@ -83,7 +83,7 @@ import java.util.StringTokenizer;
  * </p>
  *
  * @author Pier Fumagalli
- * @version 1.0 <i>(CVS $Revision$)</i>
+ * @version 1.0 <i>(SVN $Revision$)</i>
  */
 public final class DaemonPermission extends Permission
 {

Modified: 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/support/DaemonLoader.java
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/support/DaemonLoader.java?rev=923123&r1=923122&r2=923123&view=diff
==============================================================================
--- 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/support/DaemonLoader.java
 (original)
+++ 
commons/proper/daemon/trunk/src/java/org/apache/commons/daemon/support/DaemonLoader.java
 Mon Mar 15 09:20:00 2010
@@ -15,8 +15,6 @@
  *  limitations under the License.
  */
 
-/* @version $Id$ */
-
 package org.apache.commons.daemon.support;
 
 import org.apache.commons.daemon.DaemonContext;
@@ -24,6 +22,11 @@ import org.apache.commons.daemon.DaemonC
 
 import java.lang.reflect.Method;
 
+/*
+ * Used by jsvc for Daemon management.
+ *
+ * @version 1.0 <i>(SVN $Revision$)</i>
+ */
 public final class DaemonLoader
 {
 
@@ -246,6 +249,7 @@ public final class DaemonLoader
     }
 
     private static native void shutdown(boolean reload);
+    private static native void failed(String message);
 
     public static class Controller
         implements DaemonController
@@ -304,21 +308,40 @@ public final class DaemonLoader
         public void fail()
             throws IllegalStateException
         {
+            fail(null, null);
         }
 
         public void fail(String message)
             throws IllegalStateException
         {
+            fail(message, null);
         }
 
         public void fail(Exception exception)
             throws IllegalStateException
         {
+            fail(null, exception);
         }
 
         public void fail(String message, Exception exception)
             throws IllegalStateException
         {
+            synchronized (this) {
+                if (!this.isAvailable()) {
+                    throw new IllegalStateException();
+                }
+                else {
+                    this.setAvailable(false);
+                    String msg = message;
+                    if (exception != null) {
+                        if (msg != null)
+                            msg = msg + ": " + exception.toString();
+                        else
+                            msg = exception.toString();
+                    }
+                    DaemonLoader.failed(msg);
+                }
+            }
         }
 
     }

Modified: commons/proper/daemon/trunk/src/native/unix/native/java.c
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/unix/native/java.c?rev=923123&r1=923122&r2=923123&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/unix/native/java.c (original)
+++ commons/proper/daemon/trunk/src/native/unix/native/java.c Mon Mar 15 
09:20:00 2010
@@ -40,7 +40,7 @@ static jclass cls  = NULL;
 #define FALSE 0
 #define TRUE !FALSE
 
-static void shutdown(JNIEnv * env, jobject source, jboolean reload)
+static void shutdown(JNIEnv *env, jobject source, jboolean reload)
 {
     log_debug("Shutdown requested (reload is %d)", reload);
     if (reload == TRUE)
@@ -49,6 +49,19 @@ static void shutdown(JNIEnv * env, jobje
         main_shutdown();
 }
 
+static void failed(JNIEnv *env, jobject source, jstring message)
+{
+    if (message) {
+        const char *msg = (*env)->GetStringUTFChars(env, message, NULL);
+        log_error("Failed %s", msg ? msg : "(null)");
+        if (msg)
+            (*env)->ReleaseStringUTFChars(env, message, msg);
+    }
+    else
+        log_error("Failed requested");
+    main_shutdown();
+}
+
 /* Automatically restart when the JVM crashes */
 static void java_abort123(void)
 {
@@ -98,7 +111,7 @@ bool java_init(arg_data *args, home_data
     struct stat sb;
 #endif /* ifdef OS_DARWIN */
     jint(*symb) (JavaVM **, JNIEnv **, JavaVMInitArgs *);
-    JNINativeMethod nativemethod;
+    JNINativeMethod nativemethods[2];
     JavaVMOption *opt = NULL;
     dso_handle libh   = NULL;
     JavaVMInitArgs arg;
@@ -106,8 +119,10 @@ bool java_init(arg_data *args, home_data
     jint ret;
     int x;
     char loaderclass[]    = LOADER;
-    char shutdownclass[]  = "shutdown";
+    char shutdownmethod[] = "shutdown";
     char shutdownparams[] = "(Z)V";
+    char failedmethod[]   = "failed";
+    char failedparams[]   = "(Ljava/lang/String;)V";
 
     /* Decide WHAT virtual machine we need to use */
     libf = java_library(args, data);
@@ -264,12 +279,18 @@ bool java_init(arg_data *args, home_data
 #if defined(HAVE_SABLEVM)
     log_debug("sableVM doesn't support RegisterNatives");
 #else
-    jsvc_xlate_to_ascii(shutdownclass);
-    nativemethod.name = shutdownclass;
+    jsvc_xlate_to_ascii(shutdownmethod);
+    nativemethods[0].name = shutdownmethod;
     jsvc_xlate_to_ascii(shutdownparams);
-    nativemethod.signature = shutdownparams;
-    nativemethod.fnPtr = shutdown;
-    if ((*env)->RegisterNatives(env, cls, &nativemethod, 1) != 0) {
+    nativemethods[0].signature = shutdownparams;
+    nativemethods[0].fnPtr = shutdown;
+    jsvc_xlate_to_ascii(failedmethod);
+    nativemethods[1].name = failedmethod;
+    jsvc_xlate_to_ascii(failedparams);
+    nativemethods[1].signature = failedparams;
+    nativemethods[1].fnPtr = failed;
+
+    if ((*env)->RegisterNatives(env, cls, nativemethods, 2) != 0) {
         log_error("Cannot register native methods");
         return false;
     }


Reply via email to