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/01/26 16:00:46 UTC

[isis] branch 2033-IoC updated: ISIS-2033: fixes provisioning of email related services

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

ahuber pushed a commit to branch 2033-IoC
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/2033-IoC by this push:
     new c72ab46  ISIS-2033: fixes provisioning of email related services
c72ab46 is described below

commit c72ab4658f9a201ba1e70213c4791412f8dff403
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jan 26 17:00:36 2019 +0100

    ISIS-2033: fixes provisioning of email related services
    
    also handle serialization aspects such that injection points are
    transient
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../apache/isis/applib/annotation/Constants.java   |  6 ++++
 .../isis/applib/services/email/EmailService.java   | 12 -------
 .../services/userreg/EmailNotificationService.java | 11 -------
 .../apache/isis/config/beans/WebAppConfigBean.java |  6 +++-
 .../isis/core/plugins/ioc/weld/WeldFactory.java    |  2 ++
 .../services/email/EmailServiceDefault.java        | 21 ++++++------
 .../userreg/EmailNotificationServiceDefault.java   | 27 ++++-----------
 .../wicket/viewer/IsisWicketApplication.java       |  9 +++--
 .../services/EmailNotificationServiceWicket.java   | 13 ++------
 .../password_reset/PasswordResetEmailPanel.java    | 29 +++++++++--------
 .../accmngt/signup/RegistrationFormPanel.java      | 29 +++++++++--------
 .../wicket/ui/pages/login/IsisSignInPanel.java     | 38 +++++++++-------------
 .../application/HelloWorldAppManifest.java         | 19 ++++++++---
 13 files changed, 98 insertions(+), 124 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Constants.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Constants.java
