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 2016/04/21 11:05:44 UTC

[08/12] isis git commit: ISIS-1384: new MetaModelService2 for "sort of" API.

ISIS-1384: new MetaModelService2 for "sort of" API.

Also fixing comment of WizardFacet.


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

Branch: refs/heads/ISIS-1291
Commit: 16a42b839ff9b76051d7253c504c1ba7ac4a7afb
Parents: 675ed85
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Apr 21 09:48:08 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Apr 21 09:50:29 2016 +0100

----------------------------------------------------------------------
 .../guides/_rgsvc_api_MetamodelService.adoc     | 21 ++++--
 .../services/metamodel/MetaModelService.java    |  1 +
 .../services/metamodel/MetaModelService2.java   | 69 ++++++++++++++++++++
 .../facets/object/wizard/WizardFacet.java       |  4 --
 .../metamodel/MetaModelServiceDefault.java      | 47 ++++++++++++-
 .../metamodel/spec/ObjectSpecification.java     |  1 +
 .../dflt/ObjectSpecificationDefault.java        |  6 ++
 .../ObjectSpecificationOnStandaloneList.java    |  5 ++
 .../testspec/ObjectSpecificationStub.java       |  4 ++
 9 files changed, 148 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/adocs/documentation/src/main/asciidoc/guides/_rgsvc_api_MetamodelService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rgsvc_api_MetamodelService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rgsvc_api_MetamodelService.adoc
index 4cf640b..efe200f 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rgsvc_api_MetamodelService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rgsvc_api_MetamodelService.adoc
@@ -6,9 +6,13 @@
 
 
 
-The `MetaModelService` provides access (albeit currently extremely limited) to aspects of Apache Isis' internal metamodel.
+The `MetaModelService2` (`MetaModelService2` sub-interface introduced in `1.13.0-SNAPSHOT`) provides access to
+a number of aspects of Apache Isis' internal metamodel.
+
+[NOTE]
+====
+====
 
