1818import java .lang .module .ModuleFinder ;
1919import java .lang .module .ModuleReference ;
2020import java .util .ArrayList ;
21- import java .util .Collections ;
2221import java .util .HashMap ;
2322import java .util .IdentityHashMap ;
2423import java .util .List ;
@@ -56,8 +55,8 @@ public <E extends Entitlement> Stream<E> getEntitlements(Class<E> entitlementCla
5655
5756 final Map <Module , ModuleEntitlements > moduleEntitlementsMap = new HashMap <>();
5857
59- protected final Policy serverPolicy ;
60- protected final Map <String , Policy > pluginPolicies ;
58+ protected final Map < String , List < Entitlement >> serverEntitlements ;
59+ protected final Map <String , Map < String , List < Entitlement >>> pluginsEntitlements ;
6160 private final Function <Class <?>, String > pluginResolver ;
6261
6362 public static final String ALL_UNNAMED = "ALL-UNNAMED" ;
@@ -79,19 +78,16 @@ private static Set<Module> findSystemModules() {
7978 }
8079
8180 public PolicyManager (Policy defaultPolicy , Map <String , Policy > pluginPolicies , Function <Class <?>, String > pluginResolver ) {
82- this .serverPolicy = Objects .requireNonNull (defaultPolicy );
83- this .pluginPolicies = Collections .unmodifiableMap (Objects .requireNonNull (pluginPolicies ));
81+ this .serverEntitlements = buildScopeEntitlementsMap (Objects .requireNonNull (defaultPolicy ));
82+ this .pluginsEntitlements = Objects .requireNonNull (pluginPolicies )
83+ .entrySet ()
84+ .stream ()
85+ .collect (Collectors .toUnmodifiableMap (Map .Entry ::getKey , e -> buildScopeEntitlementsMap (e .getValue ())));
8486 this .pluginResolver = pluginResolver ;
8587 }
8688
87- private static List <Entitlement > lookupEntitlementsForModule (Policy policy , String moduleName ) {
88- for (int i = 0 ; i < policy .scopes .size (); ++i ) {
89- var scope = policy .scopes .get (i );
90- if (scope .name .equals (moduleName )) {
91- return scope .entitlements ;
92- }
93- }
94- return null ;
89+ private static Map <String , List <Entitlement >> buildScopeEntitlementsMap (Policy policy ) {
90+ return policy .scopes .stream ().collect (Collectors .toUnmodifiableMap (scope -> scope .name , scope -> scope .entitlements ));
9591 }
9692
9793 public void checkExitVM (Class <?> callerClass ) {
@@ -141,21 +137,21 @@ ModuleEntitlements getEntitlementsOrThrow(Class<?> callerClass, Module requestin
141137
142138 if (isServerModule (requestingModule )) {
143139 var scopeName = requestingModule .getName ();
144- return getModuleEntitlementsOrThrow (callerClass , requestingModule , serverPolicy , scopeName );
140+ return getModuleEntitlementsOrThrow (callerClass , requestingModule , serverEntitlements , scopeName );
145141 }
146142
147143 // plugins
148144 var pluginName = pluginResolver .apply (callerClass );
149145 if (pluginName != null ) {
150- var pluginPolicy = pluginPolicies .get (pluginName );
151- if (pluginPolicy != null ) {
146+ var pluginEntitlements = pluginsEntitlements .get (pluginName );
147+ if (pluginEntitlements != null ) {
152148 final String scopeName ;
153149 if (requestingModule .isNamed () == false ) {
154150 scopeName = ALL_UNNAMED ;
155151 } else {
156152 scopeName = requestingModule .getName ();
157153 }
158- return getModuleEntitlementsOrThrow (callerClass , requestingModule , pluginPolicy , scopeName );
154+ return getModuleEntitlementsOrThrow (callerClass , requestingModule , pluginEntitlements , scopeName );
159155 }
160156 }
161157
@@ -167,15 +163,20 @@ private static String buildModuleNoPolicyMessage(Class<?> callerClass, Module re
167163 return Strings .format ("Missing entitlement policy: caller [%s], module [%s]" , callerClass , requestingModule .getName ());
168164 }
169165
170- private ModuleEntitlements getModuleEntitlementsOrThrow (Class <?> callerClass , Module module , Policy policy , String moduleName ) {
171- var entitlements = lookupEntitlementsForModule (policy , moduleName );
166+ private ModuleEntitlements getModuleEntitlementsOrThrow (
167+ Class <?> callerClass ,
168+ Module module ,
169+ Map <String , List <Entitlement >> scopeEntitlements ,
170+ String moduleName
171+ ) {
172+ var entitlements = scopeEntitlements .get (moduleName );
172173 if (entitlements == null ) {
173174 // Module without entitlements - remember we don't have any
174175 moduleEntitlementsMap .put (module , ModuleEntitlements .NONE );
175176 throw new NotEntitledException (buildModuleNoPolicyMessage (callerClass , module ));
176177 }
177178 // We have a policy for this module
178- var classEntitlements = createClassEntitlements (entitlements );
179+ var classEntitlements = new ModuleEntitlements (entitlements );
179180 moduleEntitlementsMap .put (module , classEntitlements );
180181 return classEntitlements ;
181182 }
@@ -184,10 +185,6 @@ private static boolean isServerModule(Module requestingModule) {
184185 return requestingModule .isNamed () && requestingModule .getLayer () == ModuleLayer .boot ();
185186 }
186187
187- private ModuleEntitlements createClassEntitlements (List <Entitlement > entitlements ) {
188- return new ModuleEntitlements (entitlements );
189- }
190-
191188 private static Module requestingModule (Class <?> callerClass ) {
192189 if (callerClass != null ) {
193190 Module callerModule = callerClass .getModule ();
@@ -222,6 +219,6 @@ private static boolean isTriviallyAllowed(Module requestingModule) {
222219
223220 @ Override
224221 public String toString () {
225- return "PolicyManager{" + "serverPolicy =" + serverPolicy + ", pluginPolicies =" + pluginPolicies + '}' ;
222+ return "PolicyManager{" + "serverEntitlements =" + serverEntitlements + ", pluginsEntitlements =" + pluginsEntitlements + '}' ;
226223 }
227224}
0 commit comments