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 2021/09/17 21:02:10 UTC

[isis] branch master updated: ISIS-2871: new Prog Model: add valueSemantics selection via Property annot.

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 5c20e5e  ISIS-2871: new Prog Model: add valueSemantics selection via Property annot.
5c20e5e is described below

commit 5c20e5e4f94c72e5413c9964ed6791ae3336910e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 17 23:01:57 2021 +0200

    ISIS-2871: new Prog Model: add valueSemantics selection via Property
    annot.
---
 .../apache/isis/applib/annotation/Property.java    | 18 +++++++++
 .../facets/object/value/ValueFacetAbstract.java    |  6 +--
 .../ValueSemanticsSelectingFacet.java              | 38 ++++++++++++++++++
 .../ValueSemanticsSelectingFacetAbstract.java      | 38 ++++++++++++++++++
 .../property/PropertyAnnotationFacetFactory.java   | 11 ++++++
 ...manticsSelectingFacetForPropertyAnnotation.java | 46 ++++++++++++++++++++++
 .../HasAsciiDocDescription_description.java        |  2 +-
 .../_infra/resources/AsciiDocConverterService.java |  7 ++--
 .../AsciiDocValueSemanticsWithPreprocessing.java   | 10 +++--
 9 files changed, 165 insertions(+), 11 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
