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 5414bb8bee ISIS-3110: some post merge polishing
5414bb8bee is described below
commit 5414bb8bee80c536bbd1011396474ca57b5b74a1
Author: Andi Huber <[email protected]>
AuthorDate: Fri Aug 5 07:40:54 2022 +0200
ISIS-3110: some post merge polishing
- LifecycleCallbackNotifier: guard against empty
- CallbackFacet: guard against unspecified
- AuthorizationManager: fix constructor
- CommandSubscriberForCommandLog: just comments
- Converter (AsciiDoc/Markdown): better java-doc
---
.../facets/object/callbacks/CallbackFacet.java | 20 +++++++---
.../metamodel/objectmanager/ObjectManager.java | 16 ++++++--
.../isis/core/metamodel/spec/ManagedObjects.java | 19 +++++++++
.../publish/LifecycleCallbackNotifier.java | 46 +++++++++-------------
.../manager/AuthorizationManager.java | 44 +++++++++++----------
.../changetracking/EntityChangeTracker.java | 8 ++--
.../subscriber/CommandSubscriberForCommandLog.java | 5 ++-
.../changetracking/EntityChangeTrackerDefault.java | 3 +-
.../asciidoc/applib/value/Converter.java | 10 +++++
.../markdown/applib/value/Converter.java | 29 ++++----------
10 files changed, 112 insertions(+), 88 deletions(-)
diff --git
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacet.java
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacet.java
index 1e6e4d0f09..5dd7e85b9b 100644
---
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacet.java
+++
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacet.java
@@ -22,6 +22,7 @@ import
org.apache.isis.applib.exceptions.unrecoverable.DomainModelException;
import org.apache.isis.core.metamodel.facetapi.Facet;
import org.apache.isis.core.metamodel.facets.ImperativeFacet;
import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
/**
* A {@link Facet} that represents some type of lifecycle callback on the
object
@@ -32,15 +33,22 @@ extends ImperativeFacet {
public void invoke(ManagedObject object);
- public static void callCallback(final ManagedObject object, final Class<?
extends Facet> cls) {
- final CallbackFacet facet = (CallbackFacet)
object.getSpecification().getFacet(cls);
- if (facet != null) {
+ public static void callCallback(
+ final ManagedObject object,
+ final Class<? extends CallbackFacet> callbackFacetType) {
+
+ ManagedObjects.whenSpecified(object)
+ .map(ManagedObject::getSpecification)
+ .flatMap(spec->spec.lookupFacet(callbackFacetType))
+ .ifPresent(callbackFacet->{
try {
- facet.invoke(object);
+ callbackFacet.invoke(object);
} catch (final RuntimeException e) {
- throw new DomainModelException("Callback failed. Calling " +
facet + " on " + object, e);
+ throw new DomainModelException(
+ "Callback failed. Calling " + callbackFacet + " on "
+ object, e);
}
- }
+ });
+
}
diff --git
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
index 03204bb5a6..d5f0bbb0c4 100644
---
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
+++
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
@@ -159,7 +159,7 @@ public interface ObjectManager {
return ManagedObject.unspecified();
}
return spec.isScalar()
- ? managedObjectFor(spec, pojo, entityAdaptingMode)
+ ? managedObjectEagerlyBookmarkedIfRequired(spec, pojo,
entityAdaptingMode)
: PackedManagedObject.pack(
spec.getElementSpecification().orElseGet(fallbackElementType),
_NullSafe.streamAutodetect(pojo)
@@ -190,7 +190,8 @@ public interface ObjectManager {
||
pojo.getClass().equals(proposedSpec.getCorrespondingClass()))
// if actual type matches spec's, we assume, that we don't need to
reload,
// so this is a shortcut for performance reasons
- ? managedObjectFor(proposedSpec, pojo,
EntityAdaptingMode.MEMOIZE_BOOKMARK)
+ ? managedObjectEagerlyBookmarkedIfRequired(
+ proposedSpec, pojo, EntityAdaptingMode.MEMOIZE_BOOKMARK)
// fallback, ignoring proposedSpec
: adapt(pojo);
return adapter;
@@ -198,12 +199,19 @@ public interface ObjectManager {
// -- HELPER
- private static ManagedObject managedObjectFor(
+ /**
+ * {@link ManagedObject} factory, that in case of given pojo representing
an entity
+ * and the entityAdaptingMode equals {@link
EntityAdaptingMode#isMemoize()},
+ * then tries to memoize its {@link Bookmark} eagerly
+ * (otherwise its {@link Bookmark} is lazily resolved).
+ */
+ private static ManagedObject managedObjectEagerlyBookmarkedIfRequired(
final ObjectSpecification spec,
final Object pojo,
final EntityAdaptingMode entityAdaptingMode) {
- if(entityAdaptingMode.isMemoize() && spec.isEntity()) {
+ if(entityAdaptingMode.isMemoize()
+ && spec.isEntity()) {
val entityFacet = spec.getFacet(EntityFacet.class);
val state = entityFacet.getEntityState(pojo);
if(state.isAttached()) {
diff --git
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
index 16b771b7d7..23ff65bee6 100644
---
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
+++
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
@@ -93,11 +93,30 @@ public final class ManagedObjects {
: adapter.getPojo()==null;
}
+ /**
+ * Optionally given adapter, based on whether it is not null AND specified
AND not empty.
+ */
+ public static Optional<ManagedObject> whenNonEmpty(final ManagedObject
adapter) {
+ return isNullOrUnspecifiedOrEmpty(adapter)
+ ? Optional.empty()
+ : Optional.of(adapter);
+ }
+
/** whether has at least a spec */
public static boolean isSpecified(final @Nullable ManagedObject adapter) {
return adapter!=null && adapter!=ManagedObject.unspecified();
}
+ /**
+ * Optionally given adapter, based on whether it is specified
+ * (even if empty, that is, representing null.)
+ */
+ public static Optional<ManagedObject> whenSpecified(final ManagedObject
adapter) {
+ return isSpecified(adapter)
+ ? Optional.of(adapter)
+ : Optional.empty();
+ }
+
/**
* whether the corresponding type can be mapped onto a REFERENCE (schema)
or an Oid,
* that is, the type is 'identifiable' (aka 'referencable' or
'bookmarkable')
diff --git
a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/LifecycleCallbackNotifier.java
b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/LifecycleCallbackNotifier.java
index fbd6d448a8..70fab30607 100644
---
a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/LifecycleCallbackNotifier.java
+++
b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/LifecycleCallbackNotifier.java
@@ -18,11 +18,6 @@
*/
package org.apache.isis.core.runtimeservices.publish;
-import java.util.LinkedHashSet;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Consumer;
-
import javax.annotation.Priority;
import javax.inject.Inject;
import javax.inject.Named;
@@ -30,12 +25,10 @@ import javax.inject.Named;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
-import org.apache.isis.applib.annotation.InteractionScope;
import org.apache.isis.applib.annotation.PriorityPrecedence;
import org.apache.isis.applib.events.lifecycle.AbstractLifecycleEvent;
-import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.iactnlayer.InteractionService;
+import org.apache.isis.commons.internal.base._Casts;
import org.apache.isis.commons.internal.factory._InstanceUtil;
import org.apache.isis.core.metamodel.facets.object.callbacks.CallbackFacet;
import
org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacet;
@@ -54,12 +47,12 @@ import
org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedLifecycleEv
import
org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacet;
import
org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingLifecycleEventFacet;
import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
import org.apache.isis.core.transaction.changetracking.events.PostStoreEvent;
import org.apache.isis.core.transaction.changetracking.events.PreStoreEvent;
import lombok.RequiredArgsConstructor;
-import lombok.val;
/**
* Calls lifecycle callbacks for entities, ensuring that any given entity is
only ever called once.
@@ -75,61 +68,58 @@ public class LifecycleCallbackNotifier {
final EventBusService eventBusService;
- public void postCreate(ManagedObject entity) {
+ public void postCreate(final ManagedObject entity) {
CallbackFacet.callCallback(entity, CreatedCallbackFacet.class);
postLifecycleEventIfRequired(entity, CreatedLifecycleEventFacet.class);
}
- public void postLoad(ManagedObject entity) {
+ public void postLoad(final ManagedObject entity) {
CallbackFacet.callCallback(entity, LoadedCallbackFacet.class);
postLifecycleEventIfRequired(entity, LoadedLifecycleEventFacet.class);
}
- public void prePersist(ManagedObject entity) {
+ public void prePersist(final ManagedObject entity) {
eventBusService.post(PreStoreEvent.of(entity.getPojo()));
CallbackFacet.callCallback(entity, PersistingCallbackFacet.class);
postLifecycleEventIfRequired(entity,
PersistingLifecycleEventFacet.class);
}
- public void postPersist(ManagedObject entity) {
+ public void postPersist(final ManagedObject entity) {
eventBusService.post(PostStoreEvent.of(entity.getPojo()));
CallbackFacet.callCallback(entity, PersistedCallbackFacet.class);
postLifecycleEventIfRequired(entity,
PersistedLifecycleEventFacet.class);
}
- public void preUpdate(ManagedObject entity) {
+ public void preUpdate(final ManagedObject entity) {
eventBusService.post(PreStoreEvent.of(entity.getPojo()));
CallbackFacet.callCallback(entity, UpdatingCallbackFacet.class);
postLifecycleEventIfRequired(entity,
UpdatingLifecycleEventFacet.class);
}
- public void postUpdate(ManagedObject entity) {
+ public void postUpdate(final ManagedObject entity) {
CallbackFacet.callCallback(entity, UpdatedCallbackFacet.class);
postLifecycleEventIfRequired(entity, UpdatedLifecycleEventFacet.class);
}
- public void preRemove(ManagedObject entity) {
+ public void preRemove(final ManagedObject entity) {
CallbackFacet.callCallback(entity, RemovingCallbackFacet.class);
postLifecycleEventIfRequired(entity,
RemovingLifecycleEventFacet.class);
}
-
// -- HELPER
- @SuppressWarnings({ "unchecked", "rawtypes" })
protected void postLifecycleEventIfRequired(
- final ManagedObject adapter,
+ final ManagedObject object,
final Class<? extends LifecycleEventFacet>
lifecycleEventFacetClass) {
- val lifecycleEventFacet =
adapter.getSpecification().getFacet(lifecycleEventFacetClass);
- if(lifecycleEventFacet == null) {
- return;
- }
- val eventInstance = (AbstractLifecycleEvent) _InstanceUtil
- .createInstance(lifecycleEventFacet.getEventType());
- val pojo = adapter.getPojo();
- postEvent(eventInstance, pojo);
-
+ ManagedObjects.whenNonEmpty(object)
+ .map(ManagedObject::getSpecification)
+ .flatMap(spec->spec.lookupFacet(lifecycleEventFacetClass))
+ .map(LifecycleEventFacet::getEventType)
+ .map(_InstanceUtil::createInstance)
+ .ifPresent(eventInstance->{
+ postEvent(_Casts.uncheckedCast(eventInstance), object.getPojo());
+ });
}
protected void postEvent(final AbstractLifecycleEvent<Object> event, final
Object pojo) {
diff --git
a/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
b/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
index 78f07dcdb0..fa005ab508 100644
---
a/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
+++
b/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
@@ -18,20 +18,24 @@
*/
package org.apache.isis.core.security.authorization.manager;
-import lombok.val;
+import java.util.List;
+import java.util.Optional;
+
+import javax.annotation.Priority;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.lang.Nullable;
+import org.springframework.stereotype.Service;
+
import org.apache.isis.applib.Identifier;
import org.apache.isis.applib.annotation.PriorityPrecedence;
import org.apache.isis.applib.services.iactnlayer.InteractionContext;
import org.apache.isis.applib.services.sudo.SudoService;
+import org.apache.isis.commons.internal.assertions._Assert;
+import org.apache.isis.commons.internal.base._NullSafe;
import org.apache.isis.core.security.authorization.Authorizor;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
-
-import org.springframework.lang.Nullable;
-import javax.annotation.Priority;
-import javax.inject.Inject;
-import javax.inject.Named;
-import java.util.List;
/**
* Authorizes the user in the current session view and use members of an
object.
@@ -44,22 +48,22 @@ import java.util.List;
@Qualifier("Default")
public class AuthorizationManager {
- private final List<Authorizor> authorizors;
private final Authorizor authorizor;
@Inject
public AuthorizationManager(
final List<Authorizor> authorizors,
- @org.springframework.lang.Nullable final AuthorizorChooser
authorizorChooser) {
- this.authorizors = authorizors;
- val authorizorPrecedenceChooserToUse = authorizorChooser != null
- ? authorizorChooser
- : new AuthorizorChooser() {
- @Override public Authorizor chooseFrom(final
List<Authorizor> authorizors) {
- return authorizors.get(0);
- }
- };
- this.authorizor =
authorizorPrecedenceChooserToUse.chooseFrom(authorizors);
+ final Optional<AuthorizorChooser> authorizorChooserIfAny) {
+
+ _Assert.assertTrue(_NullSafe.size(authorizors)>0, ()->
+ String.format(
+ "At least one %s is required to be registered for
injection.",
+ Authorizor.class.getName()));
+
+ this.authorizor =
+ authorizorChooserIfAny
+ .map(authorizorChooser->authorizorChooser.chooseFrom(authorizors))
+ .orElseGet(()->authorizors.get(0));
}
/**
diff --git
a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTracker.java
b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTracker.java
index a75a7ead10..343e3eeb32 100644
---
a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTracker.java
+++
b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTracker.java
@@ -39,10 +39,10 @@ public interface EntityChangeTracker extends DisposableBean
{
*/
EntityChangeTracker NOOP = new EntityChangeTracker() {
@Override public void destroy() throws Exception {}
- @Override public void enlistCreated(ManagedObject entity) {}
- @Override public void enlistUpdating(ManagedObject entity,
Can<PropertyChangeRecord> propertyChangeRecords) {}
- @Override public void enlistDeleting(ManagedObject entity) {}
- @Override public void incrementLoaded(ManagedObject entity) {}
+ @Override public void enlistCreated(final ManagedObject entity) {}
+ @Override public void enlistUpdating(final ManagedObject entity, final
Can<PropertyChangeRecord> propertyChangeRecords) {}
+ @Override public void enlistDeleting(final ManagedObject entity) {}
+ @Override public void incrementLoaded(final ManagedObject entity) {}
};
/**
diff --git
a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java
b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java
index b0f3226689..c33abf534a 100644
---
a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java
+++
b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java
@@ -27,7 +27,6 @@ import org.apache.isis.applib.annotation.PriorityPrecedence;
import org.apache.isis.applib.services.command.Command;
import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
import org.apache.isis.applib.util.JaxbUtil;
-import org.apache.isis.commons.internal.base._Casts;
import org.apache.isis.core.config.IsisConfiguration;
import
org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib;
import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry;
@@ -53,7 +52,9 @@ public class CommandSubscriberForCommandLog implements
CommandSubscriber {
@Override
public void onCompleted(final Command command) {
- if
(isisConfiguration.getExtensions().getCommandLog().getPublishPolicy().isOnlyIfSystemChanged()
&& !command.isSystemStateChanged()) {
+ // skip if no changes AND skipping is allowed
+ if
(isisConfiguration.getExtensions().getCommandLog().getPublishPolicy().isOnlyIfSystemChanged()
+ && !command.isSystemStateChanged()) {
return;
}
diff --git
a/persistence/commons/src/main/java/org/apache/isis/persistence/jpa/integration/changetracking/EntityChangeTrackerDefault.java
b/persistence/commons/src/main/java/org/apache/isis/persistence/jpa/integration/changetracking/EntityChangeTrackerDefault.java
index f2b40b61f8..7753622106 100644
---
a/persistence/commons/src/main/java/org/apache/isis/persistence/jpa/integration/changetracking/EntityChangeTrackerDefault.java
+++
b/persistence/commons/src/main/java/org/apache/isis/persistence/jpa/integration/changetracking/EntityChangeTrackerDefault.java
@@ -31,7 +31,6 @@ import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
-import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
@@ -173,7 +172,7 @@ implements
}
- private boolean isEntityExcludedForChangePublishing(ManagedObject entity) {
+ private boolean isEntityExcludedForChangePublishing(final ManagedObject
entity) {
if(!EntityChangePublishingFacet.isPublishingEnabled(entity.getSpecification()))
{
return true; // ignore entities that are not enabled for entity
change publishing
diff --git
a/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/Converter.java
b/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/Converter.java
index ff7cc44a38..3cdb9bd124 100644
---
a/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/Converter.java
+++
b/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/Converter.java
@@ -32,6 +32,16 @@ import lombok.Getter;
final class Converter {
+ /**
+ * For syntax highlighting to work, the client/browser needs to load
specific
+ * Javascript and CSS.
+ * The framework supports this out of the box with its various viewers,
+ * using <i>Prism</i> web-jars.
+ *
+ * @param adoc - formated input to be converted to HTML
+ *
+ * @see <a href="https://prismjs.com/">prismjs.com</a>
+ */
public static String adocToHtml(final @Nullable String adoc, final
@Nullable Options options) {
return _Strings.isEmpty(adoc)
? ""
diff --git
a/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Converter.java
b/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Converter.java
index c9c47fc096..ef4a4764d6 100644
---
a/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Converter.java
+++
b/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Converter.java
@@ -33,30 +33,15 @@ public final class Converter {
/**
* For syntax highlighting to work, the client/browser needs to load
specific
- * java-script and css.
- * <p>
- * 1) In your web-app's {@code scripts/application.js} include the bundled
- * {@code src/main/resources/prism1.14.js}.
- * <pre>
- * function includeJs(jsFilePath) {
- * var js = document.createElement("script");
- * js.type = "text/javascript";
- * js.src = jsFilePath;
- * document.body.appendChild(js);
- * }
- *
- * includeJs("/scripts/prism1.14.js");
- * </pre>
- * <p>
- * 2) In your web-app's {@code css/application.css} include the bundled
- * {@code src/main/resources/prism.css}.
- * <pre>
- * {@code @import "prism.css"}.
- * </pre>
+ * Javascript and CSS.
+ * The framework supports this out of the box with its various viewers,
+ * using <i>Prism</i> web-jars.
*
* @param markdown - formated input to be converted to HTML
+ *
+ * @see <a href="https://prismjs.com/">prismjs.com</a>
*/
- public static String mdToHtml(String markdown) {
+ public static String mdToHtml(final String markdown) {
if(markdownSupport==null) {
markdownSupport = new MarkdownSupport();
}
@@ -86,7 +71,7 @@ public final class Converter {
renderer = HtmlRenderer.builder(options).build();
}
- public String toHtml(String markdown) {
+ public String toHtml(final String markdown) {
return renderer.render(parser.parse(markdown));
}
}