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