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 2020/10/07 10:39:09 UTC
[isis] branch 2441-auditing updated (61ba812 -> 4054e76)
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a change to branch 2441-auditing
in repository https://gitbox.apache.org/repos/asf/isis.git.
from 61ba812 ISIS-2441: ensure _Result.getOrElse() is never null
new 292afba ISIS-2441: use _Result instead of _Either when applicable
new 4054e76 ISIS-2441: improve _Either semantics
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../apache/isis/commons/internal/base/_Either.java | 42 ++++++++---
.../isis/commons/internal/resources/_Json.java | 82 ++++++----------------
.../isis/commons/internal/resources/_Yaml.java | 34 +++------
.../interactions/managed/ActionInteraction.java | 14 ++--
.../interactions/managed/MemberInteraction.java | 4 +-
.../interactions/managed/PropertyInteraction.java | 2 +-
.../viewer/resources/ObjectActionArgHelper.java | 33 ++++-----
7 files changed, 88 insertions(+), 123 deletions(-)
[isis] 02/02: ISIS-2441: improve _Either semantics
Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch 2441-auditing
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 4054e768302d0d379662e71bca2979c7d929a337
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Oct 7 12:38:54 2020 +0200
ISIS-2441: improve _Either semantics
---
.../apache/isis/commons/internal/base/_Either.java | 42 ++++++++++++++++------
.../interactions/managed/ActionInteraction.java | 14 ++++----
.../interactions/managed/MemberInteraction.java | 4 +--
.../interactions/managed/PropertyInteraction.java | 2 +-
4 files changed, 41 insertions(+), 21 deletions(-)
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_Either.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_Either.java
index d8008c4..d85b7a7 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Either.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Either.java
@@ -30,6 +30,7 @@ import static org.apache.isis.commons.internal.base._With.requires;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
+import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
@@ -109,39 +110,58 @@ public final class _Either<L, R> {
return right!=null;
}
- // -- COMPOSITION
-
- public <X, Y> _Either<X, Y> map(Function<L, X> leftMapper, Function<R, Y> rightMapper){
+ // -- MAPPING
+
+ public <T> _Either<T, R> mapLeft(final @NonNull Function<L, T> leftMapper){
+ return isLeft()
+ ? _Either.left(leftMapper.apply(left))
+ : _Either.right(right);
+ }
+
+ public <T> _Either<L, T> mapRight(final @NonNull Function<R, T> rightMapper){
+ return isLeft()
+ ? _Either.left(left)
+ : _Either.right(rightMapper.apply(right));
+ }
+
+ public <X, Y> _Either<X, Y> bimap(
+ final @NonNull Function<L, X> leftMapper,
+ final @NonNull Function<R, Y> rightMapper){
return isLeft()
? left(leftMapper.apply(left))
: right(rightMapper.apply(right));
}
- public <X, Y> _Either<X, Y> mapNullable(Function<L, X> leftMapper, Function<R, Y> rightMapper){
+ public <X, Y> _Either<X, Y> bimapNullable(
+ final @NonNull Function<L, X> leftMapper,
+ final @NonNull Function<R, Y> rightMapper){
return isLeft()
? leftNullable(leftMapper.apply(left))
: rightNullable(rightMapper.apply(right));
}
- public _Either<L, R> leftRemap(Function<L, _Either<L, R>> leftRemapper){
+ public _Either<L, R> mapIfLeft(Function<L, _Either<L, R>> leftRemapper){
return isLeft()
? leftRemapper.apply(left)
: this;
}
- public _Either<L, R> rightReMap(Function<R, _Either<L, R>> rightRemapper){
+ public _Either<L, R> mapIfRight(Function<R, _Either<L, R>> rightRemapper){
return isLeft()
? this
: rightRemapper.apply(right);
}
- // -- REDUCTION
+
+ // -- FOLDING
- public <X> X get(BiFunction<L, R, X> reduction){
- return reduction.apply(left, right);
+ public <T> T fold(BiFunction<L, R, T> biMapper){
+ return biMapper.apply(left, right);
}
-
- public <X> X get(Function<L, X> leftMapper, Function<R, X> rightMapper){
+
+ public <T> T fold(
+ final @NonNull Function<L, T> leftMapper,
+ final @NonNull Function<R, T> rightMapper){
return isLeft()
? leftMapper.apply(left)
: rightMapper.apply(right);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
index 0c800ca..8d9d15a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
@@ -80,7 +80,7 @@ public final class ActionInteraction extends MemberInteraction<ManagedAction, Ac
public ActionInteraction checkSemanticConstraint(@NonNull SemanticConstraint semanticConstraint) {
- chain = chain.leftRemap(action->{
+ chain = chain.mapIfLeft(action->{
val actionSemantics = action.getAction().getSemantics();
@@ -89,13 +89,13 @@ public final class ActionInteraction extends MemberInteraction<ManagedAction, Ac
return _Either.left(action);
case IDEMPOTENT:
- return (! actionSemantics.isIdempotentInNature())
- ? _Either.right(InteractionVeto.actionNotIdempotent(action))
- : _Either.left(action);
+ return actionSemantics.isIdempotentInNature()
+ ? _Either.left(action)
+ : _Either.right(InteractionVeto.actionNotIdempotent(action)) ;
case SAFE:
- return (! actionSemantics.isSafeInNature())
- ? _Either.right(InteractionVeto.actionNotSafe(action))
- : _Either.left(action);
+ return actionSemantics.isSafeInNature()
+ ? _Either.left(action)
+ : _Either.right(InteractionVeto.actionNotSafe(action));
default:
throw _Exceptions.unmatchedCase(semanticConstraint); // unexpected code reach
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/MemberInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/MemberInteraction.java
index 477e6f4..4d4318d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/MemberInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/MemberInteraction.java
@@ -44,7 +44,7 @@ public abstract class MemberInteraction<T extends ManagedMember, H extends Membe
}
public H checkVisibility() {
- chain = chain.leftRemap(property->{
+ chain = chain.mapIfLeft(property->{
val visibilityVeto = property.checkVisibility();
return visibilityVeto.isPresent()
? _Either.right(visibilityVeto.get())
@@ -54,7 +54,7 @@ public abstract class MemberInteraction<T extends ManagedMember, H extends Membe
}
public H checkUsability() {
- chain = chain.leftRemap(property->{
+ chain = chain.mapIfLeft(property->{
val usablitiyVeto = property.checkUsability();
return usablitiyVeto.isPresent()
? _Either.right(usablitiyVeto.get())
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyInteraction.java
index 35601b1..000405f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyInteraction.java
@@ -52,7 +52,7 @@ public final class PropertyInteraction extends MemberInteraction<ManagedProperty
public PropertyInteraction modifyProperty(
@NonNull final Function<ManagedProperty, ManagedObject> newProperyValueProvider) {
- chain = chain.leftRemap(property->{
+ chain = chain.mapIfLeft(property->{
val validityVeto = property.modifyProperty(newProperyValueProvider.apply(property));
return validityVeto.isPresent()
? _Either.right(validityVeto.get())
[isis] 01/02: ISIS-2441: use _Result instead of _Either when
applicable
Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch 2441-auditing
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 292afbade9569609f2e9e5936943a61db3a64842
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Oct 7 11:18:30 2020 +0200
ISIS-2441: use _Result instead of _Either when applicable
---
.../isis/commons/internal/resources/_Json.java | 82 ++++++----------------
.../isis/commons/internal/resources/_Yaml.java | 34 +++------
.../viewer/resources/ObjectActionArgHelper.java | 33 ++++-----
3 files changed, 47 insertions(+), 102 deletions(-)
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/resources/_Json.java b/commons/src/main/java/org/apache/isis/commons/internal/resources/_Json.java
index 348335c..5b763f1 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/resources/_Json.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/resources/_Json.java
@@ -29,7 +29,7 @@ import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
-import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.commons.internal.base._Result;
import lombok.val;
@@ -73,12 +73,8 @@ public class _Json {
* @param content
* @return
*/
- public static <T> _Either<T, Exception> tryReadJson(final Class<T> clazz, InputStream content) {
- try {
- return _Either.left(readJson(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<T> tryReadJson(final Class<T> clazz, InputStream content) {
+ return _Result.of(()->readJson(clazz, content));
}
/**
@@ -108,12 +104,8 @@ public class _Json {
* @param content
* @return
*/
- public static <T> _Either<List<T>, Exception> tryReadJsonList(final Class<T> clazz, InputStream content) {
- try {
- return _Either.left(readJsonList(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<List<T>> tryReadJsonList(final Class<T> clazz, InputStream content) {
+ return _Result.of(()->readJsonList(clazz, content));
}
@@ -144,12 +136,8 @@ public class _Json {
* @param content
* @return
*/
- public static <T> _Either<T, Exception> tryReadJson(final Class<T> clazz, String content) {
- try {
- return _Either.left(readJson(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<T> tryReadJson(final Class<T> clazz, String content) {
+ return _Result.of(()->readJson(clazz, content));
}
/**
@@ -179,12 +167,8 @@ public class _Json {
* @param content
* @return
*/
- public static <T> _Either<List<T>, Exception> tryReadJsonList(final Class<T> clazz, String content) {
- try {
- return _Either.left(readJsonList(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<List<T>> tryReadJsonList(final Class<T> clazz, String content) {
+ return _Result.of(()->readJsonList(clazz, content));
}
@@ -215,12 +199,8 @@ public class _Json {
* @param content
* @return
*/
- public static <T> _Either<T, Exception> tryReadJson(final Class<T> clazz, File content) {
- try {
- return _Either.left(readJson(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<T> tryReadJson(final Class<T> clazz, File content) {
+ return _Result.of(()->readJson(clazz, content));
}
/**
@@ -250,12 +230,8 @@ public class _Json {
* @param content
* @return
*/
- public static <T> _Either<List<T>, Exception> tryReadJsonList(final Class<T> clazz, File content) {
- try {
- return _Either.left(readJsonList(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<List<T>> tryReadJsonList(final Class<T> clazz, File content) {
+ return _Result.of(()->readJsonList(clazz, content));
}
// -- BYTE CONTENT
@@ -285,12 +261,8 @@ public class _Json {
* @param content
* @return
*/
- public static <T> _Either<T, Exception> tryReadJson(final Class<T> clazz, byte[] content) {
- try {
- return _Either.left(readJson(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<T> tryReadJson(final Class<T> clazz, byte[] content) {
+ return _Result.of(()->readJson(clazz, content));
}
/**
@@ -320,12 +292,8 @@ public class _Json {
* @param content
* @return
*/
- public static <T> _Either<List<T>, Exception> tryReadJsonList(final Class<T> clazz, byte[] content) {
- try {
- return _Either.left(readJsonList(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<List<T>> tryReadJsonList(final Class<T> clazz, byte[] content) {
+ return _Result.of(()->readJsonList(clazz, content));
}
// -- WRITING
@@ -341,20 +309,12 @@ public class _Json {
return toString(objectMapper, pojo);
}
- public static <T> _Either<String, Exception> tryToString(ObjectMapper objectMapper, Object pojo) {
- try {
- return _Either.left(toString(objectMapper, pojo));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<String> tryToString(ObjectMapper objectMapper, Object pojo) {
+ return _Result.of(()->toString(objectMapper, pojo));
}
- public static <T> _Either<String, Exception> tryToString(Object pojo) {
- try {
- return _Either.left(toString(pojo));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<String> tryToString(Object pojo) {
+ return _Result.of(()->toString(pojo));
}
}
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/resources/_Yaml.java b/commons/src/main/java/org/apache/isis/commons/internal/resources/_Yaml.java
index 3f9a076..9d15e02 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/resources/_Yaml.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/resources/_Yaml.java
@@ -28,7 +28,7 @@ import java.io.InputStream;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
-import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.commons.internal.base._Result;
import lombok.val;
@@ -68,12 +68,8 @@ public class _Yaml {
* @param content
* @return
*/
- public static <T> _Either<T, Exception> tryReadYaml(final Class<T> clazz, InputStream content) {
- try {
- return _Either.left(readYaml(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<T> tryReadYaml(final Class<T> clazz, InputStream content) {
+ return _Result.of(()->readYaml(clazz, content));
}
// -- FROM STRING
@@ -99,12 +95,8 @@ public class _Yaml {
* @param content
* @return
*/
- public static <T> _Either<T, Exception> tryReadYaml(final Class<T> clazz, String content) {
- try {
- return _Either.left(readYaml(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<T> tryReadYaml(final Class<T> clazz, String content) {
+ return _Result.of(()->readYaml(clazz, content));
}
// -- FROM FILE
@@ -134,12 +126,8 @@ public class _Yaml {
* @param content
* @return
*/
- public static <T> _Either<T, Exception> tryReadYaml(final Class<T> clazz, File content) {
- try {
- return _Either.left(readYaml(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<T> tryReadYaml(final Class<T> clazz, File content) {
+ return _Result.of(()->readYaml(clazz, content));
}
// -- FROM BYTE ARRAY
@@ -168,12 +156,8 @@ public class _Yaml {
* @param content
* @return
*/
- public static <T> _Either<T, Exception> tryReadYaml(final Class<T> clazz, byte[] content) {
- try {
- return _Either.left(readYaml(clazz, content));
- } catch (Exception e) {
- return _Either.right(e);
- }
+ public static <T> _Result<T> tryReadYaml(final Class<T> clazz, byte[] content) {
+ return _Result.of(()->readYaml(clazz, content));
}
}
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectActionArgHelper.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectActionArgHelper.java
index 819e546..037791e 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectActionArgHelper.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectActionArgHelper.java
@@ -23,6 +23,7 @@ import java.util.Map;
import org.apache.isis.commons.collections.Can;
import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.commons.internal.base._Result;
import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.core.metamodel.interactions.managed.InteractionVeto;
import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -54,23 +55,23 @@ public class ObjectActionArgHelper {
val parameters = action.getParameters();
for (int i = 0; i < jsonArgList.size(); i++) {
final JsonRepresentation argRepr = jsonArgList.get(i);
- val paramMeta = parameters.getElseFail(i);
+ final int argIndex = i;
+ val paramMeta = parameters.getElseFail(argIndex);
val paramSpec = paramMeta.getSpecification();
- try {
- if(paramMeta.isOptional() && argRepr == null) {
- argAdapters.add(_Either.leftNullable(ManagedObject.empty(paramSpec)));
- } else {
- val argAdapter = new JsonParserHelper(resourceContext, paramSpec)
- .objectAdapterFor(argRepr);
- argAdapters.add(_Either.left(argAdapter));
- }
- } catch (Exception e) {
-
- val veto = InteractionVeto.actionParamInvalid(
- String.format("exception when parsing paramNr %d [%s]: %s", i, argRepr, e));
-
- argAdapters.add(_Either.right(veto));
- }
+
+ val objectOrVeto = _Result.of(()->
+ (paramMeta.isOptional() && argRepr == null)
+ ? ManagedObject.empty(paramSpec)
+ : new JsonParserHelper(resourceContext, paramSpec)
+ .objectAdapterFor(argRepr))
+ .<_Either<ManagedObject, InteractionVeto>>fold(
+ _Either::left,
+ exception->_Either.right(
+ InteractionVeto.actionParamInvalid(
+ String.format("exception when parsing paramNr %d [%s]: %s",
+ argIndex, argRepr, exception))));
+
+ argAdapters.add(objectOrVeto);
}
return Can.ofCollection(argAdapters);
}