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/23 08:40:23 UTC
[isis] 04/07: ISIS-2039: cleaning up the component-provider mess
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 0f5b9855726283faef2826c2686e65ead4db3d33
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Nov 23 00:29:20 2018 +0100
ISIS-2039: cleaning up the component-provider mess
for web-modules: no longer negotiate by writing attributes to the
servlet-context, instead use a java class for that
Task-Url: https://issues.apache.org/jira/browse/ISIS-2039
---
.../org/apache/isis/config/internal/_Config.java | 2 +-
.../configbuilder/IsisConfigurationBuilder.java | 301 ++-------------------
...r.java => IsisConfigurationBuilderDefault.java} | 33 ++-
...ConfigurationBuilder_PeekConfigurationTest.java | 2 +-
...PrimerForEnvironmentVariableISIS_OPTS_Test.java | 2 +-
.../services/ServicesInjectorBuilder.java | 14 -
.../action/ActionAnnotationFacetFactoryTest.java | 2 +
.../DomainObjectAnnotationFacetFactoryTest.java | 3 +-
.../PropertyAnnotationFacetFactoryTest.java | 5 +-
.../headless/IsisComponentProviderDefault.java | 35 ---
.../isis/core/runtime/headless/IsisSystem.java | 14 +-
.../runtime/system/session/IsisSessionFactory.java | 6 +-
.../system/session/IsisSessionFactoryBuilder.java | 7 +-
.../IsisComponentProvider.java | 64 +++--
.../IsisComponentProviderBuilder.java | 78 ++++++
.../IsisComponentProviderDefault2.java | 84 ------
.../IsisComponentProviderUsingInstallers.java | 10 +-
.../isis/core/webapp/IsisWebAppBootstrapper.java | 8 +-
.../isis/core/webapp/IsisWebAppConfigHelper.java | 90 ++++++
.../isis/core/webapp/IsisWebAppConfigProvider.java | 162 -----------
.../core/webapp/IsisWebAppContextListener.java | 21 +-
.../apache/isis/core/webapp/modules/WebModule.java | 99 +------
.../isis/core/webapp/modules/WebModuleContext.java | 111 ++++++++
.../modules/WebModule_FallbackBootstrapper.java | 5 +-
.../modules/WebModule_LogOnExceptionLogger.java | 26 +-
.../core/webapp/modules/WebModule_RestEasy.java | 15 +-
.../isis/core/webapp/modules/WebModule_Shiro.java | 10 +-
.../webapp/modules/WebModule_StaticResources.java | 4 +-
.../isis/core/webapp/modules/WebModule_Wicket.java | 24 +-
.../wicket/viewer/IsisWicketApplication.java | 25 +-
.../org/apache/isis/core/webserver/WebServer.java | 6 +-
.../webserver/config/WebServerConfigBuilder.java | 24 +-
32 files changed, 484 insertions(+), 808 deletions(-)
diff --git a/core/config/src/main/java/org/apache/isis/config/internal/_Config.java b/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
index d496998..f2872c8 100644
--- a/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
+++ b/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
@@ -102,7 +102,7 @@ public class _Config {
}
private static IsisConfigurationBuilder createBuilder() {
- final IsisConfigurationBuilder builder = new IsisConfigurationBuilder();
+ final IsisConfigurationBuilder builder = IsisConfigurationBuilder.empty();
return builder;
}
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
index 5fe0762..be0f5b1 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
@@ -16,156 +16,21 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.isis.core.commons.configbuilder;
-import java.io.IOException;
-import java.util.Arrays;
import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.core.commons.config.ConfigurationConstants;
import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.config.IsisConfiguration.ContainsPolicy;
import org.apache.isis.core.commons.config.NotFoundPolicy;
-import org.apache.isis.core.commons.exceptions.IsisException;
import org.apache.isis.core.commons.resource.ResourceStreamSource;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsibility;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
-
-/**
- * Holds a mutable set of properties representing the configuration.
- *
- * This implementation loads the specified
- * configuration resource (file) from the given {@link ResourceStreamSource}(s).
- *
- * <p>
- * If a property is in multiple configuration resources then the latter
- * resources will overwrite the former.
- *
- * <p>
- * Mutable/immutable pair with the {@link IsisConfiguration}. To obtain the
- * configuration, use {@link #getConfiguration()}.
- *
- * @see {@link IsisConfiguration} for more details on the mutable/immutable pair pattern.
- *
- */
-public final class IsisConfigurationBuilder {
-
- private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilder.class);
-
- // -- constructor, fields
-
- private final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain;
-
- private IsisConfigurationDefault configuration;
-
- private final Set<String> configurationResourcesFound = _Sets.newLinkedHashSet();
- private final Set<String> configurationResourcesNotFound = _Sets.newLinkedHashSet();
-
- public IsisConfigurationBuilder() {
- this(ResourceStreamSourceFileSystem.create(ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY));
- }
-
- public IsisConfigurationBuilder(final ResourceStreamSource... resourceStreamSources) {
- this(createComposite(Arrays.asList(resourceStreamSources)));
- }
-
- public IsisConfigurationBuilder(final List<ResourceStreamSource> resourceStreamSources) {
- this(createComposite(resourceStreamSources));
- }
-
- public IsisConfigurationBuilder(final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain) {
- this.resourceStreamSourceChain = resourceStreamSourceChain;
- configuration = new IsisConfigurationDefault(resourceStreamSourceChain);
- }
-
- private static ResourceStreamSourceChainOfResponsibility createComposite(
- final List<ResourceStreamSource> resourceStreamSources) {
- final ResourceStreamSourceChainOfResponsibility composite = new ResourceStreamSourceChainOfResponsibility();
- for (final ResourceStreamSource rss : resourceStreamSources) {
- if (rss == null) {
- continue;
- }
- composite.addResourceStreamSource(rss);
- }
- return composite;
- }
- public void addDefaultConfigurationResourcesAndPrimers() {
- addDefaultConfigurationResources();
- addDefaultPrimers();
- }
-
- private void addDefaultConfigurationResources() {
- IsisConfigurationDefault.ContainsPolicy ignorePolicy = IsisConfigurationDefault.ContainsPolicy.IGNORE;
- NotFoundPolicy continuePolicy = NotFoundPolicy.CONTINUE;
-
- addConfigurationResource(ConfigurationConstants.DEFAULT_CONFIG_FILE, NotFoundPolicy.FAIL_FAST, ignorePolicy);
-
- addConfigurationResource(ConfigurationConstants.WEB_CONFIG_FILE, continuePolicy, ignorePolicy);
- addConfigurationResource("war.properties", continuePolicy, ignorePolicy);
-
- addConfigurationResource("viewer_wicket.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("viewer_restful.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("viewer_restfulobjects.properties", continuePolicy, ignorePolicy);
-
- addConfigurationResource("persistor_datanucleus.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("persistor.properties", continuePolicy, ignorePolicy);
-
- addConfigurationResource("authentication_shiro.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("authentication_bypass.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("authentication.properties", continuePolicy, ignorePolicy);
-
- addConfigurationResource("authorization_shiro.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("authorization_bypass.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("authorization.properties", continuePolicy, ignorePolicy);
-
- addConfigurationResource("reflector_java.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("reflector.properties", continuePolicy, ignorePolicy);
-
- addConfigurationResource("fixtures-installer_configuration.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("fixtures-installer.properties", continuePolicy, ignorePolicy);
-
- addConfigurationResource("services-installer_annotation.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("services-installer_configuration.properties", continuePolicy, ignorePolicy);
-
- addConfigurationResource("services-installer_configuration-and-annotation.properties", continuePolicy, ignorePolicy);
- addConfigurationResource("services-installer.properties", continuePolicy, ignorePolicy);
-
- // both override and overrides are accepted (because I keep forgetting which)
- addConfigurationResource("override.properties", NotFoundPolicy.CONTINUE, IsisConfigurationDefault.ContainsPolicy.OVERWRITE);
- addConfigurationResource("overrides.properties", NotFoundPolicy.CONTINUE, IsisConfigurationDefault.ContainsPolicy.OVERWRITE);
- }
-
- private void addDefaultPrimers() {
- primeWith(new PrimerForSystemProperties());
- primeWith(new PrimerForEnvironmentVariablesIsisPrefix());
- primeWith(new PrimerForEnvironmentVariableISIS_OPTS());
- }
-
- // -- addResourceStreamSource, addResourceStreamSources
-
- public void addResourceStreamSource(final ResourceStreamSource resourceStreamSource) {
- addResourceStreamSources(resourceStreamSource);
- }
-
- public void addResourceStreamSources(final ResourceStreamSource... resourceStreamSources) {
- addResourceStreamSources(Arrays.asList(resourceStreamSources));
- }
-
- public void addResourceStreamSources(final List<ResourceStreamSource> resourceStreamSources) {
- for (ResourceStreamSource resourceStreamSource : resourceStreamSources) {
- this.resourceStreamSourceChain.addResourceStreamSource(resourceStreamSource);
- }
- }
+public interface IsisConfigurationBuilder {
+
+ void addDefaultConfigurationResourcesAndPrimers();
- // -- addConfigurationResource
+ void addResourceStreamSource(ResourceStreamSource resourceStreamSource);
+ void addResourceStreamSources(ResourceStreamSource... resourceStreamSources);
+ void addResourceStreamSources(List<ResourceStreamSource> resourceStreamSources);
/**
* Registers the configuration resource (usually, a file) with the specified
@@ -174,157 +39,47 @@ public final class IsisConfigurationBuilder {
* <p>
* If the configuration resource cannot be found then the provided
* {@link NotFoundPolicy} determines whether an exception is thrown or not.
- *
- * <p>
- * Must be called before {@link IsisConfigurationBuilder#getConfiguration()}.
- */
- public void addConfigurationResource(
- final String configurationResource,
- final NotFoundPolicy notFoundPolicy,
- final IsisConfigurationDefault.ContainsPolicy containsPolicy) {
-
- if(LOG.isDebugEnabled()) {
- LOG.debug(String.format(
- "checking availability of configuration resource: %s, notFoundPolicy: %s",
- configurationResource, notFoundPolicy));
- }
- loadConfigurationResource(configurationResource, notFoundPolicy, containsPolicy);
- }
-
- /**
- * Loads the configuration resource (usually, a file) with the specified
- * name from the first {@link ResourceStreamSource} available.
- *
- * <p>
- * If the configuration resource cannot be found then the provided
- * {@link NotFoundPolicy} determines whether an exception is thrown or not.
*/
- private void loadConfigurationResource(
- final String configurationResource,
- final NotFoundPolicy notFoundPolicy,
- final IsisConfigurationDefault.ContainsPolicy containsPolicy) {
-
- try {
- final PropertiesReader propertiesReader =
- loadConfigurationResource(resourceStreamSourceChain, configurationResource);
- LOG.info("loading properties from {}", configurationResource);
- configuration.add(propertiesReader.getProperties(), containsPolicy);
- configurationResourcesFound.add(configurationResource);
- return;
- } catch (final IOException ignore) {
- // ignore
- }
- if (notFoundPolicy == NotFoundPolicy.FAIL_FAST) {
- throw new IsisException(String.format(
- "failed to load '%s'; tried using: %s",
- configurationResource, resourceStreamSourceChain.getName()));
- }
- configurationResourcesNotFound.add(configurationResource);
- if(LOG.isDebugEnabled()) {
- LOG.debug("'{}' not found, but not needed", configurationResource);
-
- }
- }
-
- private PropertiesReader loadConfigurationResource(final ResourceStreamSource resourceStreamSource, final String configurationResource) throws IOException {
- return new PropertiesReader(resourceStreamSource, configurationResource);
- }
-
- // -- add, put
+ void addConfigurationResource(String configurationResource, NotFoundPolicy notFoundPolicy,
+ IsisConfigurationDefault.ContainsPolicy containsPolicy);
/**
* Adds additional property; if already present then will _not_ be replaced.
*/
- public void add(final String key, final String value) {
- configuration.add(key, value);
- }
+ void add(String key, String value);
/**
* Adds/updates property; if already present then _will_ be replaced.
*/
- public void put(final String key, final String value) {
- configuration.put(key, value);
- }
-
- // -- PRIMING
-
- public interface Primer {
- void prime(IsisConfigurationBuilder isisConfigurationBuilder);
- }
-
- public void primeWith(final Primer primer) {
- LOG.debug("priming configurations for '{}'", primer);
- primer.prime(this);
- }
-
- // -- PEEKING
-
- public String peekAtString(String key) {
- return configuration.getString(key);
- }
-
- public String peekAtString(String key, String defaultValue) {
- return configuration.getString(key, defaultValue);
- }
-
- public boolean peekAtBoolean(String key) {
- return configuration.getBoolean(key);
- }
-
- public boolean peekAtBoolean(String key, boolean defaultValue) {
- return configuration.getBoolean(key, defaultValue);
- }
-
- public String[] peekAtList(String key) {
- return configuration.getList(key);
- }
-
- // -- BUILD
+ void put(String key, String value);
- public IsisConfiguration build() {
+ void primeWith(Primer primer);
- dumpResourcesToLog();
+ String peekAtString(String key);
+ String peekAtString(String key, String defaultValue);
- final IsisConfigurationDefault copy = new IsisConfigurationDefault(resourceStreamSourceChain);
- final Properties props = new Properties();
- props.putAll(configuration.asMap());
- copy.add(props, ContainsPolicy.OVERWRITE);
+ boolean peekAtBoolean(String key);
+ boolean peekAtBoolean(String key, boolean defaultValue);
- configuration = null; // once built this builder is no longer usable
-
- return copy;
- }
+ String[] peekAtList(String key);
- // -- dumpResourcesToLog, toString
+ IsisConfiguration build();
/**
* Log a summary of resources found or not found.
*/
- public void dumpResourcesToLog() {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Configuration resources FOUND:");
- for (String resource : configurationResourcesFound) {
- LOG.debug("* {}", resource);
- }
- LOG.debug("Configuration resources NOT FOUND (but not needed):");
- for (String resource : configurationResourcesNotFound) {
- LOG.debug("* {}", resource);
- }
- }
+ void dumpResourcesToLog();
+
+ // -- PRIMING
+
+ public interface Primer {
+ void prime(IsisConfigurationBuilder isisConfigurationBuilder);
}
+ // -- FACTORIES
+ static IsisConfigurationBuilder empty() {
+ return new IsisConfigurationBuilderDefault();
+ }
- //TODO[2039]
- // private final static ToString<IsisConfigurationBuilder> toString =
- // ToString.<IsisConfigurationBuilder>
- // toString("resourceStream", x->x.resourceStreamSourceChain)
- // .thenToString("configResources", x->x.configurationResourcesFound)
- // ;
- //
- // @Override
- // public String toString() {
- // return toString.toString(this);
- // }
-
-}
+}
\ No newline at end of file
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
similarity index 94%
copy from core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
copy to core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
index 5fe0762..5374960 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
@@ -55,9 +55,9 @@ import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
* @see {@link IsisConfiguration} for more details on the mutable/immutable pair pattern.
*
*/
-public final class IsisConfigurationBuilder {
+final class IsisConfigurationBuilderDefault implements IsisConfigurationBuilder {
- private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilder.class);
+ private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilderDefault.class);
// -- constructor, fields
@@ -68,19 +68,19 @@ public final class IsisConfigurationBuilder {
private final Set<String> configurationResourcesFound = _Sets.newLinkedHashSet();
private final Set<String> configurationResourcesNotFound = _Sets.newLinkedHashSet();
- public IsisConfigurationBuilder() {
+ public IsisConfigurationBuilderDefault() {
this(ResourceStreamSourceFileSystem.create(ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY));
}
- public IsisConfigurationBuilder(final ResourceStreamSource... resourceStreamSources) {
+ public IsisConfigurationBuilderDefault(final ResourceStreamSource... resourceStreamSources) {
this(createComposite(Arrays.asList(resourceStreamSources)));
}
- public IsisConfigurationBuilder(final List<ResourceStreamSource> resourceStreamSources) {
+ public IsisConfigurationBuilderDefault(final List<ResourceStreamSource> resourceStreamSources) {
this(createComposite(resourceStreamSources));
}
- public IsisConfigurationBuilder(final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain) {
+ public IsisConfigurationBuilderDefault(final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain) {
this.resourceStreamSourceChain = resourceStreamSourceChain;
configuration = new IsisConfigurationDefault(resourceStreamSourceChain);
}
@@ -97,6 +97,7 @@ public final class IsisConfigurationBuilder {
return composite;
}
+ @Override
public void addDefaultConfigurationResourcesAndPrimers() {
addDefaultConfigurationResources();
addDefaultPrimers();
@@ -151,14 +152,17 @@ public final class IsisConfigurationBuilder {
// -- addResourceStreamSource, addResourceStreamSources
+ @Override
public void addResourceStreamSource(final ResourceStreamSource resourceStreamSource) {
addResourceStreamSources(resourceStreamSource);
}
+ @Override
public void addResourceStreamSources(final ResourceStreamSource... resourceStreamSources) {
addResourceStreamSources(Arrays.asList(resourceStreamSources));
}
+ @Override
public void addResourceStreamSources(final List<ResourceStreamSource> resourceStreamSources) {
for (ResourceStreamSource resourceStreamSource : resourceStreamSources) {
this.resourceStreamSourceChain.addResourceStreamSource(resourceStreamSource);
@@ -176,8 +180,9 @@ public final class IsisConfigurationBuilder {
* {@link NotFoundPolicy} determines whether an exception is thrown or not.
*
* <p>
- * Must be called before {@link IsisConfigurationBuilder#getConfiguration()}.
+ * Must be called before {@link IsisConfigurationBuilderDefault#getConfiguration()}.
*/
+ @Override
public void addConfigurationResource(
final String configurationResource,
final NotFoundPolicy notFoundPolicy,
@@ -235,6 +240,7 @@ public final class IsisConfigurationBuilder {
/**
* Adds additional property; if already present then will _not_ be replaced.
*/
+ @Override
public void add(final String key, final String value) {
configuration.add(key, value);
}
@@ -242,16 +248,14 @@ public final class IsisConfigurationBuilder {
/**
* Adds/updates property; if already present then _will_ be replaced.
*/
+ @Override
public void put(final String key, final String value) {
configuration.put(key, value);
}
// -- PRIMING
- public interface Primer {
- void prime(IsisConfigurationBuilder isisConfigurationBuilder);
- }
-
+ @Override
public void primeWith(final Primer primer) {
LOG.debug("priming configurations for '{}'", primer);
primer.prime(this);
@@ -259,28 +263,34 @@ public final class IsisConfigurationBuilder {
// -- PEEKING
+ @Override
public String peekAtString(String key) {
return configuration.getString(key);
}
+ @Override
public String peekAtString(String key, String defaultValue) {
return configuration.getString(key, defaultValue);
}
+ @Override
public boolean peekAtBoolean(String key) {
return configuration.getBoolean(key);
}
+ @Override
public boolean peekAtBoolean(String key, boolean defaultValue) {
return configuration.getBoolean(key, defaultValue);
}
+ @Override
public String[] peekAtList(String key) {
return configuration.getList(key);
}
// -- BUILD
+ @Override
public IsisConfiguration build() {
dumpResourcesToLog();
@@ -300,6 +310,7 @@ public final class IsisConfigurationBuilder {
/**
* Log a summary of resources found or not found.
*/
+ @Override
public void dumpResourcesToLog() {
if (LOG.isDebugEnabled()) {
LOG.debug("Configuration resources FOUND:");
diff --git a/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder_PeekConfigurationTest.java b/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder_PeekConfigurationTest.java
index 6fafc22..f198f23 100644
--- a/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder_PeekConfigurationTest.java
+++ b/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder_PeekConfigurationTest.java
@@ -33,7 +33,7 @@ public class IsisConfigurationBuilder_PeekConfigurationTest extends TestCase {
@Override
protected void setUp() throws Exception {
- configurationBuilder = new IsisConfigurationBuilder();
+ configurationBuilder = IsisConfigurationBuilder.empty();
configurationBuilder.add("isis.test", "val");
}
diff --git a/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/PrimerForEnvironmentVariableISIS_OPTS_Test.java b/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/PrimerForEnvironmentVariableISIS_OPTS_Test.java
index e22321a..3a07d5d 100644
--- a/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/PrimerForEnvironmentVariableISIS_OPTS_Test.java
+++ b/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/PrimerForEnvironmentVariableISIS_OPTS_Test.java
@@ -34,7 +34,7 @@ public class PrimerForEnvironmentVariableISIS_OPTS_Test {
@Before
public void setUp() throws Exception {
- builder = new IsisConfigurationBuilder();
+ builder = IsisConfigurationBuilder.empty();
}
@Test
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorBuilder.java
index 1990caa..2275da5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorBuilder.java
@@ -19,7 +19,6 @@ package org.apache.isis.core.metamodel.services;
import java.util.ArrayList;
import java.util.List;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
import org.apache.isis.core.metamodel.spec.InjectorMethodEvaluator;
import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
@@ -28,7 +27,6 @@ import static org.apache.isis.commons.internal.base._With.computeIfAbsent;
public class ServicesInjectorBuilder {
private final List<Object> services = new ArrayList<>();
- private IsisConfigurationBuilder configBuilder;
private InjectorMethodEvaluator injectorMethodEvaluator;
private boolean autowireSetters = false;
private boolean autowireInject = false;
@@ -43,11 +41,6 @@ public class ServicesInjectorBuilder {
return this;
}
- public ServicesInjectorBuilder configBuilder(IsisConfigurationBuilder configBuilder) {
- this.configBuilder = configBuilder;
- return this;
- }
-
public ServicesInjectorBuilder injectorMethodEvaluator(InjectorMethodEvaluator injectorMethodEvaluator) {
this.injectorMethodEvaluator = injectorMethodEvaluator;
return this;
@@ -68,7 +61,6 @@ public class ServicesInjectorBuilder {
public ServicesInjector build() {
return new ServicesInjector(
new ArrayList<>(services),
-// computeIfAbsent(configBuilder, this::defaultConfigBuilder),
computeIfAbsent(injectorMethodEvaluator, this::defaultInjectorMethodEvaluatorDefault),
autowireSetters,
autowireInject
@@ -77,14 +69,8 @@ public class ServicesInjectorBuilder {
// -- HELPER
- private IsisConfigurationBuilder defaultConfigBuilder() {
- return new IsisConfigurationBuilder();
- }
-
private InjectorMethodEvaluator defaultInjectorMethodEvaluatorDefault() {
return new InjectorMethodEvaluatorDefault();
}
-
-
}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index e532ebd..f9b477f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -107,6 +107,8 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
// PRODUCTION
+ _Config.clear();
+
facetFactory = new ActionAnnotationFacetFactory();
context.checking(new Expectations() {{
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 0fa77f5..5fa2c67 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -65,10 +65,9 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
@Before
public void setUp() throws Exception {
+ _Config.clear();
facetFactory = new DomainObjectAnnotationFacetFactory();
-
facetFactory.setServicesInjector(mockServicesInjector);
-
}
@After
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index c6aea89..3f72391 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -106,6 +106,7 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
@Before
public void setUp() throws Exception {
+ _Config.clear();
facetFactory = new PropertyAnnotationFacetFactory();
facetFactory.setServicesInjector(mockServicesInjector);
}
@@ -328,6 +329,8 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
}
// given
+ _Config.put("isis.reflector.facet.propertyAnnotation.domainEvent.postForDefault", true);
+
final Class<?> cls = Customer.class;
propertyMethod = findMethod(Customer.class, "getName");
@@ -337,8 +340,6 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
// expect
allowingLoadSpecificationRequestsFor(cls, propertyMethod.getReturnType());
-
- _Config.put("isis.reflector.facet.propertyAnnotation.domainEvent.postForDefault", true);
// when
final FacetFactory.ProcessMethodContext processMethodContext = new FacetFactory.ProcessMethodContext(cls, null,
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisComponentProviderDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisComponentProviderDefault.java
deleted file mode 100644
index d62f00b..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisComponentProviderDefault.java
+++ /dev/null
@@ -1,35 +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.core.runtime.headless;
-
-import org.apache.isis.applib.AppManifest;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
-import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderDefault2;
-
-public class IsisComponentProviderDefault extends IsisComponentProviderDefault2 {
-
- public IsisComponentProviderDefault(
- final AppManifest appManifestIfAny,
- final IsisConfigurationBuilder configurationBuilder) {
- super(appManifestIfAny, configurationBuilder);
-
- }
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
index adcba64..450a4e1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
@@ -25,8 +25,8 @@ import java.util.stream.Collectors;
import org.apache.isis.applib.AppManifest;
import org.apache.isis.applib.fixtures.FixtureClock;
import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.config.internal._Config;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
@@ -77,7 +77,7 @@ public class IsisSystem {
protected AuthenticationRequest authenticationRequest = new AuthenticationRequestNameOnly("tester");
- protected IsisConfigurationBuilder configurationBuilder = new IsisConfigurationBuilder();
+ protected IsisConfigurationBuilder configurationBuilder = IsisConfigurationBuilder.empty();
protected AppManifest appManifestIfAny;
@@ -180,12 +180,12 @@ public class IsisSystem {
boolean firstTime = isisSessionFactory == null;
if(firstTime) {
- componentProvider = new IsisComponentProviderDefault(
- appManifestIfAny,
- configurationBuilder
- );
+
+ componentProvider = IsisComponentProvider.builder()
+ .appManifest(appManifestIfAny)
+ .build();
- IsisContext.EnvironmentPrimer.primeEnvironment(configurationBuilder);
+ _Config.acceptBuilder(IsisContext.EnvironmentPrimer::primeEnvironment);
final IsisSessionFactoryBuilder isisSessionFactoryBuilder =
new IsisSessionFactoryBuilder(componentProvider, appManifestIfAny);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
index c7fc3e8..8fc1eb7 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
@@ -25,9 +25,6 @@ import java.util.stream.Collectors;
import javax.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.apache.isis.applib.AppManifest;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.fixtures.LogonFixture;
@@ -72,8 +69,7 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransactionManagerExc
public class IsisSessionFactory
implements ApplicationScopedComponent, AppManifestProvider {
- @SuppressWarnings("unused")
- private final static Logger LOG = LoggerFactory.getLogger(IsisSessionFactory.class);
+ //private final static Logger LOG = LoggerFactory.getLogger(IsisSessionFactory.class);
// -- constructor, fields, accessors
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
index 0145f47..57442fd 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
@@ -51,7 +51,6 @@ import org.apache.isis.core.runtime.system.internal.IsisTimeZoneInitializer;
import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactoryMetamodelRefiner;
import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProvider;
-import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderDefault2;
import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
import org.apache.isis.schema.utils.ChangesDtoUtils;
import org.apache.isis.schema.utils.CommandDtoUtils;
@@ -73,7 +72,11 @@ public class IsisSessionFactoryBuilder {
private final IsisTimeZoneInitializer timeZoneInitializer;
public IsisSessionFactoryBuilder(final AppManifest appManifest) {
- this(new IsisComponentProviderDefault2(appManifest, null), appManifest);
+ this(IsisComponentProvider.builder()
+ .appManifest(appManifest)
+ .addConfigPackageAsResourceStreamSource()
+ .build(),
+ appManifest);
}
public IsisSessionFactoryBuilder(
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index 20d525b..06d2a28 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -45,6 +45,7 @@ import org.apache.isis.applib.fixturescripts.FixtureScript;
import org.apache.isis.commons.internal.base._NullSafe;
import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.config.internal._Config;
import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
import org.apache.isis.core.commons.factory.InstanceUtil;
import org.apache.isis.core.commons.lang.ClassFunctions;
@@ -71,27 +72,32 @@ import org.apache.isis.progmodels.dflt.JavaReflectorHelper;
import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
import static org.apache.isis.commons.internal.base._With.requires;
+import static org.apache.isis.config.internal._Config.acceptBuilder;
+import static org.apache.isis.config.internal._Config.applyBuilder;
/**
- *
+ *
*/
-public abstract class IsisComponentProvider {
+public final class IsisComponentProvider {
+
+ // -- BUILDER
+
+ public static IsisComponentProviderBuilder builder() {
+ return new IsisComponentProviderBuilder();
+ }
// -- constructor, fields
private final AppManifest appManifest;
- private final IsisConfigurationBuilder configurationBuilder;
protected final List<Object> services;
protected final AuthenticationManager authenticationManager;
protected final AuthorizationManager authorizationManager;
- public IsisComponentProvider(
- final IsisConfigurationBuilder configurationBuilder,
+ IsisComponentProvider(
final AppManifest appManifest,
final AuthenticationManager authenticationManager,
- final AuthorizationManager authorizationManager){
+ final AuthorizationManager authorizationManager) {
- this.configurationBuilder = requires(configurationBuilder, "configurationBuilder");
this.appManifest = requires(appManifest, "appManifest");
putAppManifestKey(appManifest);
@@ -104,7 +110,7 @@ public abstract class IsisComponentProvider {
final String fixtureClassNamesCsv = classNamesFrom(getAppManifest().getFixtures());
- configurationBuilder.add(FixturesInstallerFromConfiguration.FIXTURES, fixtureClassNamesCsv);
+ _Config.put(FixturesInstallerFromConfiguration.FIXTURES, fixtureClassNamesCsv);
this.authenticationManager = authenticationManager;
this.authorizationManager = authorizationManager;
@@ -120,8 +126,7 @@ public abstract class IsisComponentProvider {
// required to prevent RegisterEntities validation from complaining
// if it can't find any @PersistenceCapable entities in a module
// that contains only services.
- configurationBuilder.add(
- SystemConstants.APP_MANIFEST_KEY, appManifest.getClass().getName() );
+ _Config.put(SystemConstants.APP_MANIFEST_KEY, appManifest.getClass().getName() );
}
private void findAndRegisterTypes(final AppManifest appManifest) {
@@ -232,8 +237,10 @@ public abstract class IsisComponentProvider {
final Stream<String> packageNames = modulePackageNamesFrom(appManifest);
final String packageNamesCsv = packageNames.collect(Collectors.joining(","));
- configurationBuilder.add(ServicesInstallerFromAnnotation.PACKAGE_PREFIX_KEY, packageNamesCsv);
- configurationBuilder.add(RegisterEntities.PACKAGE_PREFIX_KEY, packageNamesCsv);
+ acceptBuilder(builder->{
+ builder.add(ServicesInstallerFromAnnotation.PACKAGE_PREFIX_KEY, packageNamesCsv);
+ builder.add(RegisterEntities.PACKAGE_PREFIX_KEY, packageNamesCsv);
+ });
final List<Class<?>> additionalServices = appManifest.getAdditionalServices();
if(additionalServices != null) {
@@ -243,9 +250,9 @@ public abstract class IsisComponentProvider {
}
private void appendToPropertyCsvValue(final String servicesKey, final String additionalServicesCsv) {
- final String existingServicesCsv = configurationBuilder.peekAtString(servicesKey);
+ final String existingServicesCsv = _Config.peekAtString(servicesKey);
final String servicesCsv = join(existingServicesCsv, additionalServicesCsv);
- configurationBuilder.add(servicesKey, servicesCsv);
+ _Config.put(servicesKey, servicesCsv);
}
private static String join(final String csv1, final String csv2) {
@@ -292,11 +299,17 @@ public abstract class IsisComponentProvider {
private void addToConfigurationUsing(final AppManifest appManifest) {
final Map<String, String> configurationProperties = appManifest.getConfigurationProperties();
- if (configurationProperties != null) {
- for (Map.Entry<String, String> configProp : configurationProperties.entrySet()) {
- configurationBuilder.add(configProp.getKey(), configProp.getValue());
+
+ acceptBuilder(builder->{
+
+ if (configurationProperties != null) {
+ for (Map.Entry<String, String> configProp : configurationProperties.entrySet()) {
+ builder.add(configProp.getKey(), configProp.getValue());
+ }
}
- }
+
+ });
+
}
// -- provideAuth*
@@ -312,7 +325,7 @@ public abstract class IsisComponentProvider {
// -- provideServiceInjector
public ServicesInjector provideServiceInjector() {
- return ServicesInjector.builderOf(configurationBuilder)
+ return applyBuilder(ServicesInjector::builderOf)
.addServices(services)
.build();
}
@@ -323,7 +336,7 @@ public abstract class IsisComponentProvider {
final ServicesInjector servicesInjector,
final Collection<MetaModelRefiner> metaModelRefiners) throws IsisSystemException {
- final ProgrammingModel programmingModel = createProgrammingModel();
+ final ProgrammingModel programmingModel = applyBuilder(this::createProgrammingModel);
final MetaModelValidator mmv = createMetaModelValidator();
@@ -336,19 +349,18 @@ public abstract class IsisComponentProvider {
protected MetaModelValidator createMetaModelValidator() {
final String metaModelValidatorClassName =
- configurationBuilder.peekAtString(
+ _Config.peekAtString(
ReflectorConstants.META_MODEL_VALIDATOR_CLASS_NAME,
ReflectorConstants.META_MODEL_VALIDATOR_CLASS_NAME_DEFAULT);
return InstanceUtil.createInstance(metaModelValidatorClassName, MetaModelValidator.class);
}
- protected ProgrammingModel createProgrammingModel() {
-
- final DeprecatedPolicy deprecatedPolicy = DeprecatedPolicy.parse(configurationBuilder);
+ protected ProgrammingModel createProgrammingModel(IsisConfigurationBuilder builder) {
+ final DeprecatedPolicy deprecatedPolicy = DeprecatedPolicy.parse(builder);
final ProgrammingModel programmingModel = new ProgrammingModelFacetsJava5(deprecatedPolicy);
- ProgrammingModel.Util.includeFacetFactories(configurationBuilder, programmingModel);
- ProgrammingModel.Util.excludeFacetFactories(configurationBuilder, programmingModel);
+ ProgrammingModel.Util.includeFacetFactories(builder, programmingModel);
+ ProgrammingModel.Util.excludeFacetFactories(builder, programmingModel);
return programmingModel;
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
new file mode 100644
index 0000000..128de8a
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
@@ -0,0 +1,78 @@
+package org.apache.isis.core.runtime.systemusinginstallers;
+
+import java.util.List;
+
+import org.apache.isis.applib.AppManifest;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.resource.ResourceStreamSource;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
+import org.apache.isis.core.runtime.authentication.AuthenticationManager;
+import org.apache.isis.core.runtime.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.core.runtime.authorization.AuthorizationManager;
+import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
+
+import static org.apache.isis.commons.internal.base._With.computeIfAbsent;
+import static org.apache.isis.config.internal._Config.acceptBuilder;
+
+public class IsisComponentProviderBuilder {
+
+ private AppManifest appManifest;
+ private AuthenticationManager authenticationManager;
+ private AuthorizationManager authorizationManager;
+ private final List<ResourceStreamSource> resourceStreamSources = _Lists.newArrayList();
+
+ public IsisComponentProviderBuilder appManifest(AppManifest appManifest) {
+ this.appManifest = appManifest;
+ return this;
+ }
+
+ public IsisComponentProviderBuilder addResourceStreamSource(ResourceStreamSource source) {
+ resourceStreamSources.add(source);
+ return this;
+ }
+
+ // -- SHORTCUTS
+
+ /**
+ * Default will read <tt>isis.properties</tt> (and other optional property files) from the 'config'
+ * package on the current classpath.
+ */
+ public IsisComponentProviderBuilder addConfigPackageAsResourceStreamSource() {
+ addResourceStreamSource(ResourceStreamSourceContextLoaderClassPath.create("config"));
+ return this;
+ }
+
+ // -- BUILD
+
+ public IsisComponentProvider build() {
+
+ authenticationManager = computeIfAbsent(authenticationManager,
+ IsisComponentProviderBuilder::authenticationManagerWithBypass);
+
+ authorizationManager = computeIfAbsent(authorizationManager,
+ AuthorizationManagerStandard::new);
+
+ acceptBuilder(builder->{
+ resourceStreamSources.forEach(builder::addResourceStreamSource);
+ });
+
+ return new IsisComponentProvider(appManifest, authenticationManager, authorizationManager);
+ }
+
+ // -- HELPER
+
+
+ /**
+ * The standard authentication manager, configured with the 'bypass' authenticator
+ * (allows all requests through).
+ * <p>
+ * integration tests ignore appManifest for authentication and authorization.
+ */
+ private static AuthenticationManager authenticationManagerWithBypass() {
+ final AuthenticationManagerStandard authenticationManager = new AuthenticationManagerStandard();
+ authenticationManager.addAuthenticator(new AuthenticatorBypass());
+ return authenticationManager;
+ }
+
+
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java
deleted file mode 100644
index e161dfb..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java
+++ /dev/null
@@ -1,84 +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.core.runtime.systemusinginstallers;
-
-import org.apache.isis.applib.AppManifest;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
-import org.apache.isis.core.runtime.authentication.AuthenticationManager;
-import org.apache.isis.core.runtime.authentication.standard.AuthenticationManagerStandard;
-import org.apache.isis.core.runtime.authorization.AuthorizationManager;
-import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
-
-public class IsisComponentProviderDefault2 extends IsisComponentProvider {
-
- public IsisComponentProviderDefault2(
- final AppManifest appManifest,
- final IsisConfigurationBuilder configurationBuilder) {
- this(elseDefault(configurationBuilder), appManifest);
-
- }
-
- // -- HELPER
-
- private IsisComponentProviderDefault2(
- final IsisConfigurationBuilder configurationBuilder,
- final AppManifest appManifest
- ) {
- this(configurationBuilder, appManifest,
- // integration tests ignore appManifest for authentication and authorization.
- authenticationManagerWithBypass(configurationBuilder),
- new AuthorizationManagerStandard());
- }
-
- private IsisComponentProviderDefault2(
- final IsisConfigurationBuilder configurationBuilder,
- final AppManifest appManifest,
- final AuthenticationManager authenticationManager,
- final AuthorizationManager authorizationManager
- ) {
- super(configurationBuilder, appManifest, authenticationManager, authorizationManager);
- }
-
-
-
- // -- constructor helpers (factories)
- /**
- * Default will read <tt>isis.properties</tt> (and other optional property files) from the "config"
- * package on the current classpath.
- */
- private static IsisConfigurationBuilder elseDefault(final IsisConfigurationBuilder configurationBuilder) {
- return configurationBuilder != null
- ? configurationBuilder
- : new IsisConfigurationBuilder(ResourceStreamSourceContextLoaderClassPath.create("config"));
- }
-
- /**
- * The standard authentication manager, configured with the 'bypass' authenticator (allows all requests through).
- */
- private static AuthenticationManager authenticationManagerWithBypass(final IsisConfigurationBuilder configuration ) {
- final AuthenticationManagerStandard authenticationManager = new AuthenticationManagerStandard();
- authenticationManager.addAuthenticator(new AuthenticatorBypass());
- return authenticationManager;
- }
-
-
-
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
index d5b36a5..560de47 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
@@ -42,8 +42,8 @@ import org.apache.isis.core.runtime.authorization.AuthorizationManagerInstaller;
import org.apache.isis.core.runtime.system.SystemConstants;
import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
-public class IsisComponentProviderUsingInstallers extends IsisComponentProvider {
-
+class IsisComponentProviderUsingInstallers {
+/*
// -- constructors
public IsisComponentProviderUsingInstallers(
@@ -104,7 +104,7 @@ public class IsisComponentProviderUsingInstallers extends IsisComponentProvider
return authorizationInstaller.createAuthorizationManager();
}
-
+*/
/**
@@ -122,6 +122,7 @@ public class IsisComponentProviderUsingInstallers extends IsisComponentProvider
*
* @deprecated - intention is to replace in future using CDI
*/
+ /*
@Deprecated
static class InstallerLookup implements ApplicationScopedComponent {
@@ -229,7 +230,6 @@ public class IsisComponentProviderUsingInstallers extends IsisComponentProvider
return installer;
}
-
-
}
+ */
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
index 53bfd04..478fb52 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
@@ -27,6 +27,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.config.internal._Config;
import org.apache.isis.core.commons.config.IsisConfiguration.ContainsPolicy;
import org.apache.isis.core.commons.config.NotFoundPolicy;
import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
@@ -64,11 +65,8 @@ public final class IsisWebAppBootstrapper implements ServletContextListener {
final String webInfDir = servletContext.getRealPath("/WEB-INF");
loggingConfigurer.configureLogging(webInfDir, emptyStringArray);
- final IsisConfigurationBuilder isisConfigurationBuilder =
- IsisWebAppConfigProvider.getInstance().getConfigurationBuilder(servletContext);
- isisConfigurationBuilder.addDefaultConfigurationResourcesAndPrimers();
-
- addConfigurationResourcesForDeploymentType(isisConfigurationBuilder);
+ IsisWebAppConfigHelper.initConfigurationFrom(servletContext);
+ _Config.acceptBuilder(this::addConfigurationResourcesForDeploymentType);
} catch (final RuntimeException e) {
LOG.error("startup failed", e);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java
new file mode 100644
index 0000000..844ce08
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java
@@ -0,0 +1,90 @@
+/*
+ * 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.core.webapp;
+
+import javax.servlet.ServletContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceCurrentClassClassPath;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceForWebInf;
+import org.apache.isis.core.runtime.runner.opts.OptionHandlerInitParameters;
+
+/**
+ *
+ * @since 2.0.0-M2
+ */
+public final class IsisWebAppConfigHelper {
+
+ private static final Logger LOG = LoggerFactory.getLogger(IsisWebAppConfigHelper.class);
+ private IsisWebAppConfigHelper() {}
+
+ //private final Map<String, String> additionalConfig = _Maps.newHashMap();
+
+ /**
+ * Initializes the IsisConfiguration subsystem with all currently available configuration values.
+ * @param servletContext
+ * @return
+ */
+ public static void initConfigurationFrom(final ServletContext servletContext) {
+ _Config.acceptBuilder(builder->{
+ builder.primeWith(new OptionHandlerInitParameters(servletContext));
+// additionalConfig.forEach((k, v)->builder.put(k, v));
+ addServletContextConstants(servletContext, builder);
+ addResourceStreamSources(servletContext, builder);
+ builder.addDefaultConfigurationResourcesAndPrimers();
+ });
+ }
+
+
+ // -- HELPER
+
+ private static void addServletContextConstants(
+ final ServletContext servletContext,
+ final IsisConfigurationBuilder isisConfigurationBuilder) {
+
+ final String webappDir = servletContext.getRealPath("/");
+ isisConfigurationBuilder.add(WebAppConstants.WEB_APP_DIR, webappDir);
+ }
+
+ private static void addResourceStreamSources(
+ final ServletContext servletContext,
+ final IsisConfigurationBuilder builder) {
+
+ // will load either from WEB-INF, from the class-path or from config directory.
+ final String configLocation = servletContext.getInitParameter(WebAppConstants.CONFIG_DIR_PARAM);
+ if ( configLocation != null ) {
+ LOG.info("Config override location: {}", configLocation );
+ builder.addResourceStreamSource(ResourceStreamSourceFileSystem.create(configLocation));
+ } else {
+ LOG.info("Config override location: No override location configured" );
+
+ builder.addResourceStreamSource(ResourceStreamSourceContextLoaderClassPath.create());
+ builder.addResourceStreamSource(new ResourceStreamSourceCurrentClassClassPath());
+ builder.addResourceStreamSource(new ResourceStreamSourceForWebInf(servletContext));
+ }
+ }
+
+
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigProvider.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigProvider.java
deleted file mode 100644
index c445486..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigProvider.java
+++ /dev/null
@@ -1,162 +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.core.webapp;
-
-import static org.apache.isis.commons.internal.base._With.ifPresentElse;
-import static org.apache.isis.commons.internal.base._With.requires;
-import static org.apache.isis.commons.internal.context._Context.computeIfAbsent;
-import static org.apache.isis.commons.internal.context._Context.getOrThrow;
-
-import java.util.Map;
-
-import javax.servlet.ServletContext;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceCurrentClassClassPath;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceForWebInf;
-import org.apache.isis.core.runtime.runner.opts.OptionHandlerInitParameters;
-
-/**
- * Provides IsisConfigurationBuilder instances.
- *
- * @since 2.0.0
- */
-public class IsisWebAppConfigProvider {
-
- private static final Logger LOG = LoggerFactory.getLogger(IsisWebAppConfigProvider.class);
-
- private IsisConfigurationBuilder cfgBuilder;
- private final Map<String, String> additionalConfig = _Maps.newHashMap();
-
- private IsisWebAppConfigProvider() {
- // private constructor
- }
-
- /**
- * Removes any cached IsisConfigurationBuilder instance from this provider.
- */
- public void invalidate() {
- cfgBuilder = null;
- }
-
- /**
- * If available reuses the IsisConfigurationBuilder instance that is already on the ServletContext or
- * creates a new one and puts it on the ServletContext.
- *
- * @param servletContext
- * @return
- */
- public synchronized IsisConfigurationBuilder getConfigurationBuilder(final ServletContext servletContext) {
- if(cfgBuilder == null) {
- cfgBuilder = newIsisConfigurationBuilder(servletContext);
- }
- return cfgBuilder;
- }
-
- /**
- * Returns a new IsisConfigurationBuilder populated with all currently available configuration values.
- * @param servletContext
- * @return
- */
- protected IsisConfigurationBuilder newIsisConfigurationBuilder(final ServletContext servletContext) {
- IsisConfigurationBuilder isisConfigurationBuilder = new IsisConfigurationBuilder();
- isisConfigurationBuilder.primeWith(new OptionHandlerInitParameters(servletContext));
- additionalConfig.forEach((k, v)->isisConfigurationBuilder.put(k, v));
- addServletContextConstants(servletContext, isisConfigurationBuilder);
- addResourceStreamSources(servletContext, isisConfigurationBuilder);
- return isisConfigurationBuilder;
- }
-
- // -- CONFIG OVERRIDING
-
- public void addConfig(Map<String, String> map) {
- this.additionalConfig.putAll(map);
- }
-
- // -- PEEKING
-
- /**
- * Try to fetch the value from config stored under {@code key} else fallback to {@code defaultValue}
- * @param servletContext
- * @param key
- * @param defaultValue
- * @return non-null
- */
- public String peekAtOrDefault(ServletContext servletContext, String key, String defaultValue) {
- requires(servletContext, "servletContext");
- requires(key, "key");
- requires(defaultValue, "defaultValue");
-
- final String configValue = getConfigurationBuilder(servletContext).peekAtString(key);
- return ifPresentElse(configValue, defaultValue);
- }
-
- // -- LOOKUP
-
- /**
- * @return the application-scoped singleton instance of IsisWebAppConfigProvider
- * @throws IllegalStateException if no such singleton was registered
- */
- public static IsisWebAppConfigProvider getInstance() {
- return getOrThrow(IsisWebAppConfigProvider.class,
- ()->new IllegalStateException("No config provider registered on current context."));
- }
-
- public static IsisWebAppConfigProvider registerInstanceIfAbsent() {
- final IsisWebAppConfigProvider configProvider =
- computeIfAbsent(IsisWebAppConfigProvider.class, __->new IsisWebAppConfigProvider());
- return configProvider;
- }
-
- // -- HELPER
-
- private static void addServletContextConstants(
- final ServletContext servletContext,
- final IsisConfigurationBuilder isisConfigurationBuilder) {
-
- final String webappDir = servletContext.getRealPath("/");
- isisConfigurationBuilder.add(WebAppConstants.WEB_APP_DIR, webappDir);
- }
-
- private static void addResourceStreamSources(
- final ServletContext servletContext,
- final IsisConfigurationBuilder isisConfigurationBuilder) {
-
- // will load either from WEB-INF, from the class-path or from config directory.
- final String configLocation = servletContext.getInitParameter(WebAppConstants.CONFIG_DIR_PARAM);
- if ( configLocation != null ) {
- LOG.info("Config override location: {}", configLocation );
- isisConfigurationBuilder.addResourceStreamSource(ResourceStreamSourceFileSystem.create(configLocation));
- } else {
- LOG.info("Config override location: No override location configured" );
-
- isisConfigurationBuilder.addResourceStreamSource(ResourceStreamSourceContextLoaderClassPath.create());
- isisConfigurationBuilder.addResourceStreamSource(new ResourceStreamSourceCurrentClassClassPath());
- isisConfigurationBuilder.addResourceStreamSource(new ResourceStreamSourceForWebInf(servletContext));
- }
- }
-
-
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
index eae2ab3..0b2f222 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
@@ -31,11 +31,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.config.internal._Config;
import org.apache.isis.core.commons.config.IsisConfiguration.ContainsPolicy;
import org.apache.isis.core.commons.config.NotFoundPolicy;
import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
import org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.core.webapp.modules.WebModule;
+import org.apache.isis.core.webapp.modules.WebModuleContext;
import static org.apache.isis.commons.internal.base._With.acceptIfPresent;
import static org.apache.isis.commons.internal.resources._Resources.putContextPathIfPresent;
@@ -76,28 +78,23 @@ public class IsisWebAppContextListener implements ServletContextListener {
putContextPathIfPresent(servletContext.getContextPath());
- final IsisWebAppConfigProvider configProvider = IsisWebAppConfigProvider.registerInstanceIfAbsent();
+ IsisWebAppConfigHelper.initConfigurationFrom(servletContext);
+ _Config.acceptBuilder(IsisContext.EnvironmentPrimer::primeEnvironment);
- final IsisConfigurationBuilder isisConfigurationBuilder =
- IsisWebAppConfigProvider.getInstance().getConfigurationBuilder(servletContext);
- isisConfigurationBuilder.addDefaultConfigurationResourcesAndPrimers();
+ final WebModuleContext webModuleContext = new WebModuleContext(servletContext);
- IsisContext.EnvironmentPrimer.primeEnvironment(isisConfigurationBuilder);
-
final List<WebModule> webModules =
WebModule.discoverWebModules()
- .peek(module->module.prepare(servletContext)) // prepare context
+ .peek(module->module.prepare(webModuleContext)) // prepare context
.collect(Collectors.toList());
- // put the list of viewer names "isis.viewers" into a context parameter
- WebModule.ContextUtil.commitViewers(servletContext);
- // invalidate config such that next IsisConfigurationBuilder that gets obtained is reinitialized
- configProvider.invalidate();
+ // commit negotiated properties to configuration subsystem
+ webModuleContext.commit();
LOG.info("=== PHASE 2 === Initializing the ServletContext");
webModules.stream()
- .filter(module->module.isApplicable(servletContext)) // filter those WebModules that are applicable
+ .filter(module->module.isApplicable(webModuleContext)) // filter those WebModules that are applicable
.forEach(module->addListener(servletContext, module));
activeListeners.forEach(listener->listener.contextInitialized(event));
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
index eb7dcfd..231930e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
@@ -18,8 +18,6 @@
*/
package org.apache.isis.core.webapp.modules;
-import static org.apache.isis.commons.internal.base._Strings.isEmpty;
-
import java.util.stream.Stream;
import javax.servlet.Filter;
@@ -29,7 +27,6 @@ import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebListener;
-import org.apache.isis.commons.internal.base._Strings;
import org.apache.isis.core.webapp.IsisWebAppContextListener;
/**
@@ -53,26 +50,26 @@ public interface WebModule {
/**
* Before initializing any WebModule we call each WebModule's prepare method
* to allow for a WebModule to leave information useful for other modules on
- * the shared ServletContext.
+ * the shared WebModuleContext.
*
- * @param ctx ServletContext
+ * @param ctx WebModuleContext
*/
- default public void prepare(ServletContext ctx) {}
+ default public void prepare(WebModuleContext ctx) {}
/**
- * Expected to be called after all WebModules had a chance to prepare the ServletContext.
+ * Expected to be called after all WebModules had a chance to prepare the WebModuleContext.
* Sets this WebModule's {@link Filter}s, {@link Servlet}s or {@link WebListener}s
- * up and registers them with the given {@link ServletContext} {@code ctx}.
+ * up and registers them with the {@link ServletContext} as provided via {@code ctx}.
* @param ctx ServletContext
*/
public ServletContextListener init(ServletContext ctx) throws ServletException;
/**
- * Expected to be called after all WebModules had a chance to prepare the ServletContext.
- * @param ctx ServletContext
+ * Expected to be called after all WebModules had a chance to prepare the WebModuleContext.
+ * @param ctx WebModuleContext
* @return whether this module is applicable/usable
*/
- public boolean isApplicable(ServletContext ctx);
+ public boolean isApplicable(WebModuleContext ctx);
// -- DISCOVERY
@@ -96,85 +93,5 @@ public interface WebModule {
);
}
- // -- UTILITY
-
- static final class ContextUtil {
-
- /**
- * This key was deprecated from config, but we still use it for reference. It is auto-populated
- * such that it can be looked up, to see what viewers have been discovered by the framework.
- */
- private final static String ISIS_VIEWERS = "isis.viewers";
-
- /**
- * Tell other modules that a bootstrapper is present.
- * @param ctx
- * @param bootstrapper
- */
- public static void registerBootstrapper(ServletContext ctx, WebModule bootstrapper) {
- ctx.setAttribute("isis.bootstrapper", bootstrapper);
- }
-
- /**
- * @param ctx
- * @return whether this context has a bootstrapper registered
- */
- public static boolean hasBootstrapper(ServletContext ctx) {
- return ctx.getAttribute("isis.bootstrapper")!=null;
- }
-
- /**
- * Adds to the list of viewer names "isis.viewers"
- * @param ctx
- * @param viewerName
- */
- public static void registerViewer(ServletContext ctx, String viewerName) {
- String viewers = (String) ctx.getAttribute(ISIS_VIEWERS);
- if(isEmpty(viewers)) {
- viewers = viewerName;
- } else {
- viewers = viewers + "," + viewerName;
- }
- ctx.setAttribute(ISIS_VIEWERS, viewers);
- }
-
- /**
- * Puts the list of viewer names "isis.viewers" into a context parameter.
- * @param ctx
- */
- public static void commitViewers(ServletContext ctx) {
- String viewers = (String) ctx.getAttribute(ISIS_VIEWERS);
- if(!isEmpty(viewers)) {
- ctx.setInitParameter(ISIS_VIEWERS, viewers);
- }
- }
-
- /**
- * Adds to the list of protected path names "isis.protected"
- * @param ctx
- * @param path
- */
- public static void registerProtectedPath(ServletContext ctx, String path) {
- String list = (String) ctx.getAttribute("isis.protected");
- if(isEmpty(list)) {
- list = path;
- } else {
- list = list + "," + path;
- }
- ctx.setAttribute("isis.protected", list);
- }
-
- /**
- * Streams the protected path names "isis.protected".
- * @param ctx
- */
- public static Stream<String> streamProtectedPaths(ServletContext ctx) {
- final String list = (String) ctx.getAttribute("isis.protected");
- return _Strings.splitThenStream(list, ",");
- }
-
-
- }
-
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java
new file mode 100644
index 0000000..b41d116
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java
@@ -0,0 +1,111 @@
+/*
+ * 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.core.webapp.modules;
+
+import java.util.stream.Stream;
+
+import javax.servlet.ServletContext;
+
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.config.internal._Config;
+
+/**
+ *
+ * @since 2.0.0-M2
+ *
+ */
+public class WebModuleContext {
+
+ /**
+ * This key was deprecated from config, but we still use it for reference. It is auto-populated
+ * such that it can be looked up, to see what viewers have been discovered by the framework.
+ */
+ private final static String ISIS_VIEWERS = "isis.viewers";
+ private final static String ISIS_PROTECTED = "isis.protected";
+
+ private boolean hasBootstrapper = false;
+ private final StringBuilder viewers = new StringBuilder();
+ private final StringBuilder protectedPath = new StringBuilder();
+
+ private final ServletContext servletContext;
+
+ public WebModuleContext(ServletContext servletContext) {
+ this.servletContext = servletContext;
+ }
+
+ public ServletContext getServletContext() {
+ return servletContext;
+ }
+
+ /**
+ * Tell other modules that a bootstrapper is present.
+ */
+ public void setHasBootstrapper() {
+ hasBootstrapper = true;
+ }
+
+ /**
+ * @return whether this context has a bootstrapper
+ */
+ public boolean hasBootstrapper() {
+ return hasBootstrapper;
+ }
+
+ /**
+ * Adds to the list of viewer names "isis.viewers"
+ * @param viewerName
+ */
+ public void addViewer(String viewerName) {
+ if(viewers.length()>0) {
+ viewers.append(",");
+ }
+ viewers.append(viewerName);
+ }
+
+ /**
+ * Adds to the list of protected path names "isis.protected"
+ * @param path
+ */
+ public void addProtectedPath(String path) {
+ if(protectedPath.length()>0) {
+ protectedPath.append(",");
+ }
+ protectedPath.append(path);
+ }
+
+ /**
+ * Streams the protected path names "isis.protected".
+ * @param ctx
+ */
+ public Stream<String> streamProtectedPaths() {
+ final String list = protectedPath.toString();
+ return _Strings.splitThenStream(list, ",");
+ }
+
+ /**
+ * Commits all properties to current life-cycle's config.
+ */
+ public void commit() {
+ _Config.acceptBuilder(builder->{
+ builder.add(ISIS_VIEWERS, viewers.toString());
+ builder.add(ISIS_PROTECTED, protectedPath.toString());
+ });
+ }
+
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java
index 9f9f132..dc925b7 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java
@@ -37,15 +37,14 @@ final class WebModule_FallbackBootstrapper implements WebModule {
@Override
public ServletContextListener init(ServletContext ctx) throws ServletException {
- ctx.setInitParameter("deploymentType", "SERVER_PROTOTYPE");
return ctx.createListener(IsisWebAppBootstrapper.class);
}
@Override
- public boolean isApplicable(ServletContext ctx) {
+ public boolean isApplicable(WebModuleContext ctx) {
// not required if another bootstrapper module is on the context
// e.g. the Wicket module
- return !ContextUtil.hasBootstrapper(ctx);
+ return !ctx.hasBootstrapper();
}
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_LogOnExceptionLogger.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_LogOnExceptionLogger.java
index e92cc70..5217a0d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_LogOnExceptionLogger.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_LogOnExceptionLogger.java
@@ -18,10 +18,6 @@
*/
package org.apache.isis.core.webapp.modules;
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
-import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
-
import javax.servlet.Filter;
import javax.servlet.FilterRegistration.Dynamic;
import javax.servlet.ServletContext;
@@ -30,6 +26,10 @@ import javax.servlet.ServletException;
import org.apache.isis.commons.internal.collections._Arrays;
+import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
+import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
+
/**
* Package private mixin for WebModule implementing WebModule.
* @since 2.0.0
@@ -38,8 +38,9 @@ final class WebModule_LogOnExceptionLogger implements WebModule {
private final static String LOGONLOGGER_FILTER_CLASS_NAME =
"org.apache.isis.core.webapp.diagnostics.IsisLogOnExceptionFilter";
-
- private final static String LOGONLOGGER_FILTER_NAME = "IsisLogOnExceptionFilter";
+ private final static String LOGONLOGGER_FILTER_NAME =
+ "IsisLogOnExceptionFilter";
+ private WebModuleContext webModuleContext;
@Override
@@ -48,6 +49,11 @@ final class WebModule_LogOnExceptionLogger implements WebModule {
}
@Override
+ public void prepare(WebModuleContext ctx) {
+ this.webModuleContext = ctx;
+ }
+
+ @Override
public ServletContextListener init(ServletContext ctx) throws ServletException {
final Filter filter;
@@ -64,13 +70,13 @@ final class WebModule_LogOnExceptionLogger implements WebModule {
return null; // filter was already registered somewhere else (eg web.xml)
}
- reg.addMappingForUrlPatterns(null, true, getProtectedUrlPatterns(ctx) ); // filter is forced last
+ reg.addMappingForUrlPatterns(null, true, getProtectedUrlPatterns() ); // filter is forced last
return null; // does not provide a listener
}
@Override
- public boolean isApplicable(ServletContext ctx) {
+ public boolean isApplicable(WebModuleContext ctx) {
try {
getDefaultClassLoader().loadClass(LOGONLOGGER_FILTER_CLASS_NAME);
return true;
@@ -81,8 +87,8 @@ final class WebModule_LogOnExceptionLogger implements WebModule {
// -- HELPER
- private String[] getProtectedUrlPatterns(ServletContext ctx) {
- return ContextUtil.streamProtectedPaths(ctx)
+ private String[] getProtectedUrlPatterns() {
+ return webModuleContext.streamProtectedPaths()
.collect(_Arrays.toArray(String.class));
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
index c9465e4..4926ca1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
@@ -23,8 +23,8 @@ import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
+import org.apache.isis.config.internal._Config;
import org.apache.isis.core.webapp.IsisSessionFilter;
-import org.apache.isis.core.webapp.IsisWebAppConfigProvider;
import static java.util.Objects.requireNonNull;
import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
@@ -57,24 +57,23 @@ final class WebModule_RestEasy implements WebModule {
}
@Override
- public void prepare(ServletContext ctx) {
+ public void prepare(WebModuleContext ctx) {
if(!isApplicable(ctx)) {
return;
}
// try to fetch restfulPath from config else fallback to default
- final String restfulPath =
- IsisWebAppConfigProvider.getInstance()
- .peekAtOrDefault(ctx, KEY_RESTFUL_BASE_PATH, KEY_RESTFUL_BASE_PATH_DEFAULT);
+ final String restfulPath = _Config
+ .peekAtString(KEY_RESTFUL_BASE_PATH, KEY_RESTFUL_BASE_PATH_DEFAULT);
putRestfulPath(restfulPath);
this.restfulPathConfigValue = restfulPath; // store locally for reuse
// register this module as a viewer
- ContextUtil.registerViewer(ctx, "restfulobjects");
- ContextUtil.registerProtectedPath(ctx, suffix(prefix(restfulPath, "/"), "/") + "*" );
+ ctx.addViewer("restfulobjects");
+ ctx.addProtectedPath(suffix(prefix(restfulPath, "/"), "/") + "*" );
}
@Override
@@ -136,7 +135,7 @@ final class WebModule_RestEasy implements WebModule {
}
@Override
- public boolean isApplicable(ServletContext ctx) {
+ public boolean isApplicable(WebModuleContext ctx) {
try {
getDefaultClassLoader().loadClass(RESTEASY_BOOTSTRAPPER);
return true;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Shiro.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Shiro.java
index 87aa79a..b97ea43 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Shiro.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Shiro.java
@@ -18,16 +18,16 @@
*/
package org.apache.isis.core.webapp.modules;
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
-import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
-
import javax.servlet.Filter;
import javax.servlet.FilterRegistration.Dynamic;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
+import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
+import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
+
/**
* Package private mixin for WebModule implementing WebModule.
* @since 2.0.0
@@ -79,7 +79,7 @@ final class WebModule_Shiro implements WebModule {
}
@Override
- public boolean isApplicable(ServletContext ctx) {
+ public boolean isApplicable(WebModuleContext ctx) {
try {
getDefaultClassLoader().loadClass(SHIRO_LISTENER_CLASS_NAME);
return true;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_StaticResources.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_StaticResources.java
index e280cf2..37f3704 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_StaticResources.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_StaticResources.java
@@ -46,7 +46,7 @@ final class WebModule_StaticResources implements WebModule {
}
@Override
- public void prepare(ServletContext ctx) {
+ public void prepare(WebModuleContext ctx) {
// nothing special required
}
@@ -71,7 +71,7 @@ final class WebModule_StaticResources implements WebModule {
}
@Override
- public boolean isApplicable(ServletContext ctx) {
+ public boolean isApplicable(WebModuleContext ctx) {
return true;
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
index 3462e40..8bcf82f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
@@ -25,7 +25,7 @@ import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.core.webapp.IsisWebAppConfigProvider;
+import org.apache.isis.config.internal._Config;
import static java.util.Objects.requireNonNull;
import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
@@ -55,28 +55,26 @@ final class WebModule_Wicket implements WebModule {
}
@Override
- public void prepare(ServletContext ctx) {
+ public void prepare(WebModuleContext ctx) {
if(!isAvailable()) {
return;
}
- final IsisWebAppConfigProvider configProvider = IsisWebAppConfigProvider.getInstance();
pathConfigValue =
- configProvider.peekAtOrDefault(ctx, "isis.viewer.wicket.basePath", "/wicket");
+ _Config.peekAtString("isis.viewer.wicket.basePath", "/wicket");
- {
- deploymentMode = _Context.isPrototyping()
- ? "development" : "deployment";
- }
+ deploymentMode = _Context.isPrototyping()
+ ? "development"
+ : "deployment";
appConfigValue =
- configProvider.peekAtOrDefault(ctx, "isis.viewer.wicket.app",
+ _Config.peekAtString("isis.viewer.wicket.app",
"org.apache.isis.viewer.wicket.viewer.IsisWicketApplication");
- ContextUtil.registerBootstrapper(ctx, this);
- ContextUtil.registerViewer(ctx, "wicket");
- ContextUtil.registerProtectedPath(ctx, suffix(prefix(pathConfigValue, "/"), "/") + "*" );
+ ctx.setHasBootstrapper();
+ ctx.addViewer("wicket");
+ ctx.addProtectedPath(suffix(prefix(pathConfigValue, "/"), "/") + "*");
}
@Override
@@ -107,7 +105,7 @@ final class WebModule_Wicket implements WebModule {
}
@Override
- public boolean isApplicable(ServletContext ctx) {
+ public boolean isApplicable(WebModuleContext ctx) {
return isAvailable();
}
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index 8b0af81..a5d4e37 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -29,6 +29,8 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.function.Function;
+import javax.servlet.ServletContext;
+
import com.google.common.base.Charsets;
import com.google.common.io.Resources;
import com.google.inject.Guice;
@@ -74,14 +76,13 @@ import org.apache.isis.commons.internal.context._Context;
import org.apache.isis.config.internal._Config;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
import org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
-import org.apache.isis.core.webapp.IsisWebAppConfigProvider;
+import org.apache.isis.core.webapp.IsisWebAppConfigHelper;
import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettingsAccessor;
import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
@@ -216,7 +217,6 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
@com.google.inject.Inject
private WicketViewerSettings settings;
- private IsisConfigurationBuilder isisConfigurationBuilder;
private final IsisWicketApplication_Experimental experimental;
@@ -246,22 +246,16 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
// --- prepare the configuration prior to init()
- isisConfigurationBuilder = prepareConfigurationBuilder();
+ prepareConfigurationBuilder(getServletContext());
super.internalInit();
}
- private IsisConfigurationBuilder prepareConfigurationBuilder() {
-
- final String isisConfigDir = getServletContext().getInitParameter("isis.config.dir");
+ private void prepareConfigurationBuilder(ServletContext ctx) {
+ final String isisConfigDir = ctx.getInitParameter("isis.config.dir");
configureLogging(isisConfigDir);
-
- final IsisConfigurationBuilder isisConfigurationBuilder = IsisWebAppConfigProvider.getInstance()
- .getConfigurationBuilder(getServletContext());
- isisConfigurationBuilder.addDefaultConfigurationResourcesAndPrimers();
-
- return isisConfigurationBuilder;
+ IsisWebAppConfigHelper.initConfigurationFrom(ctx);
}
private static AjaxRequestTarget decorate(final AjaxRequestTarget ajaxRequestTarget) {
@@ -289,8 +283,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
// that's suitable for the entire web-application to use as default.
_Context.setDefaultClassLoader(this.getClass().getClassLoader(), true);
- requireNonNull(isisConfigurationBuilder, "ConfigurationBuilder must be prepared prior to init().");
- final IsisConfiguration configuration = isisConfigurationBuilder.build();
+ final IsisConfiguration configuration;
List<Future<Object>> futures = null;
try {
@@ -306,6 +299,8 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
requestCycleListeners.add(requestCycleListenerForIsis);
requestCycleListeners.add(new PageRequestHandlerTracker());
+ configuration = _Config.getConfiguration();
+
//
// create IsisSessionFactory
//
diff --git a/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java b/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
index 75fe684..57c8b49 100644
--- a/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
+++ b/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
@@ -46,7 +46,6 @@ import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixture;
import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureFromEnvironmentVariable;
import org.apache.isis.core.runtime.runner.opts.OptionHandlerHelp;
import org.apache.isis.core.runtime.runner.opts.OptionHandlerSystemProperties;
-import org.apache.isis.core.webapp.IsisWebAppConfigProvider;
import org.apache.isis.core.webserver.config.WebServerConfigBuilder;
import org.apache.isis.core.webserver.internal.OptionHandlerPort;
import org.apache.isis.core.webserver.internal.OptionHandlerStartupMode;
@@ -144,7 +143,7 @@ public class WebServer {
ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY;
}
- private Server createJettyServerAndBindConfig(final IsisConfiguration configuration) {
+ private Server createJettyServerAndBindConfig(IsisConfiguration configuration) {
final int port = configuration.getInteger(
EMBEDDED_WEB_SERVER_PORT_KEY, EMBEDDED_WEB_SERVER_PORT_DEFAULT);
@@ -157,9 +156,6 @@ public class WebServer {
final WebAppContext context = new WebAppContext(SRC_MAIN_WEBAPP, webappContextPath);
jettyServer.setHandler(context);
- final IsisWebAppConfigProvider configProvider = IsisWebAppConfigProvider.registerInstanceIfAbsent();
- configProvider.addConfig(configuration.asMap());
-
return jettyServer;
}
diff --git a/core/webserver/src/main/java/org/apache/isis/core/webserver/config/WebServerConfigBuilder.java b/core/webserver/src/main/java/org/apache/isis/core/webserver/config/WebServerConfigBuilder.java
index 3ef8107..78db66d 100644
--- a/core/webserver/src/main/java/org/apache/isis/core/webserver/config/WebServerConfigBuilder.java
+++ b/core/webserver/src/main/java/org/apache/isis/core/webserver/config/WebServerConfigBuilder.java
@@ -10,21 +10,23 @@ import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.config.internal._Config;
import org.apache.isis.core.commons.config.ConfigurationConstants;
import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
import org.apache.isis.core.commons.resource.ResourceStreamSource;
import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
import org.apache.isis.core.runtime.optionhandler.BootPrinter;
import org.apache.isis.core.runtime.optionhandler.OptionHandler;
+import static org.apache.isis.config.internal._Config.acceptBuilder;
+
public class WebServerConfigBuilder {
- private final IsisConfigurationBuilder isisConfigurationBuilder = new IsisConfigurationBuilder();
-
public WebServerConfigBuilder() {
- isisConfigurationBuilder.addResourceStreamSources(resourceStreamSources());
+ acceptBuilder(builder->{
+ builder.addResourceStreamSources(resourceStreamSources());
+ });
}
public boolean parseAndPrimeWith(final List<OptionHandler> optionHandlers, final String[] args) {
@@ -39,9 +41,15 @@ public class WebServerConfigBuilder {
final boolean parsedOk = parseAndPrimeWith(options, optionHandlers, args);
if(parsedOk) {
- for (final OptionHandler optionHandler : optionHandlers) {
- isisConfigurationBuilder.primeWith(optionHandler);
- }
+
+ acceptBuilder(builder->{
+
+ for (final OptionHandler optionHandler : optionHandlers) {
+ builder.primeWith(optionHandler);
+ }
+
+ });
+
}
return parsedOk;
@@ -79,7 +87,7 @@ public class WebServerConfigBuilder {
}
public IsisConfiguration build() {
- return isisConfigurationBuilder.build();
+ return _Config.getConfiguration();
}
}