This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch CAUSEWAY-3524 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit d91aba3a9f44e32d43fa3498568300f38fcbe6c5 Author: danhaywood <[email protected]> AuthorDate: Sat Jul 8 12:32:33 2023 +0100 CAUSEWAY-3524 --- extensions/security/secman/integration/pom.xml | 7 +++ .../CausewayModuleExtSecmanIntegration.java | 4 +- .../ApplicationFeatureIdTransformer.java | 16 ------ .../ApplicationFeatureIdTransformerIdentity.java | 66 ++++++++++++++++++++++ .../PermissionsEvaluationServiceForSecman.java | 14 +---- .../src/main/resources/META-INF/spring.factories | 3 +- ...icationFeatureIdTransformerV1Compatibility.java | 59 +++++++++++++++++++ ...onFeatureIdTransformerV1Compatibility_Test.java | 47 +++++++++++++++ 8 files changed, 186 insertions(+), 30 deletions(-) diff --git a/extensions/security/secman/integration/pom.xml b/extensions/security/secman/integration/pom.xml index 6977e5f0dd..82668509be 100644 --- a/extensions/security/secman/integration/pom.xml +++ b/extensions/security/secman/integration/pom.xml @@ -48,6 +48,13 @@ <scope>provided</scope> </dependency> + <dependency> + <groupId>org.apache.causeway.testing</groupId> + <artifactId>causeway-testing-unittestsupport-applib</artifactId> + <scope>test</scope> + </dependency> + + </dependencies> </project> diff --git a/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/CausewayModuleExtSecmanIntegration.java b/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/CausewayModuleExtSecmanIntegration.java index b8c8bb0ef3..25ff15a256 100644 --- a/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/CausewayModuleExtSecmanIntegration.java +++ b/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/CausewayModuleExtSecmanIntegration.java @@ -18,7 +18,7 @@ */ package org.apache.causeway.extensions.secman.integration; -import org.apache.causeway.extensions.secman.integration.permissions.ApplicationFeatureIdTransformer; +import org.apache.causeway.extensions.secman.integration.permissions.ApplicationFeatureIdTransformerIdentity; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -46,7 +46,7 @@ import org.apache.causeway.extensions.secman.integration.userreg.UserRegistratio TableColumnVisibilityServiceForSecman.class, ImpersonateMenuAdvisorForSecman.class, //not activated by default yet PermissionsEvaluationServiceForSecman.class, - ApplicationFeatureIdTransformer.Identity.class, + ApplicationFeatureIdTransformerIdentity.class, UserRegistrationServiceForSecman.class, UserMementoRefinerFromApplicationUser.class, diff --git a/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformer.java b/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformer.java index a843a19710..ffbd3544bb 100644 --- a/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformer.java +++ b/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformer.java @@ -53,20 +53,4 @@ public interface ApplicationFeatureIdTransformer { .collect(Collectors.toList()); } - @Service - @Priority(PriorityPrecedence.LATE) - class Identity implements ApplicationFeatureIdTransformer { - - @Programmatic - @Override - public ApplicationFeatureId transform(ApplicationFeatureId applicationFeatureId) { - return applicationFeatureId; - } - - @Programmatic - @Override - public Collection<ApplicationPermissionValue> transform(Collection<ApplicationPermissionValue> permissionValues) { - return permissionValues; - } - } } diff --git a/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerIdentity.java b/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerIdentity.java new file mode 100644 index 0000000000..4a4810a07b --- /dev/null +++ b/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerIdentity.java @@ -0,0 +1,66 @@ +/* + * 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.causeway.extensions.secman.integration.permissions; + +import org.apache.causeway.applib.annotation.PriorityPrecedence; +import org.apache.causeway.applib.annotation.Programmatic; +import org.apache.causeway.applib.services.appfeat.ApplicationFeatureId; +import org.apache.causeway.extensions.secman.applib.CausewayModuleExtSecmanApplib; +import org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPermissionValue; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Collection; + +/** + * Created as a service, if required, by {@link AutoConfiguration}. + * + * @since 2.0 {@index} + */ +public class ApplicationFeatureIdTransformerIdentity implements ApplicationFeatureIdTransformer { + + @Programmatic + @Override + public ApplicationFeatureId transform(ApplicationFeatureId applicationFeatureId) { + return applicationFeatureId; + } + + @Programmatic + @Override + public Collection<ApplicationPermissionValue> transform(Collection<ApplicationPermissionValue> permissionValues) { + return permissionValues; + } + + @AutoConfigureOrder(PriorityPrecedence.LATE) + @Configuration + public static class AutoConfiguration { + + @Bean(CausewayModuleExtSecmanApplib.NAMESPACE + ".ApplicationFeatureIdTransformerIdentity") + @ConditionalOnMissingBean(ApplicationFeatureIdTransformer.class) + @Qualifier("Identity") + public ApplicationFeatureIdTransformer ApplicationFeatureIdTransformer() { + return new ApplicationFeatureIdTransformerIdentity(); + } + + } +} diff --git a/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/PermissionsEvaluationServiceForSecman.java b/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/PermissionsEvaluationServiceForSecman.java index b0991ec9fc..b0a6adb8bb 100644 --- a/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/PermissionsEvaluationServiceForSecman.java +++ b/extensions/security/secman/integration/src/main/java/org/apache/causeway/extensions/secman/integration/permissions/PermissionsEvaluationServiceForSecman.java @@ -76,8 +76,8 @@ implements PermissionsEvaluationService { final ApplicationPermissionMode mode, final Collection<ApplicationPermissionValue> permissionValuesInput) { - final ApplicationFeatureId targetMemberId = applicationFeatureIdTransformer().transform(targetMemberIdInput); - final Collection<ApplicationPermissionValue> permissionValues = applicationFeatureIdTransformer().transform(permissionValuesInput); + final ApplicationFeatureId targetMemberId = applicationFeatureIdTransformer.transform(targetMemberIdInput); + final Collection<ApplicationPermissionValue> permissionValues = applicationFeatureIdTransformer.transform(permissionValuesInput); if(_NullSafe.isEmpty(permissionValues)) { return null; @@ -116,14 +116,6 @@ implements PermissionsEvaluationService { throw _Exceptions.illegalArgument("PermissionsEvaluationPolicy '%s' not recognised", policy); } - private ApplicationFeatureIdTransformer applicationFeatureIdTransformerCached; - ApplicationFeatureIdTransformer applicationFeatureIdTransformer() { - if (applicationFeatureIdTransformerCached == null) { - applicationFeatureIdTransformerCached = applicationFeatureIdTransformers == null || applicationFeatureIdTransformers.isEmpty() ? new ApplicationFeatureIdTransformer.Identity() : applicationFeatureIdTransformers.get(0); - } - return applicationFeatureIdTransformerCached; - }; - - @Inject List<ApplicationFeatureIdTransformer> applicationFeatureIdTransformers; + @Inject ApplicationFeatureIdTransformer applicationFeatureIdTransformer; } diff --git a/extensions/security/secman/integration/src/main/resources/META-INF/spring.factories b/extensions/security/secman/integration/src/main/resources/META-INF/spring.factories index 34738a98d8..30d7a4af8a 100644 --- a/extensions/security/secman/integration/src/main/resources/META-INF/spring.factories +++ b/extensions/security/secman/integration/src/main/resources/META-INF/spring.factories @@ -1,2 +1,3 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - org.apache.causeway.extensions.secman.integration.authenticator.AuthenticatorSecmanAutoConfiguration + org.apache.causeway.extensions.secman.integration.authenticator.AuthenticatorSecmanAutoConfiguration, + org.apache.causeway.extensions.secman.integration.permissions.ApplicationFeatureIdTransformerIdentity.AutoConfiguration diff --git a/extensions/security/secman/integration/src/test/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerV1Compatibility.java b/extensions/security/secman/integration/src/test/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerV1Compatibility.java new file mode 100644 index 0000000000..debde0dad2 --- /dev/null +++ b/extensions/security/secman/integration/src/test/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerV1Compatibility.java @@ -0,0 +1,59 @@ +/* + * 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.causeway.extensions.secman.integration.permissions; + +import java.util.Collection; + +import lombok.RequiredArgsConstructor; + +import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import org.apache.causeway.applib.annotation.PriorityPrecedence; +import org.apache.causeway.applib.annotation.Programmatic; +import org.apache.causeway.applib.services.appfeat.ApplicationFeatureId; +import org.apache.causeway.extensions.secman.applib.CausewayModuleExtSecmanApplib; +import org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPermissionValue; + +import javax.inject.Inject; + + +@RequiredArgsConstructor(onConstructor_ = {@Inject}) +public class ApplicationFeatureIdTransformerV1Compatibility implements ApplicationFeatureIdTransformer { + + private final SpecificationLoader specificationLoader; + + @Programmatic + @Override + public ApplicationFeatureId transform(ApplicationFeatureId applicationFeatureId) { + return applicationFeatureId; + } + + @Programmatic + @Override + public Collection<ApplicationPermissionValue> transform(Collection<ApplicationPermissionValue> permissionValues) { + return permissionValues; + } + +} diff --git a/extensions/security/secman/integration/src/test/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerV1Compatibility_Test.java b/extensions/security/secman/integration/src/test/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerV1Compatibility_Test.java new file mode 100644 index 0000000000..eae7ce4454 --- /dev/null +++ b/extensions/security/secman/integration/src/test/java/org/apache/causeway/extensions/secman/integration/permissions/ApplicationFeatureIdTransformerV1Compatibility_Test.java @@ -0,0 +1,47 @@ +package org.apache.causeway.extensions.secman.integration.permissions; + +import org.apache.causeway.applib.services.appfeat.ApplicationFeatureId; + +import org.apache.causeway.core.metamodel.spec.ObjectSpecification; +import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.lenient; + +@ExtendWith(MockitoExtension.class) +class ApplicationFeatureIdTransformerV1Compatibility_Test { + + public static class Customer {} + + @Mock SpecificationLoader mockSpecificationLoader; + @Mock ObjectSpecification mockSpecificationForCustomerClass; + + ApplicationFeatureIdTransformer transformer; + + @BeforeEach + void setup() { + transformer = new ApplicationFeatureIdTransformerV1Compatibility(mockSpecificationLoader); + + lenient().when(mockSpecificationLoader.specForLogicalTypeName("customer.Customer")).thenReturn(Optional.of(mockSpecificationForCustomerClass)); + lenient().when(mockSpecificationForCustomerClass.getCorrespondingClass()).then(__ -> Customer.class); + } + + @Test + void happy_case() { + ApplicationFeatureId input = ApplicationFeatureId.newMember("customer.Customer", "lastName"); + ApplicationFeatureId transform = transformer.transform(input); + + assertThat(transform.getLogicalTypeName()).isEqualTo(Customer.class.getName()); + } + +} \ No newline at end of file
