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 2019/05/09 17:39:31 UTC

[isis] branch 2112_SpringBoot updated (a51213d -> 6d6100e)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch 2112_SpringBoot
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from a51213d  ISIS-2112: further fixing provisioning issues
     new 6f770fb  ISIS-2112: resolve 'dependsOn' cycle with SpecificationLoader
     new 1358116  ISIS-2112: remove @Any qualifiers at injection points
     new 9304c68  ISIS-2112: fixes poReader provisioning
     new 6d6100e  ISIS-2112: fixes provisioning of MetamodelEventService

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../isis/core/metamodel/MetaModelContext.java      |   2 +-
 .../isis/core/metamodel/MetaModelContexts.java     | 128 ++++++++++++++++++++-
 .../events/MetamodelEventSupport_Spring.java       | 111 ++++++++++++++++++
 .../services/grid/GridLoaderServiceDefault.java    |   4 +-
 .../services/grid/GridServiceDefault.java          |   4 +-
 .../specloader/SpecificationLoaderDefault.java     |  22 ----
 .../standard/AuthorizationManagerStandard.java     |   3 +
 .../core/runtime/services/i18n/po/PoReader.java    |  33 ++++--
 .../services/i18n/po/TranslationServicePo.java     |  34 +++---
 .../context/session/RuntimeEventService.java       |   8 --
 .../session/RuntimeEventSupport_Spring.java        |  28 +++--
 .../system/session/IsisSessionFactoryBuilder.java  |  16 +--
 .../system/session/IsisSessionProducerBean.java    |  22 +++-
 .../RepresentationServiceContentNegotiator.java    |   5 +-
 .../ContentNegotiationServiceXRoDomainType.java    |   4 +-
 .../services/TranslationsResolverWicket.java       |  11 +-
 .../wicket/ui/pages/login/IsisSignInPanel.java     |   7 +-
 17 files changed, 324 insertions(+), 118 deletions(-)
 create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventSupport_Spring.java


[isis] 02/04: ISIS-2112: remove @Any qualifiers at injection points

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch 2112_SpringBoot
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 1358116ff094459f62f948325a4985323a0168d7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 9 19:12:30 2019 +0200

    ISIS-2112: remove @Any qualifiers at injection points
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2112
---
 .../core/metamodel/services/grid/GridLoaderServiceDefault.java     | 4 +---
 .../isis/core/metamodel/services/grid/GridServiceDefault.java      | 4 +---
 .../rendering/service/RepresentationServiceContentNegotiator.java  | 5 ++---
 .../service/conneg/ContentNegotiationServiceXRoDomainType.java     | 4 +---
 .../apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java  | 7 ++++---
 5 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
index 7e779fd..b82bf1e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
@@ -24,8 +24,6 @@ import java.util.Map;
 import java.util.Objects;
 
 import javax.annotation.PostConstruct;
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import javax.xml.bind.JAXBContext;
@@ -276,6 +274,6 @@ public class GridLoaderServiceDefault implements GridLoaderService {
 
     @Inject MessageService messageService;
     @Inject JaxbService jaxbService;
-    @Inject @Any Instance<GridSystemService<?>> gridSystemServices;
+    @Inject List<GridSystemService<?>> gridSystemServices;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
index 121f5d2..7032ea9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
@@ -19,8 +19,6 @@ package org.apache.isis.core.metamodel.services.grid;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
@@ -204,7 +202,7 @@ public class GridServiceDefault implements GridService {
     ////////////////////////////////////////////////////////
 
     @Inject GridLoaderService gridLoaderService;
-    @Inject @Any private Instance<GridSystemService<?>> gridSystemServices;
+    @Inject private List<GridSystemService<?>> gridSystemServices;
     
     
 
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
index 5f06e87..8d5e390 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
@@ -16,11 +16,10 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.service;
 
+import java.util.List;
 import java.util.function.Function;
 
 import javax.annotation.PostConstruct;
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import javax.ws.rs.core.Response;
@@ -174,5 +173,5 @@ public class RepresentationServiceContentNegotiator implements RepresentationSer
         return responseBuilder.build();
     }
 
-    @Inject @Any Instance<ContentNegotiationService> contentNegotiationServices;
+    @Inject List<ContentNegotiationService> contentNegotiationServices;
 }
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
index 20e9a26..60c2eef 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceXRoDomainType.java
@@ -20,8 +20,6 @@ package org.apache.isis.viewer.restfulobjects.rendering.service.conneg;
 
 import java.util.List;
 
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
@@ -157,6 +155,6 @@ public class ContentNegotiationServiceXRoDomainType extends ContentNegotiationSe
         return domainObject;
     }
 
