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 f338b8b0a907f3581041644abe2f093542b09c88 Author: Andi Huber <ahu...@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 ahu...@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 ahu...@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 293dafb..e96588f 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 @@ -328,7 +328,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 danhayw...@apache.org.