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

[isis] branch ISIS-1740-where-am-i updated: ISIS-1816 impl. navigable parent resolving behavior according to spec

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

ahuber pushed a commit to branch ISIS-1740-where-am-i
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/ISIS-1740-where-am-i by this push:
     new 43a84cc  ISIS-1816 impl. navigable parent resolving behavior according to spec
43a84cc is described below

commit 43a84cc7f3ff70704716be0e99e6aa04fe11ffdd
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jan 15 11:16:31 2018 +0100

    ISIS-1816 impl. navigable parent resolving behavior according to spec
---
 .../NavigableParentAnnotationFacetFactory.java     | 77 +++++++++-------------
 .../method/NavigableParentFacetMethodFactory.java  |  3 +
 .../dflt/ProgrammingModelFacetsJava5.java          |  2 +-
 3 files changed, 36 insertions(+), 46 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
index f3b2102..7921bda 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
@@ -26,6 +26,7 @@ import java.util.List;
 
 import org.apache.isis.applib.annotation.Parent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.lang.NullSafe;
 import org.apache.isis.core.commons.reflection.Reflect;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -33,9 +34,7 @@ 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.object.navparent.method.NavigableParentFacetMethod;
-import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -44,6 +43,8 @@ import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVis
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
 /**
+ * For detailed behavioral specification see 
+ * <a href="https://issues.apache.org/jira/browse/ISIS-1816">ISIS-1816</a>.
  * 
  * @author ahuber@apache.org
  * @since 2.0.0
@@ -51,9 +52,6 @@ import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
  */
 public class NavigableParentAnnotationFacetFactory extends FacetFactoryAbstract implements MetaModelValidatorRefiner {
 
-    private static final String NAVIGABLE_PARENT_METHOD_NAME = "parent";
-
-
     public NavigableParentAnnotationFacetFactory() {
         super(FeatureType.OBJECTS_ONLY);
     }
@@ -63,10 +61,18 @@ public class NavigableParentAnnotationFacetFactory extends FacetFactoryAbstract
         final Class<?> cls = processClassContext.getCls();
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final List<Annotations.Evaluator<Parent>> evaluators = Annotations.getEvaluators(cls, Parent.class);
-        if (evaluators.isEmpty()) {
-            return;
+        // Starting from the current domain-object class, we search down the object 
+        // inheritance hierarchy (super class, super super class, ...), until we find 
+        // the first class that has a @Parent annotation. That's the one we use to 
+        // resolve the current domain-object's navigable parent. 
+        
+        final List<Annotations.Evaluator<Parent>> evaluators = 
+        		Annotations.findFirstInHierarchyHaving(cls, Parent.class);
+        
+        if (NullSafe.isEmpty(evaluators)) {
+            return; // no parent resolvable
         } else if (evaluators.size()>1) {
+        	// code should not be reached, since case should be handled by meta-data validation
         	throw new RuntimeException("unable to determine navigable parent due to ambiguity");
         }
         
@@ -84,10 +90,10 @@ public class NavigableParentAnnotationFacetFactory extends FacetFactoryAbstract
         	try {
 				method = Reflect.getGetter(cls, field.getName());
 			} catch (IntrospectionException e) {
-				return;
+				return; // no parent resolvable
 			}
         } else {
-        	return;
+        	return; // no parent resolvable
         }
         
         try {
@@ -99,59 +105,40 @@ public class NavigableParentAnnotationFacetFactory extends FacetFactoryAbstract
 
 
     /**
-     * Violation if there is a class that has both a <tt>parent()</tt> method and also 
-     * any non-inherited method annotated with <tt>@Parent</tt>.
-     * <p>
-     * If there are only inherited methods annotated with <tt>@Parent</tt> then this is 
-     * <i>not</i> a violation; but the imperative <tt>parent()</tt> method will take precedence.
-     * </p>
+     * For detailed behavioral specification see 
+     * <a href="https://issues.apache.org/jira/browse/ISIS-1816">ISIS-1816</a>.
      */
     @Override
     public void refineMetaModelValidator(MetaModelValidatorComposite metaModelValidator, IsisConfiguration configuration) {
         metaModelValidator.add(new MetaModelValidatorVisiting(new MetaModelValidatorVisiting.Visitor() {
-
-        	//TODO [ahuber] code is a copy of the TitleAnnotationFacetFactory, not sure ...
-        	// 1) what the wanted behavior should be (what about annotations in interfaces, ambiguity, etc.)
-        	// 2) what this code fragment does
         	
             @Override
             public boolean visit(ObjectSpecification objectSpec, ValidationFailures validationFailures) {
                 final Class<?> cls = objectSpec.getCorrespondingClass();
-
-                final Method parentMethod =
-                		MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, NAVIGABLE_PARENT_METHOD_NAME, Object.class, null);
-                if (parentMethod == null) {
-                    return true; // no conflict
-                }
                 
-                // determine if cls contains a @Parent annotated method, not inherited from superclass
-                final Class<?> supClass = cls.getSuperclass();
-                if (supClass == null) {
-                    return true; // no conflict
-                }
+                final List<Annotations.Evaluator<Parent>> evaluators = 
+                		Annotations.findFirstInHierarchyHaving(cls, Parent.class);
                 
-                final List<Method> methods = methodsWithParentAnnotation(cls);
-                final List<Method> superClassMethods = methodsWithParentAnnotation(supClass);
-                if (methods.size() > superClassMethods.size()) {
-                    validationFailures.add(
+                if (NullSafe.isEmpty(evaluators)) {
+                	return true; // no conflict
+                } else if (evaluators.size()>1) {
+                	
+                	validationFailures.add(
                             "%s: conflict for determining a strategy for retrieval of (navigable) parent for class, "
-                            + "contains a method '%s' and an annotation '@%s'",
+                            + "contains multiple annotations '@%s', while at most one is allowed.",
                             objectSpec.getIdentifier().getClassName(),
-                            NAVIGABLE_PARENT_METHOD_NAME,
                             Parent.class.getName());
                 }
-
-                return true;
-            }
-
-            private List<Method> methodsWithParentAnnotation(final Class<?> cls) {
-                return MethodFinderUtils.findMethodsWithAnnotation(cls, MethodScope.OBJECT, Parent.class);
+                
+                return true; // no conflict
+                
             }
 
         }));
     }
 
-
+    // -- ADAPTER INJECTION
+    
     @Override
     public void setServicesInjector(final ServicesInjector servicesInjector) {
         super.setServicesInjector(servicesInjector);
@@ -159,5 +146,5 @@ public class NavigableParentAnnotationFacetFactory extends FacetFactoryAbstract
     }
 
     PersistenceSessionServiceInternal adapterManager;
-
+    
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/method/NavigableParentFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/method/NavigableParentFacetMethodFactory.java
index ad0db2a..471dd5e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/method/NavigableParentFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/navparent/method/NavigableParentFacetMethodFactory.java
@@ -33,7 +33,10 @@ import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstra
  * @author ahuber@apache.org
  * @since 2.0.0
  *
+ * @deprecated according to proposed spec, <a href="https://issues.apache.org/jira/browse/ISIS-1816">ISIS-1816</a>
+ * let's not introduce new 'keywords'. 
  */
+@Deprecated
 public class NavigableParentFacetMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
     private static final String NAVIGABLE_PARENT_PREFIX = "parent";
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 0552f7c..7204a4d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -322,7 +322,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(new TitleFacetViaMethodsFactory());
         addFactory(new IconFacetMethodFactory());
         addFactory(new NavigableParentAnnotationFacetFactory());
-        addFactory(new NavigableParentFacetMethodFactory());
+        //addFactory(new NavigableParentFacetMethodFactory()); //TODO [ahuber] remove once we agreed on deprecation
         addFactory(new CssClassFacetMethodFactory());
 
 

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