-    @Inject @Any Instance<ContentMappingService> contentMappingServices;
+    @Inject List<ContentMappingService> contentMappingServices;
 
 }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java
index 505c020..a3f04be 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/login/IsisSignInPanel.java
@@ -19,7 +19,8 @@
 
 package org.apache.isis.viewer.wicket.ui.pages.login;
 
-import javax.enterprise.inject.Instance;
+import java.util.List;
+
 import javax.inject.Inject;
 
 import org.apache.wicket.Component;
@@ -50,8 +51,8 @@ public class IsisSignInPanel extends SignInPanel {
     @Inject transient IsisSessionFactory isisSessionFactory;
     @Inject transient ServiceInjector servicesInjector;
     @Inject transient private PageClassRegistry pageClassRegistry;
-    @Inject transient Instance<UserRegistrationService> anyUserRegistrationService;
-    @Inject transient Instance<EmailNotificationService> anyEmailNotificationService;
+    @Inject transient List<UserRegistrationService> anyUserRegistrationService;
+    @Inject transient List<EmailNotificationService> anyEmailNotificationService;
     
     private final boolean signUpLink;
     private final boolean passwordResetLink;


[isis] 04/04: ISIS-2112: fixes provisioning of MetamodelEventService

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch 2112_SpringBoot
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 6d6100e5edb0b174b4e3d2c0456d26a731dcb5c8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 9 19:39:25 2019 +0200

    ISIS-2112: fixes provisioning of MetamodelEventService
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2112
---
 .../events/MetamodelEventSupport_Spring.java       | 111 +++++++++++++++++++++
 .../context/session/RuntimeEventService.java       |   8 --
 2 files changed, 111 insertions(+), 8 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventSupport_Spring.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventSupport_Spring.java
new file mode 100644
index 0000000..f7e5b4d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventSupport_Spring.java
@@ -0,0 +1,111 @@
+package org.apache.isis.core.metamodel.services.events;
+
+import java.lang.annotation.Annotation;
+import java.util.concurrent.CompletionStage;
+
+import javax.enterprise.event.Event;
+import javax.enterprise.event.NotificationOptions;
+import javax.enterprise.util.TypeLiteral;
+
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import org.apache.isis.applib.events.domain.ActionDomainEvent;
+import org.apache.isis.applib.events.domain.CollectionDomainEvent;
+import org.apache.isis.applib.events.domain.PropertyDomainEvent;
+import org.apache.isis.applib.events.ui.CssClassUiEvent;
+import org.apache.isis.applib.events.ui.IconUiEvent;
+import org.apache.isis.applib.events.ui.LayoutUiEvent;
+import org.apache.isis.applib.events.ui.TitleUiEvent;
+import org.apache.isis.commons.internal.debug._Probe;
+
+import lombok.RequiredArgsConstructor;
+
+@Configuration
+public class MetamodelEventSupport_Spring {
+    
+    @Bean
+    public Event<CssClassUiEvent<Object>> cssClassUiEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<CssClassUiEvent<Object>>(publisher);
+    }
+    
+    @Bean
+    public Event<IconUiEvent<Object>> iconUiEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<IconUiEvent<Object>>(publisher);
+    }
+    
+    @Bean
+    public Event<LayoutUiEvent<Object>> layoutUiEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<LayoutUiEvent<Object>>(publisher);
+    }
+    
+    @Bean
+    public Event<TitleUiEvent<Object>> titleUiEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<TitleUiEvent<Object>>(publisher);
+    }
+    
+    @Bean
+    public Event<ActionDomainEvent<?>> actionDomainEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<ActionDomainEvent<?>>(publisher);
+    }
+    
+    @Bean
+    public Event<PropertyDomainEvent<?, ?>> propertyDomainEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<PropertyDomainEvent<?, ?>>(publisher);
+    }
+    
+    @Bean
+    public Event<CollectionDomainEvent<?, ?>> collectionDomainEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<CollectionDomainEvent<?, ?>>(publisher);
+    }
+    
+    // -- HELPER
+    
+    @RequiredArgsConstructor
+    static class SimpleEvent<T> implements Event<T> {
+
+        private final ApplicationEventPublisher publisher;
+        
+        _Probe probe = _Probe.unlimited().label("SimpleEvent");
+
+        @Override
+        public void fire(T event) {
+            probe.println("fire(%s)", event.getClass());
+            publisher.publishEvent(event);
+        }
+
+        @Override
+        public <U extends T> CompletionStage<U> fireAsync(U event) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <U extends T> CompletionStage<U> fireAsync(U event, NotificationOptions options) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Event<T> select(Annotation... qualifiers) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <U extends T> Event<U> select(Class<U> subtype, Annotation... qualifiers) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public <U extends T> Event<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+        
+    }
+    
+
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventService.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventService.java
index e46fe39..9b7588b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventService.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventService.java
@@ -22,7 +22,6 @@ import javax.enterprise.event.Event;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.apache.isis.applib.events.ui.CssClassUiEvent;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstalledEvent;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstallingEvent;
 import org.apache.isis.core.runtime.system.session.IsisSession;
