@@ -333,98 +333,108 @@ public static boolean allMatch(String key1, String key2) {
333
333
return key1 .equals (key2 );
334
334
}
335
335
336
- /**
337
- * generateGFunction is the factory method of the g(_, _) function.
338
- *
339
- * @param name the name of the g(_, _) function, can be "g", "g2", ..
340
- * @param rm the role manager used by the function.
341
- * @return the function.
342
- */
343
- public static AviatorFunction generateGFunction (String name , RoleManager rm ) {
344
336
345
- Map <String , AviatorBoolean > memorized = new HashMap <>();
337
+ public static class generateGFunctionClass {
338
+ // key:name such as g,g2 value:user-role mapping
339
+ private static Map <String , Map <String , AviatorBoolean >> memorizedMap = new HashMap <>();
346
340
347
- return new AbstractVariadicFunction () {
348
- @ Override
349
- public AviatorObject variadicCall (Map <String , Object > env , AviatorObject ... args ) {
350
- int len = args .length ;
351
- if (len < 2 ){
352
- return AviatorBoolean .valueOf (false );
353
- }
354
- Object name1Obj = FunctionUtils .getJavaObject (args [0 ], env );
355
- String name2 = FunctionUtils .getStringValue (args [1 ], env );
356
- Sequence name1List = null ;
357
- String name1 = null ;
358
- if (name1Obj instanceof java .util .List ) {
359
- name1List = RuntimeUtils .seq (name1Obj ,env );
360
- } else {
361
- name1 = (String ) name1Obj ;
362
- }
341
+ public static void updateGFunctionCache (String name ){
342
+ Map <String , AviatorBoolean > memorized = memorizedMap .get (name );
343
+ memorized = new HashMap <>();
344
+ }
363
345
364
- String key = "" ;
365
- for (int i = 0 ; i < len ; i ++) {
366
- Object nameObj = FunctionUtils .getJavaObject (args [i ], env );
367
- if (nameObj instanceof java .util .List ) {
368
- Sequence nameList = RuntimeUtils .seq (name , env );
369
- for (Object obj : nameList ) {
370
- key += ";" + obj ;
346
+ /**
347
+ * generateGFunction is the factory method of the g(_, _) function.
348
+ *
349
+ * @param name the name of the g(_, _) function, can be "g", "g2", ..
350
+ * @param rm the role manager used by the function.
351
+ * @return the function.
352
+ */
353
+ public static AviatorFunction generateGFunction (String name , RoleManager rm ) {
354
+ memorizedMap .put (name ,new HashMap <>());
355
+
356
+ return new AbstractVariadicFunction () {
357
+ @ Override
358
+ public AviatorObject variadicCall (Map <String , Object > env , AviatorObject ... args ) {
359
+ Map <String , AviatorBoolean > memorized = memorizedMap .get (name );
360
+ int len = args .length ;
361
+ if (len < 2 ){
362
+ return AviatorBoolean .valueOf (false );
363
+ }
364
+ Object name1Obj = FunctionUtils .getJavaObject (args [0 ], env );
365
+ String name2 = FunctionUtils .getStringValue (args [1 ], env );
366
+ Sequence name1List = null ;
367
+ String name1 = null ;
368
+ if (name1Obj instanceof java .util .List ) {
369
+ name1List = RuntimeUtils .seq (name1Obj ,env );
370
+ } else {
371
+ name1 = (String ) name1Obj ;
372
+ }
373
+
374
+ String key = "" ;
375
+ for (int i = 0 ; i < len ; i ++) {
376
+ Object nameObj = FunctionUtils .getJavaObject (args [i ], env );
377
+ if (nameObj instanceof java .util .List ) {
378
+ Sequence nameList = RuntimeUtils .seq (name , env );
379
+ for (Object obj : nameList ) {
380
+ key += ";" + obj ;
381
+ }
382
+ } else {
383
+ key += ";" + nameObj ;
371
384
}
372
- } else {
373
- key += ";" + nameObj ;
374
385
}
375
- }
376
386
377
- AviatorBoolean value = memorized .get (key );
378
- if (value != null ) {
379
- return value ;
380
- }
387
+ AviatorBoolean value = memorized .get (key );
388
+ if (value != null ) {
389
+ return value ;
390
+ }
381
391
382
- if (rm == null ) {
383
- value = AviatorBoolean .valueOf (name1 .equals (name2 ));
384
- } else if (len == 2 ) {
385
- if (name1List !=null ) {
386
- boolean res = false ;
387
- for (Object obj : name1List ) {
388
- if (rm .hasLink ((String ) obj , name2 )){
389
- res = true ;
390
- break ;
392
+ if (rm == null ) {
393
+ value = AviatorBoolean .valueOf (name1 .equals (name2 ));
394
+ } else if (len == 2 ) {
395
+ if (name1List !=null ) {
396
+ boolean res = false ;
397
+ for (Object obj : name1List ) {
398
+ if (rm .hasLink ((String ) obj , name2 )){
399
+ res = true ;
400
+ break ;
401
+ }
391
402
}
403
+ value = AviatorBoolean .valueOf (res );
392
404
}
393
- value = AviatorBoolean .valueOf (res );
394
- }
395
- value = AviatorBoolean .valueOf (rm .hasLink (name1 , name2 ));
396
- } else if (len == 3 ) {
397
- String domain = FunctionUtils .getStringValue (args [2 ], env );
398
- value = AviatorBoolean .valueOf (rm .hasLink (name1 , name2 , domain ));
399
- } else if (len == 4 ) {
400
- String p_dom = FunctionUtils .getStringValue (args [3 ], env );
401
- Object domainObj = FunctionUtils .getJavaObject (args [2 ], env );
402
-
403
- boolean res = false ;
404
- if (domainObj instanceof java .util .List ){
405
- Sequence domainSeq = RuntimeUtils .seq (domainObj ,env );
406
- for (Object r_dom : domainSeq ) {
407
- if (r_dom .equals (p_dom ) && rm .hasLink (name1 , name2 , (String ) r_dom )){
408
- res = true ;
409
- break ;
405
+ value = AviatorBoolean .valueOf (rm .hasLink (name1 , name2 ));
406
+ } else if (len == 3 ) {
407
+ String domain = FunctionUtils .getStringValue (args [2 ], env );
408
+ value = AviatorBoolean .valueOf (rm .hasLink (name1 , name2 , domain ));
409
+ } else if (len == 4 ) {
410
+ String p_dom = FunctionUtils .getStringValue (args [3 ], env );
411
+ Object domainObj = FunctionUtils .getJavaObject (args [2 ], env );
412
+
413
+ boolean res = false ;
414
+ if (domainObj instanceof java .util .List ){
415
+ Sequence domainSeq = RuntimeUtils .seq (domainObj ,env );
416
+ for (Object r_dom : domainSeq ) {
417
+ if (r_dom .equals (p_dom ) && rm .hasLink (name1 , name2 , (String ) r_dom )){
418
+ res = true ;
419
+ break ;
420
+ }
410
421
}
411
422
}
423
+ value = AviatorBoolean .valueOf (res );
424
+ } else {
425
+ value = AviatorBoolean .valueOf (false );
412
426
}
413
- value = AviatorBoolean .valueOf (res );
414
- } else {
415
- value = AviatorBoolean .valueOf (false );
427
+ memorized .put (key , value );
428
+ return value ;
416
429
}
417
- memorized .put (key , value );
418
- return value ;
419
- }
420
430
421
- @ Override
422
- public String getName () {
423
- return name ;
424
- }
425
- };
431
+ @ Override
432
+ public String getName () {
433
+ return name ;
434
+ }
435
+ };
436
+ }
426
437
}
427
-
428
438
/**
429
439
* eval calculates the stringified boolean expression and return its result.
430
440
*
0 commit comments