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