@@ -77,13 +76,6 @@ public class RuntimeEventService {
 	public void fireFixturesInstalled(FixturesInstalledEvent fixturesInstalledEvent) {
 		fixturesInstalledEvents.fire(fixturesInstalledEvent);
 	}
-	
-	// -- METAMODEL EVENTS
-	
-	public void fireCssClassUiEvent(CssClassUiEvent<Object> cssClassUiEvent) {
-		// TODO Auto-generated method stub
-		
-	}
 		
 
 }


[isis] 03/04: ISIS-2112: fixes poReader provisioning

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch 2112_SpringBoot
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 9304c68515db70542f5140278ea3913b8314f3a7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 9 19:34:31 2019 +0200

    ISIS-2112: fixes poReader provisioning
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2112
---
 .../core/runtime/services/i18n/po/PoReader.java    | 33 +++++++++++++--------
 .../services/i18n/po/TranslationServicePo.java     | 34 ++++++++++------------
 .../services/TranslationsResolverWicket.java       | 11 +++----
 3 files changed, 40 insertions(+), 38 deletions(-)

diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/PoReader.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/PoReader.java
index 9822194..da55735 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/PoReader.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/PoReader.java
@@ -23,9 +23,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.stream.Collectors;
 
 import org.apache.isis.applib.services.i18n.LocaleProvider;
 import org.apache.isis.applib.services.i18n.TranslationService;
