You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/11/09 12:38:28 UTC
[isis] branch master updated (d3e8193 -> 0276d56)
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.
from d3e8193 ISIS-2062: fixes z-index for menu items (issue when overlapping)
new ffa117b ISIS-2174: adds Module interface
new e9dc23e ISIS-2174: first sketches of ModuleDependencyGraphService
new a2d7076 ISIS-2174: adds ModuleService and new Spring extension
new 5b9720c ISIS-2174: simplifies ModuleService
new 0276d56 Merge branch 'ISIS-2174'
The 5 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:
.../application/DomainAppApplicationModule.java | 8 +-
.../domainapp/conf/SimpleAppConfiguration.java | 17 +--
.../domainapp/modules/simple/SimpleModule.java | 32 ++++--
extensions/fixtures/pom.xml | 5 +
.../isis/extensions/fixtures/IsisBootFixtures.java | 11 +-
.../fixtures/fixturescripts/FixtureScript.java | 6 +
.../isis/extensions/fixtures/module/Module.java | 65 +++++++++++
.../extensions/fixtures/module/ModuleService.java | 128 +++++++++++++++++++++
extensions/pom.xml | 53 +++++++++
extensions/secman/pom.xml | 30 +++++
extensions/spring/_adoc/antora.yml | 6 +
.../_adoc/modules/ext-spring}/_attributes.adoc | 0
.../_adoc/modules/ext-spring/attachments}/.gitkeep | 0
.../_adoc/modules/ext-spring/examples}/.gitkeep | 0
.../_adoc/modules/ext-spring}/images/.gitkeep | 0
.../spring/_adoc/modules/ext-spring/nav.adoc | 2 +
.../modules/ext-spring/pages}/_attributes.adoc | 0
.../_adoc/modules/ext-spring/pages/about.adoc | 5 +-
.../modules/ext-spring}/partials/_attributes.adoc | 0
.../modules/ext-spring/partials/module-nav.adoc | 3 +
extensions/{restclient => spring}/pom.xml | 15 +--
.../isis/extensions/spring/ExtSpringModule.java} | 7 +-
.../extensions/spring/service/BeanDescriptor.java | 67 +++++++++++
.../extensions/spring/service/ContextBeans.java | 49 ++++++++
.../spring/service/SpringBeansService.java | 62 ++++++++++
25 files changed, 533 insertions(+), 38 deletions(-)
create mode 100644 extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/Module.java
create mode 100644 extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleService.java
create mode 100644 extensions/spring/_adoc/antora.yml
copy {mixins/_adoc/modules/ROOT => extensions/spring/_adoc/modules/ext-spring}/_attributes.adoc (100%)
copy {mixins/_adoc/modules/ROOT/images => extensions/spring/_adoc/modules/ext-spring/attachments}/.gitkeep (100%)
copy {mixins/_adoc/modules/ROOT/images => extensions/spring/_adoc/modules/ext-spring/examples}/.gitkeep (100%)
copy {mixins/_adoc/modules/ROOT => extensions/spring/_adoc/modules/ext-spring}/images/.gitkeep (100%)
create mode 100644 extensions/spring/_adoc/modules/ext-spring/nav.adoc
copy {mixins/_adoc/modules/ROOT/partials => extensions/spring/_adoc/modules/ext-spring/pages}/_attributes.adoc (100%)
copy core/plugins/jdo/_adoc/modules/ROOT/pages/jdo-mappings.adoc => extensions/spring/_adoc/modules/ext-spring/pages/about.adoc (97%)
copy {mixins/_adoc/modules/ROOT => extensions/spring/_adoc/modules/ext-spring}/partials/_attributes.adoc (100%)
create mode 100644 extensions/spring/_adoc/modules/ext-spring/partials/module-nav.adoc
copy extensions/{restclient => spring}/pom.xml (84%)
copy extensions/{incubator/src/main/java/org/apache/isis/extensions/incubator/IsisBootIncubator.java => spring/src/main/java/org/apache/isis/extensions/spring/ExtSpringModule.java} (84%)
create mode 100644 extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/BeanDescriptor.java
create mode 100644 extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/ContextBeans.java
create mode 100644 extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
[isis] 02/05: ISIS-2174: first sketches of
ModuleDependencyGraphService
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit e9dc23e0d774a0f4704caa69610b2d0de4728736
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Nov 8 17:32:15 2019 +0000
ISIS-2174: first sketches of ModuleDependencyGraphService
---
.../isis/extensions/fixtures/IsisBootFixtures.java | 9 +-
.../module/ModuleDependencyGraphService.java | 196 +++++++++++++++++++++
2 files changed, 201 insertions(+), 4 deletions(-)
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisBootFixtures.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisBootFixtures.java
index 74c04d9..7be1ecb 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisBootFixtures.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisBootFixtures.java
@@ -18,19 +18,20 @@
*/
package org.apache.isis.extensions.fixtures;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-
import org.apache.isis.extensions.fixtures.fixturescripts.ExecutionParametersService;
import org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsDefault;
import org.apache.isis.extensions.fixtures.legacy.queryresultscache.QueryResultsCacheControlInternal;
+import org.apache.isis.extensions.fixtures.module.ModuleDependencyGraphService;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
@Configuration
@Import({
FixturesLifecycleService.class,
FixtureScriptsDefault.class,
ExecutionParametersService.class,
- QueryResultsCacheControlInternal.class
+ QueryResultsCacheControlInternal.class,
+ ModuleDependencyGraphService.class
})
public class IsisBootFixtures {
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleDependencyGraphService.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleDependencyGraphService.java
new file mode 100644
index 0000000..89d6d84
--- /dev/null
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleDependencyGraphService.java
@@ -0,0 +1,196 @@
+/*
+ * 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.extensions.fixtures.module;
+
+import lombok.extern.log4j.Log4j2;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+@Service @Log4j2
+public class ModuleDependencyGraphService {
+
+ private final ConfigurableApplicationContext context;
+
+ public ModuleDependencyGraphService(ConfigurableApplicationContext context) {
+ this.context = context;
+ }
+
+ @EventListener(ContextRefreshedEvent.class)
+ public void onContextRefreshed(ContextRefreshedEvent event) {
+
+ log.info("onContextRefreshed");
+
+
+// final ApplicationContext rootContext = root(event.getApplicationContext(), 0);
+
+// final String[] beanDefinitionNames = rootContext.getBeanDefinitionNames();
+//
+// final List<String> beanList = Arrays.stream(beanDefinitionNames).sorted().collect(Collectors.toList());
+// for (String beanDefinitionName : beanList) {
+// log.info(beanDefinitionName);
+// }
+
+ }
+
+// private static ApplicationContext root(ApplicationContext applicationContext, int level) {
+//
+// // guard
+// if(level > 100) {
+// throw new IllegalStateException("Seem to be in an infinite loop trying to obtain the root ApplicationContext");
+// }
+//
+// if(applicationContext == null) {
+// return null;
+// }
+//
+// final ApplicationContext parent = applicationContext.getParent();
+// if(parent == null) {
+// return applicationContext;
+// }
+//
+// return root(parent, ++level);
+// }
+
+
+ public ApplicationBeans beans() {
+ Map<String, ContextBeans> contexts = new HashMap<>();
+
+ for(ConfigurableApplicationContext context = this.context; context != null; context = getConfigurableParent(context)) {
+ contexts.put(context.getId(), ContextBeans.describing(context));
+ }
+
+ return new ApplicationBeans(contexts);
+ }
+
+ private static ConfigurableApplicationContext getConfigurableParent(ConfigurableApplicationContext context) {
+ ApplicationContext parent = context.getParent();
+ return parent instanceof ConfigurableApplicationContext ? (ConfigurableApplicationContext)parent : null;
+ }
+
+ public static final class BeanDescriptor {
+ private final String[] aliases;
+ private final String scope;
+ private final Class<?> type;
+ private final String resource;
+ private final String[] dependencies;
+
+ private BeanDescriptor(String[] aliases, String scope, Class<?> type, String resource, String[] dependencies) {
+ this.aliases = aliases;
+ this.scope = StringUtils.hasText(scope) ? scope : "singleton";
+ this.type = type;
+ this.resource = resource;
+ this.dependencies = dependencies;
+ }
+
+ public String[] getAliases() {
+ return this.aliases;
+ }
+
+ public String getScope() {
+ return this.scope;
+ }
+
+ public Class<?> getType() {
+ return this.type;
+ }
+
+ public String getResource() {
+ return this.resource;
+ }
+
+ public String[] getDependencies() {
+ return this.dependencies;
+ }
+ }
+
+ public static final class ContextBeans {
+ private final Map<String, BeanDescriptor> beans;
+ private final String parentId;
+
+ private ContextBeans(Map<String, BeanDescriptor> beans, String parentId) {
+ this.beans = beans;
+ this.parentId = parentId;
+ }
+
+ public String getParentId() {
+ return this.parentId;
+ }
+
+ public Map<String, BeanDescriptor> getBeans() {
+ return this.beans;
+ }
+
+ private static ContextBeans describing(ConfigurableApplicationContext context) {
+ if (context == null) {
+ return null;
+ } else {
+ ConfigurableApplicationContext parent = getConfigurableParent(context);
+ return new ContextBeans(describeBeans(context.getBeanFactory()), parent != null ? parent.getId() : null);
+ }
+ }
+
+ private static Map<String, BeanDescriptor> describeBeans(ConfigurableListableBeanFactory beanFactory) {
+ Map<String, BeanDescriptor> beans = new HashMap();
+ String[] var2 = beanFactory.getBeanDefinitionNames();
+ int var3 = var2.length;
+
+ for(int var4 = 0; var4 < var3; ++var4) {
+ String beanName = var2[var4];
+ BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
+ if (isBeanEligible(beanName, definition, beanFactory)) {
+ beans.put(beanName, describeBean(beanName, definition, beanFactory));
+ }
+ }
+
+ return beans;
+ }
+
+ private static BeanDescriptor describeBean(String name, BeanDefinition definition, ConfigurableListableBeanFactory factory) {
+ return new BeanDescriptor(factory.getAliases(name), definition.getScope(), factory.getType(name), definition.getResourceDescription(), factory.getDependenciesForBean(name));
+ }
+
+ private static boolean isBeanEligible(String beanName, BeanDefinition bd, ConfigurableBeanFactory bf) {
+ return bd.getRole() != 2 && (!bd.isLazyInit() || bf.containsSingleton(beanName));
+ }
+ }
+
+ public static final class ApplicationBeans {
+ private final Map<String, ContextBeans> contexts;
+
+ private ApplicationBeans(Map<String, ContextBeans> contexts) {
+ this.contexts = contexts;
+ }
+
+ public Map<String, ContextBeans> getContexts() {
+ return this.contexts;
+ }
+ }
+
+}
[isis] 03/05: ISIS-2174: adds ModuleService and new Spring extension
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit a2d70760ce176212563607e99bbb98e5f590063a
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Nov 9 12:28:39 2019 +0000
ISIS-2174: adds ModuleService and new Spring extension
Spring extension provides SpringBeansService. ModuleService filters to those beans that are also modules (in the Isis sense)
---
.../application/DomainAppApplicationModule.java | 8 +-
.../domainapp/conf/SimpleAppConfiguration.java | 17 +-
.../domainapp/modules/simple/SimpleModule.java | 32 ++--
extensions/fixtures/pom.xml | 5 +
.../isis/extensions/fixtures/IsisBootFixtures.java | 6 +-
.../isis/extensions/fixtures/module/Module.java | 14 +-
.../module/ModuleDependencyGraphService.java | 196 ---------------------
.../extensions/fixtures/module/ModuleService.java | 145 +++++++++++++++
extensions/pom.xml | 53 ++++++
extensions/secman/pom.xml | 30 ++++
extensions/spring/_adoc/antora.yml | 6 +
.../_adoc/modules/ext-spring/_attributes.adoc | 6 +
.../_adoc/modules/ext-spring/attachments/.gitkeep | 0
.../_adoc/modules/ext-spring/examples/.gitkeep | 0
.../_adoc/modules/ext-spring/images/.gitkeep | 0
.../spring/_adoc/modules/ext-spring/nav.adoc | 2 +
.../modules/ext-spring/pages/_attributes.adoc | 4 +
.../_adoc/modules/ext-spring/pages/about.adoc | 6 +
.../modules/ext-spring/partials/_attributes.adoc | 4 +
.../modules/ext-spring/partials/module-nav.adoc | 3 +
extensions/{fixtures => spring}/pom.xml | 36 +---
.../isis/extensions/spring/ExtSpringModule.java | 16 +-
.../extensions/spring/service/BeanDescriptor.java | 67 +++++++
.../extensions/spring/service/ContextBeans.java | 49 ++++++
.../spring/service/SpringBeansService.java | 62 +++++++
25 files changed, 507 insertions(+), 260 deletions(-)
diff --git a/examples/apps/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java b/examples/apps/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java
index 6787524..6ffafb0 100644
--- a/examples/apps/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java
+++ b/examples/apps/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java
@@ -20,12 +20,16 @@ package domainapp.application;
import javax.xml.bind.annotation.XmlRootElement;
+import org.apache.isis.extensions.fixtures.module.Module;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import domainapp.modules.simple.SimpleModule;
-@XmlRootElement(name = "module")
+@Configuration
@Import(SimpleModule.class)
-public class DomainAppApplicationModule {
+@ComponentScan
+public class DomainAppApplicationModule implements Module {
}
diff --git a/examples/apps/simpleapp/application/src/main/java/domainapp/conf/SimpleAppConfiguration.java b/examples/apps/simpleapp/application/src/main/java/domainapp/conf/SimpleAppConfiguration.java
index a907e4f..44f6a3a 100644
--- a/examples/apps/simpleapp/application/src/main/java/domainapp/conf/SimpleAppConfiguration.java
+++ b/examples/apps/simpleapp/application/src/main/java/domainapp/conf/SimpleAppConfiguration.java
@@ -58,16 +58,19 @@ import domainapp.modules.simple.SimpleModule;
IsisBootWebRestfulObjects.class,
IsisBootWebWicket.class,
IsisBootFixtures.class,
-
+
+ DomainAppApplicationModule.class,
+
DomainAppDemo.class // register this fixture
})
-@ComponentScan(
- basePackageClasses= {
- DomainAppApplicationModule.class,
- SimpleModule.class
- })
-public class SimpleAppConfiguration {
+//@ComponentScan(
+// basePackageClasses= {
+// DomainAppApplicationModule.class,
+// SimpleModule.class
+// })
+public class SimpleAppConfiguration { // this is somewhat akin to the old AppManifest
+ // TODO: why?
@Bean @Singleton
public WebAppConfigBean webAppConfigBean() {
return WebAppConfigBean.builder()
diff --git a/examples/apps/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java b/examples/apps/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java
index b843ff8..46b9ed4 100644
--- a/examples/apps/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java
+++ b/examples/apps/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java
@@ -18,19 +18,27 @@
*/
package domainapp.modules.simple;
-//@XmlRootElement(name = "module")
-public class SimpleModule /*extends ModuleAbstract*/ {
+import domainapp.modules.simple.dom.impl.SimpleObject;
- //XXX migrated from
- // @Override
- // public FixtureScript getTeardownFixture() {
- // return new TeardownFixtureAbstract2() {
- // @Override
- // protected void execute(ExecutionContext executionContext) {
- // deleteFrom(SimpleObject.class);
- // }
- // };
- // }
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+import org.apache.isis.extensions.fixtures.legacy.teardown.TeardownFixtureAbstract2;
+import org.apache.isis.extensions.fixtures.module.Module;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan
+public class SimpleModule implements Module {
+
+ @Override
+ public FixtureScript getTeardownFixture() {
+ return new TeardownFixtureAbstract2() {
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+ deleteFrom(SimpleObject.class);
+ }
+ };
+ }
public static class PropertyDomainEvent<S,T>
extends org.apache.isis.applib.events.domain.PropertyDomainEvent<S,T> {}
diff --git a/extensions/fixtures/pom.xml b/extensions/fixtures/pom.xml
index 63b88f8..99eac7f 100644
--- a/extensions/fixtures/pom.xml
+++ b/extensions/fixtures/pom.xml
@@ -48,6 +48,11 @@
</dependency>
<dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-spring</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-integtestsupport</artifactId>
<scope>provided</scope>
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisBootFixtures.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisBootFixtures.java
index 7be1ecb..1a4ec48 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisBootFixtures.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisBootFixtures.java
@@ -21,17 +21,19 @@ package org.apache.isis.extensions.fixtures;
import org.apache.isis.extensions.fixtures.fixturescripts.ExecutionParametersService;
import org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsDefault;
import org.apache.isis.extensions.fixtures.legacy.queryresultscache.QueryResultsCacheControlInternal;
-import org.apache.isis.extensions.fixtures.module.ModuleDependencyGraphService;
+import org.apache.isis.extensions.fixtures.module.ModuleService;
+import org.apache.isis.extensions.spring.ExtSpringModule;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({
+ ExtSpringModule.class,
FixturesLifecycleService.class,
FixtureScriptsDefault.class,
ExecutionParametersService.class,
QueryResultsCacheControlInternal.class,
- ModuleDependencyGraphService.class
+ ModuleService.class
})
public class IsisBootFixtures {
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/Module.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/Module.java
index 1e5bca2..1bb1236 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/Module.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/Module.java
@@ -1,11 +1,21 @@
package org.apache.isis.extensions.fixtures.module;
import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
/**
- * Classes annotated with {@link org.springframework.context.annotation.Configuration @Configuration}
- * can define a hierarchy by {@link org.springframework.context.annotation.Import @Import}ing other configurations.
+ * A module is a class that implements this {@link Module} interface, but in addition is expected to be annotated with
+ * {@link Configuration @Configuration} and which defines a dependency other modules by {@link Import @Import}ing them,
+ * and conversely may be a dependency of other modules if they import it.
+ *
+ * <p>
+ * Modules are therefore classes that define a module hierarchy using these Spring annotations.
+ * </p>
+ *
+ * <p>
* These are, in effect, a module hierarchy, declared using types.
+ * </p>
*
* <p>
* Optionally, the <code>@Configuration</code> class can implements this {@link Module} interface.
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleDependencyGraphService.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleDependencyGraphService.java
deleted file mode 100644
index 89d6d84..0000000
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleDependencyGraphService.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * 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.extensions.fixtures.module;
-
-import lombok.extern.log4j.Log4j2;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.context.event.ContextRefreshedEvent;
-import org.springframework.context.event.EventListener;
-import org.springframework.stereotype.Service;
-import org.springframework.util.StringUtils;
-
-@Service @Log4j2
-public class ModuleDependencyGraphService {
-
- private final ConfigurableApplicationContext context;
-
- public ModuleDependencyGraphService(ConfigurableApplicationContext context) {
- this.context = context;
- }
-
- @EventListener(ContextRefreshedEvent.class)
- public void onContextRefreshed(ContextRefreshedEvent event) {
-
- log.info("onContextRefreshed");
-
-
-// final ApplicationContext rootContext = root(event.getApplicationContext(), 0);
-
-// final String[] beanDefinitionNames = rootContext.getBeanDefinitionNames();
-//
-// final List<String> beanList = Arrays.stream(beanDefinitionNames).sorted().collect(Collectors.toList());
-// for (String beanDefinitionName : beanList) {
-// log.info(beanDefinitionName);
-// }
-
- }
-
-// private static ApplicationContext root(ApplicationContext applicationContext, int level) {
-//
-// // guard
-// if(level > 100) {
-// throw new IllegalStateException("Seem to be in an infinite loop trying to obtain the root ApplicationContext");
-// }
-//
-// if(applicationContext == null) {
-// return null;
-// }
-//
-// final ApplicationContext parent = applicationContext.getParent();
-// if(parent == null) {
-// return applicationContext;
-// }
-//
-// return root(parent, ++level);
-// }
-
-
- public ApplicationBeans beans() {
- Map<String, ContextBeans> contexts = new HashMap<>();
-
- for(ConfigurableApplicationContext context = this.context; context != null; context = getConfigurableParent(context)) {
- contexts.put(context.getId(), ContextBeans.describing(context));
- }
-
- return new ApplicationBeans(contexts);
- }
-
- private static ConfigurableApplicationContext getConfigurableParent(ConfigurableApplicationContext context) {
- ApplicationContext parent = context.getParent();
- return parent instanceof ConfigurableApplicationContext ? (ConfigurableApplicationContext)parent : null;
- }
-
- public static final class BeanDescriptor {
- private final String[] aliases;
- private final String scope;
- private final Class<?> type;
- private final String resource;
- private final String[] dependencies;
-
- private BeanDescriptor(String[] aliases, String scope, Class<?> type, String resource, String[] dependencies) {
- this.aliases = aliases;
- this.scope = StringUtils.hasText(scope) ? scope : "singleton";
- this.type = type;
- this.resource = resource;
- this.dependencies = dependencies;
- }
-
- public String[] getAliases() {
- return this.aliases;
- }
-
- public String getScope() {
- return this.scope;
- }
-
- public Class<?> getType() {
- return this.type;
- }
-
- public String getResource() {
- return this.resource;
- }
-
- public String[] getDependencies() {
- return this.dependencies;
- }
- }
-
- public static final class ContextBeans {
- private final Map<String, BeanDescriptor> beans;
- private final String parentId;
-
- private ContextBeans(Map<String, BeanDescriptor> beans, String parentId) {
- this.beans = beans;
- this.parentId = parentId;
- }
-
- public String getParentId() {
- return this.parentId;
- }
-
- public Map<String, BeanDescriptor> getBeans() {
- return this.beans;
- }
-
- private static ContextBeans describing(ConfigurableApplicationContext context) {
- if (context == null) {
- return null;
- } else {
- ConfigurableApplicationContext parent = getConfigurableParent(context);
- return new ContextBeans(describeBeans(context.getBeanFactory()), parent != null ? parent.getId() : null);
- }
- }
-
- private static Map<String, BeanDescriptor> describeBeans(ConfigurableListableBeanFactory beanFactory) {
- Map<String, BeanDescriptor> beans = new HashMap();
- String[] var2 = beanFactory.getBeanDefinitionNames();
- int var3 = var2.length;
-
- for(int var4 = 0; var4 < var3; ++var4) {
- String beanName = var2[var4];
- BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
- if (isBeanEligible(beanName, definition, beanFactory)) {
- beans.put(beanName, describeBean(beanName, definition, beanFactory));
- }
- }
-
- return beans;
- }
-
- private static BeanDescriptor describeBean(String name, BeanDefinition definition, ConfigurableListableBeanFactory factory) {
- return new BeanDescriptor(factory.getAliases(name), definition.getScope(), factory.getType(name), definition.getResourceDescription(), factory.getDependenciesForBean(name));
- }
-
- private static boolean isBeanEligible(String beanName, BeanDefinition bd, ConfigurableBeanFactory bf) {
- return bd.getRole() != 2 && (!bd.isLazyInit() || bf.containsSingleton(beanName));
- }
- }
-
- public static final class ApplicationBeans {
- private final Map<String, ContextBeans> contexts;
-
- private ApplicationBeans(Map<String, ContextBeans> contexts) {
- this.contexts = contexts;
- }
-
- public Map<String, ContextBeans> getContexts() {
- return this.contexts;
- }
- }
-
-}
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleService.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleService.java
new file mode 100644
index 0000000..4862c88
--- /dev/null
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleService.java
@@ -0,0 +1,145 @@
+/*
+ * 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.extensions.fixtures.module;
+
+import lombok.Data;
+import lombok.extern.log4j.Log4j2;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import org.apache.isis.extensions.spring.service.SpringBeansService;
+import org.apache.isis.extensions.spring.service.BeanDescriptor;
+import org.apache.isis.extensions.spring.service.ContextBeans;
+import org.apache.isis.metamodel.facets.Annotations;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
+
+@Service
+@Log4j2
+public class ModuleService {
+
+ private final SpringBeansService springBeansService;
+
+ public ModuleService(final SpringBeansService springBeansService) {
+ this.springBeansService = springBeansService;
+ }
+
+ public List<ModuleDescriptor> modules() {
+
+ final List<ModuleDescriptor> moduleDescriptors = new ArrayList<>();
+ final Map<String, ContextBeans> contexts = springBeansService.beans();
+ for (Map.Entry<String, ContextBeans> contextEntry : contexts.entrySet()) {
+ final String contextId = contextEntry.getKey();
+ final ContextBeans contextBeans = contextEntry.getValue();
+ final ConfigurableApplicationContext context = contextBeans.getContext();
+
+ final Map<String, Module> modulesByBeanName = context.getBeansOfType(Module.class);
+ final Map<String, Object> configurationBeansByBeanName = context.getBeansWithAnnotation(Configuration.class);
+ final Map<String, Object> beansAnnotatedWithImportByBeanName = context.getBeansWithAnnotation(Import.class);
+
+ for (Map.Entry<String, BeanDescriptor> beanEntry : contextBeans.getBeans().entrySet()) {
+ final String beanName = beanEntry.getKey();
+
+ final Module module = modulesByBeanName.get(beanName);
+ if(module != null) {
+
+ final Object annotatedWithConfiguration = configurationBeansByBeanName.get(beanName);
+ final Object annotatedWithImport = beansAnnotatedWithImportByBeanName.get(beanName);
+
+ final List<Module> importedModules;
+ if(annotatedWithConfiguration != null && annotatedWithImport != null) {
+
+ final Import importAnnot = Annotations.getAnnotation(annotatedWithImport.getClass(), Import.class);
+ final Class<?>[] importedClasses = importAnnot.value();
+
+ importedModules = Arrays.stream(importedClasses)
+ .map(importedClass -> context.getBeansOfType(importedClass).values())
+ .flatMap(Collection::stream)
+ .filter(Module.class::isInstance)
+ .map(Module.class::cast)
+ .collect(Collectors.toList());
+ } else {
+ importedModules = Collections.emptyList();
+ }
+
+ final Map<String, Module> importedModulesByBeanName = new LinkedHashMap<>();
+ if(annotatedWithConfiguration != null && annotatedWithImport != null) {
+
+ final Import importAnnot = Annotations.getAnnotation(annotatedWithImport.getClass(), Import.class);
+ final Class<?>[] importedClasses = importAnnot.value();
+
+ Arrays.stream(importedClasses)
+ .forEach(importedClass -> {
+ final Map<String, ?> importedBeansOfType = context.getBeansOfType(importedClass);
+ importedBeansOfType.forEach((name, entryValue) -> {
+ final Collection<?> beanCollection;
+ if (entryValue instanceof Collection) {
+ beanCollection = (Collection) entryValue;
+ } else {
+ beanCollection = Collections.singletonList(entryValue);
+ }
+ beanCollection.stream()
+ .filter(Module.class::isInstance)
+ .map(Module.class::cast)
+ .forEach(mod -> importedModulesByBeanName.put(name, mod));
+ });
+ });
+ }
+
+ final ModuleDescriptor moduleDescriptor = new ModuleDescriptor(contextId, beanName, module, importedModules, importedModulesByBeanName);
+ moduleDescriptors.add(moduleDescriptor);
+ }
+ }
+ }
+ return moduleDescriptors;
+ }
+
+ @EventListener(ContextRefreshedEvent.class)
+ public void onContextRefreshed(ContextRefreshedEvent event) {
+ log.info("onContextRefreshed");
+ final List<ModuleDescriptor> modules = modules();
+ for (final ModuleDescriptor module : modules) {
+ log.info(module);
+ }
+ }
+
+ @Data
+ public static class ModuleDescriptor {
+ private final String contextId;
+ private final String beanName;
+ private final Module module;
+ private final List<Module> moduleDependencies;
+ private final Map<String,Module> dependenciesByName;
+
+ @Override
+ public String toString() {
+ return "ModuleDescriptor{" +
+ "contextId='" + contextId + '\'' +
+ ", beanName='" + beanName + '\'' +
+ ", dependenciesByName=" + dependenciesByName.keySet() +
+ '}';
+ }
+ }
+
+}
diff --git a/extensions/pom.xml b/extensions/pom.xml
index ded45f2..61e9fd8a 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -189,6 +189,58 @@
<scope>import</scope>
</dependency>
+ <!-- extensions -->
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-asciidoc</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-fixtures</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-incubator</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-legacy</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-markdown</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-restclient</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-secman</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-specsupport</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-spring</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-sse</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+
<!-- LOMBOK -->
<dependency>
<groupId>org.projectlombok</groupId>
@@ -217,6 +269,7 @@
<modules>
<module>asciidoc</module>
<module>fixtures</module>
+ <module>spring</module>
<module>markdown</module>
<module>restclient</module>
<module>secman</module>
diff --git a/extensions/secman/pom.xml b/extensions/secman/pom.xml
index e38c546..4dd0688 100644
--- a/extensions/secman/pom.xml
+++ b/extensions/secman/pom.xml
@@ -38,6 +38,36 @@
<git-plugin.propertiesDir>org/apache/isis/extensions/secman</git-plugin.propertiesDir>
</properties>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-secman-api</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-secman-encryption-jbcrypt</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-secman-encryption-model</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-secman-encryption-persistence-jdo</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-secman-encryption-realm-shiro</artifactId>
+ <version>${isis.version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
<dependencies>
<dependency>
diff --git a/extensions/spring/_adoc/antora.yml b/extensions/spring/_adoc/antora.yml
new file mode 100644
index 0000000..8a89103
--- /dev/null
+++ b/extensions/spring/_adoc/antora.yml
@@ -0,0 +1,6 @@
+name: ext-spring
+title: "Extensions - Spring"
+version: master
+start_page: ROOT:about.adoc
+nav:
+ - modules/ROOT/nav.adoc
diff --git a/extensions/spring/_adoc/modules/ext-spring/_attributes.adoc b/extensions/spring/_adoc/modules/ext-spring/_attributes.adoc
new file mode 100644
index 0000000..43cb529
--- /dev/null
+++ b/extensions/spring/_adoc/modules/ext-spring/_attributes.adoc
@@ -0,0 +1,6 @@
+ifndef::env-site,env-github[]
+:attachmentsdir: {moduledir}/attachments
+:examplesdir: {moduledir}/examples
+:imagesdir: {moduledir}/images
+:partialsdir: {moduledir}/partials
+endif::[]
diff --git a/extensions/spring/_adoc/modules/ext-spring/attachments/.gitkeep b/extensions/spring/_adoc/modules/ext-spring/attachments/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/extensions/spring/_adoc/modules/ext-spring/examples/.gitkeep b/extensions/spring/_adoc/modules/ext-spring/examples/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/extensions/spring/_adoc/modules/ext-spring/images/.gitkeep b/extensions/spring/_adoc/modules/ext-spring/images/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/extensions/spring/_adoc/modules/ext-spring/nav.adoc b/extensions/spring/_adoc/modules/ext-spring/nav.adoc
new file mode 100644
index 0000000..f47e22a
--- /dev/null
+++ b/extensions/spring/_adoc/modules/ext-spring/nav.adoc
@@ -0,0 +1,2 @@
+include::extensions:ext-spring:partial$component-nav.adoc[]
+
diff --git a/extensions/spring/_adoc/modules/ext-spring/pages/_attributes.adoc b/extensions/spring/_adoc/modules/ext-spring/pages/_attributes.adoc
new file mode 100644
index 0000000..e8ada7c
--- /dev/null
+++ b/extensions/spring/_adoc/modules/ext-spring/pages/_attributes.adoc
@@ -0,0 +1,4 @@
+ifndef::env-site,env-github[]
+:moduledir: ..
+include::{moduledir}/_attributes.adoc[]
+endif::[]
diff --git a/extensions/spring/_adoc/modules/ext-spring/pages/about.adoc b/extensions/spring/_adoc/modules/ext-spring/pages/about.adoc
new file mode 100644
index 0000000..f035090
--- /dev/null
+++ b/extensions/spring/_adoc/modules/ext-spring/pages/about.adoc
@@ -0,0 +1,6 @@
+= Spring
+:Notice: 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 ag [...]
+include::_attributes.adoc[]
+
+TODO
+
diff --git a/extensions/spring/_adoc/modules/ext-spring/partials/_attributes.adoc b/extensions/spring/_adoc/modules/ext-spring/partials/_attributes.adoc
new file mode 100644
index 0000000..e8ada7c
--- /dev/null
+++ b/extensions/spring/_adoc/modules/ext-spring/partials/_attributes.adoc
@@ -0,0 +1,4 @@
+ifndef::env-site,env-github[]
+:moduledir: ..
+include::{moduledir}/_attributes.adoc[]
+endif::[]
diff --git a/extensions/spring/_adoc/modules/ext-spring/partials/module-nav.adoc b/extensions/spring/_adoc/modules/ext-spring/partials/module-nav.adoc
new file mode 100644
index 0000000..d5abc2f
--- /dev/null
+++ b/extensions/spring/_adoc/modules/ext-spring/partials/module-nav.adoc
@@ -0,0 +1,3 @@
+* xref:extensions:ext-spring:about.adoc[Spring (extension)]
+
+
diff --git a/extensions/fixtures/pom.xml b/extensions/spring/pom.xml
similarity index 71%
copy from extensions/fixtures/pom.xml
copy to extensions/spring/pom.xml
index 63b88f8..a12aec3 100644
--- a/extensions/fixtures/pom.xml
+++ b/extensions/spring/pom.xml
@@ -21,49 +21,23 @@
<relativePath>../pom.xml</relativePath>
</parent>
- <artifactId>isis-extensions-fixtures</artifactId>
- <name>Apache Isis Extensions - Fixtures</name>
- <description></description>
+ <artifactId>isis-extensions-spring</artifactId>
+ <name>Apache Isis Extensions - Spring</name>
+ <description>Utility services for interacting with the Spring application context</description>
<properties>
- <jar-plugin.automaticModuleName>org.apache.isis.extensions.fixtures</jar-plugin.automaticModuleName>
- <git-plugin.propertiesDir>org/apache/isis/extensions/fixtures</git-plugin.propertiesDir>
+ <jar-plugin.automaticModuleName>org.apache.isis.extensions.spring</jar-plugin.automaticModuleName>
+ <git-plugin.propertiesDir>org/apache/isis/extensions/spring</git-plugin.propertiesDir>
</properties>
<dependencies>
- <!-- JDO API (non transient, provided by plugin) -->
- <dependency>
- <groupId>javax.jdo</groupId>
- <artifactId>jdo-api</artifactId>
- <version>${jdo-api.version}</version>
- <!-- provided by plugins -->
- <scope>provided</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-plugins-jdo-common</artifactId>
- <scope>provided</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-integtestsupport</artifactId>
- <scope>provided</scope>
- </dependency>
-
<dependency>
<groupId>org.apache.isis.core</groupId>
<artifactId>isis-runtime</artifactId>
<scope>provided</scope>
</dependency>
- <dependency>
- <groupId>joda-time</groupId>
- <artifactId>joda-time</artifactId>
- </dependency>
-
</dependencies>
<profiles>
diff --git a/examples/apps/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java b/extensions/spring/src/main/java/org/apache/isis/extensions/spring/ExtSpringModule.java
similarity index 77%
copy from examples/apps/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java
copy to extensions/spring/src/main/java/org/apache/isis/extensions/spring/ExtSpringModule.java
index 6787524..279232c 100644
--- a/examples/apps/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java
+++ b/extensions/spring/src/main/java/org/apache/isis/extensions/spring/ExtSpringModule.java
@@ -16,16 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-package domainapp.application;
-
-import javax.xml.bind.annotation.XmlRootElement;
+package org.apache.isis.extensions.spring;
+import org.apache.isis.extensions.spring.service.SpringBeansService;
+import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
-import domainapp.modules.simple.SimpleModule;
-
-@XmlRootElement(name = "module")
-@Import(SimpleModule.class)
-public class DomainAppApplicationModule {
+@Configuration
+@Import({
+ SpringBeansService.class
+})
+public class ExtSpringModule {
}
diff --git a/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/BeanDescriptor.java b/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/BeanDescriptor.java
new file mode 100644
index 0000000..e991802
--- /dev/null
+++ b/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/BeanDescriptor.java
@@ -0,0 +1,67 @@
+package org.apache.isis.extensions.spring.service;
+
+import lombok.Getter;
+import lombok.ToString;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.util.StringUtils;
+
+@Getter
+@ToString
+public final class BeanDescriptor {
+
+ private final String beanName;
+ private final List<String> aliases;
+ private final Object bean;
+ private final String scope;
+ private final Class<?> type;
+ private final String resource;
+ private final Map<String, Object> dependenciesByName;
+
+ BeanDescriptor(
+ final String beanName,
+ final ConfigurableApplicationContext context) {
+ final ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
+
+ this.beanName = beanName;
+
+ final BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
+
+ this.aliases = Collections.unmodifiableList(Arrays.asList(beanFactory.getAliases(beanName)));
+ this.bean = beanFactory.getBean(beanName);
+
+ final String scope = definition.getScope();
+ this.scope = StringUtils.hasText(scope) ? scope : "singleton";
+
+ this.type = beanFactory.getType(beanName);
+ this.resource = definition.getResourceDescription();
+
+ this.dependenciesByName = Arrays.stream(beanFactory.getDependenciesForBean(beanName))
+ .filter(name -> {
+ try {
+ return beanFactory.getBean(name) != null;
+ } catch(NoSuchBeanDefinitionException ex) {
+ return false;
+ }
+ })
+ .collect(Collectors.toMap(Function.identity(), beanFactory::getBean));
+ }
+
+ <T> List<T> dependencies(Class<T> cls) {
+ return dependenciesByName.values().stream()
+ .filter(cls::isInstance)
+ .map(cls::cast)
+ .collect(Collectors.toList());
+ }
+
+}
diff --git a/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/ContextBeans.java b/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/ContextBeans.java
new file mode 100644
index 0000000..428b603
--- /dev/null
+++ b/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/ContextBeans.java
@@ -0,0 +1,49 @@
+package org.apache.isis.extensions.spring.service;
+
+import lombok.Data;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ConfigurableApplicationContext;
+
+@Data
+public final class ContextBeans {
+
+ private final Map<String, BeanDescriptor> beans;
+ private final String parentId;
+ private final ConfigurableApplicationContext context;
+
+ static ContextBeans describing(final ConfigurableApplicationContext context) {
+ if (context == null) {
+ return null;
+ }
+
+ final ConfigurableApplicationContext parent = SpringBeansService.Util.getConfigurableParent(context);
+ final Map<String, BeanDescriptor> beans = describeBeans(context);
+ final String parentId = parent != null ? parent.getId() : null;
+ return new ContextBeans(beans, parentId, context);
+ }
+
+ private static Map<String, BeanDescriptor> describeBeans(final ConfigurableApplicationContext context) {
+
+ final ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
+
+ final Map<String, BeanDescriptor> beans = Arrays.stream(beanFactory.getBeanDefinitionNames())
+ .filter(beanName -> isBeanEligible(beanName, beanFactory))
+ .collect(Collectors.toMap(Function.identity(), beanName -> new BeanDescriptor(beanName, context)));
+ return Collections.unmodifiableMap(beans);
+ }
+
+ private static boolean isBeanEligible(
+ final String beanName,
+ final ConfigurableListableBeanFactory bf) {
+ final BeanDefinition bd = bf.getBeanDefinition(beanName);
+ return bd.getRole() != BeanDefinition.ROLE_INFRASTRUCTURE && (!bd.isLazyInit() || bf.containsSingleton(beanName));
+ }
+}
diff --git a/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java b/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
new file mode 100644
index 0000000..284cf16
--- /dev/null
+++ b/extensions/spring/src/main/java/org/apache/isis/extensions/spring/service/SpringBeansService.java
@@ -0,0 +1,62 @@
+/*
+ * 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.extensions.spring.service;
+
+import lombok.experimental.UtilityClass;
+import lombok.extern.log4j.Log4j2;
+
+import java.util.*;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.stereotype.Service;
+
+/**
+ * Borrowed from BeansEndpoint.
+ */
+@Service
+@Log4j2
+public class SpringBeansService {
+
+ private final ConfigurableApplicationContext context;
+
+ public SpringBeansService(final ConfigurableApplicationContext context) {
+ this.context = context;
+ }
+
+ public Map<String, ContextBeans> beans() {
+ Map<String, ContextBeans> contexts = new HashMap<>();
+
+ for(ConfigurableApplicationContext context = this.context; context != null; context = Util.getConfigurableParent(context)) {
+ contexts.put(context.getId(), ContextBeans.describing(context));
+ }
+
+ return contexts;
+ }
+
+ @UtilityClass
+ static
+ class Util {
+
+ static ConfigurableApplicationContext getConfigurableParent(final ConfigurableApplicationContext context) {
+ ApplicationContext parent = context.getParent();
+ return parent instanceof ConfigurableApplicationContext ? (ConfigurableApplicationContext)parent : null;
+ }
+ }
+}
[isis] 04/05: ISIS-2174: simplifies ModuleService
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 5b9720c2bd4fb1e9e51f125ef11bf610b3fb5295
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Nov 9 12:30:12 2019 +0000
ISIS-2174: simplifies ModuleService
... return module dependencies in a map, not a list.
---
.../extensions/fixtures/module/ModuleService.java | 19 +------------------
1 file changed, 1 insertion(+), 18 deletions(-)
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleService.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleService.java
index 4862c88..52e42cf 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleService.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/ModuleService.java
@@ -67,22 +67,6 @@ public class ModuleService {
final Object annotatedWithConfiguration = configurationBeansByBeanName.get(beanName);
final Object annotatedWithImport = beansAnnotatedWithImportByBeanName.get(beanName);
- final List<Module> importedModules;
- if(annotatedWithConfiguration != null && annotatedWithImport != null) {
-
- final Import importAnnot = Annotations.getAnnotation(annotatedWithImport.getClass(), Import.class);
- final Class<?>[] importedClasses = importAnnot.value();
-
- importedModules = Arrays.stream(importedClasses)
- .map(importedClass -> context.getBeansOfType(importedClass).values())
- .flatMap(Collection::stream)
- .filter(Module.class::isInstance)
- .map(Module.class::cast)
- .collect(Collectors.toList());
- } else {
- importedModules = Collections.emptyList();
- }
-
final Map<String, Module> importedModulesByBeanName = new LinkedHashMap<>();
if(annotatedWithConfiguration != null && annotatedWithImport != null) {
@@ -107,7 +91,7 @@ public class ModuleService {
});
}
- final ModuleDescriptor moduleDescriptor = new ModuleDescriptor(contextId, beanName, module, importedModules, importedModulesByBeanName);
+ final ModuleDescriptor moduleDescriptor = new ModuleDescriptor(contextId, beanName, module, importedModulesByBeanName);
moduleDescriptors.add(moduleDescriptor);
}
}
@@ -129,7 +113,6 @@ public class ModuleService {
private final String contextId;
private final String beanName;
private final Module module;
- private final List<Module> moduleDependencies;
private final Map<String,Module> dependenciesByName;
@Override
[isis] 01/05: ISIS-2174: adds Module interface
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit ffa117bd58effdadc2f5595f1ba6163735fed15f
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Nov 8 17:31:39 2019 +0000
ISIS-2174: adds Module interface
---
.../fixtures/fixturescripts/FixtureScript.java | 6 +++
.../isis/extensions/fixtures/module/Module.java | 55 ++++++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScript.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScript.java
index da6f60f..234117a 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScript.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScript.java
@@ -63,6 +63,12 @@ import org.apache.isis.runtime.system.context.IsisContext;
public abstract class FixtureScript
extends AbstractViewModel {
+ public static final FixtureScript NOOP = new FixtureScript() {
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+ }
+ };
+
protected static final String PATH_SEPARATOR = "/";
// -- constructors
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/Module.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/Module.java
new file mode 100644
index 0000000..1e5bca2
--- /dev/null
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/module/Module.java
@@ -0,0 +1,55 @@
+package org.apache.isis.extensions.fixtures.module;
+
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+
+/**
+ * Classes annotated with {@link org.springframework.context.annotation.Configuration @Configuration}
+ * can define a hierarchy by {@link org.springframework.context.annotation.Import @Import}ing other configurations.
+ * These are, in effect, a module hierarchy, declared using types.
+ *
+ * <p>
+ * Optionally, the <code>@Configuration</code> class can implements this {@link Module} interface.
+ * Doing so allows it to declare setup and teardown fixtures, eg to set up permanent ref data or to teardown
+ * test entities within the module.
+ * </p>
+ * <p>
+ * These setup/teardown fixtures will be called in the correct order as per the transitive dependency graph
+ * inferred from the <code>@Configuration</code> imports.
+ * </p>
+ */
+public interface Module {
+
+ /**
+ * Optionally each module can define a {@link FixtureScript} which holds immutable "reference data".
+ *
+ * <p>
+ * These are automatically executed whenever running integration tests (but are ignored when bootstrapping the
+ * runtime as a webapp).
+ * </p>
+ *
+ * <p>
+ * By default, returns a {@link FixtureScript#NOOP noop}.
+ * </p>
+ */
+ default FixtureScript getRefDataSetupFixture() {
+ return FixtureScript.NOOP;
+ }
+
+ /**
+ * Optionally each module can define a tear-down {@link FixtureScript}, used to remove the contents of <i>all</i>
+ * entities (both reference data and operational/transactional data).
+ *
+ * <p>
+ * These are automatically executed whenever running integration tests (but are ignored when bootstrapping the
+ * runtime as a webapp).
+ * </p>
+ *
+ * <p>
+ * By default, returns a {@link FixtureScript#NOOP noop}.
+ * </p>
+ */
+ default FixtureScript getTeardownFixture() {
+ return FixtureScript.NOOP;
+ }
+
+}
[isis] 05/05: Merge branch 'ISIS-2174'
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 0276d56b767e0d42332d38cc3f3cd38f15a79322
Merge: d3e8193 5b9720c
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Nov 9 12:31:23 2019 +0000
Merge branch 'ISIS-2174'
.../application/DomainAppApplicationModule.java | 8 +-
.../domainapp/conf/SimpleAppConfiguration.java | 17 +--
.../domainapp/modules/simple/SimpleModule.java | 32 ++++--
extensions/fixtures/pom.xml | 5 +
.../isis/extensions/fixtures/IsisBootFixtures.java | 11 +-
.../fixtures/fixturescripts/FixtureScript.java | 6 +
.../isis/extensions/fixtures/module/Module.java | 65 +++++++++++
.../extensions/fixtures/module/ModuleService.java | 128 +++++++++++++++++++++
extensions/pom.xml | 53 +++++++++
extensions/secman/pom.xml | 30 +++++
extensions/spring/_adoc/antora.yml | 6 +
.../_adoc/modules/ext-spring/_attributes.adoc | 6 +
.../_adoc/modules/ext-spring/attachments/.gitkeep | 0
.../_adoc/modules/ext-spring/examples/.gitkeep | 0
.../_adoc/modules/ext-spring/images/.gitkeep | 0
.../spring/_adoc/modules/ext-spring/nav.adoc | 2 +
.../modules/ext-spring/pages/_attributes.adoc | 4 +
.../_adoc/modules/ext-spring/pages/about.adoc | 6 +
.../modules/ext-spring/partials/_attributes.adoc | 4 +
.../modules/ext-spring/partials/module-nav.adoc | 3 +
extensions/{fixtures => spring}/pom.xml | 36 +-----
.../isis/extensions/spring/ExtSpringModule.java | 16 +--
.../extensions/spring/service/BeanDescriptor.java | 67 +++++++++++
.../extensions/spring/service/ContextBeans.java | 49 ++++++++
.../spring/service/SpringBeansService.java | 62 ++++++++++
25 files changed, 552 insertions(+), 64 deletions(-)