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

Reply via email to