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 2015/11/25 13:51:20 UTC

isis git commit: ISIS-1257: updates facet factory to allow @Title to be added to field. Also updated .adoc.

Repository: isis
Updated Branches:
  refs/heads/master f5a5de6c2 -> c6c3066e3


ISIS-1257: updates facet factory to allow @Title to be added to field.  Also updated .adoc.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/c6c3066e
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/c6c3066e
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/c6c3066e

Branch: refs/heads/master
Commit: c6c3066e3b7e58dc1d338e44ba4ca926dc29d1ef
Parents: f5a5de6
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Nov 25 12:51:08 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Nov 25 12:51:08 2015 +0000

----------------------------------------------------------------------
 .../guides/_rg_annotations_manpage-Title.adoc   |  30 ++++-
 .../isis/core/metamodel/facets/Annotations.java | 113 +++++++++++++++++++
 .../annotation/TitleAnnotationFacetFactory.java |  32 +++---
 .../TitleFacetViaTitleAnnotation.java           |  29 ++---
 .../TitleAnnotationFacetFactoryTest.java        |  13 ++-
 .../TitleFacetViaTitleAnnotationTest.java       |  27 +++--
 .../java/domainapp/dom/simple/SimpleObject.java |   3 +-
 7 files changed, 199 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/c6c3066e/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-Title.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-Title.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-Title.adoc
index 253e9f3..8fbd83a 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-Title.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-Title.adoc
@@ -13,16 +13,17 @@ For example:
 ----
 public void Customer {
     @Title(sequence="1.0")
-    public String lastName() { ... }
+    public String getLastName() { ... }     // <1>
     ...
     @Title(sequence="1.5", prepend=", ")
-    public String firstName() { ... }
+    public String getFirstName() { ... }
     ...
     @Title(sequence="1.7", append=".")
-    public String midInitial() { ... }
+    public String getMidInitial() { ... }
     ...
 }
 ----
+<1> backing field and setters omitted
 
 could be used to create names of the style "Bloggs, Joe K."
 
@@ -36,3 +37,26 @@ For viewers that support this annotation (for example, the Wicket
 viewer), this convention excludes any properties whose value is already
 present in the title column. This convention can be overridden using
 `@Hidden(where=Where.NOWHERE)`.
+
+== Lombok support
+
+If xref:cg.adoc#_cg_ide_project-lombok[Project Lombok] is being used, then `@Title` can be specified on the backing field.
+
+For example:
+
+[source,java]
+----
+public void Customer {
+    @Title(sequence="1.0")
+    @Getter @Setter
+    private String name;
+
+    @Title(sequence="1.5", prepend=", ")
+    @Getter @Setter
+    private String firstName;
+
+    @Title(sequence="1.7", append=".")
+    @Getter @Setter
+    private String midInitial;
+}
+----

