Commit 5555ae85f525505c9c2681bb0fbfd269f5cb7aa4

Authored by perry.werneck@gmail.com
1 parent 687a562d

Tratando erros ao chamar aplicação java

src/java/plugin.cc
@@ -44,6 +44,7 @@ @@ -44,6 +44,7 @@
44 44
45 #include "private.h" 45 #include "private.h"
46 46
  47 + #include <malloc.h>
47 #include <libintl.h> 48 #include <libintl.h>
48 #include <glib/gi18n.h> 49 #include <glib/gi18n.h>
49 #include <gtk/gtk.h> 50 #include <gtk/gtk.h>
@@ -56,6 +57,7 @@ @@ -56,6 +57,7 @@
56 #include <lib3270/trace.h> 57 #include <lib3270/trace.h>
57 #include <lib3270/charset.h> 58 #include <lib3270/charset.h>
58 #include <pw3270/class.h> 59 #include <pw3270/class.h>
  60 + #include <pw3270/trace.h>
59 61
60 62
61 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 63 /*--[ Globals ]--------------------------------------------------------------------------------------*/
@@ -323,15 +325,46 @@ @@ -323,15 +325,46 @@
323 325
324 extern "C" { 326 extern "C" {
325 327
326 - static session * factory(const char *name)  
327 - { 328 + static session * factory(const char *name) {
328 debug("---> %s",__FUNCTION__); 329 debug("---> %s",__FUNCTION__);
329 return new plugin(lib3270_get_default_session_handle()); 330 return new plugin(lib3270_get_default_session_handle());
330 } 331 }
331 332
332 - static jint JNICALL jni_vfprintf(FILE *fp, const char *format, va_list args)  
333 - {  
334 - lib3270_write_va_log(lib3270_get_default_session_handle(),"java",format,args); 333 + static void trace_cleanup(GtkWidget *widget, GtkWidget **window) {
  334 + *window = NULL;
  335 + }
  336 +
  337 + static jint JNICALL jni_vfprintf(FILE *fp, const char *fmt, va_list args) {
  338 +
  339 + char * msg = NULL;
  340 + static GtkWidget * trace = NULL;
  341 +
  342 + if(vasprintf(&msg,fmt,args) < 1) {
  343 + lib3270_write_log(lib3270_get_default_session_handle(),"java","vasprintf() error on \"%s\"",fmt);
  344 + return 0;
  345 + }
  346 +
  347 + fprintf(fp,"%s",msg);
  348 + lib3270_write_log(lib3270_get_default_session_handle(),"java","%s",msg);
  349 +
  350 + if(!trace) {
  351 + // Cria janela de trace.
  352 + trace = pw3270_trace_new();
  353 + g_signal_connect(G_OBJECT(trace), "destroy",G_CALLBACK(trace_cleanup), &trace);
  354 +
  355 + pw3270_trace_set_destroy_on_close(trace,TRUE);
  356 +
  357 + // gtk_window_set_transient_for(GTK_WINDOW(trace),GTK_WINDOW(gtk_widget_get_toplevel(widget)));
  358 + gtk_window_set_destroy_with_parent(GTK_WINDOW(trace),TRUE);
  359 +
  360 + gtk_window_set_default_size(GTK_WINDOW(trace),590,430);
  361 + gtk_widget_show_all(trace);
  362 +
  363 + pw3270_trace_printf(trace,"%s",msg);
  364 +
  365 + free(msg);
  366 + }
  367 +
335 return 0; 368 return 0;
336 } 369 }
337 370
@@ -655,7 +688,7 @@ extern &quot;C&quot; @@ -655,7 +688,7 @@ extern &quot;C&quot;
655 GTK_BUTTONS_CANCEL, 688 GTK_BUTTONS_CANCEL,
656 _( "Can't find class %s" ), classname ); 689 _( "Can't find class %s" ), classname );
657 690
658 - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java script failure" )); 691 + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
659 if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) 692 if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
660 gtk_main_quit(); 693 gtk_main_quit();
661 gtk_widget_destroy(dialog); 694 gtk_widget_destroy(dialog);
@@ -672,7 +705,8 @@ extern &quot;C&quot; @@ -672,7 +705,8 @@ extern &quot;C&quot;
672 GTK_BUTTONS_OK_CANCEL, 705 GTK_BUTTONS_OK_CANCEL,
673 _( "Can't find class \"%s\"" ), classname ); 706 _( "Can't find class \"%s\"" ), classname );
674 707
675 - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java script failure" )); 708 + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
  709 +
676 if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) 710 if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
677 gtk_main_quit(); 711 gtk_main_quit();
678 gtk_widget_destroy(dialog); 712 gtk_widget_destroy(dialog);
@@ -687,6 +721,40 @@ extern &quot;C&quot; @@ -687,6 +721,40 @@ extern &quot;C&quot;
687 env->CallStaticVoidMethod(cls, mid, args); 721 env->CallStaticVoidMethod(cls, mid, args);
688 debug("%s: CallStaticVoidMethod() has returned",__FUNCTION__); 722 debug("%s: CallStaticVoidMethod() has returned",__FUNCTION__);
689 723
  724 + jthrowable exc = env->ExceptionOccurred();
  725 + env->ExceptionClear();
  726 +
  727 + if (exc) {
  728 + jclass throwable_class = env->FindClass("java/lang/Throwable");
  729 +
  730 + jmethodID jni_getMessage = env->GetMethodID(throwable_class,"getMessage","()Ljava/lang/String;");
  731 + jstring j_msg = (jstring) env->CallObjectMethod(exc,jni_getMessage);
  732 +
  733 + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  734 + GTK_DIALOG_DESTROY_WITH_PARENT,
  735 + GTK_MESSAGE_ERROR,
  736 + GTK_BUTTONS_OK_CANCEL,
  737 + _( "Java application \"%s\" has failed." ), classname );
  738 +
  739 + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java failure" ));
  740 +
  741 + if(!env->IsSameObject(j_msg,NULL)) {
  742 +
  743 + const char * msg = env->GetStringUTFChars(j_msg, 0);
  744 +
  745 + debug("jni_getMessage = %s",msg);
  746 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg);
  747 +
  748 + env->ReleaseStringUTFChars( j_msg, msg);
  749 + }
  750 +
  751 + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
  752 + gtk_main_quit();
  753 + gtk_widget_destroy(dialog);
  754 +
  755 +
  756 + }
  757 +
690 } catch(std::exception &e) { 758 } catch(std::exception &e) {
691 759
692 debug("Java error: %s",e.what()); 760 debug("Java error: %s",e.what());
@@ -700,8 +768,6 @@ extern &quot;C&quot; @@ -700,8 +768,6 @@ extern &quot;C&quot;
700 768
701 g_free(classname); 769 g_free(classname);
702 770
703 - exit(-1);  
704 -  
705 jvm->DestroyJavaVM(); 771 jvm->DestroyJavaVM();
706 } 772 }
707 773
src/java/sample/except.java 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +public class except
  2 +{
  3 + public static void main (String[] args) throws Exception
  4 + {
  5 + throw new Exception("Testing exceptions");
  6 + }
  7 +};
  8 +
  9 +
  10 +
  11 +
src/java/sample/out.java 0 → 100755
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +
  2 +public class out
  3 +{
  4 + public static void main (String[] args)
  5 + {
  6 + System.out.println("Test out");
  7 + System.err.println("Test err");
  8 + }
  9 +};