You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/11/24 16:53:01 UTC
[isis] 01/02: ISIS-2039: experimenting with AppConfig managed by
Guice
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch 2039-Redesign_of_Config
in repository https://gitbox.apache.org/repos/asf/isis.git
commit ccafeb8b7032343a58c112e7750fe5986d37ff56
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Nov 23 21:09:12 2018 +0100
ISIS-2039: experimenting with AppConfig managed by Guice
Task-Url: https://issues.apache.org/jira/browse/ISIS-2039
---
.../java/org/apache/isis/applib/AppManifest.java | 33 ++++++
.../config/internal/_Config_LifecycleResource.java | 4 +-
.../shiro/ShiroAuthenticatorOrAuthorizor.java | 5 +-
.../apache/isis/core/runtime/startup-objects.ucls | 111 ---------------------
.../viewer/integration/isis/IsisInjectModule.java | 77 ++++++--------
...ldAppManifest.java => HelloWorldAppConfig.java} | 31 ++++--
.../application/HelloWorldAppManifest.java | 3 +
.../application/isis-non-changing.properties | 12 ---
8 files changed, 96 insertions(+), 180 deletions(-)
diff --git a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
index b834758..9bc437e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
@@ -256,6 +256,39 @@ public interface AppManifest {
//endregion
}
+
+ // -- NOOP
+
+ static final AppManifest NOOP = new AppManifest() {
+ @Override public List<Class<?>> getModules() {
+ return null;
+ }
+ @Override public List<Class<?>> getAdditionalServices() {
+ return null;
+ }
+
+ @Override public String getAuthenticationMechanism() {
+ return null;
+ }
+
+ @Override public String getAuthorizationMechanism() {
+ return null;
+ }
+
+ @Override public List<Class<? extends FixtureScript>> getFixtures() {
+ return null;
+ }
+
+ @Override public Map<String, String> getConfigurationProperties() {
+ return null;
+ }
+ };
+
+ public static AppManifest noop() {
+ return NOOP;
+ }
+
+ // -- UTIL
public static class Util {
diff --git a/core/config/src/main/java/org/apache/isis/config/internal/_Config_LifecycleResource.java b/core/config/src/main/java/org/apache/isis/config/internal/_Config_LifecycleResource.java
index ce6543a..1aeeca0 100644
--- a/core/config/src/main/java/org/apache/isis/config/internal/_Config_LifecycleResource.java
+++ b/core/config/src/main/java/org/apache/isis/config/internal/_Config_LifecycleResource.java
@@ -54,11 +54,13 @@ class _Config_LifecycleResource {
// causal information, in case the builder is accessed after it already
// built the configuration
try {
- throw new IllegalStateException("Configuration Build Event");
+ throw new IllegalStateException("IsisConfiguration Build (previously already triggered by ...)");
} catch(IllegalStateException e) {
this.configurationBuildStacktrace = e;
}
+ System.err.println("!!!!!!! IsisConfiguration BUILT");
+
return builder.build();
}
diff --git a/core/plugins/security-shiro/src/main/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizor.java b/core/plugins/security-shiro/src/main/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizor.java
index 5df10b2..c07d344 100644
--- a/core/plugins/security-shiro/src/main/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizor.java
+++ b/core/plugins/security-shiro/src/main/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizor.java
@@ -45,7 +45,6 @@ import org.slf4j.LoggerFactory;
import org.apache.isis.applib.Identifier;
import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.config.internal._Config;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.runtime.authentication.AuthenticationManagerInstaller;
import org.apache.isis.core.runtime.authentication.AuthenticationRequest;
@@ -56,6 +55,8 @@ import org.apache.isis.core.runtime.authorization.AuthorizationManagerInstaller;
import org.apache.isis.core.runtime.authorization.standard.Authorizor;
import org.apache.isis.security.shiro.authorization.IsisPermission;
+import static org.apache.isis.config.internal._Config.getConfiguration;
+
/**
* If Shiro is configured for both {@link AuthenticationManagerInstaller authentication} and
* {@link AuthorizationManagerInstaller authorization} (as recommended), then this class is
@@ -76,7 +77,7 @@ public class ShiroAuthenticatorOrAuthorizor implements Authenticator, Authorizor
private final boolean autoLogout;
public ShiroAuthenticatorOrAuthorizor() {
- autoLogout = _Config.getConfiguration().getBoolean(
+ autoLogout = getConfiguration().getBoolean(
ISIS_AUTHENTICATION_SHIRO_AUTO_LOGOUT_KEY,
ISIS_AUTHENTICATION_SHIRO_AUTO_LOGOUT_DEFAULT);
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/startup-objects.ucls b/core/runtime/src/main/java/org/apache/isis/core/runtime/startup-objects.ucls
deleted file mode 100644
index 7af5a5f..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/startup-objects.ucls
+++ /dev/null
@@ -1,111 +0,0 @@
-<class-diagram version="0.9.86" icons="true" always-add-relationships="false" generalizations="true" realizations="true"
- associations="true" dependencies="false" nesting-relationships="true">
- <class corner="BOTTOM_RIGHT" language="java" name="org.apache.isis.core.runtime.Isis" project="runtime"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/Isis.java" binary="false">
- <position x="438" y="251" width="-1" height="-1"/>
- <display autosize="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="false" package="false" protected="false" private="false"/>
- <operations public="false" package="false" protected="false" private="false"/>
- </display>
- </class>
- <class corner="BOTTOM_RIGHT" language="java" name="org.apache.isis.core.runtime.IsisAbstract" project="runtime"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/IsisAbstract.java" binary="false">
- <position x="442" y="154" width="-1" height="-1"/>
- <display autosize="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="false" package="false" protected="false" private="false"/>
- <operations public="false" package="false" protected="false" private="false"/>
- </display>
- </class>
- <class corner="BOTTOM_RIGHT" language="java" name="org.apache.isis.core.runtime.logging.IsisLoggingConfigurer"
- project="runtime" file="/runtime/src/main/java/org/apache/isis/core/runtime/logging/IsisLoggingConfigurer.java"
- binary="false">
- <position x="712" y="152" width="-1" height="-1"/>
- <display autosize="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="false" package="false" protected="false" private="false"/>
- <operations public="false" package="false" protected="false" private="false"/>
- </display>
- </class>
- <interface corner="BOTTOM_RIGHT" language="java" name="org.apache.isis.core.runtime.installers.InstallerLookup"
- project="runtime" file="/runtime/src/main/java/org/apache/isis/core/runtime/installers/InstallerLookup.java"
- binary="false">
- <position x="196" y="154" width="-1" height="-1"/>
- <display autosize="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="false" package="false" protected="false" private="false"/>
- <operations public="false" package="false" protected="false" private="false"/>
- </display>
- </interface>
- <class corner="BOTTOM_RIGHT" language="java" name="org.apache.isis.core.runtime.installers.InstallerLookupDefault"
- project="runtime" file="/runtime/src/main/java/org/apache/isis/core/runtime/installers/InstallerLookupDefault.java"
- binary="false">
- <position x="196" y="272" width="-1" height="-1"/>
- <display autosize="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="false" package="false" protected="false" private="false"/>
- <operations public="false" package="false" protected="false" private="false"/>
- </display>
- </class>
- <interface corner="BOTTOM_RIGHT" language="java" name="org.apache.isis.metamodel.commons.component.Installer"
- project="metamodel" file="/metamodel/src/main/java/org/apache/isis/metamodel/commons/component/Installer.java"
- binary="false">
- <position x="-41" y="340" width="-1" height="-1"/>
- <display autosize="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="false" package="false" protected="false" private="false"/>
- <operations public="false" package="false" protected="false" private="false"/>
- </display>
- </interface>
- <interface corner="BOTTOM_RIGHT" language="java" name="org.apache.isis.metamodel.config.ConfigurationBuilder"
- project="metamodel" file="/metamodel/src/main/java/org/apache/isis/metamodel/config/ConfigurationBuilder.java"
- binary="false">
- <position x="-21" y="248" width="-1" height="-1"/>
- <display autosize="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="false" package="false" protected="false" private="false"/>
- <operations public="false" package="false" protected="false" private="false"/>
- </display>
- </interface>
- <association>
- <source project="runtime" name="org.apache.isis.core.runtime.installers.InstallerLookupDefault"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/installers/InstallerLookupDefault.java" binary="false"
- navigable="false">
- <attribute name="installerList"/>
- <multiplicity minimum="0" maximum="2147483647"/>
- </source>
- <target project="metamodel" name="org.apache.isis.metamodel.commons.component.Installer"
- file="/metamodel/src/main/java/org/apache/isis/metamodel/commons/component/Installer.java" binary="false"
- navigable="true"/>
- <display labels="true" multiplicity="true"/>
- </association>
- <realization>
- <source project="runtime" name="org.apache.isis.core.runtime.installers.InstallerLookupDefault"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/installers/InstallerLookupDefault.java" binary="false"/>
- <target project="runtime" name="org.apache.isis.core.runtime.installers.InstallerLookup"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/installers/InstallerLookup.java" binary="false"/>
- </realization>
- <association>
- <source project="runtime" name="org.apache.isis.core.runtime.installers.InstallerLookupDefault"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/installers/InstallerLookupDefault.java" binary="false"
- navigable="false">
- <attribute name="configurationBuilder"/>
- <multiplicity minimum="0" maximum="1"/>
- </source>
- <target project="metamodel" name="org.apache.isis.metamodel.config.ConfigurationBuilder"
- file="/metamodel/src/main/java/org/apache/isis/metamodel/config/ConfigurationBuilder.java" binary="false"
- navigable="true"/>
- <display labels="true" multiplicity="true"/>
- </association>
- <generalization>
- <source project="runtime" name="org.apache.isis.core.runtime.Isis"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/Isis.java" binary="false"/>
- <target project="runtime" name="org.apache.isis.core.runtime.IsisAbstract"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/IsisAbstract.java" binary="false"/>
- </generalization>
- <dependency>
- <source project="runtime" name="org.apache.isis.core.runtime.IsisAbstract"
- file="/runtime/src/main/java/org/apache/isis/core/runtime/IsisAbstract.java" binary="false"/>
- <target project="runtime" name="org.apache.isis.core.runtime.installers.InstallerLookup"
- file="/runtime/src/main/java/org/apache/isis/runtime/installers/InstallerLookup.java" binary="false"/>
- </dependency>
- <classifier-display autosize="true" package="true" initial-value="false" signature="true" visibility="true">
- <attributes public="false" package="false" protected="false" private="false"/>
- <operations public="false" package="false" protected="false" private="false"/>
- </classifier-display>
- <association-display labels="true" multiplicity="true"/>
-</class-diagram>
\ No newline at end of file
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/IsisInjectModule.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/IsisInjectModule.java
index 7026c11..c1e3b79 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/IsisInjectModule.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/IsisInjectModule.java
@@ -28,6 +28,7 @@ import com.google.inject.Singleton;
import org.apache.isis.applib.AppManifest;
import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.commons.internal.base._With;
import org.apache.isis.config.internal._Config;
import org.apache.isis.core.commons.factory.InstanceUtil;
import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -36,6 +37,8 @@ import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProvider;
+import static org.apache.isis.commons.internal.base._With.computeIfAbsent;
+
public class IsisInjectModule extends AbstractModule {
/**
@@ -46,30 +49,7 @@ public class IsisInjectModule extends AbstractModule {
* {@link #provideIsisSessionFactory(AppManifest)} created} .
* </p>
*/
- private static final AppManifest APP_MANIFEST_NOOP = new AppManifest() {
- @Override public List<Class<?>> getModules() {
- return null;
- }
- @Override public List<Class<?>> getAdditionalServices() {
- return null;
- }
-
- @Override public String getAuthenticationMechanism() {
- return null;
- }
-
- @Override public String getAuthorizationMechanism() {
- return null;
- }
-
- @Override public List<Class<? extends FixtureScript>> getFixtures() {
- return null;
- }
-
- @Override public Map<String, String> getConfigurationProperties() {
- return null;
- }
- };
+ private static final AppManifest APP_MANIFEST_NOOP = AppManifest.noop();
/**
* Allows the {@link AppManifest} to be programmatically bound in.
@@ -87,21 +67,32 @@ public class IsisInjectModule extends AbstractModule {
@Provides
@com.google.inject.Inject
@Singleton
- protected IsisSessionFactory provideIsisSessionFactory(
- final AppManifest appManifestIfExplicitlyBound) {
+ protected IsisSessionFactory provideIsisSessionFactory(final AppManifest boundAppManifest) {
+
+ System.err.println("!!!!!!!!!! provideIsisSessionFactory STAGE 1 "+Thread.currentThread().getName());
- final AppManifest appManifestToUse = determineAppManifest(appManifestIfExplicitlyBound);
+ final AppManifest appManifestToUse = determineAppManifest(boundAppManifest);
+ System.err.println("!!!!!!!!!! provideIsisSessionFactory STAGE 2 "+Thread.currentThread().getName());
+
final IsisComponentProvider componentProvider = IsisComponentProvider
.builderUsingInstallers(appManifestToUse)
.build();
+
+ System.err.println("!!!!!!!!!! provideIsisSessionFactory STAGE 3 "+Thread.currentThread().getName());
final IsisSessionFactoryBuilder builder =
new IsisSessionFactoryBuilder(componentProvider, componentProvider.getAppManifest());
+
+ System.err.println("!!!!!!!!!! provideIsisSessionFactory STAGE 4 "+Thread.currentThread().getName());
// as a side-effect, if the metamodel turns out to be invalid, then
// this will push the MetaModelInvalidException into IsisContext.
- return builder.buildSessionFactory();
+ IsisSessionFactory sessionFactory = builder.buildSessionFactory();
+
+ System.err.println("!!!!!!!!!! ............. provideIsisSessionFactory DONE "+Thread.currentThread().getName());
+
+ return sessionFactory;
}
@Provides
@@ -111,28 +102,26 @@ public class IsisInjectModule extends AbstractModule {
return isisSessionFactory.getServicesInjector();
}
-
- private AppManifest determineAppManifest(final AppManifest appManifestIfExplicitlyBound) {
+ // -- HELPER
+
+ /**
+ * If an {@link AppManifest} was explicitly provided (eg from the Guice <tt>IsisWicketModule</tt> when running
+ * unde the Wicket viewer) then use that; otherwise read the <tt>isis.properties</tt> config file and look
+ * for an <tt>isis.appManifest</tt> entry instead.
+ */
+ private AppManifest determineAppManifest(final AppManifest boundAppManifest) {
final AppManifest appManifest =
- appManifestIfExplicitlyBound != APP_MANIFEST_NOOP
- ? appManifestIfExplicitlyBound
+ boundAppManifest != APP_MANIFEST_NOOP
+ ? boundAppManifest
: null;
- return appManifestFrom(appManifest);
+ return computeIfAbsent(appManifest, IsisInjectModule::getAppManifestFromConfig);
}
+ private static AppManifest getAppManifestFromConfig() {
- /**
- * If an {@link AppManifest} was explicitly provided (eg from the Guice <tt>IsisWicketModule</tt> when running
- * unde the Wicket viewer) then use that; otherwise read the <tt>isis.properties</tt> config file and look
- * for an <tt>isis.appManifest</tt> entry instead.
- */
- private static AppManifest appManifestFrom(
- final AppManifest appManifestFromConstructor) {
- if(appManifestFromConstructor != null) {
- return appManifestFromConstructor;
- }
- final String appManifestFromConfiguration = _Config.getConfiguration().getString(SystemConstants.APP_MANIFEST_KEY);
+ System.err.println("WARNING: accessing Configuration prior to it being built"); //TODO[2039] ... use logger
+ final String appManifestFromConfiguration = _Config.peekAtString(SystemConstants.APP_MANIFEST_KEY);
return appManifestFromConfiguration != null
? InstanceUtil.createInstance(appManifestFromConfiguration, AppManifest.class)
: null;
diff --git a/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java b/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppConfig.java
similarity index 52%
copy from example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
copy to example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppConfig.java
index 1e5baa9..4f00a90 100644
--- a/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
+++ b/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppConfig.java
@@ -18,22 +18,33 @@
*/
package domainapp.application;
-import org.apache.isis.applib.AppManifestAbstract2;
+import javax.enterprise.inject.Produces;
-import domainapp.dom.HelloWorldModule;
+import org.apache.isis.applib.Module;
+import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.commons.config.IsisConfiguration;
/**
* Bootstrap the application.
*/
-public class HelloWorldAppManifest extends AppManifestAbstract2 {
+public class HelloWorldAppConfig { // <<< managed and discovered by IoC container
- public static final Builder BUILDER = Builder
- .forModule(new HelloWorldModule())
- .withConfigurationPropertiesFile(HelloWorldAppManifest.class, "isis-non-changing.properties")
- .withAuthMechanism("shiro");
-
- public HelloWorldAppManifest() {
- super(BUILDER);
+ @Produces
+ public IsisConfiguration isisConfiguration () {
+
+ // code contributed by user ...
+
+ //ResourceStreamSource resourceStreamSource = ResourceStreamSourceCurrentClassClassPath
+ //_Config.acceptBuilder(builder->builder.addResourceStreamSource(resourceStreamSource));
+ return _Config.getConfiguration();
+ //. FromConfig("isis.properties");
}
+
+ @Produces
+ public Module appModule() {
+ // code contributed by user ...
+ return new HelloWorldAppManifest().getModule();
+ }
}
+
diff --git a/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java b/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
index 1e5baa9..e18f930 100644
--- a/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
+++ b/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
@@ -19,6 +19,7 @@
package domainapp.application;
import org.apache.isis.applib.AppManifestAbstract2;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
import domainapp.dom.HelloWorldModule;
@@ -34,6 +35,8 @@ public class HelloWorldAppManifest extends AppManifestAbstract2 {
public HelloWorldAppManifest() {
super(BUILDER);
+ System.err.println("!!!!!!! HelloWorldAppManifest");
+ _Exceptions.dumpStackTrace(System.err, 0, 1000);
}
}
diff --git a/example/application/helloworld/src/main/java/domainapp/application/isis-non-changing.properties b/example/application/helloworld/src/main/java/domainapp/application/isis-non-changing.properties
index a4a9792..3aa8dd8 100644
--- a/example/application/helloworld/src/main/java/domainapp/application/isis-non-changing.properties
+++ b/example/application/helloworld/src/main/java/domainapp/application/isis-non-changing.properties
@@ -46,18 +46,6 @@ isis.reflector.explicitAnnotations.action=true
isis.objects.editing=false
-
-bind(String.class).annotatedWith(Names.named("applicationName")).toInstance("Hello World App");
-bind(String.class).annotatedWith(Names.named("applicationCss")).toInstance("css/application.css");
-bind(String.class).annotatedWith(Names.named("applicationJs")).toInstance("scripts/application.js");
-bind(String.class).annotatedWith(Names.named("welcomeMessage")).toInstance(readLines(getClass(), "welcome.html",
-"This is the hello world app"));
-bind(String.class).annotatedWith(Names.named("aboutMessage")).toInstance("Hello World App");
-bind(InputStream.class).annotatedWith(Names.named("metaInfManifest")).toProvider(
-Providers.of(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF")));
-
-
-
isis.viewer.wicket.application.name=Hello World App
isis.viewer.wicket.application.css=css/application.css
isis.viewer.wicket.application.js=scripts/application.js