http://git-wip-us.apache.org/repos/asf/isis/blob/c6c3066e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java
index f47f1cc..707213c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java
@@ -21,17 +21,23 @@ package org.apache.isis.core.metamodel.facets;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.core.commons.lang.ThrowableExtensions;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
 
 public final class Annotations  {
     
@@ -160,6 +166,113 @@ public final class Annotations  {
         return null;
     }
 
+    /**
+     * Searches for all no-arg methods or fields with a specified title, returning an
+     * {@link Evaluator} object that wraps either.  Will search up hierarchy also.
+     */
+    public static <T extends Annotation> List<Evaluator<T>> getEvaluators(
+            final Class<?> cls,
+            final Class<T> annotationClass) {
+        List<Evaluator<T>> evaluators = Lists.newArrayList();
+        appendEvaluators(cls, annotationClass, evaluators);
+        return evaluators;
+    }
+
+    private static <T extends Annotation> void appendEvaluators(
+            final Class<?> cls,
+            final Class<T> annotationClass,
+            final List<Evaluator<T>> evaluators) {
+
+        for (Method method : cls.getDeclaredMethods()) {
+            if(MethodScope.OBJECT.matchesScopeOf(method) &&
+                    method.getParameterCount() == 0) {
+                final Annotation annotation = method.getAnnotation(annotationClass);
+                if(annotation != null) {
+                    evaluators.add(new MethodEvaluator(method, annotation));
+                }
+            }
+        }
+        for (final Field field: cls.getDeclaredFields()) {
+            final Annotation annotation = field.getAnnotation(annotationClass);
+            if(annotation != null) {
+                evaluators.add(new FieldEvaluator(field, annotation));
+            }
+        }
+
+        // search superclasses
+        final Class<?> superclass = cls.getSuperclass();
+        if (superclass != null) {
+            appendEvaluators(superclass, annotationClass, evaluators);
+        }
+
+        // search implemented interfaces
+        final Class<?>[] interfaces = cls.getInterfaces();
+        for (final Class<?> iface : interfaces) {
+            appendEvaluators(iface, annotationClass, evaluators);
+        }
+    }
+
+    public static abstract class Evaluator<T extends Annotation> {
+
+        private final T annotation;
+
+        protected Evaluator(final T annotation) {
+            this.annotation = annotation;
+        }
+
+        public T getAnnotation() {
+            return annotation;
+        }
+
+        public abstract Object value(final Object obj) ;
+    }
+
+    public static class MethodEvaluator<T extends Annotation> extends Evaluator<T> {
+        private final Method method;
+
+        MethodEvaluator(final Method method, final T annotation) {
+            super(annotation);
+            this.method = method;
+        }
+
+        public Object value(final Object obj)  {
+            try {
+                return method.invoke(obj);
+            } catch (final InvocationTargetException e) {
+                ThrowableExtensions.throwWithinIsisException(e, "Exception executing " + method);
+                return null;
+            } catch (final IllegalAccessException e) {
+                throw new MetaModelException("illegal access of " + method, e);
+            }
+        }
+
+        public Method getMethod() {
+            return method;
+        }
+    }
+
+    static class FieldEvaluator<T extends Annotation> extends Evaluator<T> {
+        private final Field field;
+
+        FieldEvaluator(final Field field, final T annotation) {
+            super(annotation);
+            this.field = field;
+        }
+
+        public Object value(final Object obj)  {
+            try {
+                field.setAccessible(true);
+                return field.get(obj);
+            } catch (final IllegalAccessException e) {
+                throw new MetaModelException("illegal access of " + field, e);
+            }
+        }
+
+        public Field getField() {
+            return field;
+        }
+    }
+
     private static List<Class<?>> fieldAnnotationClasses = Collections.unmodifiableList(
             Arrays.<Class<?>>asList(
                     Property.class,

http://git-wip-us.apache.org/repos/asf/isis/blob/c6c3066e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
index 147e65b..7cacb62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
@@ -35,14 +35,15 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
+import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.fallback.FallbackFacetFactory;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.core.metamodel.facets.fallback.FallbackFacetFactory;
 
 public class TitleAnnotationFacetFactory extends FacetFactoryAbstract implements AdapterManagerAware, MetaModelValidatorRefiner {
 
@@ -63,28 +64,29 @@ public class TitleAnnotationFacetFactory extends FacetFactoryAbstract implements
         final Class<?> cls = processClassContext.getCls();
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final List<Method> methods = MethodFinderUtils.findMethodsWithAnnotation(cls, MethodScope.OBJECT, Title.class);
+        final List<Annotations.Evaluator<Title>> evaluators = Annotations.getEvaluators(cls, Title.class);
+        if (evaluators.isEmpty()) {
+            return;
+        }
 
-        Collections.sort(methods, new Comparator<Method>() {
+        sort(evaluators);
+        final List<TitleFacetViaTitleAnnotation.TitleComponent> titleComponents = Lists.transform(evaluators, TitleFacetViaTitleAnnotation.TitleComponent.FROM_EVALUATORS);
+        FacetUtil.addFacet(new TitleFacetViaTitleAnnotation(titleComponents, facetHolder, adapterManager));
+    }
+
+    public static void sort(final List<Annotations.Evaluator<Title>> evaluators) {
+        Collections.sort(evaluators, new Comparator<Annotations.Evaluator<Title>>() {
             Comparator<String> comparator = new SequenceComparator();
 
             @Override
-            public int compare(final Method o1, final Method o2) {
-                final Title a1 = o1.getAnnotation(Title.class);
-                final Title a2 = o2.getAnnotation(Title.class);
+            public int compare(final Annotations.Evaluator<Title> o1, final Annotations.Evaluator<Title> o2) {
+                final Title a1 = o1.getAnnotation();
+                final Title a2 = o2.getAnnotation();
                 return comparator.compare(a1.sequence(), a2.sequence());
             }
         });
-        if (methods.isEmpty()) {
-            return;
-        }
-        final List<TitleFacetViaTitleAnnotation.TitleComponent> titleComponents = Lists.transform(methods, TitleFacetViaTitleAnnotation.TitleComponent.FROM_METHOD);
-        FacetUtil.addFacet(new TitleFacetViaTitleAnnotation(titleComponents, facetHolder, adapterManager));
     }
 
-
-
-
     static class SequenceComparator implements Comparator<String> {
 
         @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/c6c3066e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
index e097b79..a0006aa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets.object.title.annotation;
 
-import java.lang.reflect.Method;
 import java.util.List;
 
 import com.google.common.base.Function;
@@ -34,6 +33,7 @@ import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
 
 public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
@@ -43,24 +43,24 @@ public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
     private final AdapterManager adapterManager;
 
     public static class TitleComponent {
-        public static final Function<? super Method, ? extends TitleComponent> FROM_METHOD = new Function<Method, TitleComponent>() {
-
+        public static final Function<? super Annotations.Evaluator<Title>, ? extends TitleComponent> FROM_EVALUATORS = new Function<Annotations.Evaluator<Title>, TitleComponent>() {
             @Override
-            public TitleComponent apply(final Method input) {
-                return TitleComponent.of(input);
+            public TitleComponent apply(final Annotations.Evaluator<Title> titleEvaluator) {
+                return TitleComponent.of(titleEvaluator);
             }
         };
 
+
         private final String prepend;
         private final String append;
-        private final Method method;
+        private final Annotations.Evaluator<Title> titleEvaluator;
         private final int abbreviateTo;
 
-        private TitleComponent(final String prepend, final String append, final Method method, final int abbreviateTo) {
+        private TitleComponent(final String prepend, final String append, final Annotations.Evaluator<Title> titleEvaluator, final int abbreviateTo) {
             super();
             this.prepend = prepend;
             this.append = append;
-            this.method = method;
+            this.titleEvaluator = titleEvaluator;
             this.abbreviateTo = abbreviateTo;
         }
 
@@ -72,17 +72,18 @@ public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
             return append;
         }
 
-        public Method getMethod() {
-            return method;
+        public Annotations.Evaluator<Title> getTitleEvaluator() {
+            return titleEvaluator;
         }
 
-        public static TitleComponent of(final Method method) {
-            final Title annotation = method.getAnnotation(Title.class);
+        private static TitleComponent of(final Annotations.Evaluator<Title> titleEvaluator) {
+            final Title annotation = titleEvaluator.getAnnotation();
             final String prepend = annotation != null ? annotation.prepend() : " ";
             final String append = annotation != null ? annotation.append() : "";
             final int abbreviateTo = annotation != null ? annotation.abbreviatedTo() : Integer.MAX_VALUE;
-            return new TitleComponent(prepend, append, method, abbreviateTo);
+            return new TitleComponent(prepend, append, titleEvaluator, abbreviateTo);
         }
+
     }
 
     public TitleFacetViaTitleAnnotation(final List<TitleComponent> components, final FacetHolder holder, final AdapterManager adapterManager) {
@@ -117,7 +118,7 @@ public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
 
         try {
             for (final TitleComponent component : this.components) {
-                final Object titlePart = ObjectAdapter.InvokeUtils.invoke(component.getMethod(), targetAdapter);
+                final Object titlePart = component.getTitleEvaluator().value(targetAdapter.getObject());
                 if (titlePart == null) {
                     continue;
                 } 

http://git-wip-us.apache.org/repos/asf/isis/blob/c6c3066e/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java
index aaf6d85..700e856 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java
@@ -36,6 +36,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
+import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleAnnotationFacetFactory;
@@ -114,7 +115,11 @@ public class TitleAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4T
 
         final List<Method> titleMethods = Arrays.asList(Customer.class.getMethod("someTitle"));
         for (int i = 0; i < titleMethods.size(); i++) {
-            Assert.assertEquals(titleMethods.get(i), titleFacetViaTitleAnnotation.getComponents().get(i).getMethod());
+            final Annotations.MethodEvaluator<Title> titleEvaluator = (Annotations.MethodEvaluator<Title>) titleFacetViaTitleAnnotation.getComponents().get(i)
+                    .getTitleEvaluator();
+
+            Assert.assertEquals(titleMethods.get(i),
+                    titleEvaluator.getMethod());
         }
     }
 
@@ -152,7 +157,11 @@ public class TitleAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4T
 
         final List<TitleComponent> components = titleFacetViaTitleAnnotation.getComponents();
         for (int i = 0; i < titleMethods.size(); i++) {
-            Assert.assertEquals(titleMethods.get(i), components.get(i).getMethod());
+            final Annotations.MethodEvaluator<Title> titleEvaluator = (Annotations.MethodEvaluator<Title>) titleFacetViaTitleAnnotation.getComponents().get(i)
+                    .getTitleEvaluator();
+
+            Assert.assertEquals(titleMethods.get(i),
+                    titleEvaluator.getMethod());
         }
 
         final Customer2 customer = new Customer2();

http://git-wip-us.apache.org/repos/asf/isis/blob/c6c3066e/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
index 8b4d739..6c95e85 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
@@ -19,11 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets.object.ident.title.annotation;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
 import java.util.List;
 
 import com.google.common.collect.Lists;
@@ -35,17 +30,20 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.isis.applib.annotation.Title;
-import org.apache.isis.core.metamodel.runtimecontext.LocalizationProvider;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.methodutils.MethodScope;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleFacetViaTitleAnnotation;
 import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleFacetViaTitleAnnotation.TitleComponent;
+import org.apache.isis.core.metamodel.runtimecontext.LocalizationProvider;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
 public class TitleFacetViaTitleAnnotationTest {
 
     @Rule
@@ -93,9 +91,12 @@ public class TitleFacetViaTitleAnnotationTest {
 
     @Test
     public void testTitle() throws Exception {
-        final List<Method> methods = Arrays.asList(NormalDomainObject.class.getMethod("titleElement1"), NormalDomainObject.class.getMethod("titleElement2"), NormalDomainObject.class.getMethod("titleElement3"));
+        final List<Annotations.Evaluator<Title>> evaluatorList = Annotations
+                .getEvaluators(NormalDomainObject.class, Title.class);
 
-        final List<TitleComponent> components = Lists.transform(methods, TitleComponent.FROM_METHOD);
+        TitleAnnotationFacetFactory.sort(evaluatorList);
+
+        final List<TitleComponent> components = Lists.transform(evaluatorList, TitleComponent.FROM_EVALUATORS);
         final TitleFacetViaTitleAnnotation facet = new TitleFacetViaTitleAnnotation(components, mockFacetHolder, mockAdapterManager);
         final NormalDomainObject normalPojo = new NormalDomainObject();
         final Sequence sequence = context.sequence("in-title-element-order");
@@ -121,9 +122,11 @@ public class TitleFacetViaTitleAnnotationTest {
 
     @Test
     public void titleThrowsException() {
-        final List<Method> methods = MethodFinderUtils.findMethodsWithAnnotation(DomainObjectWithProblemInItsAnnotatedTitleMethod.class, MethodScope.OBJECT, Title.class);
 
-        final List<TitleComponent> components = Lists.transform(methods, TitleComponent.FROM_METHOD);
+        final List<Annotations.Evaluator<Title>> evaluators = Annotations
+                .getEvaluators(DomainObjectWithProblemInItsAnnotatedTitleMethod.class, Title.class);
+
+        final List<TitleComponent> components = Lists.transform(evaluators, TitleComponent.FROM_EVALUATORS);
         final TitleFacetViaTitleAnnotation facet = new TitleFacetViaTitleAnnotation(components, mockFacetHolder, mockAdapterManager);
         final DomainObjectWithProblemInItsAnnotatedTitleMethod screwedPojo = new DomainObjectWithProblemInItsAnnotatedTitleMethod();
         context.checking(new Expectations() {

http://git-wip-us.apache.org/repos/asf/isis/blob/c6c3066e/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.java b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.java
index 556e2b8..4f6c5a6 100644
--- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.java
+++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.java
@@ -32,6 +32,7 @@ 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.eventbus.ActionDomainEvent;
 import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
 import org.apache.isis.applib.services.i18n.TranslatableString;
@@ -74,8 +75,6 @@ public class SimpleObject implements Comparable<SimpleObject> {
         return TranslatableString.tr("Object: {name}", "name", getName());
     }
 
-
-
     public static class NameDomainEvent extends PropertyDomainEvent<SimpleObject,String> {}
     @javax.jdo.annotations.Column(
             allowsNull="false",