88import com .alibaba .qlexpress4 .exception .QLRuntimeException ;
99import com .alibaba .qlexpress4 .exception .QLSyntaxException ;
1010import com .alibaba .qlexpress4 .exception .QLTimeoutException ;
11+ import com .alibaba .qlexpress4 .inport .MyDesk ;
1112import com .alibaba .qlexpress4 .runtime .Value ;
1213import com .alibaba .qlexpress4 .runtime .context .DynamicVariableContext ;
1314import com .alibaba .qlexpress4 .runtime .context .ExpressContext ;
2526import org .junit .Test ;
2627
2728import java .lang .reflect .InvocationTargetException ;
29+ import java .lang .reflect .Member ;
2830import java .math .BigDecimal ;
2931import java .math .BigInteger ;
3032import java .util .ArrayList ;
@@ -427,6 +429,56 @@ public void docPreciseTest() {
427429 // end::preciseSwitch[]
428430 }
429431
432+ @ Test
433+ public void securityStrategyTest ()
434+ throws NoSuchMethodException , SecurityException , NoSuchFieldException {
435+ // tag::securityStrategyContextSetup[]
436+ MyDesk desk = new MyDesk ();
437+ desk .setBook1 ("Thinking in Java" );
438+ desk .setBook2 ("Effective Java" );
439+ Map <String , Object > context = Collections .singletonMap ("desk" , desk );
440+ // end::securityStrategyContextSetup[]
441+
442+ // tag::securityStrategyIsolation[]
443+ // default isolation strategy, no field or method can be found
444+ Express4Runner express4RunnerIsolation = new Express4Runner (InitOptions .DEFAULT_OPTIONS );
445+ assertErrorCode (express4RunnerIsolation , context , "desk.book1" , "FIELD_NOT_FOUND" );
446+ assertErrorCode (express4RunnerIsolation , context , "desk.getBook2()" , "METHOD_NOT_FOUND" );
447+ // end::securityStrategyIsolation[]
448+
449+ // tag::securityStrategyBlackList[]
450+ // black list security strategy
451+ Set <Member > memberList = new HashSet <>();
452+ memberList .add (MyDesk .class .getMethod ("getBook2" ));
453+ Express4Runner express4RunnerBlackList = new Express4Runner (
454+ InitOptions .builder ().securityStrategy (QLSecurityStrategy .blackList (memberList )).build ());
455+ assertErrorCode (express4RunnerBlackList , context , "desk.book2" , "FIELD_NOT_FOUND" );
456+ Object resultBlack =
457+ express4RunnerBlackList .execute ("desk.book1" , context , QLOptions .DEFAULT_OPTIONS ).getResult ();
458+ Assert .assertEquals ("Thinking in Java" , resultBlack );
459+ // end::securityStrategyBlackList[]
460+
461+ // tag::securityStrategyWhiteList[]
462+ // white list security strategy
463+ Express4Runner express4RunnerWhiteList = new Express4Runner (
464+ InitOptions .builder ().securityStrategy (QLSecurityStrategy .whiteList (memberList )).build ());
465+ Object resultWhite =
466+ express4RunnerWhiteList .execute ("desk.getBook2()" , context , QLOptions .DEFAULT_OPTIONS ).getResult ();
467+ Assert .assertEquals ("Effective Java" , resultWhite );
468+ assertErrorCode (express4RunnerWhiteList , context , "desk.getBook1()" , "METHOD_NOT_FOUND" );
469+ // end::securityStrategyWhiteList[]
470+
471+ // tag::securityStrategyOpen[]
472+ // open security strategy
473+ Express4Runner express4RunnerOpen =
474+ new Express4Runner (InitOptions .builder ().securityStrategy (QLSecurityStrategy .open ()).build ());
475+ Assert .assertEquals ("Thinking in Java" ,
476+ express4RunnerOpen .execute ("desk.book1" , context , QLOptions .DEFAULT_OPTIONS ).getResult ());
477+ Assert .assertEquals ("Effective Java" ,
478+ express4RunnerOpen .execute ("desk.getBook2()" , context , QLOptions .DEFAULT_OPTIONS ).getResult ());
479+ // end::securityStrategyOpen[]
480+ }
481+
430482 @ Test
431483 public void mapSetGetTest () {
432484 String script = "a = new HashMap<>();" + "a['aaa'] = 'bbb';" + "a" ;
@@ -526,6 +578,7 @@ public void debugExample() {
526578
527579 @ Test
528580 public void populateTest () {
581+ // tag::polluteUserContext[]
529582 Express4Runner express4Runner = new Express4Runner (InitOptions .DEFAULT_OPTIONS );
530583 QLOptions populateOption = QLOptions .builder ().polluteUserContext (true ).build ();
531584 Map <String , Object > populatedMap = new HashMap <>();
@@ -535,14 +588,15 @@ public void populateTest() {
535588 assertEquals (11 , populatedMap .get ("b" ));
536589
537590 // no population
538- Map <String , Object > populatedMap2 = new HashMap <>();
539- express4Runner .execute ("a = 11" , populatedMap2 , QLOptions .DEFAULT_OPTIONS );
540- assertFalse (populatedMap2 .containsKey ("a" ));
541-
542- Map <String , Object > populatedMap3 = new HashMap <>();
543- populatedMap3 .put ("a" , 10 );
544- assertEquals (19 , express4Runner .execute ("a = 19;a" , populatedMap3 , QLOptions .DEFAULT_OPTIONS ).getResult ());
545- assertEquals (10 , populatedMap3 .get ("a" ));
591+ Map <String , Object > noPopulatedMap1 = new HashMap <>();
592+ express4Runner .execute ("a = 11" , noPopulatedMap1 , QLOptions .DEFAULT_OPTIONS );
593+ assertFalse (noPopulatedMap1 .containsKey ("a" ));
594+
595+ Map <String , Object > noPopulatedMap2 = new HashMap <>();
596+ noPopulatedMap2 .put ("a" , 10 );
597+ assertEquals (19 , express4Runner .execute ("a = 19;a" , noPopulatedMap2 , QLOptions .DEFAULT_OPTIONS ).getResult ());
598+ assertEquals (10 , noPopulatedMap2 .get ("a" ));
599+ // end::polluteUserContext[]
546600 }
547601
548602 @ SuppressWarnings ("unchecked" )
0 commit comments