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 2017/10/30 19:13:58 UTC

[isis] 01/02: ISIS-1632: updates simpleapp to use @Meta annotation

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

danhaywood pushed a commit to branch dev/2.0.0/ISIS-1632-meta-annotations
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 071f79aaf18d801c194b350afbf675376e5ff86c
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Oct 30 19:13:33 2017 +0000

    ISIS-1632: updates simpleapp to use @Meta annotation
---
 .../Annotations_getAnnotations_on_Field_Test.java  | 182 +++++++++++++++++++++
 .../modules/simple/dom/impl/SimpleObject.java      |  17 +-
 .../domainapp/modules/simple/dom/types/Name.java   |  35 ++++
 3 files changed, 222 insertions(+), 12 deletions(-)

diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Annotations_getAnnotations_on_Field_Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Annotations_getAnnotations_on_Field_Test.java
new file mode 100644
index 0000000..1e6cade
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Annotations_getAnnotations_on_Field_Test.java
@@ -0,0 +1,182 @@
+package org.apache.isis.core.metamodel.facets;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.isis.applib.annotation.Meta;
+
+import static org.hamcrest.CoreMatchers.is;
+
+public class Annotations_getAnnotations_on_Method_Test {
+
+
+    @Inherited
+    @Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface DomainObj { // cf @DomainObject
+        enum Publishng { // cf Publishing enum
+            YES,
+            NO,
+            NOT_SPECIFIED
+        }
+        Publishng publishng() default Publishng.NOT_SPECIFIED;
+    }
+
+    @Meta
+    @DomainObj(publishng = DomainObj.Publishng.YES)
+    @Inherited
+    @Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface Published {
+    }
+
+    @Meta
+    @DomainObj(publishng = DomainObj.Publishng.NO)
+    @Inherited
+    @Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface NotPublished {
+    }
+
+    @Meta
+    @Published
+    @Inherited
+    @Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface MetaPublished {
+    }
+
+    @Test
+    public void direct() throws Exception {
+
+        class SomeDomainObject {
+            @DomainObj(publishng = DomainObj.Publishng.YES)
+            public void updateName(String name) {}
+        }
+
+        Method method = SomeDomainObject.class.getMethod("updateName", String.class);
+        final List<DomainObj> annotations = Annotations.getAnnotations(method, DomainObj.class);
+
+        Assert.assertThat(annotations.size(), is(1));
+
+        Assert.assertThat(annotations.get(0).publishng(), is(DomainObj.Publishng.YES));
+    }
+
+    @Test
+    public void meta() throws Exception {
+
+        class SomeDomainObject {
+            @Published
+            public void updateName(String name) {}
+        }
+
+        Method method = SomeDomainObject.class.getMethod("updateName", String.class);
+        final List<DomainObj> annotations = Annotations.getAnnotations(method, DomainObj.class);
+
+        Assert.assertThat(annotations.size(), is(1));
+
+        Assert.assertThat(annotations.get(0).publishng(), is(DomainObj.Publishng.YES));
+    }
+
+    @Test
+    public void metaMeta() throws Exception {
+
+        class SomeDomainObject {
+            @MetaPublished
+            public void updateName(String name) {}
+        }
+
+        Method method = SomeDomainObject.class.getMethod("updateName", String.class);
+        final List<DomainObj> annotations = Annotations.getAnnotations(method, DomainObj.class);
+
+        Assert.assertThat(annotations.size(), is(1));
+
+        Assert.assertThat(annotations.get(0).publishng(), is(DomainObj.Publishng.YES));
+    }
+
+    @Test
+    public void meta_and_metaMeta() throws Exception {
+
+        class SomeDomainObject {
+            @MetaPublished
+            @Published
+            public void updateName(String name) {}
+        }
+
+        Method method = SomeDomainObject.class.getMethod("updateName", String.class);
+        final List<DomainObj> annotations = Annotations.getAnnotations(method, DomainObj.class);
+
+        Assert.assertThat(annotations.size(), is(2));
+
+        Assert.assertThat(annotations.get(0).publishng(), is(DomainObj.Publishng.YES));
+        Assert.assertThat(annotations.get(1).publishng(), is(DomainObj.Publishng.YES));
+    }
+
+    @Test
+    public void meta_overrides_metaMeta() throws Exception {
+
+        class SomeDomainObject {
+            @MetaPublished
+            @NotPublished
+            public void updateName(String name) {}
+        }
+
+        Method method = SomeDomainObject.class.getMethod("updateName", String.class);
+        final List<DomainObj> annotations = Annotations.getAnnotations(method, DomainObj.class);
+
+        Assert.assertThat(annotations.size(), is(2));
+
+        Assert.assertThat(annotations.get(0).publishng(), is(DomainObj.Publishng.NO));
+        Assert.assertThat(annotations.get(1).publishng(), is(DomainObj.Publishng.YES));
+    }
+
+    @Test
+    public void direct_overrides_metaMeta() throws Exception {
+
+        class SomeDomainObject {
+            @MetaPublished
+            @Published
+            @DomainObj(publishng = DomainObj.Publishng.NO)
+            public void updateName(String name) {}
+        }
+
+        Method method = SomeDomainObject.class.getMethod("updateName", String.class);
+        final List<DomainObj> annotations = Annotations.getAnnotations(method, DomainObj.class);
+
+        Assert.assertThat(annotations.size(), is(3));
+
+        Assert.assertThat(annotations.get(0).publishng(), is(DomainObj.Publishng.NO));
+        Assert.assertThat(annotations.get(1).publishng(), is(DomainObj.Publishng.YES));
+        Assert.assertThat(annotations.get(2).publishng(), is(DomainObj.Publishng.YES));
+    }
+
+
+    @Test
+    public void direct_overrides_metaMeta_2() throws Exception {
+
+        class SomeDomainObject {
+            @MetaPublished
+            @NotPublished
+            @DomainObj(publishng = DomainObj.Publishng.YES)
+            public void updateName(String name) {}
+        }
+
+        Method method = SomeDomainObject.class.getMethod("updateName", String.class);
+        final List<DomainObj> annotations = Annotations.getAnnotations(method, DomainObj.class);
+
+        Assert.assertThat(annotations.size(), is(3));
+
+        Assert.assertThat(annotations.get(0).publishng(), is(DomainObj.Publishng.YES));
+        Assert.assertThat(annotations.get(1).publishng(), is(DomainObj.Publishng.NO));
+        Assert.assertThat(annotations.get(2).publishng(), is(DomainObj.Publishng.YES));
+    }
+
+}
\ No newline at end of file
diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
index 50a5a73..8936f54 100644
--- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
+++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
@@ -25,17 +25,15 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Editing;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Title;
-import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.util.ObjectContracts;
 
