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()));
}
}