You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/02/06 14:26:38 UTC

[causeway] branch master updated: CAUSEWAY-3351: fixes CssClassFacet for the regex case when mixed in

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 dddd509e2a CAUSEWAY-3351: fixes CssClassFacet for the regex case when mixed in
dddd509e2a is described below

commit dddd509e2a63decf68e9e069957939e234d4759b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Feb 6 15:26:33 2023 +0100

    CAUSEWAY-3351: fixes CssClassFacet for the regex case when mixed in
---
 .../CssClassFacetOnActionFromConfiguredRegex.java  | 35 ++++++++++++++++--
 ...assFacetOnActionFromConfiguredRegexFactory.java | 42 +++++-----------------
 ...CssClassFaFacetOnMemberFromConfiguredRegex.java |  2 +-
 ...sOnActionFromConfiguredRegexPostProcessor.java} | 23 +++++++-----
 .../dflt/ProgrammingModelFacetsJava11.java         |  4 +--
 5 files changed, 59 insertions(+), 47 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegex.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegex.java
index 7c3a262817..3eb98edc26 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegex.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegex.java
@@ -18,12 +18,43 @@
  */
 package org.apache.causeway.core.metamodel.facets.members.cssclass.annotprop;
 
+import java.util.Map;
+import java.util.Optional;
+import java.util.regex.Pattern;
+
+import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.facets.members.cssclass.CssClassFacetSimple;
 
