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>.