Commit 7e3238e236706ed925b0b1928cbca22b8dfe912a

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

Remodelando módulo java

src/java/call.cc
... ... @@ -30,6 +30,7 @@
30 30  
31 31 #include "private.h"
32 32 #include <pw3270/v3270.h>
  33 + #include <lib3270/trace.h>
33 34  
34 35  
35 36 /*---[ Implement ]----------------------------------------------------------------------------------*/
... ... @@ -37,7 +38,7 @@
37 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 43 if(!trylock()) {
43 44  
... ... @@ -49,6 +50,7 @@ namespace PW3270_NAMESPACE {
49 50 if(jvm || load_jvm(widget)) {
50 51  
51 52 v3270_set_script(widget,'J',TRUE);
  53 +/*
52 54  
53 55 gchar * dirname = g_path_get_dirname(filename);
54 56 gchar * classname = g_path_get_basename(filename);
... ... @@ -58,25 +60,108 @@ namespace PW3270_NAMESPACE {
58 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 110 try {
64 111  
65 112 jclass cls;
66 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 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 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 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 166 } catch(std::exception &e) {
82 167  
... ... @@ -84,8 +169,11 @@ namespace PW3270_NAMESPACE {
84 169  
85 170 }
86 171  
  172 +/*
87 173 g_free(dirname);
88 174 g_free(classname);
  175 + g_free(classpath);
  176 +*/
89 177  
90 178 v3270_set_script(widget,'J',FALSE);
91 179  
... ...
src/java/startstop.cc
... ... @@ -104,18 +104,19 @@ extern &quot;C&quot; {
104 104  
105 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 113 // Has filename, call it directly
114   - call(widget,filename);
  114 + call(widget,classname);
115 115 }
116 116 else
117 117 {
118   - // No filename, ask user
  118 +/*
  119 + // No classname, ask user
119 120 static const struct _list
120 121 {
121 122 const gchar *name;
... ... @@ -144,7 +145,7 @@ extern &quot;C&quot; {
144 145 call(widget,filename);
145 146 g_free(filename);
146 147 }
147   -
  148 +*/
148 149 }
149 150  
150 151 }
... ... @@ -166,6 +167,17 @@ extern &quot;C&quot; {
166 167  
167 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 181 if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
170 182 gtk_main_quit();
171 183 gtk_widget_destroy(dialog);
... ... @@ -212,11 +224,13 @@ extern &quot;C&quot; {
212 224 #if defined(DEBUG)
213 225  
214 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 230 #else
218 231  
219 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 235 #endif // JNIDIR
222 236  
... ...
ui/80java.xml
... ... @@ -34,8 +34,10 @@
34 34 <menu name='FileMenu' label='_File' />
35 35 <menu name='EditMenu' label='_Edit' />
36 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 41 </menu>
40 42 </menubar>
41 43 </ui>
... ...