index d6d9ebc..d1abcbf 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
@@ -24,6 +24,7 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.commanddto.conmap.ContentMappingServiceForCommandDto;
@@ -292,4 +293,21 @@ public @interface Property {
     String regexPatternReplacement()
             default "Doesn't match pattern";
 
+    /**
+     * <i>Experimental Feature</i>
+     * <p>
+     * Allows to select {@link ValueSemanticsProvider}(s) by qualifiers.
+     *
+     * TODO not provided yet...
+     * @see Parameter#valueSemantics()
+     * @see Action#valueSemantics()
+     * @see Collection#valueSemantics()
+     * @apiNote the selection (qualifier inclusion/exclusion) mechanics is not yet finalized,
+     * currently we qualifiers declared here must exactly match that of the targeted bean
+     */
+    String valueSemantics()
+            default "";
+
+
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
index 3fe1557..086638c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -39,7 +39,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
-import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.valuesemantics.ValueSemanticsSelectingFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
@@ -168,8 +168,8 @@ implements ValueFacet<T> {
     }
 
     private Can<String> qualifiersAccepted(final FacetHolder feature) {
-        return feature.lookupFacet(FileAcceptFacet.class)
-        .map(FileAcceptFacet::value) // TODO use a new qualifier facet instead
+        return feature.lookupFacet(ValueSemanticsSelectingFacet.class)
+        .map(ValueSemanticsSelectingFacet::value)
         .map(_Strings::emptyToNull)
         .stream()
         .collect(Can.toCan());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/valuesemantics/ValueSemanticsSelectingFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/valuesemantics/ValueSemanticsSelectingFacet.java
new file mode 100644
index 0000000..a0e8bc1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/valuesemantics/ValueSemanticsSelectingFacet.java
@@ -0,0 +1,38 @@
+/*
+ *  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.core.metamodel.facets.objectvalue.valuesemantics;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.applib.value.Clob;
+import org.apache.isis.core.metamodel.facets.SingleStringValueFacet;
+
+/**
+ * @see Action#valueSemantics()
+ * @see Parameter#valueSemantics()
+ * @see Property#valueSemantics()
+ * @see Collection#valueSemantics()
+ */
+public interface ValueSemanticsSelectingFacet
+extends SingleStringValueFacet {
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/valuesemantics/ValueSemanticsSelectingFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/valuesemantics/ValueSemanticsSelectingFacetAbstract.java
new file mode 100644
index 0000000..665f634
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/valuesemantics/ValueSemanticsSelectingFacetAbstract.java
@@ -0,0 +1,38 @@
+/*
+ *  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.core.metamodel.facets.objectvalue.valuesemantics;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.SingleStringValueFacetAbstract;
+
+public abstract class ValueSemanticsSelectingFacetAbstract
+extends SingleStringValueFacetAbstract
+implements ValueSemanticsSelectingFacet {
+
+    private static final Class<? extends Facet> type() {
+        return ValueSemanticsSelectingFacet.class;
+    }
+
+    public ValueSemanticsSelectingFacetAbstract(final String value, final FacetHolder holder) {
+        super(type(), holder, value);
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index ae44e5e..3d24b6c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -57,6 +57,7 @@ import org.apache.isis.core.metamodel.facets.properties.property.mustsatisfy.Mus
 import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPatternAnnotationOnProperty;
 import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.snapshot.SnapshotExcludeFacetForPropertyAnnotation;
+import org.apache.isis.core.metamodel.facets.properties.property.valuesemantics.ValueSemanticsSelectingFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -98,6 +99,7 @@ extends FacetFactoryAbstract {
         processOptional(processMethodContext, propertyIfAny);
         processRegEx(processMethodContext, propertyIfAny);
         processFileAccept(processMethodContext, propertyIfAny);
+        processValueSemantics(processMethodContext, propertyIfAny);
     }
 
     void inferIntentWhenOnTypeLevel(final ProcessMethodContext processMethodContext, final Optional<Property> propertyIfAny) {
@@ -378,4 +380,13 @@ extends FacetFactoryAbstract {
                 .create(propertyIfAny, holder));
     }
 
+    void processValueSemantics(final ProcessMethodContext processMethodContext, final Optional<Property> propertyIfAny) {
+        val holder = processMethodContext.getFacetHolder();
+
+        // else search for @Property(maxLength=...)
+        addFacetIfPresent(
+                ValueSemanticsSelectingFacetForPropertyAnnotation
+                .create(propertyIfAny, holder));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/valuesemantics/ValueSemanticsSelectingFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/valuesemantics/ValueSemanticsSelectingFacetForPropertyAnnotation.java
new file mode 100644
index 0000000..e1a303b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/valuesemantics/ValueSemanticsSelectingFacetForPropertyAnnotation.java
@@ -0,0 +1,46 @@
+/*
+ *  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.core.metamodel.facets.properties.property.valuesemantics;
+
+import java.util.Optional;
+
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.objectvalue.valuesemantics.ValueSemanticsSelectingFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.valuesemantics.ValueSemanticsSelectingFacetAbstract;
+
+public class ValueSemanticsSelectingFacetForPropertyAnnotation
+extends ValueSemanticsSelectingFacetAbstract {
+
+    public static Optional<ValueSemanticsSelectingFacet> create(
+            final Optional<Property> propertyIfAny,
+            final FacetHolder holder) {
+
+        return propertyIfAny
+        .map(Property::valueSemantics)
+        .filter(_Strings::isNotEmpty)
+        .map(valueSemantics -> new ValueSemanticsSelectingFacetForPropertyAnnotation(valueSemantics, holder));
+    }
+
+    private ValueSemanticsSelectingFacetForPropertyAnnotation(final String value, final FacetHolder holder) {
+        super(value, holder);
+    }
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/asciidocdesc/HasAsciiDocDescription_description.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/asciidocdesc/HasAsciiDocDescription_description.java
index 9140f60..698fd21 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/_infra/asciidocdesc/HasAsciiDocDescription_description.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/_infra/asciidocdesc/HasAsciiDocDescription_description.java
@@ -32,7 +32,7 @@ import lombok.RequiredArgsConstructor;
 import demoapp.dom._infra.resources.AsciiDocReaderService;
 
 @Property(snapshot = Snapshot.EXCLUDED
-    , fileAccept = "demo-adoc-pre-processor") //TODO ISIS-2871 yet just a hack, used as a marker to select a different value-semantics
+    , valueSemantics = "demo-adoc-pre-processor")
 @RequiredArgsConstructor
 public class HasAsciiDocDescription_description {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/resources/AsciiDocConverterService.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/resources/AsciiDocConverterService.java
index 337488f..388a19f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/_infra/resources/AsciiDocConverterService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/_infra/resources/AsciiDocConverterService.java
@@ -35,7 +35,6 @@ import org.springframework.stereotype.Service;
 
 import lombok.val;
 
-
 @Service
 @Named("demo.AsciiDocConverterService")
 public class AsciiDocConverterService {
@@ -48,7 +47,7 @@ public class AsciiDocConverterService {
     private final Options options;
 
     @Inject
-    public AsciiDocConverterService(ResourceReaderService resourceReaderService) {
+    public AsciiDocConverterService(final ResourceReaderService resourceReaderService) {
         this.resourceReaderService = resourceReaderService;
         this.asciidoctor = createAsciidoctor();
         this.options = OptionsBuilder.options()
@@ -67,12 +66,12 @@ public class AsciiDocConverterService {
         class LocalIncludeProcessor extends IncludeProcessor {
 
             @Override
-            public boolean handles(String target) {
+            public boolean handles(final String target) {
                 return true;
             }
 
             @Override
-            public void process(Document document, PreprocessorReader reader, String target, Map<String, Object> attributes) {
+            public void process(final Document document, final PreprocessorReader reader, final String target, final Map<String, Object> attributes) {
                 val contextClass = context.get();
                 val content = resourceReaderService.readResource(contextClass, target, attributes);
                 reader.push_include(content, target, target, 1, attributes);
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/resources/AsciiDocValueSemanticsWithPreprocessing.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/resources/AsciiDocValueSemanticsWithPreprocessing.java
index b16bb82..4134fda 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/_infra/resources/AsciiDocValueSemanticsWithPreprocessing.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/_infra/resources/AsciiDocValueSemanticsWithPreprocessing.java
@@ -1,5 +1,6 @@
 package demoapp.dom._infra.resources;
 
+import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -15,12 +16,15 @@ import org.apache.isis.valuetypes.asciidoc.metamodel.semantics.AsciiDocValueSema
 public class AsciiDocValueSemanticsWithPreprocessing
 extends AsciiDocValueSemantics {
 
-    //FIXME add pre-processing stuff
+    @Inject AsciiDocConverterService asciiDocConverterService;
 
     @Override
     public String presentationValue(final ValueSemanticsProvider.Context context, final AsciiDoc adoc) {
-        return render(adoc, __->"Hello World!");
-                //AsciiDoc::asHtml);
+        return render(adoc, plainAdoc->
+            asciiDocConverterService
+            .adocToHtml(
+                    context.getIdentifier().getLogicalType().getCorrespondingClass(),
+                    plainAdoc.getAdoc()));
     }
 
 }