@@ -34,12 +32,15 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.core.commons.collections.Bin;
+
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 class PoReader extends PoAbstract {
 
     public static final String DASH = "-";
     public static final String UNDERSCORE = "_";
-    public static Logger LOG = LoggerFactory.getLogger(PoReader.class);
 
     private final Map<Locale, Map<ContextAndMsgId, String>> translationByKeyByLocale = _Maps.newHashMap();
     private final Map<Locale, Boolean> usesFallbackByLocale = _Maps.newHashMap();
@@ -59,18 +60,21 @@ class PoReader extends PoAbstract {
      * </p>
      */
     private final String basename = "translations";
-    private final TranslationsResolver translationsResolver;
-    private final LocaleProvider localeProvider;
+    private final Bin<TranslationsResolver> translationsResolver;
+    private final Bin<LocaleProvider> localeProvider;
 
     private List<String> fallback;
 
     public PoReader(final TranslationServicePo translationServicePo) {
         super(translationServicePo, TranslationService.Mode.READ);
         translationsResolver = translationServicePo.getTranslationsResolver();
-        if(translationsResolver == null) {
-            LOG.warn("No translationsResolver available");
+        if(translationsResolver.isEmpty()) {
+            log.warn("No TranslationsResolver available");
         }
         localeProvider = translationServicePo.getLocaleProvider();
+        if(localeProvider.isEmpty()) {
+            log.warn("No LocaleProvider available");
+        }
     }
 
     // -- init, shutdown
@@ -81,7 +85,7 @@ class PoReader extends PoAbstract {
     void init() {
         fallback = readUrl(basename + ".po");
         if(fallback == null) {
-            LOG.info("No fallback translations found; i18n is in effect disabled for this application");
+            log.info("No fallback translations found; i18n is in effect disabled for this application");
             fallback = Collections.emptyList();
         }
     }
@@ -127,7 +131,9 @@ class PoReader extends PoAbstract {
 
         final Locale targetLocale;
         try {
-            targetLocale = localeProvider.getLocale();
+            targetLocale = localeProvider.getFirst()
+                    .map(LocaleProvider::getLocale)
+                    .orElse(null);
             if(targetLocale == null) {
                 // eg if request from RO viewer and the (default) LocaleProviderWicket is being used.
                 return msgId;
@@ -241,14 +247,17 @@ class PoReader extends PoAbstract {
     }
 
     private List<String> readUrl(final String candidate) {
-        return translationsResolver.readLines(candidate);
+        return translationsResolver.stream()
+        .map(resolver->resolver.readLines(candidate))
+        .flatMap(List::stream)
+        .collect(Collectors.toList());
     }
 
 
     // to avoid flooding the logs
     private void logInfoIfNotPreviously(final String infoMessage) {
         if(!loggedInfoMessages.contains(infoMessage)) {
-            LOG.info(infoMessage);
+            log.info(infoMessage);
             loggedInfoMessages.add(infoMessage);
         }
     }
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
index 52919a1..0e2cc19 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
@@ -20,28 +20,22 @@ package org.apache.isis.core.runtime.services.i18n.po;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.inject.Singleton;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.i18n.LocaleProvider;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.i18n.TranslationsResolver;
+import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.core.commons.collections.Bin;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 
 import static org.apache.isis.config.internal._Config.getConfiguration;
 
-@DomainService(
-        nature = NatureOfService.DOMAIN,
-        menuOrder = "" + Integer.MAX_VALUE
-        )
+@Singleton
 public class TranslationServicePo implements TranslationService {
 
-    public static Logger LOG = LoggerFactory.getLogger(TranslationServicePo.class);
-
     public static final String KEY_PO_MODE = "isis.services.translation.po.mode";
 
     private PoAbstract po;
@@ -172,20 +166,22 @@ public class TranslationServicePo implements TranslationService {
 
     // //////////////////////////////////////
 
-    @javax.inject.Inject
-    private TranslationsResolver translationsResolver;
+    
+    private _Lazy<Bin<TranslationsResolver>> translationsResolvers = _Lazy.threadSafe(()->
+        IsisContext.getServiceRegistry().select(TranslationsResolver.class) );
 
     @Programmatic
-    TranslationsResolver getTranslationsResolver() {
-        return translationsResolver;
+    Bin<TranslationsResolver> getTranslationsResolver() {
+        return translationsResolvers.get();
     }
 
-    @javax.inject.Inject
-    private LocaleProvider localeProvider;
+    private _Lazy<Bin<LocaleProvider>> localeProviders = _Lazy.threadSafe(()->
+        IsisContext.getServiceRegistry().select(LocaleProvider.class) );
 
     @Programmatic
-    LocaleProvider getLocaleProvider() {
-        return localeProvider;
+    Bin<LocaleProvider> getLocaleProvider() {
+        return localeProviders.get();
     }
 
+
 }
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
index f064097..40d933a 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
@@ -37,24 +37,21 @@ import com.google.common.io.CharSource;
 import com.google.common.io.Files;
 import com.google.common.io.Resources;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.i18n.TranslationsResolver;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.config.WebAppConstants;
 import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication;
 
+import lombok.extern.slf4j.Slf4j;
+
 
 /**
  * An implementation that reads from /WEB-INF/...
  */
-@Singleton
+@Singleton @Slf4j
 public class TranslationsResolverWicket implements TranslationsResolver {
 
-    public static Logger LOG = LoggerFactory.getLogger(TranslationsResolverWicket.class);
-
     @Override
     @Programmatic
     public List<String> readLines(final String file) {
@@ -63,7 +60,7 @@ public class TranslationsResolverWicket implements TranslationsResolver {
         final String configLocation = servletContext.getInitParameter(WebAppConstants.CONFIG_DIR_PARAM);
         try {
             if(configLocation != null) {
-                LOG.info( "Reading translations relative to config override location: {}", configLocation );
+                log.info( "Reading translations relative to config override location: {}", configLocation );
                 return Files.readLines(newFile(configLocation, file), Charsets.UTF_8);
             } else {
                 final URL url = servletContext.getResource("/WEB-INF/" + file);


[isis] 01/04: ISIS-2112: resolve 'dependsOn' cycle with SpecificationLoader

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch 2112_SpringBoot
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 6f770fb64be07e2127aab65d555593086e72bf88
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 9 18:55:45 2019 +0200

    ISIS-2112: resolve 'dependsOn' cycle with SpecificationLoader
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2112
---
 .../isis/core/metamodel/MetaModelContext.java      |   2 +-
 .../isis/core/metamodel/MetaModelContexts.java     | 128 ++++++++++++++++++++-
 .../specloader/SpecificationLoaderDefault.java     |  22 ----
 .../standard/AuthorizationManagerStandard.java     |   3 +
 .../session/RuntimeEventSupport_Spring.java        |  28 +++--
 .../system/session/IsisSessionFactoryBuilder.java  |  16 +--
 .../system/session/IsisSessionProducerBean.java    |  22 +++-
 7 files changed, 164 insertions(+), 57 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java
index 97931ef..2727ac2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContext.java
@@ -87,7 +87,7 @@ public interface MetaModelContext {
     
     static MetaModelContext current() {
         return _Context.computeIfAbsent(MetaModelContext.class, 
-                __->MetaModelContexts.usingCDI()); // default
+                __->MetaModelContexts.usingSpring()); // default
     }
     
     static void preset(MetaModelContext metaModelContext) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
index 50acf0d..268abc8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/MetaModelContexts.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.commons.internal.base._Lazy;
+import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.spring._Spring;
 import org.apache.isis.config.IsisConfiguration;
@@ -64,6 +65,118 @@ public final class MetaModelContexts {
 
         @Getter(lazy=true) 
         private final ObjectAdapterProvider objectAdapterProvider =
+                _CDI.getSingletonElseFail(ObjectAdapterProvider.class);
+
+        @Getter(lazy=true) 
+        private final ServiceInjector serviceInjector =
+                _CDI.getSingletonElseFail(ServiceInjector.class);
+
+        @Getter(lazy=true) 
+        private final ServiceRegistry serviceRegistry =
+                _CDI.getSingletonElseFail(ServiceRegistry.class);
+
+        @Getter(lazy=true) 
+        private final SpecificationLoader specificationLoader = 
+                _CDI.getSingletonElseFail(SpecificationLoader.class);
+
+        @Getter(lazy=true) 
+        private final AuthenticationSessionProvider authenticationSessionProvider =
+                _CDI.getSingletonElseFail(AuthenticationSessionProvider.class);
+
+        @Getter(lazy=true) 
+        private final TranslationService translationService =
+                _CDI.getSingletonElseFail(TranslationService.class);
+
+        @Getter(lazy=true) 
+        private final AuthorizationManager authorizationManager =
+                _CDI.getSingletonElseFail(AuthorizationManager.class); 
+
+        @Getter(lazy=true) 
+        private final AuthenticationManager authenticationManager =
+                _CDI.getSingletonElseFail(AuthenticationManager.class);
+
+        @Getter(lazy=true) 
+        private final TitleService titleService =
+                _CDI.getSingletonElseFail(TitleService.class);
+
+//        @Getter(lazy=true) 
+//        private final ObjectAdapterService objectAdapterService =
+//        _CDI.getSingletonElseFail(ObjectAdapterService.class);
+
+        @Getter(lazy=true) 
+        private final RepositoryService repositoryService =
+                _CDI.getSingletonElseFail(RepositoryService.class);
+        
+        @Getter(lazy=true) 
+        private final TransactionService transactionService =
+                _CDI.getSingletonElseFail(TransactionService.class);
+        
+
+        @Override
+        public final AuthenticationSession getAuthenticationSession() {
+            return getAuthenticationSessionProvider().getAuthenticationSession();
+        }
+
+        @Override
+        public final ObjectSpecification getSpecification(final Class<?> type) {
+            return type != null ? getSpecificationLoader().loadSpecification(type) : null;
+        }
+
+        @Override
+        public final TransactionState getTransactionState() {
+            return getTransactionService().getTransactionState();
+        }
+        
+        // -- SERVICE SUPPORT
+        
+        @Override
+        public Stream<ObjectAdapter> streamServiceAdapters() {
+            return serviceAdapters.get().values().stream();
+        }
+        
+        @Override
+        public ObjectAdapter lookupServiceAdapterById(final String serviceId) {
+            return serviceAdapters.get().get(serviceId);
+        }
+        
+        
+        // -- HELPER
+        
+        private final _Lazy<Map<String, ObjectAdapter>> serviceAdapters = _Lazy.of(this::initServiceAdapters);
+        
+        private Map<String, ObjectAdapter> initServiceAdapters() {
+        	
+        	val objectAdapterProvider = getObjectAdapterProvider();
+        	
+            return getServiceRegistry().streamServices()
+            .map(objectAdapterProvider::adapterFor) 
+            .peek(serviceAdapter->{
+                val oid = serviceAdapter.getOid();
+                if(oid.isTransient()) {
+                    val msg = "ObjectAdapter for 'Bean' is expected not to be 'transient' " + oid;
+                    throw _Exceptions.unrecoverable(msg);
+                }
+            })
+            .collect(Collectors.toMap(ServiceUtil::idOfAdapter, v->v, (o,n)->n, LinkedHashMap::new));
+        }
+
+        // -------------------------------------------------------------------------------
+
+
+    }
+
+    final static MetaModelContext usingCDI() {
+        return new MetaModelContextUsingCDI();
+    }
+    
+    static class MetaModelContextUsingSpring implements MetaModelContext {
+
+        @Getter(lazy=true) 
+        private final IsisConfiguration configuration = 
+                _Config.getConfiguration();
+
+        @Getter(lazy=true) 
+        private final ObjectAdapterProvider objectAdapterProvider =
                 _Spring.getSingletonElseFail(ObjectAdapterProvider.class);
 
         @Getter(lazy=true) 
@@ -144,9 +257,9 @@ public final class MetaModelContexts {
         private final _Lazy<Map<String, ObjectAdapter>> serviceAdapters = _Lazy.of(this::initServiceAdapters);
         
         private Map<String, ObjectAdapter> initServiceAdapters() {
-        	
-        	val objectAdapterProvider = getObjectAdapterProvider();
-        	
+            
+            val objectAdapterProvider = getObjectAdapterProvider();
+            
             return getServiceRegistry().streamServices()
             .map(objectAdapterProvider::adapterFor) 
             .peek(serviceAdapter->{
@@ -163,9 +276,10 @@ public final class MetaModelContexts {
 
 
     }
-
-    final static MetaModelContext usingCDI() {
-        return new MetaModelContextUsingCDI();
+    
+    
+    final static MetaModelContext usingSpring() {
+        return new MetaModelContextUsingSpring();
     }
     
     // -- JUNIT TEST SUPPORT
@@ -225,5 +339,7 @@ public final class MetaModelContexts {
 		}
     	
     }
+
+   
     
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
index ab1ffce..ece3bec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
@@ -177,28 +177,6 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
 		log.info("init() - done");
 
-		//FIXME [2033] remove debug code ...
-		//{
-		//        	streamServiceClasses()
-		//        	.forEach(service->probe.println("using service %s", service));
-		//        	
-		//        	
-		//        	val metaModelService = _CDI.getSingleton(MetaModelService.class);
-		//        	val jaxbService = _CDI.getSingleton(JaxbService.class);
-		//        	
-		//        	val metamodelDto =
-		//        			metaModelService.exportMetaModel(
-		//        					new MetaModelService.Config()
-		//        							.withIgnoreNoop()
-		//        							.withIgnoreAbstractClasses()
-		//        							.withIgnoreBuiltInValueTypes()
-		//        							.withIgnoreInterfaces()
-		//        							.withPackagePrefix("domainapp")
-		//        			);
-		//			
-		//			final String xml = jaxbService.toXml(metamodelDto);
-		//			//probe.println(xml);
-		//        }
 	}
 
 	@Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/runtime/authorization/standard/AuthorizationManagerStandard.java b/core/metamodel/src/main/java/org/apache/isis/core/runtime/authorization/standard/AuthorizationManagerStandard.java
index 8f03112..a13b8a4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/runtime/authorization/standard/AuthorizationManagerStandard.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/runtime/authorization/standard/AuthorizationManagerStandard.java
@@ -25,6 +25,8 @@ import javax.enterprise.event.Observes;
 import javax.enterprise.inject.Vetoed;
 import javax.inject.Inject;
 
+import org.springframework.context.event.EventListener;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.sudo.SudoService;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
@@ -108,6 +110,7 @@ public class AuthorizationManagerStandard implements AuthorizationManager {
         return (identifier.getClassName().equals(""));
     }
 
+    @EventListener
     public static void refineProgrammingModel(@Observes ProgrammingModel baseProgrammingModel) {
         final AuthorizationFacetFactory facetFactory = new AuthorizationFacetFactory();
         baseProgrammingModel.addFactory(facetFactory);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventSupport_Spring.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventSupport_Spring.java
index 4381e01..f7127ef 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventSupport_Spring.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/session/RuntimeEventSupport_Spring.java
@@ -7,46 +7,52 @@ import javax.enterprise.event.Event;
 import javax.enterprise.event.NotificationOptions;
 import javax.enterprise.util.TypeLiteral;
 
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 import org.apache.isis.applib.fixturescripts.events.FixturesInstalledEvent;
 import org.apache.isis.applib.fixturescripts.events.FixturesInstallingEvent;
 import org.apache.isis.commons.internal.debug._Probe;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
+
+import lombok.RequiredArgsConstructor;
 
 @Configuration
 public class RuntimeEventSupport_Spring {
     
     @Bean
-    public Event<AppLifecycleEvent> appLifecycleEvents() {
-        return new SimpleEvent<AppLifecycleEvent>();
+    public Event<AppLifecycleEvent> appLifecycleEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<AppLifecycleEvent>(publisher);
     }
     
     @Bean
-    public Event<SessionLifecycleEvent> sessionLifecycleEvents() {
-        return new SimpleEvent<SessionLifecycleEvent>();
+    public Event<SessionLifecycleEvent> sessionLifecycleEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<SessionLifecycleEvent>(publisher);
     }
     
     @Bean
-    public Event<FixturesInstallingEvent> fixturesInstallingEvents() {
-        return new SimpleEvent<FixturesInstallingEvent>();
+    public Event<FixturesInstallingEvent> fixturesInstallingEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<FixturesInstallingEvent>(publisher);
     }
     
     @Bean
-    public Event<FixturesInstalledEvent> fixturesInstalledEvents() {
-        return new SimpleEvent<FixturesInstalledEvent>();
+    public Event<FixturesInstalledEvent> fixturesInstalledEvents(ApplicationEventPublisher publisher) {
+        return new SimpleEvent<FixturesInstalledEvent>(publisher);
     }
     
     // -- HELPER
     
+    @RequiredArgsConstructor
     static class SimpleEvent<T> implements Event<T> {
 
-        _Probe probe = _Probe.unlimited().label("SimpleEvent");
+        private final ApplicationEventPublisher publisher;
         
+        _Probe probe = _Probe.unlimited().label("SimpleEvent");
+
         @Override
         public void fire(T event) {
-            probe.warnNotImplementedYet("fire("+event+")");
+            probe.println("fire(%s)", event.getClass());
+            publisher.publishEvent(event);
         }
 
         @Override
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 a6408b5..8b6b785 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
@@ -31,7 +31,6 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.IsisSystemException;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.context.session.RuntimeEventService;
@@ -44,6 +43,7 @@ import org.apache.isis.schema.utils.ChangesDtoUtils;
 import org.apache.isis.schema.utils.CommandDtoUtils;
 import org.apache.isis.schema.utils.InteractionDtoUtils;
 
+import lombok.val;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
@@ -51,12 +51,10 @@ class IsisSessionFactoryBuilder {
 
     // -- constructors, accessors
 
-    private final SpecificationLoaderFactory specificationLoaderFactory;
     private final IsisLocaleInitializer localeInitializer;
     private final IsisTimeZoneInitializer timeZoneInitializer;
 
     public IsisSessionFactoryBuilder() {
-        this.specificationLoaderFactory = new SpecificationLoaderFactory();
         this.localeInitializer = new IsisLocaleInitializer();
         this.timeZoneInitializer = new IsisTimeZoneInitializer();
     }
@@ -83,17 +81,16 @@ class IsisSessionFactoryBuilder {
         }
 
         IsisSessionFactoryDefault isisSessionFactory;
-        try {
+        {
 
             final ServiceRegistry serviceRegistry = IsisContext.getServiceRegistry();
             final AuthenticationManager authenticationManager = IsisContext.getAuthenticationManager();
             final AuthorizationManager authorizationManager = IsisContext.getAuthorizationManager();
             final RuntimeEventService runtimeEventService = serviceRegistry.lookupServiceElseFail(RuntimeEventService.class);
 
-            final SpecificationLoader specificationLoader =
-                    specificationLoaderFactory.createSpecificationLoader();
-            
             serviceRegistry.validateServices();
+            
+            val specificationLoader = IsisContext.getSpecificationLoader();
 
             // instantiate the IsisSessionFactory
             isisSessionFactory = new IsisSessionFactoryDefault();
@@ -163,10 +160,7 @@ class IsisSessionFactoryBuilder {
 //                    );
 
 
-        } catch (final IsisSystemException ex) {
-            log.error("failed to initialise", ex);
-            throw new RuntimeException(ex);
-        }
+        } 
 
         return isisSessionFactory;
     }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionProducerBean.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionProducerBean.java
index 908d3f8..1a5bdd5 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionProducerBean.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionProducerBean.java
@@ -29,7 +29,9 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.debug._Probe;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.IsisSystemException;
 
 /**
  * @deprecated TODO [2033] convert ...
@@ -48,22 +50,30 @@ public class IsisSessionProducerBean {
 
     @Inject ServiceRegistry serviceRegistry; // depends on
     
-	@Bean @Produces @Singleton //XXX note: the resulting singleton is not life-cycle managed by CDI, neither are InjectionPoints resolved by CDI
+	@Bean @Produces @Singleton //XXX note: the resulting singleton is not life-cycle managed by CDI/Spring, neither are InjectionPoints resolved by CDI/Spring
 	public IsisSessionFactory produceIsisSessionFactory() {
 		return _Context.computeIfAbsent(IsisSessionFactory.class, this::newIsisSessionFactory);
 	}
 
-	@Bean @Produces @Singleton //XXX note: the resulting singleton is not life-cycle managed by CDI, neither are InjectionPoints resolved by CDI
-	public SpecificationLoader produceSpecificationLoader() {
-		return produceIsisSessionFactory().getSpecificationLoader();
+	@Bean @Produces @Singleton //XXX note: the resulting singleton is not life-cycle managed by CDI/Spring, neither are InjectionPoints resolved by CDI/Spring
+	public SpecificationLoader produceSpecificationLoader() throws IsisSystemException {
+	    return _Context.computeIfAbsent(SpecificationLoader.class, this::newSpecificationLoader);
 	}
 	
 	// -- HELPER
 	
-	private final _Lazy<IsisSessionFactory> isisSessionFactorySingleton = 
-			_Lazy.threadSafe(this::newIsisSessionFactory);
+//	private final _Lazy<IsisSessionFactory> isisSessionFactorySingleton = 
+//			_Lazy.threadSafe(this::newIsisSessionFactory);
 	
 	private final static _Probe probe = _Probe.maxCallsThenExitWithStacktrace(10).label("IsisSessionProducerBean");
+
+	private SpecificationLoader newSpecificationLoader() {
+	    try {
+            return new SpecificationLoaderFactory().createSpecificationLoader();
+        } catch (IsisSystemException e) {
+            throw _Exceptions.unrecoverable(e);
+        }
+	}
 	
 	private IsisSessionFactory newIsisSessionFactory() {