360         StoreFactory storeFactory = authorization.getStoreFactory();
   361         Map<String, ResourcePermission> permissionsToEvaluate = 
new LinkedHashMap<>();
   362         ResourceStore resourceStore = storeFactory.getResourceStore();
   363         ScopeStore scopeStore = storeFactory.getScopeStore();
   364         Metadata metadata = request.getMetadata();
   365         final AtomicInteger limit = metadata != null && metadata.getLimit() != null ? 
new AtomicInteger(metadata.getLimit()) : null;
   367         for (Permission permission : ticket.getPermissions()) {
   368             if (limit != null && limit.get() <= 0) {
   372             Set<String> requestedScopes = permission.getScopes();
   374             if (permission.getScopes() == null) {
   375                 requestedScopes = 
new HashSet<>();
   378             List<Resource> requestedResources = 
new ArrayList<>();
   379             String resourceId = permission.getResourceId();
   381             if (resourceId != null) {
   382                 Resource resource = null;
   384                 if (resourceId.indexOf(
'-') != -1) {
   385                     resource = resourceStore.findById(resourceId, resourceServer.getId());
   388                 if (resource != null) {
   389                     requestedResources.add(resource);
   391                     String resourceName = resourceId;
   392                     Resource ownerResource = resourceStore.findByName(resourceName, identity.getId(), resourceServer.getId());
   394                     if (ownerResource != null) {
   395                         permission.setResourceId(ownerResource.getId());
   396                         requestedResources.add(ownerResource);
   399                     if (!identity.isResourceServer()) {
   400                         Resource serverResource = resourceStore.findByName(resourceName, resourceServer.getId());
   402                         if (serverResource != null) {
   403                             permission.setResourceId(serverResource.getId());
   404                             requestedResources.add(serverResource);
   410             String clientAdditionalScopes = request.getScope();
   412             if (clientAdditionalScopes != null) {
   413                 requestedScopes.addAll(Arrays.asList(clientAdditionalScopes.split(
" ")));
   416             Set<Scope> requestedScopesModel = requestedScopes.stream().map(s -> scopeStore.findByName(s, resourceServer.getId())).filter(Objects::nonNull).collect(Collectors.toSet());
   418             if (resourceId != null && requestedResources.isEmpty()) {
   419                 throw new CorsErrorResponseException(request.getCors(), 
"invalid_resource", 
"Resource with id [" + resourceId + 
"] does not exist.", Status.BAD_REQUEST);
   422             if (!requestedScopes.isEmpty() && requestedScopesModel.isEmpty()) {
   423                 throw new CorsErrorResponseException(request.getCors(), 
"invalid_scope", 
"One of the given scopes " + permission.getScopes() + 
" is invalid", Status.BAD_REQUEST);
   426             if (!requestedResources.isEmpty()) {
   427                 for (Resource resource : requestedResources) {
   428                     if (limit != null && limit.get() <= 0) {
   431                     ResourcePermission perm = permissionsToEvaluate.get(resource.getId());
   434                         perm = Permissions.createResourcePermissions(resource, requestedScopesModel, authorization, request);
   435                         permissionsToEvaluate.put(resource.getId(), perm);
   437                             limit.decrementAndGet();
   440                         for (Scope scope : requestedScopesModel) {
   441                             perm.addScope(scope);
   446                 AtomicBoolean processed = 
new AtomicBoolean();
   448                 resourceStore.findByScope(requestedScopesModel.stream().map(
Scope::getId).collect(Collectors.toList()), resourceServer.getId(), resource -> {
   449                     if (limit != null && limit.get() <= 0) {
   453                     ResourcePermission perm = permissionsToEvaluate.get(resource.getId());
   456                         perm = Permissions.createResourcePermissions(resource, requestedScopesModel, authorization, request);
   457                         permissionsToEvaluate.put(resource.getId(), perm);
   459                             limit.decrementAndGet();
   462                         for (Scope scope : requestedScopesModel) {
   463                             perm.addScope(scope);
   467                     processed.compareAndSet(
false, 
true);
   470                 if (!processed.get()) {
   471                     for (Scope scope : requestedScopesModel) {
   472                         if (limit != null && limit.getAndDecrement() <= 0) {
   475                         permissionsToEvaluate.computeIfAbsent(scope.getId(), s -> 
new ResourcePermission(null, 
new ArrayList<>(Arrays.asList(scope)), resourceServer, request.getClaims()));
   481         AccessToken rpt = request.getRpt();
   483         if (rpt != null && rpt.isActive()) {
   484             AccessToken.Authorization authorizationData = rpt.getAuthorization();
   486             if (authorizationData != null) {
   487                 Collection<Permission> permissions = authorizationData.getPermissions();
   489                 if (permissions != null) {
   490                     for (Permission grantedPermission : permissions) {
   491                         if (limit != null && limit.get() <= 0) {
   495                         Resource resource = resourceStore.findById(grantedPermission.getResourceId(), ticket.getAudience()[0]);
   497                         if (resource != null) {
   498                             ResourcePermission permission = permissionsToEvaluate.get(resource.getId());
   500                             if (permission == null) {
   501                                 permission = 
new ResourcePermission(resource, 
new ArrayList<>(), resourceServer, grantedPermission.getClaims());
   502                                 permissionsToEvaluate.put(resource.getId(), permission);
   504                                     limit.decrementAndGet();
   507                                 if (grantedPermission.getClaims() != null) {
   508                                     for (Entry<String, Set<String>> entry : grantedPermission.getClaims().entrySet()) {
   509                                         Set<String> claims = permission.getClaims().get(entry.getKey());
   511                                         if (claims != null) {
   512                                             claims.addAll(entry.getValue());
   518                             for (String scopeName : grantedPermission.getScopes()) {
   519                                 Scope scope = scopeStore.findByName(scopeName, resourceServer.getId());
   522                                     if (!permission.getScopes().contains(scope)) {
   523                                         permission.getScopes().add(scope);
   533         return permissionsToEvaluate.values();