@@ -11,22 +11,48 @@ java.classpath.push(path.resolve(__dirname, "../commons-lang3-node-java.jar"));
1111java . classpath . push ( path . resolve ( __dirname , __dirname , "../src-java" ) ) ;
1212java . nativeBindingLocation = binaryPath ;
1313
14+ var syncSuffix = undefined ;
15+ var asyncSuffix = undefined ;
16+
17+ var SyncCall = function ( obj , method ) {
18+ if ( syncSuffix === undefined )
19+ throw new Error ( 'Sync call made before jvm created' ) ;
20+ var syncMethodName = method + syncSuffix ;
21+ if ( syncMethodName in obj )
22+ return obj [ syncMethodName ] . bind ( obj ) ;
23+ else
24+ throw new Error ( 'Sync method not found:' + syncMethodName ) ;
25+ }
26+
1427java . onJvmCreated = function ( ) {
1528 if ( java . asyncOptions ) {
16- var suffix = java . asyncOptions . promiseSuffix ;
29+ syncSuffix = java . asyncOptions . syncSuffix ;
30+ asyncSuffix = java . asyncOptions . asyncSuffix ;
31+ if ( typeof syncSuffix !== 'string' ) {
32+ throw new Error ( 'In asyncOptions, syncSuffix must be defined and must a string' ) ;
33+ }
34+ var promiseSuffix = java . asyncOptions . promiseSuffix ;
1735 var promisify = java . asyncOptions . promisify ;
18- if ( typeof suffix === 'string' && typeof promisify === 'function' ) {
36+ if ( typeof promiseSuffix === 'string' && typeof promisify === 'function' ) {
1937 var methods = [ 'newInstance' , 'callMethod' , 'callStaticMethod' ] ;
2038 methods . forEach ( function ( name ) {
21- java [ name + suffix ] = promisify ( java [ name ] ) ;
39+ java [ name + promiseSuffix ] = promisify ( java [ name ] ) ;
2240 } ) ;
41+ } else if ( typeof promiseSuffix === 'undefined' && typeof promisify === 'undefined' ) {
42+ // no promises
43+ } else {
44+ throw new Error ( 'In asyncOptions, if either promiseSuffix or promisify is defined, both most be.' ) ;
2345 }
46+ } else {
47+ syncSuffix = 'Sync' ;
48+ asyncSuffix = '' ;
2449 }
2550}
2651
2752var MODIFIER_PUBLIC = 1 ;
2853var MODIFIER_STATIC = 8 ;
2954
55+
3056java . import = function ( name ) {
3157 var clazz = java . findClassSync ( name ) ; // TODO: change to Class.forName when classloader issue is resolved.
3258 var result = function ( ) {
@@ -41,11 +67,12 @@ java.import = function(name) {
4167 result . class = clazz ;
4268
4369 // copy static fields
44- var fields = clazz . getDeclaredFieldsSync ( ) ;
70+ var fields = SyncCall ( clazz , 'getDeclaredFields' ) ( ) ;
4571 for ( i = 0 ; i < fields . length ; i ++ ) {
46- if ( ( ( fields [ i ] . getModifiersSync ( ) & MODIFIER_PUBLIC ) === MODIFIER_PUBLIC )
47- && ( ( fields [ i ] . getModifiersSync ( ) & MODIFIER_STATIC ) === MODIFIER_STATIC ) ) {
48- var fieldName = fields [ i ] . getNameSync ( ) ;
72+ var modifiers = SyncCall ( fields [ i ] , 'getModifiers' ) ( ) ;
73+ if ( ( ( modifiers & MODIFIER_PUBLIC ) === MODIFIER_PUBLIC )
74+ && ( ( modifiers & MODIFIER_STATIC ) === MODIFIER_STATIC ) ) {
75+ var fieldName = SyncCall ( fields [ i ] , 'getName' ) ( ) ;
4976 result . __defineGetter__ ( fieldName , function ( name , fieldName ) {
5077 return java . getStaticFieldValue ( name , fieldName ) ;
5178 } . bind ( this , name , fieldName ) ) ;
@@ -63,26 +90,30 @@ java.import = function(name) {
6390 }
6491
6592 // copy static methods
66- var methods = clazz . getDeclaredMethodsSync ( ) ;
93+ var methods = SyncCall ( clazz , 'getDeclaredMethods' ) ( ) ;
6794 for ( i = 0 ; i < methods . length ; i ++ ) {
68- if ( ( ( methods [ i ] . getModifiersSync ( ) & MODIFIER_PUBLIC ) === MODIFIER_PUBLIC )
69- && ( ( methods [ i ] . getModifiersSync ( ) & MODIFIER_STATIC ) === MODIFIER_STATIC ) ) {
70- var methodName = methods [ i ] . getNameSync ( ) ;
71- result [ methodName + 'Sync' ] = java . callStaticMethodSync . bind ( java , name , methodName ) ;
72- result [ methodName ] = java . callStaticMethod . bind ( java , name , methodName ) ;
95+ var modifiers = SyncCall ( methods [ i ] , 'getModifiers' ) ( ) ;
96+ if ( ( ( modifiers & MODIFIER_PUBLIC ) === MODIFIER_PUBLIC )
97+ && ( ( modifiers & MODIFIER_STATIC ) === MODIFIER_STATIC ) ) {
98+ var methodName = SyncCall ( methods [ i ] , 'getName' ) ( ) ;
99+ result [ methodName + syncSuffix ] = java . callStaticMethodSync . bind ( java , name , methodName ) ;
100+ if ( typeof asyncSuffix === 'string' ) {
101+ result [ methodName + asyncSuffix ] = java . callStaticMethod . bind ( java , name , methodName ) ;
102+ }
73103 if ( promisify ) {
74104 result [ methodName + promiseSuffix ] = promisify ( java . callStaticMethod . bind ( java , name , methodName ) ) ;
75105 }
76106 }
77107 }
78108
79109 // copy static classes/enums
80- var classes = clazz . getDeclaredClassesSync ( ) ;
110+ var classes = SyncCall ( clazz , 'getDeclaredClasses' ) ( ) ;
81111 for ( i = 0 ; i < classes . length ; i ++ ) {
82- if ( ( ( classes [ i ] . getModifiersSync ( ) & MODIFIER_PUBLIC ) === MODIFIER_PUBLIC )
83- && ( ( classes [ i ] . getModifiersSync ( ) & MODIFIER_STATIC ) === MODIFIER_STATIC ) ) {
84- var className = classes [ i ] . getNameSync ( ) ;
85- var simpleName = classes [ i ] . getSimpleNameSync ( ) ;
112+ var modifiers = SyncCall ( classes [ i ] , 'getModifiers' ) ( ) ;
113+ if ( ( ( modifiers & MODIFIER_PUBLIC ) === MODIFIER_PUBLIC )
114+ && ( ( modifiers & MODIFIER_STATIC ) === MODIFIER_STATIC ) ) {
115+ var className = SyncCall ( classes [ i ] , 'getName' ) ( ) ;
116+ var simpleName = SyncCall ( classes [ i ] , 'getSimpleName' ) ( ) ;
86117 Object . defineProperty ( result , simpleName , {
87118 get : function ( result , simpleName , className ) {
88119 var c = java . import ( className ) ;
0 commit comments