This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 2ef8bc88eb CAUSEWAY-3697: wire up filter SPI
2ef8bc88eb is described below

commit 2ef8bc88eb85c6fbab7b181f737f60682e0bf2d8
Author: Andi Huber <[email protected]>
AuthorDate: Thu Mar 14 12:52:23 2024 +0100

    CAUSEWAY-3697: wire up filter SPI
---
 .../domainservice/DomainServiceFacetAbstract.java  |  4 +--
 .../DomainServiceFacetAnnotationFactory.java       | 32 +++++++++++++++++++---
 .../DomainServiceFacetForAnnotation.java           | 30 +++++++++++---------
 3 files changed, 47 insertions(+), 19 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
index 690210f276..e546cb9e86 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
@@ -42,9 +42,9 @@ implements DomainServiceFacet {
     private final boolean contributingToWebApi;
 
     public DomainServiceFacetAbstract(
-            final @NonNull FacetHolder facetHolder,
             final boolean contributingToUi,
-            final boolean contributingToWebApi) {
+            final boolean contributingToWebApi,
+            final @NonNull FacetHolder facetHolder) {
         super(DomainServiceFacetAbstract.type(), facetHolder);
         this.contributingToUi = contributingToUi;
         this.contributingToWebApi = contributingToWebApi;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index beb88ce9f8..38af74c7f0 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -18,18 +18,24 @@
  */
 package 
org.apache.causeway.core.metamodel.facets.object.domainservice.annotation;
 
+import java.util.List;
 import java.util.stream.Collectors;
 
-import javax.inject.Inject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.DomainService;
+import org.apache.causeway.applib.id.LogicalType;
+import 
org.apache.causeway.applib.services.scope.ActionContributionFilterService;
 import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
 import 
org.apache.causeway.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
 import 
org.apache.causeway.core.metamodel.specloader.validator.ValidationFailure;
@@ -40,9 +46,20 @@ public class DomainServiceFacetAnnotationFactory
 extends FacetFactoryAbstract
 implements MetaModelRefiner {
 
-    @Inject
+    private final Can<ActionContributionFilterService> 
actionContributionFilterServices;
+
+    @Component
+    public static class FilterHolder {
+        @Autowired(required = false)
+        List<ActionContributionFilterService> actionContributionFilterServices;
+        Can<ActionContributionFilterService> toCan() {
+            return Can.ofCollection(actionContributionFilterServices);
+        }
+    }
+
     public DomainServiceFacetAnnotationFactory(final MetaModelContext mmc) {
         super(mmc, FeatureType.OBJECTS_ONLY);
+        this.actionContributionFilterServices = 
mmc.getServiceInjector().injectServicesInto(new FilterHolder()).toCan();
     }
 
     @Override
@@ -51,11 +68,18 @@ implements MetaModelRefiner {
         if (!domainServiceIfAny.isPresent()) {
             return;
         }
+
         val facetHolder = processClassContext.getFacetHolder();
+
+        val logicalType = _Casts.castTo(ObjectSpecification.class, facetHolder)
+                .map(ObjectSpecification::getLogicalType)
+                
.orElseGet(()->LogicalType.fqcn(processClassContext.getCls())); // JUnit support
+
         addFacet(
                 new DomainServiceFacetForAnnotation(
-                        facetHolder,
-                        Can.empty())); //TODO[CAUSEWAY-3697] provide services
+                        logicalType,
+                        actionContributionFilterServices,
+                        facetHolder));
 
         addFacetIfPresent(
                 AliasedFacetForDomainServiceAnnotation
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java
index 1352984e3f..671d05a5fc 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java
@@ -18,36 +18,40 @@
  */
 package 
org.apache.causeway.core.metamodel.facets.object.domainservice.annotation;
 
+import org.apache.causeway.applib.id.LogicalType;
 import 
org.apache.causeway.applib.services.scope.ActionContributionFilterService;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.causeway.core.metamodel.facets.object.domainservice.DomainServiceFacetAbstract;
 
-import lombok.NonNull;
-
 public class DomainServiceFacetForAnnotation
 extends DomainServiceFacetAbstract {
 
     public DomainServiceFacetForAnnotation(
-            final @NonNull FacetHolder facetHolder,
-            final @NonNull Can<ActionContributionFilterService> 
filterServices) {
-        super(facetHolder,
-                evaluateIsContributingToUi(filterServices),
-                evaluateIsContributingToWebApi(filterServices));
+            final LogicalType logicalType,
+            final Can<ActionContributionFilterService> filterServices,
+            final FacetHolder holder) {
+        super(evaluateIsContributingToUi(logicalType, filterServices),
+                evaluateIsContributingToWebApi(logicalType, filterServices),
+                holder);
     }
 
     // -- HELPER
 
-    private static boolean evaluateIsContributingToWebApi(
+    private static boolean evaluateIsContributingToUi(
+            final LogicalType logicalType,
             final Can<ActionContributionFilterService> filterServices) {
-        // TODO[CAUSEWAY-3697] honor filterServices
-        return true;
+        var veto = filterServices.stream()
+            .anyMatch(spi->!spi.isContributingToUi(logicalType));
+        return !veto;
     }
 
-    private static boolean evaluateIsContributingToUi(
+    private static boolean evaluateIsContributingToWebApi(
+            final LogicalType logicalType,
             final Can<ActionContributionFilterService> filterServices) {
-        // TODO[CAUSEWAY-3697] honor filterServices
-        return true;
+        var veto = filterServices.stream()
+            .anyMatch(spi->!spi.isContributingToWebApi(logicalType));
+        return !veto;
     }
 
 }

Reply via email to