use of org.keycloak.common.util.PathMatcher in project keycloak by keycloak.
the class ResourceSetService method find.
public Response find(@QueryParam("_id") String id, @QueryParam("name") String name, @QueryParam("uri") String uri, @QueryParam("owner") String owner, @QueryParam("type") String type, @QueryParam("scope") String scope, @QueryParam("matchingUri") Boolean matchingUri, @QueryParam("exactName") Boolean exactName, @QueryParam("deep") Boolean deep, @QueryParam("first") Integer firstResult, @QueryParam("max") Integer maxResult, BiFunction<Resource, Boolean, ?> toRepresentation) {
requireView();
StoreFactory storeFactory = authorization.getStoreFactory();
if (deep == null) {
deep = true;
}
Map<Resource.FilterOption, String[]> search = new EnumMap<>(Resource.FilterOption.class);
if (id != null && !"".equals(id.trim())) {
search.put(Resource.FilterOption.ID, new String[] { id });
}
if (name != null && !"".equals(name.trim())) {
search.put(exactName != null && exactName ? Resource.FilterOption.EXACT_NAME : Resource.FilterOption.NAME, new String[] { name });
}
if (uri != null && !"".equals(uri.trim())) {
search.put(Resource.FilterOption.URI, new String[] { uri });
}
if (owner != null && !"".equals(owner.trim())) {
RealmModel realm = authorization.getKeycloakSession().getContext().getRealm();
ClientModel clientModel = realm.getClientByClientId(owner);
if (clientModel != null) {
owner = clientModel.getId();
} else {
UserModel user = authorization.getKeycloakSession().users().getUserByUsername(realm, owner);
if (user != null) {
owner = user.getId();
}
}
search.put(Resource.FilterOption.OWNER, new String[] { owner });
}
if (type != null && !"".equals(type.trim())) {
search.put(Resource.FilterOption.TYPE, new String[] { type });
}
if (scope != null && !"".equals(scope.trim())) {
Map<Scope.FilterOption, String[]> scopeFilter = new EnumMap<>(Scope.FilterOption.class);
scopeFilter.put(Scope.FilterOption.NAME, new String[] { scope });
List<Scope> scopes = authorization.getStoreFactory().getScopeStore().findByResourceServer(scopeFilter, resourceServer.getId(), -1, -1);
if (scopes.isEmpty()) {
return Response.ok(Collections.emptyList()).build();
}
search.put(Resource.FilterOption.SCOPE_ID, scopes.stream().map(Scope::getId).toArray(String[]::new));
}
List<Resource> resources = storeFactory.getResourceStore().findByResourceServer(search, this.resourceServer.getId(), firstResult != null ? firstResult : -1, maxResult != null ? maxResult : Constants.DEFAULT_MAX_RESULTS);
if (matchingUri != null && matchingUri && resources.isEmpty()) {
Map<Resource.FilterOption, String[]> attributes = new EnumMap<>(Resource.FilterOption.class);
attributes.put(Resource.FilterOption.URI_NOT_NULL, new String[] { "true" });
attributes.put(Resource.FilterOption.OWNER, new String[] { resourceServer.getId() });
List<Resource> serverResources = storeFactory.getResourceStore().findByResourceServer(attributes, this.resourceServer.getId(), firstResult != null ? firstResult : -1, maxResult != null ? maxResult : -1);
PathMatcher<Map.Entry<String, Resource>> pathMatcher = new PathMatcher<Map.Entry<String, Resource>>() {
@Override
protected String getPath(Map.Entry<String, Resource> entry) {
return entry.getKey();
}
@Override
protected Collection<Map.Entry<String, Resource>> getPaths() {
Map<String, Resource> result = new HashMap<>();
serverResources.forEach(resource -> resource.getUris().forEach(uri -> {
result.put(uri, resource);
}));
return result.entrySet();
}
};
Map.Entry<String, Resource> matches = pathMatcher.matches(uri);
if (matches != null) {
resources = Collections.singletonList(matches.getValue());
}
}
Boolean finalDeep = deep;
return Response.ok(resources.stream().map(resource -> toRepresentation.apply(resource, finalDeep)).collect(Collectors.toList())).build();
}
Aggregations