You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2018/01/17 16:43:40 UTC

[isis] 01/10: ISIS-1743: also supports mixins specified using @Mixin(method="...") eg "act" or "coll" as well as the default "$$"

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

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

commit a1b99ff08db204984c61ca44e910064ead20f1a9
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 17 16:12:06 2018 +0000

    ISIS-1743: also supports mixins specified using @Mixin(method="...") eg "act" or "coll" as well as the default "$$"
---
 .../annotprop/CssClassFaFacetOnMemberFactory.java  |  2 +-
 .../cssclassfa/annotprop/MixinInterceptor.java     | 50 +++++++++-------------
 .../specloader/specimpl/ObjectMemberAbstract.java  | 17 ++++----
 .../specimpl/ObjectActionMixedInTest.java          | 10 ++---
 .../specimpl/ObjectMemberAbstractTest.java         | 25 +++++++++++
 5 files changed, 60 insertions(+), 44 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
index a72bac1..6b88929 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
@@ -84,7 +84,7 @@ public class CssClassFaFacetOnMemberFactory extends FacetFactoryAbstract impleme
         }
     }
 
-	private String faIconIfAnyFor(String name) {
+    private String faIconIfAnyFor(String name) {
         final Map<Pattern, String> faIconByPattern = getFaIconByPattern();
 
         for (Map.Entry<Pattern, String> entry : faIconByPattern.entrySet()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/MixinInterceptor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/MixinInterceptor.java
index 21563f5..689e01e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/MixinInterceptor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/MixinInterceptor.java
@@ -20,10 +20,12 @@
 package org.apache.isis.core.metamodel.facets.members.cssclassfa.annotprop;
 
 import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Optional;
 
 import org.apache.isis.applib.annotation.Mixin;
-import org.apache.isis.core.commons.lang.NullSafe;
 import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectMemberAbstract;
 
 /**
  * To solve <a href="https://issues.apache.org/jira/browse/ISIS-1743">ISIS-1743</a>.<br/>
@@ -34,42 +36,30 @@ import org.apache.isis.core.metamodel.facets.Annotations;
 class MixinInterceptor {
 
 	/**
-	 * If method originates from a mixin and is named '$$' we infer the intended name 
+	 * If method originates from a mixin then we infer the intended name
 	 * from the mixin's class name.
 	 * 
-	 * @param method
+	 * @param method within the mixin type itself.
 	 * @return the intended name of the method
 	 */
-	public static String intendedNameOf(Method method) {
-		
-		if("$$".equals(method.getName()) && isMixin(method.getDeclaringClass()) ) {
-			final String mixinMethodName = inferMixinMethodName(method.getDeclaringClass());
-			if(mixinMethodName!=null)
-				return mixinMethodName; 
+	static String intendedNameOf(Method method) {
+
+		final Class<?> declaringClass = method.getDeclaringClass();
+		final List<Mixin> mixins = Annotations.getAnnotations(declaringClass, Mixin.class);
+		final Optional<Mixin> mixinIfAny = mixins.stream().findFirst();
+
+		if(mixinIfAny.isPresent()) {
+			final String methodName = method.getName();
+			final String mixinAnnotMethodName = mixinIfAny.get().method();
+			if(mixinAnnotMethodName.equals(methodName)) {
+    			final String mixinMethodName = ObjectMemberAbstract.deriveMemberNameFrom(method.getDeclaringClass().getName());
+                if(mixinMethodName!=null) {
+                    return mixinMethodName;
+                }
+			}
 		}
 		// default behavior
 		return method.getName();
 	}
-	
-	// -- HELPER
-	
-	private static boolean isMixin(Class<?> cls) {
-		return !NullSafe.isEmpty(Annotations.getAnnotations(cls, Mixin.class));
-	}
-
-	
-	/**
-	 * Parses class name of format 'Holder_mixinMethodName' and returns 'mixinMethodName'.
-	 * @param mixin
-	 * @return null if parsing fails
-	 */
-	private static String inferMixinMethodName(Class<?> mixin) {
-		final String className = mixin.getSimpleName();
-		final int p = className.indexOf('_');
-		if(p>0 && className.length()>(p+1)) { // min length := p+2 
-			return className.substring(p+1);
-		}
-		return null;
-	}
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index cd4486e..356fd23 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -22,9 +22,10 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 import java.util.List;
 import java.util.Objects;
 
+import com.google.common.base.Predicate;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
-import com.google.common.base.Predicate;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
@@ -346,19 +347,19 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     }
 
     static String suffix(final ObjectAction mixinAction) {
-        return suffix(mixinAction.getOnType().getSingularName());
+        return deriveMemberNameFrom(mixinAction.getOnType().getSingularName());
     }
 
-    static String suffix(final String singularName) {
-        final String deriveFromUnderscore = derive(singularName, "_");
-        if(!Objects.equals(singularName, deriveFromUnderscore)) {
+    public static String deriveMemberNameFrom(final String mixinClassName) {
+        final String deriveFromUnderscore = derive(mixinClassName, "_");
+        if(!Objects.equals(mixinClassName, deriveFromUnderscore)) {
             return deriveFromUnderscore;
         }
-        final String deriveFromDollar = derive(singularName, "$");
-        if(!Objects.equals(singularName, deriveFromDollar)) {
+        final String deriveFromDollar = derive(mixinClassName, "$");
+        if(!Objects.equals(mixinClassName, deriveFromDollar)) {
             return deriveFromDollar;
         }
-        return singularName;
+        return mixinClassName;
     }
 
     private static String derive(final String singularName, final String separator) {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
index 1677c7e..b90b853 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
@@ -32,31 +32,31 @@ public class ObjectActionMixedInTest {
 
         @Test
         public void exactly_underscore() throws Exception {
-            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("_"));
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.deriveMemberNameFrom("_"));
             assertThat(s, is("_"));
         }
 
         @Test
         public void ends_with_underscore() throws Exception {
-            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("abc_"));
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.deriveMemberNameFrom("abc_"));
             assertThat(s, is("Abc_"));
         }
 
         @Test
         public void has_no_underscore() throws Exception {
-            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("defghij"));
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.deriveMemberNameFrom("defghij"));
             assertThat(s, is("Defghij"));
         }
 
         @Test
         public void contains_one_underscore() throws Exception {
-            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("abc_def"));
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.deriveMemberNameFrom("abc_def"));
             assertThat(s, is("Def"));
         }
 
         @Test
         public void contains_more_than_one_underscore() throws Exception {
-            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("abc_def_ghi"));
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.deriveMemberNameFrom("abc_def_ghi"));
             assertThat(s, is("Ghi"));
         }
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstractTest.java
new file mode 100644
index 0000000..06d6c8d
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstractTest.java
@@ -0,0 +1,25 @@
+package org.apache.isis.core.metamodel.specloader.specimpl;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.*;
+
+public class ObjectMemberAbstractTest {
+
+    @Test
+    public void deriveMemberNameFrom_with_underscore() {
+        final String suffix = ObjectMemberAbstract.deriveMemberNameFrom("Customer_placeOrder");
+        Assert.assertThat(suffix, CoreMatchers.is(equalTo("placeOrder")));
+    }
+
+    @Test
+    public void deriveMemberNameFrom_with_dollar() {
+        final String suffix = ObjectMemberAbstract.deriveMemberNameFrom("Customer$placeOrder");
+        Assert.assertThat(suffix, CoreMatchers.is(equalTo("placeOrder")));
+    }
+
+
+
+}
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
"commits@isis.apache.org" <co...@isis.apache.org>.