You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by bd...@apache.org on 2023/09/05 23:52:59 UTC
[directory-scimple] branch context-inject created (now 96743363)
This is an automated email from the ASF dual-hosted git repository.
bdemers pushed a change to branch context-inject
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git
at 96743363 Move @Context object to field injection
This branch includes the following new commits:
new 96743363 Move @Context object to field injection
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[directory-scimple] 01/01: Move @Context object to field injection
Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
bdemers pushed a commit to branch context-inject
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git
commit 9674336331e68143467ba509ac67c88eab6e740d
Author: Brian Demers <bd...@apache.org>
AuthorDate: Fri Sep 1 16:53:14 2023 -0400
Move @Context object to field injection
Previously all injectsion into resources were done with field injection, this was replaced with constructor injection and the RequestContext class.
However this mixes CDI injection and the Jakarta WS injection techniques, not all implementations support this.
Jakarta WS 4 should allow these objects to be injected via CDI-light.
For now there is a mix of constructor and field injection with a TODO message where they are used.
---
.../server/rest/BaseResourceTypeResourceImpl.java | 24 +++++++-----
.../scim/server/rest/GroupResourceImpl.java | 10 +++--
.../directory/scim/server/rest/RequestContext.java | 45 ----------------------
.../server/rest/ResourceTypesResourceImpl.java | 16 ++++----
.../scim/server/rest/SelfResourceImpl.java | 15 ++++----
.../scim/server/rest/UserResourceImpl.java | 10 +++--
.../rest/BaseResourceTypeResourceImplTest.java | 2 +-
.../scim/server/rest/SelfResourceImplTest.java | 6 ++-
.../scim/spring/ScimpleSpringConfiguration.java | 2 -
9 files changed, 50 insertions(+), 80 deletions(-)
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
index deb5f44f..66783aef 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
@@ -29,8 +29,7 @@ import java.util.function.Function;
import jakarta.enterprise.inject.spi.CDI;
import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.core.EntityTag;
-import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.*;
import jakarta.ws.rs.core.Response.ResponseBuilder;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.core.Response.Status.Family;
@@ -77,16 +76,21 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
private final AttributeUtil attributeUtil;
- RequestContext requestContext;
-
private final EtagGenerator etagGenerator;
private final Class<T> resourceClass;
- public BaseResourceTypeResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, RequestContext requestContext, EtagGenerator etagGenerator, Class<T> resourceClass) {
+ // TODO: Field injection of UriInfo, Request should work with all implementations
+ // CDI can be used directly in Jakarta WS 4
+ @Context
+ UriInfo uriInfo;
+
+ @Context
+ Request request;
+
+ public BaseResourceTypeResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, EtagGenerator etagGenerator, Class<T> resourceClass) {
this.schemaRegistry = schemaRegistry;
this.repositoryRegistry = repositoryRegistry;
- this.requestContext = requestContext;
this.etagGenerator = etagGenerator;
this.resourceClass = resourceClass;
this.attributeUtil = new AttributeUtil(schemaRegistry);
@@ -106,7 +110,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
@Override
public Response getById(String id, AttributeReferenceListWrapper attributes, AttributeReferenceListWrapper excludedAttributes) throws ScimException, ResourceException {
- if (requestContext.getUriInfo().getQueryParameters().getFirst("filter") != null) {
+ if (uriInfo.getQueryParameters().getFirst("filter") != null) {
return Response.status(Status.FORBIDDEN).build();
}
@@ -124,7 +128,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
if (resource != null) {
EntityTag backingETag = requireEtag(resource);
- ResponseBuilder evaluatePreconditionsResponse = requestContext.getRequest().evaluatePreconditions(backingETag);
+ ResponseBuilder evaluatePreconditionsResponse = request.evaluatePreconditions(backingETag);
if (evaluatePreconditionsResponse != null) {
return Response.status(Status.NOT_MODIFIED).build();
@@ -339,7 +343,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
LOG.warn("Repository must supply an id for a resource");
id = "unknown";
}
- return requestContext.getUriInfo().getAbsolutePathBuilder()
+ return uriInfo.getAbsolutePathBuilder()
.path(id)
.build();
}
@@ -379,7 +383,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
}
private void validatePreconditions(String id, EntityTag etag) {
- ResponseBuilder response = requestContext.getRequest().evaluatePreconditions(etag);
+ ResponseBuilder response = request.evaluatePreconditions(etag);
if (response != null) {
throw new WebApplicationException(response
.entity(new ErrorResponse(Status.PRECONDITION_FAILED, "Failed to update record, backing record has changed - " + id))
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
index 7714d858..7c7a0fb8 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
@@ -24,6 +24,10 @@ package org.apache.directory.scim.server.rest;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Request;
+import jakarta.ws.rs.core.SecurityContext;
+import jakarta.ws.rs.core.UriInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.directory.scim.core.repository.RepositoryRegistry;
import org.apache.directory.scim.protocol.GroupResource;
@@ -35,12 +39,12 @@ import org.apache.directory.scim.core.schema.SchemaRegistry;
public class GroupResourceImpl extends BaseResourceTypeResourceImpl<ScimGroup> implements GroupResource {
@Inject
- public GroupResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, RequestContext requestContext, EtagGenerator etagGenerator) {
- super(schemaRegistry, repositoryRegistry, requestContext, etagGenerator, ScimGroup.class);
+ public GroupResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, EtagGenerator etagGenerator) {
+ super(schemaRegistry, repositoryRegistry, etagGenerator, ScimGroup.class);
}
public GroupResourceImpl() {
// CDI
- this(null, null, null, null);
+ this(null, null, null);
}
}
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/RequestContext.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/RequestContext.java
deleted file mode 100644
index db1516b9..00000000
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/RequestContext.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.directory.scim.server.rest;
-
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.Request;
-import jakarta.ws.rs.core.SecurityContext;
-import jakarta.ws.rs.core.UriInfo;
-import lombok.Data;
-
-/**
- * Container of JAXRS Context classes. These classes are likely inject via a proxy, so keeping them in a single place
- * removes the need to have field injection for @Context classes in other places.
- */
-@Data
-@ApplicationScoped
-public class RequestContext {
-
- @Context
- private UriInfo uriInfo;
-
- @Context
- private Request request;
-
- @Context
- private SecurityContext securityContext;
-}
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
index a462c251..3b7f0631 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
@@ -25,7 +25,7 @@ import java.util.List;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
-import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.*;
import jakarta.ws.rs.core.Response.Status;
import org.apache.directory.scim.protocol.ResourceTypesResource;
@@ -39,17 +39,19 @@ public class ResourceTypesResourceImpl implements ResourceTypesResource {
private final SchemaRegistry schemaRegistry;
- private final RequestContext requestContext;
+ // TODO: Field injection of UriInfo should work with all implementations
+ // CDI can be used directly in Jakarta WS 4
+ @Context
+ UriInfo uriInfo;
@Inject
- public ResourceTypesResourceImpl(SchemaRegistry schemaRegistry, RequestContext requestContext) {
+ public ResourceTypesResourceImpl(SchemaRegistry schemaRegistry) {
this.schemaRegistry = schemaRegistry;
- this.requestContext = requestContext;
}
public ResourceTypesResourceImpl() {
// CDI
- this(null, null);
+ this(null);
}
@Override
@@ -63,7 +65,7 @@ public class ResourceTypesResourceImpl implements ResourceTypesResource {
for (ResourceType resourceType : resourceTypes) {
Meta meta = new Meta();
- meta.setLocation(requestContext.getUriInfo().getAbsolutePathBuilder().path(resourceType.getName()).build().toString());
+ meta.setLocation(uriInfo.getAbsolutePathBuilder().path(resourceType.getName()).build().toString());
meta.setResourceType(resourceType.getResourceType());
resourceType.setMeta(meta);
@@ -88,7 +90,7 @@ public class ResourceTypesResourceImpl implements ResourceTypesResource {
}
Meta meta = new Meta();
- meta.setLocation(requestContext.getUriInfo().getAbsolutePath().toString());
+ meta.setLocation(uriInfo.getAbsolutePath().toString());
meta.setResourceType(resourceType.getResourceType());
resourceType.setMeta(meta);
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
index fc7e7fc1..e7bd758c 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
@@ -24,7 +24,7 @@ import java.security.Principal;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Instance;
import jakarta.inject.Inject;
-import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.*;
import jakarta.ws.rs.core.Response.Status;
import org.apache.directory.scim.spec.exception.ResourceException;
@@ -33,7 +33,6 @@ import org.apache.directory.scim.core.repository.SelfIdResolver;
import org.apache.directory.scim.protocol.SelfResource;
import org.apache.directory.scim.protocol.UserResource;
import org.apache.directory.scim.spec.filter.attribute.AttributeReferenceListWrapper;
-import org.apache.directory.scim.protocol.data.ErrorResponse;
import org.apache.directory.scim.protocol.data.PatchRequest;
import org.apache.directory.scim.protocol.exception.ScimException;
import org.apache.directory.scim.spec.resources.ScimUser;
@@ -47,18 +46,20 @@ public class SelfResourceImpl implements SelfResource {
private final Instance<SelfIdResolver> selfIdResolver;
- private final RequestContext requestContext;
+ // TODO: Field injection of SecurityContext should work with all implementations
+ // CDI can be used directly in Jakarta WS 4
+ @Context
+ SecurityContext securityContext;
@Inject
- public SelfResourceImpl(UserResource userResource, Instance<SelfIdResolver> selfIdResolver, RequestContext requestContext) {
+ public SelfResourceImpl(UserResource userResource, Instance<SelfIdResolver> selfIdResolver) {
this.userResource = userResource;
this.selfIdResolver = selfIdResolver;
- this.requestContext = requestContext;
}
public SelfResourceImpl() {
// CDI
- this(null, null, null);
+ this(null, null);
}
@Override
@@ -94,7 +95,7 @@ public class SelfResourceImpl implements SelfResource {
}
private String getInternalId() throws ResourceException {
- Principal callerPrincipal = requestContext.getSecurityContext().getUserPrincipal();
+ Principal callerPrincipal = securityContext.getUserPrincipal();
if (callerPrincipal != null) {
log.debug("Resolved SelfResource principal to : {}", callerPrincipal.getName());
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
index cec2eed2..a621a0f6 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
@@ -24,6 +24,10 @@ package org.apache.directory.scim.server.rest;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Request;
+import jakarta.ws.rs.core.SecurityContext;
+import jakarta.ws.rs.core.UriInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.directory.scim.core.repository.RepositoryRegistry;
import org.apache.directory.scim.protocol.UserResource;
@@ -39,12 +43,12 @@ import org.apache.directory.scim.core.schema.SchemaRegistry;
public class UserResourceImpl extends BaseResourceTypeResourceImpl<ScimUser> implements UserResource {
@Inject
- public UserResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, RequestContext requestContext, EtagGenerator etagGenerator) {
- super(schemaRegistry, repositoryRegistry, requestContext, etagGenerator, ScimUser.class);
+ public UserResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, EtagGenerator etagGenerator) {
+ super(schemaRegistry, repositoryRegistry, etagGenerator, ScimUser.class);
}
public UserResourceImpl() {
// CDI
- this(null, null, null, null);
+ this(null, null, null);
}
}
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
index 8b69d3cf..8424b0e7 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
@@ -86,7 +86,7 @@ public class BaseResourceTypeResourceImplTest {
BaseResourceTypeResourceImpl baseResourceImpl = Mockito.mock(BaseResourceTypeResourceImpl.class);
UriInfo uriInfo = mock(UriInfo.class);
MultivaluedMap queryParams = mock(MultivaluedMap.class);
- baseResourceImpl.requestContext = new RequestContext().setUriInfo(uriInfo);
+ baseResourceImpl.uriInfo = uriInfo;
when(uriInfo.getQueryParameters()).thenReturn(queryParams);
when(queryParams.getFirst("filter")).thenReturn("not null");
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
index 982a59be..32052792 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
@@ -53,7 +53,8 @@ public class SelfResourceImplTest {
when(principal.getName()).thenReturn("test-user");
when(selfIdResolverInstance.isUnsatisfied()).thenReturn(true);
- SelfResourceImpl selfResource = new SelfResourceImpl(null, selfIdResolverInstance, new RequestContext().setSecurityContext(securityContext));
+ SelfResourceImpl selfResource = new SelfResourceImpl(null, selfIdResolverInstance);
+ selfResource.securityContext = securityContext;
UnableToResolveIdResourceException exception = assertThrows(UnableToResolveIdResourceException.class, () -> selfResource.getSelf(null, null));
@@ -79,7 +80,8 @@ public class SelfResourceImplTest {
when(selfIdResolver.resolveToInternalId(principal)).thenReturn(internalId);
when(userResource.getById(internalId, null, null)).thenReturn(mockResponse);
- SelfResourceImpl selfResource = new SelfResourceImpl(userResource, selfIdResolverInstance, new RequestContext().setSecurityContext(securityContext));
+ SelfResourceImpl selfResource = new SelfResourceImpl(userResource, selfIdResolverInstance);
+ selfResource.securityContext = securityContext;
// the response is just a passed along from the UserResource, so just validate it is the same instance.
assertThat(selfResource.getSelf(null, null), sameInstance(mockResponse));
diff --git a/support/spring-boot/src/main/java/org/apache/directory/scim/spring/ScimpleSpringConfiguration.java b/support/spring-boot/src/main/java/org/apache/directory/scim/spring/ScimpleSpringConfiguration.java
index bc80663d..0d066d0e 100644
--- a/support/spring-boot/src/main/java/org/apache/directory/scim/spring/ScimpleSpringConfiguration.java
+++ b/support/spring-boot/src/main/java/org/apache/directory/scim/spring/ScimpleSpringConfiguration.java
@@ -30,7 +30,6 @@ import org.apache.directory.scim.core.schema.SchemaRegistry;
import org.apache.directory.scim.protocol.UserResource;
import org.apache.directory.scim.server.configuration.ServerConfiguration;
import org.apache.directory.scim.server.rest.EtagGenerator;
-import org.apache.directory.scim.server.rest.RequestContext;
import org.apache.directory.scim.server.rest.ScimResourceHelper;
import org.apache.directory.scim.server.rest.UserResourceImpl;
import org.apache.directory.scim.spec.resources.ScimResource;
@@ -101,7 +100,6 @@ public class ScimpleSpringConfiguration {
config.register(new AbstractBinder() {
@Override
protected void configure() {
- bind(RequestContext.class).to(RequestContext.class); // needs to load from HK2 to include @Context
bind(UserResourceImpl.class).to(UserResource.class); // Used by SelfResource
}
});