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 fef2aac530 ISIS-2997: applib: adds interface MetamodelListener
fef2aac530 is described below

commit fef2aac5305fc8c30875d83612dfb1ee968e8184
Author: Andi Huber <[email protected]>
AuthorDate: Fri Apr 8 20:50:28 2022 +0200

    ISIS-2997: applib: adds interface MetamodelListener
    
    - also moves the associated event enum from metamodel -> applib
---
 .../applib/events/metamodel}/MetamodelEvent.java   |  2 +-
 .../applib/events/metamodel/MetamodelListener.java | 66 ++++++++++++++++++++++
 .../ApplicationFeatureRepositoryDefault.java       |  2 +-
 .../core/runtime/events/MetamodelEventService.java |  2 +-
 .../dom/_infra/seed/SeedServiceAbstract.java       | 28 ++++-----
 .../applib/seed/SeedSecurityModuleService.java     |  2 +-
 .../services/InitialFixtureScriptsInstaller.java   |  2 +-
 7 files changed, 82 insertions(+), 22 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/events/MetamodelEvent.java
 
b/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelEvent.java
similarity index 95%
rename from 
core/metamodel/src/main/java/org/apache/isis/core/metamodel/events/MetamodelEvent.java
rename to 
api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelEvent.java
index e28e2d7624..dfbc236826 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/events/MetamodelEvent.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelEvent.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.events;
+package org.apache.isis.applib.events.metamodel;
 
 public enum MetamodelEvent {
         BEFORE_METAMODEL_LOADING,
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelListener.java
 
b/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelListener.java
new file mode 100644
index 0000000000..13af3842dc
--- /dev/null
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelListener.java
@@ -0,0 +1,66 @@
+/*
+ *  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.events.metamodel;
+
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+
+import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+
+/**
+ * Convenience interface to listen on {@link MetamodelEvent}s.
+ * <p>
+ * Provided as an alternative to directly listening to these events.
+ * <p>
+ * Using precedence {@link Order} {@link PriorityPrecedence#MIDPOINT}.
+ * For fine grained precedence control,
+ * services need to directly listen to these events instead.
+ *
+ * @since 2.0
+ */
+@FunctionalInterface
+public interface MetamodelListener {
+
+    /**
+     * Emitted by the framework, once the <i>Metamodel</i> is populated.
+     * <p>
+     * Most common use-case is to seed database values,
+     * right after the <i>Metamodel</i> was loaded.
+     */
+    void onMetamodelLoaded();
+
+    default void onMetamodelAboutToBeLoaded() {}
+
+    @EventListener(MetamodelEvent.class)
+    @Order(PriorityPrecedence.MIDPOINT)
+    default void onMetamodelEvent(final MetamodelEvent event) {
+        switch(event) {
+        case BEFORE_METAMODEL_LOADING:
+            onMetamodelAboutToBeLoaded();
+            return;
+        case AFTER_METAMODEL_LOADED:
+            onMetamodelLoaded();
+            return;
+        default:
+            throw _Exceptions.unmatchedCase(event);
+        }
+    }
+
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index d32dbfb8e9..9020595ab8 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -24,12 +24,12 @@ import lombok.val;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.events.metamodel.MetamodelEvent;
 import org.apache.isis.applib.services.appfeat.*;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.IsisConfiguration;
 import 
org.apache.isis.core.config.metamodel.services.ApplicationFeaturesInitConfiguration;
-import org.apache.isis.core.metamodel.events.MetamodelEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleIntValueFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/events/MetamodelEventService.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/events/MetamodelEventService.java
index 9034e5ce89..303b6916a4 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/events/MetamodelEventService.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/events/MetamodelEventService.java
@@ -27,9 +27,9 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.events.metamodel.MetamodelEvent;
 import org.apache.isis.applib.services.confview.ConfigurationViewService;
 import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.core.metamodel.events.MetamodelEvent;
 
 /**
  *
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/_infra/seed/SeedServiceAbstract.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/_infra/seed/SeedServiceAbstract.java
index 3f9b29a8eb..35d3ecc54b 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/_infra/seed/SeedServiceAbstract.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/_infra/seed/SeedServiceAbstract.java
@@ -22,11 +22,7 @@ import java.util.function.Supplier;
 
 import javax.inject.Inject;
 
-import org.springframework.context.event.EventListener;
-import org.springframework.core.annotation.Order;
-
-import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.core.metamodel.events.MetamodelEvent;
+import org.apache.isis.applib.events.metamodel.MetamodelListener;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
@@ -36,11 +32,14 @@ import demoapp.dom._infra.values.ValueHolder;
 import demoapp.dom._infra.values.ValueHolderFixtureFactory;
 import demoapp.dom._infra.values.ValueHolderRepository;
 
-public abstract class SeedServiceAbstract implements SeedService {
+public abstract class SeedServiceAbstract
+implements
+    SeedService,
+    MetamodelListener {
 
     private final Supplier<FixtureScript> fixtureScriptSupplier;
 
-    protected SeedServiceAbstract(Supplier<FixtureScript> 
fixtureScriptSupplier) {
+    protected SeedServiceAbstract(final Supplier<FixtureScript> 
fixtureScriptSupplier) {
         this.fixtureScriptSupplier = fixtureScriptSupplier;
     }
 
@@ -49,21 +48,16 @@ public abstract class SeedServiceAbstract implements 
SeedService {
         this.fixtureScriptSupplier = 
()->ValueHolderFixtureFactory.fixtureScriptFor(entities);
     }
 
-
-    @EventListener(MetamodelEvent.class)
-    @Order(PriorityPrecedence.MIDPOINT)
-    public void onAppLifecycleEvent(MetamodelEvent event) {
-        if (event.isPostMetamodel()) {
-            fixtureScripts.run(fixtureScriptSupplier.get());
-        }
+    @Override
+    public void onMetamodelLoaded() {
+        fixtureScripts.run(fixtureScriptSupplier.get());
     }
 
     @Override
-    public void seed(FixtureScript parentFixtureScript, 
FixtureScript.ExecutionContext executionContext) {
+    public void seed(final FixtureScript parentFixtureScript, final 
FixtureScript.ExecutionContext executionContext) {
         executionContext.executeChild(parentFixtureScript, 
this.fixtureScriptSupplier.get());
     }
 
-    @Inject
-    FixtureScripts fixtureScripts;
+    @Inject FixtureScripts fixtureScripts;
 
 }
diff --git 
a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/seed/SeedSecurityModuleService.java
 
b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/seed/SeedSecurityModuleService.java
index 6d912bbc90..7e80e95ba6 100644
--- 
a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/seed/SeedSecurityModuleService.java
+++ 
b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/seed/SeedSecurityModuleService.java
@@ -27,8 +27,8 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.events.metamodel.MetamodelEvent;
 import org.apache.isis.applib.services.iactnlayer.InteractionService;
-import org.apache.isis.core.metamodel.events.MetamodelEvent;
 import 
org.apache.isis.extensions.secman.applib.seed.scripts.SeedUsersAndRolesFixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
diff --git 
a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/services/InitialFixtureScriptsInstaller.java
 
b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/services/InitialFixtureScriptsInstaller.java
index 94aeb996b1..8bdcbaad6b 100644
--- 
a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/services/InitialFixtureScriptsInstaller.java
+++ 
b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/services/InitialFixtureScriptsInstaller.java
@@ -30,8 +30,8 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.events.metamodel.MetamodelEvent;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.events.MetamodelEvent;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 

Reply via email to