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