-Currently this is limited to looking up the object type (as specified in xref:rgant.adoc#_rgant-DomainObject_objectType[`@DomainObject#objectType()`] and equivalent mechanisms, and as used in  xref:rgsvc.adoc#_rgsvc_api_BookmarkService[`Bookmark`]s and elsewhere) from an object's class, and vice versa.  In the future we expect other aspects of the metamodel to also be formally surfaced through this API.
 
 
 == API
@@ -18,17 +22,25 @@ The API defined by the service is:
 
 [source,java]
 ----
-public interface MetaModelService {
+public interface MetaModelService2 {
     Class<?> fromObjectType(final String objectType);   // <1>
     String toObjectType(final Class<?> domainType);     // <2>
     void rebuild(final Class<?> domainType);            // <3>
     List<DomainMember> export();                        // <4>
+
+    enum Sort {
+        VIEW_MODEL, JDO_ENTITY, DOMAIN_SERVICE,
+        MIXIN, VALUE, COLLECTION;
+    }
+    Sort sortOf(final Class<?> domainType);             // <5>
+    Sort sortOf(final Bookmark bookmark);
 }
 ----
 <1> reverse lookup of a domain class' object type
 <2> lookup of a domain class' object type
 <3> invalidate and rebuild the internal metadata (an `ObjectSpecification`) for the specified domain type.
 <4> returns a list of representations of each of member of each domain class.
+<5> (`1.13.0-SNAPSHOT`) what sort of object a domain type is (or bookmark represents)
 
 
 == Implementation
@@ -51,4 +63,5 @@ in the xref:rgsvc.adoc#_rgsvc_intro_overriding-the-services[introduction] to thi
 == Related Services
 
 The `MetaModelServiceMenu` provides a method to download all domain members as a CSV.  Internally
-this calls `MetaModelService#export()`.
+this calls `MetaModelService#export()`.  Under the covers this uses the API provided by the
+xref:rgsvc.adoc#_rgsvc_api_ApplicationFeatureRepository[`ApplicationFeatureRepository`] domain service.

http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
index 8bdcddc..3263ba7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
@@ -58,4 +58,5 @@ public interface MetaModelService {
     @Programmatic
     List<DomainMember> export();
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService2.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService2.java b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService2.java
new file mode 100644
index 0000000..7ec7e1d
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService2.java
@@ -0,0 +1,69 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.services.metamodel;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.services.bookmark.Bookmark;
+
+/**
+ * This service provides a formal API into Isis' metamodel.
+ */
+public interface MetaModelService2 extends MetaModelService {
+
+    enum Sort {
+        VIEW_MODEL,
+        JDO_ENTITY,
+        DOMAIN_SERVICE,
+        MIXIN,
+        VALUE,
+        COLLECTION;
+
+        public boolean isDomainService() {
+            return this == DOMAIN_SERVICE;
+        }
+
+        public boolean isMixin() {
+            return this == MIXIN;
+        }
+
+        public boolean isViewModel() {
+            return this == VIEW_MODEL;
+        }
+
+        public boolean isValue() {
+            return this == VALUE;
+        }
+
+        public boolean isCollection() {
+            return this == COLLECTION;
+        }
+
+        public boolean isJdoEntity() {
+            return this == JDO_ENTITY;
+        }
+
+    }
+
+    @Programmatic
+    Sort sortOf(final Class<?> domainType);
+
+    @Programmatic
+    Sort sortOf(final Bookmark bookmark);
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/wizard/WizardFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/wizard/WizardFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/wizard/WizardFacet.java
index 35ef3fd..0afac9e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/wizard/WizardFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/wizard/WizardFacet.java
@@ -24,10 +24,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 /**
  * Indicates that this class is a wizard.
- * 
- * <p>
- * In the standard Apache Isis Programming Model, typically corresponds to
- * applying the <tt>@Wizard</tt> annotation at the class level.
  */
 public interface WizardFacet extends Facet {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index 6830236..c433e45 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -26,15 +26,17 @@ import javax.inject.Inject;
 
 import com.google.common.collect.Lists;
 
+import org.datanucleus.enhancement.Persistable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.grid.GridService;
 import org.apache.isis.applib.services.metamodel.DomainMember;
-import org.apache.isis.applib.services.metamodel.MetaModelService;
+import org.apache.isis.applib.services.metamodel.MetaModelService2;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -49,7 +51,7 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 @DomainService(
         nature = NatureOfService.DOMAIN
 )
-public class MetaModelServiceDefault implements MetaModelService, SpecificationLoaderAware {
+public class MetaModelServiceDefault implements MetaModelService2, SpecificationLoaderAware {
 
     @SuppressWarnings("unused")
     private final static Logger LOG = LoggerFactory.getLogger(MetaModelServiceDefault.class);
@@ -158,6 +160,46 @@ public class MetaModelServiceDefault implements MetaModelService, SpecificationL
 
     // //////////////////////////////////////
 
+    @Override
+    public Sort sortOf(final Class<?> domainType) {
+        if(domainType == null) {
+            return null;
+        }
+        final ObjectSpecification objectSpec = specificationLookup.loadSpecification(domainType);
+        if(objectSpec.isService()) {
+            return Sort.DOMAIN_SERVICE;
+        }
+        if(objectSpec.isViewModel()) {
+            return Sort.VIEW_MODEL;
+        }
+        if(objectSpec.isValue()) {
+            return Sort.VALUE;
+        }
+        if(objectSpec.isMixin()) {
+            return Sort.VALUE;
+        }
+        if(objectSpec.isParentedOrFreeCollection()) {
+            return Sort.COLLECTION;
+        }
+        final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
+        if(Persistable.class.isAssignableFrom(correspondingClass)) {
+            return Sort.JDO_ENTITY;
+        }
+        throw new IllegalArgumentException(String.format(
+                "Unable to determine what sort of domain object is '%s'", objectSpec.getFullIdentifier()));
+    }
+
+    @Override
+    public Sort sortOf(final Bookmark bookmark) {
+        if(bookmark == null) {
+            return null;
+        }
+        final Class<?> domainType = this.fromObjectType(bookmark.getObjectType());
+        return sortOf(domainType);
+    }
+
+    // //////////////////////////////////////
+
     private SpecificationLoader specificationLookup;
 
     @Override
@@ -167,4 +209,5 @@ public class MetaModelServiceDefault implements MetaModelService, SpecificationL
 
     @Inject
     GridService gridService;
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 0aa950e..ffe719a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -356,6 +356,7 @@ public interface ObjectSpecification extends Specification, ObjectActionContaine
     // //////////////////////////////////////////////////////////////
 
     boolean isViewModel();
+    boolean isMixin();
     boolean isViewModelCloneable(ObjectAdapter targetAdapter);
     boolean isWizard();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 65448e9..2a73303 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -47,6 +47,7 @@ import org.apache.isis.core.metamodel.facets.all.i18n.PluralFacetTranslated;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetInferred;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
 import org.apache.isis.core.metamodel.facets.object.plural.inferred.PluralFacetInferred;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
@@ -317,6 +318,11 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
     }
 
     @Override
+    public boolean isMixin() {
+        return containsFacet(MixinFacet.class);
+    }
+
+    @Override
     public boolean isWizard() {
         return containsFacet(WizardFacet.class);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
index 87a521b..a963d6e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
@@ -105,6 +105,11 @@ public class ObjectSpecificationOnStandaloneList extends ObjectSpecificationAbst
     }
 
     @Override
+    public boolean isMixin() {
+        return false;
+    }
+
+    @Override
     public boolean isViewModelCloneable(ObjectAdapter targetAdapter) {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/16a42b83/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index 7f405c0..215cac7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -416,6 +416,10 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
         return false;
     }
 
+    @Override
+    public boolean isMixin() {
+        return false;
+    }
 
 
     @Override