index c33615f..ea52801 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Constants.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Constants.java
@@ -24,4 +24,10 @@ public class Constants {
     private Constants(){}
 
     public static final String MENU_ORDER_DEFAULT = "" + (Integer.MAX_VALUE - 100);
+    
+    /**
+     * use for @Priority(value=...) as wicket default, when required
+     */
+    public static final int WICKET_SERVICE_PRIORITY = 20;
+    
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/email/EmailService.java b/core/applib/src/main/java/org/apache/isis/applib/services/email/EmailService.java
index d2ca299..294af48 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/email/EmailService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/email/EmailService.java
@@ -22,9 +22,6 @@ import java.io.Serializable;
 import java.util.List;
 
 import javax.activation.DataSource;
-import javax.annotation.PostConstruct;
-
-import org.apache.isis.applib.annotation.Programmatic;
 
 /**
  * Provides the ability to send emails to one or more recipients.
@@ -37,22 +34,13 @@ import org.apache.isis.applib.annotation.Programmatic;
 public interface EmailService extends Serializable {
 
     /**
-     * Always called by the framework, and allows the implementation to read configuration properties and initialize itself
-     */
-    @PostConstruct
-    @Programmatic
-    public void init() ;
-
-    /**
      * Main API to send email and optional attachments.
      */
-    @Programmatic
     boolean send(List<String> to, List<String> cc, List<String> bcc, String subject, String body, DataSource... attachments);
 
     /**
      * Whether this service has been configured and thus available for use.
      */
-    @Programmatic
     boolean isConfigured();
 
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/userreg/EmailNotificationService.java b/core/applib/src/main/java/org/apache/isis/applib/services/userreg/EmailNotificationService.java
index 95660a5..fa29b66 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/userreg/EmailNotificationService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/userreg/EmailNotificationService.java
@@ -20,9 +20,6 @@ package org.apache.isis.applib.services.userreg;
 
 import java.io.Serializable;
 
-import javax.annotation.PostConstruct;
-
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.userreg.events.EmailRegistrationEvent;
 import org.apache.isis.applib.services.userreg.events.PasswordResetEvent;
 
@@ -36,19 +33,11 @@ import org.apache.isis.applib.services.userreg.events.PasswordResetEvent;
  */
 public interface EmailNotificationService extends Serializable {
 
-    @PostConstruct
-    @Programmatic
-    public void init() ;
-
-    @Programmatic
     boolean send(EmailRegistrationEvent ev);
-
-    @Programmatic
     boolean send(PasswordResetEvent ev);
 
     /**
      * Whether this service has been configured and thus available for use.
      */
-    @Programmatic
     boolean isConfigured();
 }
diff --git a/core/config/src/main/java/org/apache/isis/config/beans/WebAppConfigBean.java b/core/config/src/main/java/org/apache/isis/config/beans/WebAppConfigBean.java
index f998110..3266c9d 100644
--- a/core/config/src/main/java/org/apache/isis/config/beans/WebAppConfigBean.java
+++ b/core/config/src/main/java/org/apache/isis/config/beans/WebAppConfigBean.java
@@ -1,11 +1,15 @@
 package org.apache.isis.config.beans;
 
+import java.io.Serializable;
+
 import lombok.Builder;
 import lombok.Data;
 
 @Data @Builder
-public class WebAppConfigBean {
+public class WebAppConfigBean implements Serializable {
 
+    private static final long serialVersionUID = 1L;
+    
     private String applicationName;
     private String applicationVersion;
     private String aboutMessage;
diff --git a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
index 18c29bc..a84d5d4 100644
--- a/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
+++ b/core/plugins/ioc-weld/src/main/java/org/apache/isis/core/plugins/ioc/weld/WeldFactory.java
@@ -52,6 +52,8 @@ public class WeldFactory {
 	    final Class<?>[] additionalPackages = 
 	            classesForClassNames(
 	            		
+	                    //FIXME [2033] this is just for PoC, don't hardcode this here !? ...
+	                    
 	            		"org.apache.isis.core.plugins.ioc.weld.services.request.RequestContextServiceWeld",
 	                    
 	                    "domainapp.application.HelloWorldAppManifest", // specific to the app
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/email/EmailServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/email/EmailServiceDefault.java
index 1abd4ee..e35facd 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/email/EmailServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/email/EmailServiceDefault.java
@@ -31,22 +31,23 @@ import org.apache.commons.mail.DefaultAuthenticator;
 import org.apache.commons.mail.EmailException;
 import org.apache.commons.mail.ImageHtmlEmail;
 import org.apache.commons.mail.resolver.DataSourceClassPathResolver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.config.IsisConfiguration;
 
+import lombok.extern.slf4j.Slf4j;
+
 /**
  * A service that sends email notifications when specific events occur
  */
-@Singleton
+@Slf4j @Singleton
 public class EmailServiceDefault implements EmailService {
 
     private static final long serialVersionUID = 1L;
-    private static final Logger LOG = LoggerFactory.getLogger(EmailServiceDefault.class);
+    
+    @Inject transient IsisConfiguration configuration;
+    
 
     public static class EmailServiceException extends RuntimeException {
         static final long serialVersionUID = 1L;
@@ -90,9 +91,7 @@ public class EmailServiceDefault implements EmailService {
     /**
      * Loads responsive email templates borrowed from http://zurb.com/ink/templates.php (Basic)
      */
-    @Override
     @PostConstruct
-    @Programmatic
     public void init() {
 
         if (initialized) {
@@ -102,9 +101,9 @@ public class EmailServiceDefault implements EmailService {
         initialized = true;
 
         if (!isConfigured()) {
-            LOG.warn("NOT configured");
+            log.warn("NOT configured");
         } else {
-            LOG.debug("configured");
+            log.debug("configured");
         }
     }
 
@@ -241,7 +240,7 @@ public class EmailServiceDefault implements EmailService {
             email.send();
 
         } catch (EmailException ex) {
-            LOG.error("An error occurred while trying to send an email", ex);
+            log.error("An error occurred while trying to send an email", ex);
             final Boolean throwExceptionOnFail = isThrowExceptionOnFail();
             if (throwExceptionOnFail) {
                 throw new EmailServiceException(ex);
@@ -270,6 +269,6 @@ public class EmailServiceDefault implements EmailService {
     }
     // endregion
 
-    @Inject IsisConfiguration configuration;
+    
 
 }
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/userreg/EmailNotificationServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/userreg/EmailNotificationServiceDefault.java
index 3bf2c31..32a9b94 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/userreg/EmailNotificationServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/userreg/EmailNotificationServiceDefault.java
@@ -29,10 +29,11 @@ import java.util.List;
 import java.util.regex.Pattern;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.Priority;
+import javax.enterprise.inject.Alternative;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
 import org.apache.isis.applib.services.userreg.events.EmailEventAbstract;
@@ -43,11 +44,13 @@ import org.apache.isis.commons.internal.resources._Resources;
 /**
  * A service that sends email notifications when specific events occur
  */
-@Singleton
+@Singleton @Alternative @Priority(0)
 public class EmailNotificationServiceDefault implements EmailNotificationService {
     
     private static final long serialVersionUID = 1L;
-    //private static final Logger LOG = LoggerFactory.getLogger(EmailNotificationServiceDefault.class);
+    
+    @Inject private transient EmailService emailService;
+
 
     // -- constants
 
@@ -66,9 +69,7 @@ public class EmailNotificationServiceDefault implements EmailNotificationService
     /**
      * Loads responsive email templates borrowed from http://zurb.com/ink/templates.php (Basic)
      */
-    @Override
     @PostConstruct
-    @Programmatic
     public void init() {
 
         if(initialized) {
@@ -92,18 +93,13 @@ public class EmailNotificationServiceDefault implements EmailNotificationService
 
     // -- isConfigured
 
-    @Programmatic
     @Override
     public boolean isConfigured() {
         return emailService != null && emailService.isConfigured();
     }
 
-
-
     // -- send
 
-
-    @Programmatic
     @Override
     public boolean send(final EmailRegistrationEvent emailRegistrationEvent) {
         ensureConfigured();
@@ -111,7 +107,6 @@ public class EmailNotificationServiceDefault implements EmailNotificationService
         return sendEmail(emailRegistrationEvent, body);
     }
 
-    @Programmatic
     @Override
     public boolean send(final PasswordResetEvent passwordResetEvent) {
         ensureConfigured();
@@ -119,8 +114,6 @@ public class EmailNotificationServiceDefault implements EmailNotificationService
         return sendEmail(passwordResetEvent, body);
     }
 
-
-
     // -- helper methods for send(...)
 
     private void ensureConfigured() {
@@ -162,12 +155,6 @@ public class EmailNotificationServiceDefault implements EmailNotificationService
         message = APPLICATION_NAME_PATTERN.matcher(message).replaceAll(emailEvent.getApplicationName());
         return message;
     }
-
-
-
-    // -- dependencies
-
-    @Inject private EmailService emailService;
-
+    
 
 }
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 aa008a4..467d808 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
@@ -19,6 +19,9 @@
 
 package org.apache.isis.viewer.wicket.viewer;
 
+import static java.util.Objects.requireNonNull;
+import static org.apache.isis.commons.internal.base._With.acceptIfPresent;
+
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
@@ -76,7 +79,6 @@ import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
 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;
@@ -104,9 +106,6 @@ import org.apache.isis.viewer.wicket.viewer.integration.wicket.ConverterForObjec
 import org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis;
 import org.apache.isis.viewer.wicket.viewer.settings.IsisResourceSettings;
 
-import static java.util.Objects.requireNonNull;
-import static org.apache.isis.commons.internal.base._With.acceptIfPresent;
-
 import de.agilecoders.wicket.core.Bootstrap;
 import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.BootstrapBaseBehavior;
 import de.agilecoders.wicket.core.settings.BootstrapSettings;
@@ -255,7 +254,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
             new CdiConfiguration(beanManager).configure(this);
 
 
-//            // FIXME
+//            // FIXME [2033]
 //            // create IsisSessionFactory
 //            //
 //            final Injector injector = Guice.createInjector(
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/EmailNotificationServiceWicket.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/EmailNotificationServiceWicket.java
index e3e4f01..ca5ad9d 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/EmailNotificationServiceWicket.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/EmailNotificationServiceWicket.java
@@ -16,26 +16,19 @@
  */
 package org.apache.isis.viewer.wicket.viewer.services;
 
-import javax.inject.Singleton;
-import javax.enterprise.context.ApplicationScoped;
-
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
 import org.apache.isis.applib.services.userreg.events.EmailRegistrationEvent;
 import org.apache.isis.applib.services.userreg.events.PasswordResetEvent;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 
-@Singleton
-public class EmailNotificationServiceWicket implements EmailNotificationService {
+//@Singleton @Alternative @Priority(Constants.WICKET_SERVICE_PRIORITY)
+@Deprecated //TODO  [2033] adds no value
+class EmailNotificationServiceWicket implements EmailNotificationService {
 
     private static final long serialVersionUID = 1L;
     
     @Override
-    public void init() {
-        // delegate is a managed object, hence the framework takes care of initializing it
-    }
-
-    @Override
     public boolean send(EmailRegistrationEvent ev) {
         return delegate.get().send(ev);
     }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetEmailPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetEmailPanel.java
index 9399bf1..4d1e408 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetEmailPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetEmailPanel.java
@@ -52,6 +52,12 @@ public class PasswordResetEmailPanel extends Panel {
 
     private static final long serialVersionUID = 1L;
     
+    @Inject private transient EmailNotificationService emailNotificationService;
+    @Inject private transient EmailService emailService;
+    @Inject private transient EmailVerificationUrlService emailVerificationUrlService;
+    @Inject private transient PageNavigationService pageNavigationService;
+    @Inject private transient WebAppConfigBean webAppConfigBean;
+    
     /**
      * Constructor
      *
@@ -85,14 +91,15 @@ public class PasswordResetEmailPanel extends Panel {
 
                 String confirmationUrl = emailVerificationUrlService.createVerificationUrl(PageType.PASSWORD_RESET, email);
 
-                /**
-                 * We have to init() the services here because the Isis runtime is not available to us
-                 * (guice will have instantiated a new instance of the service).
-                 *
-                 * We do it this way just so that the programming model for the EmailService is similar to regular Isis-managed services.
-                 */
-                emailNotificationService.init();
-                emailService.init();
+//TODO [2033] remove ...                
+//                /**
+//                 * We have to init() the services here because the Isis runtime is not available to us
+//                 * (guice will have instantiated a new instance of the service).
+//                 *
+//                 * We do it this way just so that the programming model for the EmailService is similar to regular Isis-managed services.
+//                 */
+//                emailNotificationService.init();
+//                emailService.init();
 
                 final PasswordResetEvent passwordResetEvent = new PasswordResetEvent(
                         email, 
@@ -116,10 +123,6 @@ public class PasswordResetEmailPanel extends Panel {
         form.add(signUpButton);
     }
 
-    @Inject private EmailNotificationService emailNotificationService;
-    @Inject private EmailService emailService;
-    @Inject private EmailVerificationUrlService emailVerificationUrlService;
-    @Inject private PageNavigationService pageNavigationService;
-    @Inject private WebAppConfigBean webAppConfigBean;
+
 
 }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/signup/RegistrationFormPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/signup/RegistrationFormPanel.java
index 06602e9..ffcfb06 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/signup/RegistrationFormPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/signup/RegistrationFormPanel.java
@@ -52,6 +52,12 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel
 public class RegistrationFormPanel extends Panel {
 
     private static final long serialVersionUID = 1L;
+    
+    @Inject private transient EmailNotificationService emailNotificationService;
+    @Inject private transient EmailService emailService;
+    @Inject private transient EmailVerificationUrlService emailVerificationUrlService;
+    @Inject private transient PageNavigationService pageNavigationService;
+    @Inject private transient WebAppConfigBean webAppConfigBean;
 
     /**
      * Constructor
@@ -87,14 +93,15 @@ public class RegistrationFormPanel extends Panel {
                 String email = emailField.getModelObject();
                 String confirmationUrl = emailVerificationUrlService.createVerificationUrl(PageType.SIGN_UP_VERIFY, email);
 
-                /**
-                 * We have to init() the services here because the Isis runtime is not available to us
-                 * (guice will have instantiated a new instance of the service).
-                 *
-                 * We do it this way just so that the programming model for the EmailService is similar to regular Isis-managed services.
-                 */
-                emailNotificationService.init();
-                emailService.init();
+//TODO [2033] remove ...                
+//                /**
+//                 * We have to init() the services here because the Isis runtime is not available to us
+//                 * (guice will have instantiated a new instance of the service).
+//                 *
+//                 * We do it this way just so that the programming model for the EmailService is similar to regular Isis-managed services.
+//                 */
+//                emailNotificationService.init();
+//                emailService.init();
 
                 final EmailRegistrationEvent emailRegistrationEvent = new EmailRegistrationEvent(
                         email, 
@@ -117,11 +124,7 @@ public class RegistrationFormPanel extends Panel {
         form.add(signUpButton);
     }
 
-    @Inject private EmailNotificationService emailNotificationService;
-    @Inject private EmailService emailService;
-    @Inject private EmailVerificationUrlService emailVerificationUrlService;
-    @Inject private PageNavigationService pageNavigationService;
-    @Inject private WebAppConfigBean webAppConfigBean;
+
 
 
 }
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 2fdc4dc..b8a3ac0 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,6 +19,9 @@
 
 package org.apache.isis.viewer.wicket.ui.pages.login;
 
+import javax.enterprise.inject.Instance;
+import javax.inject.Inject;
+
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
@@ -44,6 +47,12 @@ public class IsisSignInPanel extends SignInPanel {
 
     private static final long serialVersionUID = 1L;
     
+    @Inject transient IsisSessionFactory isisSessionFactory;
+    @Inject transient ServiceInjector servicesInjector;
+    @Inject transient private PageClassRegistry pageClassRegistry;
+    @Inject transient Instance<UserRegistrationService> anyUserRegistrationService;
+    @Inject transient Instance<EmailNotificationService> anyEmailNotificationService;
+    
     private final boolean signUpLink;
     private final boolean passwordResetLink;
     private final boolean clearOriginalDestination;
@@ -117,11 +126,12 @@ public class IsisSignInPanel extends SignInPanel {
     }
 
     private void setVisibilityAllowedBasedOnAvailableServices(final Component... components) {
-        final UserRegistrationService userRegistrationService =
-                servicesInjector.lookupService(UserRegistrationService.class).orElse(null);
-        final EmailNotificationService emailNotificationService1 =
-                servicesInjector.lookupService(EmailNotificationService.class).orElse(null);
-        final boolean visibilityAllowed = userRegistrationService != null && emailNotificationService1.isConfigured();
+        final UserRegistrationService userRegistrationService = 
+                anyUserRegistrationService.stream().findFirst().orElse(null);
+        final EmailNotificationService emailNotificationService = 
+                anyEmailNotificationService.stream().findFirst().orElse(null);
+        
+        final boolean visibilityAllowed = userRegistrationService != null && emailNotificationService.isConfigured();
         for (final Component component: components) {
             if(component.isVisibilityAllowed()) {
                 component.setVisibilityAllowed(visibilityAllowed);
@@ -149,24 +159,6 @@ public class IsisSignInPanel extends SignInPanel {
         }
         super.onSignInRemembered();
     }
-
-
-    // //////////////////////////////////////
-
-    @javax.inject.Inject // strangely, this isn't a @com.google.inject.Inject
-    IsisSessionFactory isisSessionFactory;
-
-    @javax.inject.Inject // strangely, this isn't a @com.google.inject.Inject
-    ServiceInjector servicesInjector;
-
-    @javax.inject.Inject // strangely, this isn't a @com.google.inject.Inject
-    private PageClassRegistry pageClassRegistry;
     
-//not used
-//    @javax.inject.Inject // strangely, this isn't a @com.google.inject.Inject
-//    private EmailNotificationService emailNotificationService;
-//
-//    @javax.inject.Inject // strangely, this isn't a @com.google.inject.Inject
-//    private EmailService emailService;
 
 }
diff --git a/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java b/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
index 137a819..865d9cf 100644
--- a/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
+++ b/example/application/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
@@ -18,12 +18,13 @@
  */
 package domainapp.application;
 
-import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
+import javax.inject.Singleton;
 
 import org.apache.isis.applib.AppManifestAbstract2;
 import org.apache.isis.config.AppConfig;
 import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.beans.WebAppConfigBean;
 import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolExecutionMode;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
@@ -38,7 +39,7 @@ import domainapp.dom.HelloWorldModule;
 /**
  * Bootstrap the application.
  */
-@ApplicationScoped // only if you want AppConfig to be managed by CDI (if available), otherwise not required
+@Singleton // only if you want AppConfig to be managed by CDI (if available), otherwise not required
 public class HelloWorldAppManifest extends AppManifestAbstract2 implements AppConfig {
 
     public static final Builder BUILDER = Builder
@@ -57,7 +58,7 @@ public class HelloWorldAppManifest extends AppManifestAbstract2 implements AppCo
     }
 
     // Implementing AppConfig, to tell the framework how to bootstrap the configuration.
-    @Override @Produces @ApplicationScoped
+    @Override @Produces @Singleton
     public IsisConfiguration isisConfiguration() {
         return IsisConfiguration.buildFromAppManifest(this);
     }
@@ -68,14 +69,14 @@ public class HelloWorldAppManifest extends AppManifestAbstract2 implements AppCo
      * <p>
      * integration tests ignore appManifest for authentication and authorization.
      */
-    @Produces @ApplicationScoped
+    @Produces @Singleton
     public AuthenticationManager authenticationManagerWithBypass() {
         final AuthenticationManagerStandard authenticationManager = new AuthenticationManagerStandard();
         authenticationManager.addAuthenticator(new AuthenticatorBypass());
         return authenticationManager;
     }
     
-    @Produces @ApplicationScoped
+    @Produces @Singleton
     public AuthorizationManager authorizationManagerWithBypass() {
         final AuthorizationManagerStandard authorizationManager = new AuthorizationManagerStandard() {
             {
@@ -84,6 +85,14 @@ public class HelloWorldAppManifest extends AppManifestAbstract2 implements AppCo
         };
         return authorizationManager;
     }
+    
+    @Produces @Singleton
+    public WebAppConfigBean webAppConfigBean() {
+        return WebAppConfigBean.builder()
+                .build();
+    }
 
     
+    
+    
 }