Commit 7e3238e236706ed925b0b1928cbca22b8dfe912a

Authored by perry.werneck@gmail.com
1 parent a69872ea

Remodelando módulo java

src/java/call.cc
@@ -30,6 +30,7 @@ @@ -30,6 +30,7 @@
30 30
31 #include "private.h" 31 #include "private.h"
32 #include <pw3270/v3270.h> 32 #include <pw3270/v3270.h>
  33 + #include <lib3270/trace.h>
33 34
34 35
35 /*---[ Implement ]----------------------------------------------------------------------------------*/ 36 /*---[ Implement ]----------------------------------------------------------------------------------*/
@@ -37,7 +38,7 @@ @@ -37,7 +38,7 @@
37 namespace PW3270_NAMESPACE { 38 namespace PW3270_NAMESPACE {
38 39
39 40
40 - void java::call(GtkWidget *widget, const char *filename) { 41 + void java::call(GtkWidget *widget, const char *classname) {
41 42
42 if(!trylock()) { 43 if(!trylock()) {
43 44
@@ -49,6 +50,7 @@ namespace PW3270_NAMESPACE { @@ -49,6 +50,7 @@ namespace PW3270_NAMESPACE {
49 if(jvm || load_jvm(widget)) { 50 if(jvm || load_jvm(widget)) {
50 51
51 v3270_set_script(widget,'J',TRUE); 52 v3270_set_script(widget,'J',TRUE);
  53 +/*
52 54
53 gchar * dirname = g_path_get_dirname(filename); 55 gchar * dirname = g_path_get_dirname(filename);
54 gchar * classname = g_path_get_basename(filename); 56 gchar * classname = g_path_get_basename(filename);
@@ -58,25 +60,108 @@ namespace PW3270_NAMESPACE { @@ -58,25 +60,108 @@ namespace PW3270_NAMESPACE {
58 *ptr = 0; 60 *ptr = 0;
59 } 61 }
60 62
  63 + gchar * classpath;
  64 +
  65 +#ifdef _WIN32
  66 +
  67 + char buffer[1024];
  68 + gchar * exports;
  69 +
  70 + if(GetModuleFileName(NULL,buffer,sizeof(buffer)) < sizeof(buffer)) {
  71 +
  72 + gchar * ptr = strrchr(buffer,G_DIR_SEPARATOR);
  73 + if(ptr) {
  74 + *ptr = 0;
  75 + exports = g_build_filename(buffer,"jvm-exports",NULL);
  76 + } else {
  77 + exports = g_build_filename(".","jvm-exports",NULL);
  78 + }
  79 +
  80 +
  81 + } else {
  82 +
  83 + exports = g_build_filename(".","jvm-exports",NULL);
  84 +
  85 + }
  86 +
  87 + debug("myDir=%s",myDir);
  88 +
  89 + g_mkdir_with_parents(exports,0777);
  90 +
  91 +#ifdef DEBUG
  92 + classpath = g_strdup_printf("%s;%s;.bin/java",dirname,exports);
  93 +#else
  94 + classpath = g_strdup_printf("%s;%s",dirname,exports);
  95 +#endif
  96 +
  97 + g_free(exports);
  98 +#else
  99 +
  100 +#ifdef DEBUG
  101 + classpath = g_strdup_printf("%s:%s:.bin/java",dirname,JARDIR);
  102 +#else
  103 + classpath = g_strdup_printf("%s:%s",dirname,JARDIR);
  104 +#endif
  105 +
  106 +#endif // _WIN32
61 107
  108 +*/
62 109
63 try { 110 try {
64 111
65 jclass cls; 112 jclass cls;
66 jmethodID mid; 113 jmethodID mid;
67 114
  115 + /*
  116 +
  117 + DONT WORK!!
  118 + http://stackoverflow.com/questions/271506/why-cant-system-setproperty-change-the-classpath-at-runtime
  119 +
68 // Atualizar o classpath 120 // Atualizar o classpath
69 - cls = env->FindClass("java.lang.System"); 121 + cls = env->FindClass("java/lang/System");
  122 + if(!cls) {
  123 + throw exception( _( "Can't find class %s" ), "java/lang/System");
  124 + }
  125 +
  126 + mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
  127 + if(!mid) {
  128 + throw exception( _( "Can't find method %s/%s" ), "java/lang/System","setProperty");
  129 + }
  130 +
  131 + lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s\n",classpath);
  132 +
  133 + jstring name = env->NewStringUTF("java.class.path");
  134 + jstring path = env->NewStringUTF(classpath);
  135 +
  136 + jstring rc = (jstring) env->CallObjectMethod(cls,mid,name,path);
  137 +
  138 + env->DeleteLocalRef(name);
  139 + env->DeleteLocalRef(path);
  140 + env->DeleteLocalRef(rc);
  141 + */
  142 +
  143 + // Get application entry point.
  144 + cls = env->FindClass(classname);
70 if(!cls) { 145 if(!cls) {
71 - throw exception( _( "Can't find class %s" ), "java.lang.System"); 146 + throw exception( _( "Can't find class %s" ), classname);
72 } 147 }
73 148
74 - mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String"); 149 + mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
75 if(!mid) { 150 if(!mid) {
76 - throw exception( _( "Can't find method %s/%d" ), "java.lang.System","setProperty"); 151 + throw exception( _( "Can't find method %s/%s" ), classname, "main");
77 } 152 }
78 153
  154 + // Build arguments
  155 + jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), env->NewStringUTF(""));
79 156
  157 + // Call main()
  158 + env->CallStaticVoidMethod(cls, mid, args);
  159 +
  160 + // Check for exception
  161 +
  162 +
  163 + // And finish
  164 + env->DeleteLocalRef(args);
80 165
81 } catch(std::exception &e) { 166 } catch(std::exception &e) {
82 167
@@ -84,8 +169,11 @@ namespace PW3270_NAMESPACE { @@ -84,8 +169,11 @@ namespace PW3270_NAMESPACE {
84 169
85 } 170 }
86 171
  172 +/*
87 g_free(dirname); 173 g_free(dirname);
88 g_free(classname); 174 g_free(classname);
  175 + g_free(classpath);
  176 +*/
89 177
90 v3270_set_script(widget,'J',FALSE); 178 v3270_set_script(widget,'J',FALSE);
91 179
src/java/startstop.cc
@@ -104,18 +104,19 @@ extern &quot;C&quot; { @@ -104,18 +104,19 @@ extern &quot;C&quot; {
104 104
105 LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) { 105 LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) {
106 106
107 - gchar *filename = (gchar *) g_object_get_data(G_OBJECT(action),"src"); 107 + gchar *classname = (gchar *) g_object_get_data(G_OBJECT(action),"src");
108 108
109 - lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p",gtk_action_get_name(action),widget); 109 + lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p\n",gtk_action_get_name(action),widget);
110 110
111 - if(filename) 111 + if(classname)
112 { 112 {
113 // Has filename, call it directly 113 // Has filename, call it directly
114 - call(widget,filename); 114 + call(widget,classname);
115 } 115 }
116 else 116 else
117 { 117 {
118 - // No filename, ask user 118 +/*
  119 + // No classname, ask user
119 static const struct _list 120 static const struct _list
120 { 121 {
121 const gchar *name; 122 const gchar *name;
@@ -144,7 +145,7 @@ extern &quot;C&quot; { @@ -144,7 +145,7 @@ extern &quot;C&quot; {
144 call(widget,filename); 145 call(widget,filename);
145 g_free(filename); 146 g_free(filename);
146 } 147 }
147 - 148 +*/
148 } 149 }
149 150
150 } 151 }
@@ -166,6 +167,17 @@ extern &quot;C&quot; { @@ -166,6 +167,17 @@ extern &quot;C&quot; {
166 167
167 gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); 168 gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
168 169
  170 + if(format) {
  171 +
  172 + va_list arg_ptr;
  173 + va_start(arg_ptr, format);
  174 + gchar *msg = g_strdup_vprintf(format,arg_ptr);
  175 + va_end(arg_ptr);
  176 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg);
  177 + g_free(msg);
  178 +
  179 + }
  180 +
169 if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) 181 if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
170 gtk_main_quit(); 182 gtk_main_quit();
171 gtk_widget_destroy(dialog); 183 gtk_widget_destroy(dialog);
@@ -212,11 +224,13 @@ extern &quot;C&quot; { @@ -212,11 +224,13 @@ extern &quot;C&quot; {
212 #if defined(DEBUG) 224 #if defined(DEBUG)
213 225
214 // options[vm_args.nOptions++].optionString = g_strdup("-verbose"); 226 // options[vm_args.nOptions++].optionString = g_strdup("-verbose");
215 - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s:.bin/Debug:.bin/Debug/lib",JNIDIR); 227 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=.bin/Debug:.bin/Debug/lib:%s",JNIDIR);
  228 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=./src/java:.bin/java:%s",JARDIR);
216 229
217 #else 230 #else
218 231
219 options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR); 232 options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR);
  233 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s",JARDIR);
220 234
221 #endif // JNIDIR 235 #endif // JNIDIR
222 236
@@ -34,8 +34,10 @@ @@ -34,8 +34,10 @@
34 <menu name='FileMenu' label='_File' /> 34 <menu name='FileMenu' label='_File' />
35 <menu name='EditMenu' label='_Edit' /> 35 <menu name='EditMenu' label='_Edit' />
36 <menu name='View' label='_View' /> 36 <menu name='View' label='_View' />
37 - <menu name='ScriptsMenu' label='Scripts' visible='yes' >  
38 - <menuitem action='java' label='External Java Application'/> 37 + <menu name='Java' label='Java' visible='yes' >
  38 + <menuitem name='java_except' action='java' label='Exception test' src='except'/>
  39 + <menuitem name='java_output' action='java' label='Output test' src='out'/>
  40 + <menuitem name='java_popup' action='java' label='Popup test' src='popup'/>
39 </menu> 41 </menu>
40 </menubar> 42 </menubar>
41 </ui> 43 </ui>