+import lombok.val;
+
 public class CssClassFacetOnActionFromConfiguredRegex extends CssClassFacetSimple {
 
-    public CssClassFacetOnActionFromConfiguredRegex(final String value, final FacetHolder holder) {
-        super(value, holder);
+    public static Optional<CssClassFacetOnActionFromConfiguredRegex> create(
+            final String name, final FacetHolder holder) {
+        return cssIfAnyFor(name, holder.getConfiguration())
+            .map(css->new CssClassFacetOnActionFromConfiguredRegex(css, holder));
+    }
+
+    private CssClassFacetOnActionFromConfiguredRegex(final String css, final FacetHolder holder) {
+        super(css, holder, Precedence.INFERRED); // inferred from config, if not specified otherwise
+    }
+
+    // -- HELPER
+
+    private static Optional<String> cssIfAnyFor(
+            final String name, final CausewayConfiguration causewayConfiguration) {
+
+        val cssClassByPattern = causewayConfiguration.getApplib().getAnnotation().getActionLayout()
+                .getCssClass().getPatternsAsMap();
+
+        for (Map.Entry<Pattern, String> entry : cssClassByPattern.entrySet()) {
+            final Pattern pattern = entry.getKey();
+            final String cssClass = entry.getValue();
+            if(pattern.matcher(name).matches()) {
+                return Optional.ofNullable(cssClass);
+            }
+        }
+        return Optional.empty();
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
index 0021c072e8..30b82263a9 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
@@ -18,14 +18,9 @@
  */
 package org.apache.causeway.core.metamodel.facets.members.cssclass.annotprop;
 
-import java.util.Map;
-import java.util.Optional;
-import java.util.regex.Pattern;
-
 import javax.inject.Inject;
 
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.causeway.core.metamodel.facets.FacetedMethod;
@@ -36,48 +31,29 @@ import lombok.val;
 public class CssClassFacetOnActionFromConfiguredRegexFactory
 extends FacetFactoryAbstract {
 
-    private final Map<Pattern, String> cssClassByPattern;
-
     @Inject
     public CssClassFacetOnActionFromConfiguredRegexFactory(final MetaModelContext mmc) {
         super(mmc, FeatureType.ACTIONS_ONLY);
-        this.cssClassByPattern = getConfiguration().getApplib().getAnnotation().getActionLayout().getCssClass().getPatternsAsMap();
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
+        if(processMethodContext.isMixinMain()) {
+            return; // don't match regex against 'act' say
+        }
+        
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
         if(facetHolder.containsNonFallbackFacet(CssClassFacet.class)) {
             return;
         }
 
-        val method = processMethodContext.getMethod();
-        final String name = method.getName();
-
-        addFacetIfPresent(createFromConfiguredRegexIfPossible(name, facetHolder));
-    }
-
-    // -- cssClassFromPattern
+        // the name which we match the regex against
+        val actionName = processMethodContext.getMethod().getName();
 
-
-    private Optional<CssClassFacet> createFromConfiguredRegexIfPossible(
-            final String name,
-            final FacetHolder facetHolder) {
-        return cssIfAnyFor(name)
-                .map(css->new CssClassFacetOnActionFromConfiguredRegex(css, facetHolder));
-    }
-
-    private Optional<String> cssIfAnyFor(final String name) {
-
-        for (Map.Entry<Pattern, String> entry : cssClassByPattern.entrySet()) {
-            final Pattern pattern = entry.getKey();
-            final String cssClass = entry.getValue();
-            if(pattern.matcher(name).matches()) {
-                return Optional.ofNullable(cssClass);
-            }
-        }
-        return Optional.empty();
+        addFacetIfPresent(
+                CssClassFacetOnActionFromConfiguredRegex
+                    .create(actionName, facetHolder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
index ddfce2fab9..2ac5b2a75b 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
@@ -41,7 +41,7 @@ import lombok.NonNull;
 import lombok.val;
 
 /**
- * Installed by {@link CssClassFaFacetOnMemberPostProcessor},
+ * Installed by {@link CssOnActionFromConfiguredRegexPostProcessor},
  * but only if no other fa-icon is declared
  * already either via layout XML or {@link ActionLayout} annotation.
  * <p>
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberPostProcessor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/all/CssOnActionFromConfiguredRegexPostProcessor.java
similarity index 66%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberPostProcessor.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/all/CssOnActionFromConfiguredRegexPostProcessor.java
index f1d7492a1c..afb5fde78e 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/all/CssOnActionFromConfiguredRegexPostProcessor.java
@@ -16,24 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.core.metamodel.facets.members.cssclassfa.annotprop;
+package org.apache.causeway.core.metamodel.postprocessors.all;
 
 import javax.inject.Inject;
 
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
+import org.apache.causeway.core.metamodel.facets.members.cssclass.CssClassFacet;
+import org.apache.causeway.core.metamodel.facets.members.cssclass.annotprop.CssClassFacetOnActionFromConfiguredRegex;
 import org.apache.causeway.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
+import org.apache.causeway.core.metamodel.facets.members.cssclassfa.annotprop.CssClassFaFacetOnMemberFromConfiguredRegex;
 import org.apache.causeway.core.metamodel.postprocessors.ObjectSpecificationPostProcessorAbstract;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 
-import lombok.val;
-
-public class CssClassFaFacetOnMemberPostProcessor
+public class CssOnActionFromConfiguredRegexPostProcessor
 extends ObjectSpecificationPostProcessorAbstract {
 
     @Inject
-    public CssClassFaFacetOnMemberPostProcessor(final MetaModelContext mmc) {
+    public CssOnActionFromConfiguredRegexPostProcessor(final MetaModelContext mmc) {
         super(mmc);
     }
 
@@ -44,13 +45,17 @@ extends ObjectSpecificationPostProcessorAbstract {
             return; // don't process mixin main method, instead process its peer
         }
 
-        val hasExplicitFaIcon = objectAction.containsNonFallbackFacet(CssClassFaFacet.class);
-
-        if(!hasExplicitFaIcon) {
+        if(!objectAction.containsNonFallbackFacet(CssClassFaFacet.class)) {
             FacetUtil.addFacetIfPresent(
-                    CssClassFaFacetOnMemberFromConfiguredRegex
+                CssClassFaFacetOnMemberFromConfiguredRegex
                     .create(objectSpecification, objectAction));
         }
+        
+        if(!objectAction.containsNonFallbackFacet(CssClassFacet.class)) {
+            FacetUtil.addFacetIfPresent(
+                CssClassFacetOnActionFromConfiguredRegex
+                    .create(objectAction.getId(), objectAction));
+        }
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
index 6f8da5f003..9378064d42 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
@@ -35,7 +35,6 @@ import org.apache.causeway.core.metamodel.facets.collections.sortedby.annotation
 import org.apache.causeway.core.metamodel.facets.fallback.FallbackFacetFactory;
 import org.apache.causeway.core.metamodel.facets.jaxb.JaxbFacetFactory;
 import org.apache.causeway.core.metamodel.facets.members.cssclass.annotprop.CssClassFacetOnActionFromConfiguredRegexFactory;
-import org.apache.causeway.core.metamodel.facets.members.cssclassfa.annotprop.CssClassFaFacetOnMemberPostProcessor;
 import org.apache.causeway.core.metamodel.facets.members.described.method.DescribedAsFacetForMemberViaMethodFactory;
 import org.apache.causeway.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethodFactory;
 import org.apache.causeway.core.metamodel.facets.members.hidden.method.HideForContextFacetViaMethodFactory;
@@ -83,6 +82,7 @@ import org.apache.causeway.core.metamodel.facets.properties.validating.dflt.Prop
 import org.apache.causeway.core.metamodel.facets.properties.validating.method.PropertyValidateFacetViaMethodFactory;
 import org.apache.causeway.core.metamodel.facets.value.semantics.ValueSemanticsAnnotationFacetFactory;
 import org.apache.causeway.core.metamodel.methods.DomainIncludeAnnotationEnforcesMetamodelContributionValidator;
+import org.apache.causeway.core.metamodel.postprocessors.all.CssOnActionFromConfiguredRegexPostProcessor;
 import org.apache.causeway.core.metamodel.postprocessors.all.DescribedAsFromTypePostProcessor;
 import org.apache.causeway.core.metamodel.postprocessors.all.i18n.SynthesizeObjectNamingPostProcessor;
 import org.apache.causeway.core.metamodel.postprocessors.all.i18n.TranslationPostProcessor;
@@ -243,7 +243,7 @@ extends ProgrammingModelAbstract {
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new SynthesizeObjectNamingPostProcessor(mmc));
 
         // requires member names to have settled
-        addPostProcessor(PostProcessingOrder.A1_BUILTIN, new CssClassFaFacetOnMemberPostProcessor(mmc));
+        addPostProcessor(PostProcessingOrder.A1_BUILTIN, new CssOnActionFromConfiguredRegexPostProcessor(mmc));
 
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new DescribedAsFromTypePostProcessor(mmc));
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new TypicalLengthFromTypePostProcessor(mmc));