+import domainapp.modules.simple.dom.types.Name;
 import lombok.AccessLevel;
 
 @javax.jdo.annotations.PersistenceCapable(
@@ -62,11 +60,11 @@ import lombok.AccessLevel;
 @lombok.RequiredArgsConstructor(staticName = "create")
 public class SimpleObject implements Comparable<SimpleObject> {
 
-    @javax.jdo.annotations.Column(allowsNull = "false", length = 40)
+
+    @javax.jdo.annotations.Column(allowsNull = "false", length = Name.MAX_LEN)
     @lombok.NonNull
-    @Property() // editing disabled by default, see isis.properties
     @Title(prepend = "Object: ")
-    private String name;
+    @Name private String name;
 
     @javax.jdo.annotations.Column(allowsNull = "true", length = 4000)
     @Property(editing = Editing.ENABLED)
@@ -76,9 +74,7 @@ public class SimpleObject implements Comparable<SimpleObject> {
     //region > updateName (action)
     @Action(semantics = SemanticsOf.IDEMPOTENT)
     public SimpleObject updateName(
-            @Parameter(maxLength = 40)
-            @ParameterLayout(named = "Name")
-            final String name) {
+            @Name final String name) {
         setName(name);
         return this;
     }
@@ -87,9 +83,6 @@ public class SimpleObject implements Comparable<SimpleObject> {
         return getName();
     }
 
-    public TranslatableString validate0UpdateName(final String name) {
-        return name != null && name.contains("!") ? TranslatableString.tr("Exclamation mark is not allowed") : null;
-    }
     //endregion
 
     //region > delete (action)
diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/types/Name.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/types/Name.java
new file mode 100644
index 0000000..b126aba
--- /dev/null
+++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/types/Name.java
@@ -0,0 +1,35 @@
+package domainapp.modules.simple.dom.types;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.Meta;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.services.i18n.TranslatableString;
+import org.apache.isis.applib.spec.AbstractSpecification2;
+
+@Meta
+// @Column(length = Name.MAX_LEN) // requires DN 5.x
+@Property(mustSatisfy = Name.NoExclamationMarks.class, maxLength = Name.MAX_LEN, editing = Editing.ENABLED)
+@Parameter(mustSatisfy = Name.NoExclamationMarks.class, maxLength = Name.MAX_LEN)
+@ParameterLayout(named = "Name")
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Name {
+
+    int MAX_LEN = 40;
+    class NoExclamationMarks extends AbstractSpecification2<String> {
+
+        @Override
+        public TranslatableString satisfiesTranslatableSafely(final String name) {
+            return name != null && name.contains("!")
+                    ? TranslatableString.tr("Exclamation mark is not allowed")
+                    : null;
+        }
+    }
+}

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