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/24 07:07:17 UTC

[isis] branch 2033-IoC updated: ISIS-2033: fixes provisioning of TranslationService + MessageService

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 6e70355  ISIS-2033: fixes provisioning of TranslationService + MessageService
6e70355 is described below

commit 6e7035567c3729da1022544d738d133a95e6cb33
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 24 08:07:10 2019 +0100

    ISIS-2033: fixes provisioning of TranslationService + MessageService
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../isis/applib/services/i18n/LocaleProvider.java  |  3 -
 .../applib/services/i18n/TranslationService.java   |  7 +-
 .../org/apache/isis/config/AppConfigLocator.java   | 32 ++++++--
 .../services/message/MessageServiceNoop.java       | 85 ----------------------
 .../isis/core/plugins/ioc/weld/WeldFactory.java    |  3 +-
 .../services/i18n/po/TranslationServicePo.java     | 43 ++++-------
 .../services/message/MessageServiceDefault.java    |  8 +-
 .../system/session/IsisSessionProducerBean.java    |  1 -
 .../core/webapp/IsisWebAppContextListener.java     | 22 ------
 .../webapp/jee/IsisCDIBeanScanInterceptor.java     | 19 ++++-
 .../viewer/services/LocaleProviderWicket.java      | 14 ++--
 .../services/TranslationsResolverWicket.java       | 26 +++----
 12 files changed, 80 insertions(+), 183 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/LocaleProvider.java b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/LocaleProvider.java
index f5656cb..a5854f5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/LocaleProvider.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/LocaleProvider.java
@@ -20,10 +20,7 @@ package org.apache.isis.applib.services.i18n;
 
 import java.util.Locale;
 
-import org.apache.isis.applib.annotation.Programmatic;
-
 public interface LocaleProvider {
 
-    @Programmatic
     Locale getLocale();
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java
index f3b04b8..97fdc83 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java
@@ -21,8 +21,6 @@ package org.apache.isis.applib.services.i18n;
 import java.util.Objects;
 import java.util.function.Predicate;
 
-import org.apache.isis.applib.annotation.Programmatic;
-
 public interface TranslationService {
 
     /**
@@ -36,7 +34,6 @@ public interface TranslationService {
      * @param text
      * @return
      */
-    @Programmatic
     public String translate(final String context, final String text);
 
     /**
@@ -53,7 +50,6 @@ public interface TranslationService {
      * @param num - whether to return the translation of the singular (if =1) or of the plural (if != 1)
      * @return
      */
-    @Programmatic
     public String translate(final String context, final String singularText, final String pluralText, int num);
 
 
@@ -108,6 +104,5 @@ public interface TranslationService {
      *     such that all pathways are exercised..
      * </p>
      */
-    @Programmatic
-    Mode getMode();
+    public Mode getMode();
 }
diff --git a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
index d96e913..9788ece 100644
--- a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
+++ b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
@@ -23,6 +23,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.isis.commons.internal.cdi._CDI;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.context._Plugin;
@@ -48,19 +49,38 @@ public final class AppConfigLocator {
     
     // for sanity check
     private final static Set<String> criticalServices() {
-    	return _Sets.newHashSet(_Sets.of(
+    	return _Sets.newLinkedHashSet(_Lists.of(
     		"org.apache.isis.applib.services.registry.ServiceRegistry", 
     		"org.apache.isis.config.IsisConfiguration", 
     		"org.apache.isis.core.runtime.system.session.IsisSessionFactory", 
     		"org.apache.isis.core.security.authentication.manager.AuthenticationManager", 
     		"org.apache.isis.core.security.authorization.manager.AuthorizationManager",
     		"org.apache.isis.core.metamodel.specloader.SpecificationLoader",
-    		"org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory"
+    		"org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory",
+    		
+    		"org.apache.isis.applib.services.eventbus.EventBusService",
+    		"org.apache.isis.applib.services.factory.FactoryService",
+    		
+    		"org.apache.isis.applib.services.i18n.LocaleProvider",
+    		"org.apache.isis.applib.services.i18n.TranslationsResolver",
+    		"org.apache.isis.applib.services.i18n.TranslationService",
+    		"org.apache.isis.applib.services.message.MessageService",
+    		
+    		"org.apache.isis.applib.services.repository.RepositoryService",
+    		"org.apache.isis.applib.services.title.TitleService",
+    		"org.apache.isis.applib.services.user.UserService",
+    		"org.apache.isis.applib.services.xactn.TransactionService",
+    		
+    		"org.apache.isis.applib.services.homepage.HomePageProviderService"
+    		
+    		
     		));
     }
     
     private final static _Probe probe = 
     		_Probe.unlimited().label("AppConfigLocator");
+    private final static _Probe probeSanity = 
+    		_Probe.unlimited().label("AppConfigLocator SANITY");
     
     private static AppConfig lookupAppConfigAndVerifyCDI() {
         final AppConfig appConfig = lookupAppConfig();
@@ -75,7 +95,6 @@ public final class AppConfigLocator {
             } 
 		});
 		
-		
 		// ensure critical services are managed by CDI
 		final Set<String> managedTypes = new HashSet<>();
 		for(String serviceClassName : criticalServices()) {
@@ -84,11 +103,14 @@ public final class AppConfigLocator {
 				
 				_CDI.getSingleton(type);
 				
-				probe.println("SANITY-CHECK Critical service managed by CDI %s", type.getSimpleName());
+				probeSanity.println("%s ... managed by CDI", type.getSimpleName());
 				managedTypes.add(serviceClassName);
 				
 			} catch (Exception e) {
-				probe.println("failed to resolve bean %s cause: %s", serviceClassName, e.getMessage());
+				probeSanity.println("*%s ... failed to resolve bean '%s' cause: %s",
+						serviceClassName.substring(1+serviceClassName.lastIndexOf(".")),
+						serviceClassName, 
+						e.getMessage());
 			}
 		}
 		
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/message/MessageServiceNoop.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/message/MessageServiceNoop.java
deleted file mode 100644
index b422e04..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/message/MessageServiceNoop.java
+++ /dev/null
@@ -1,85 +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.metamodel.services.message;
-
-import org.apache.isis.applib.services.i18n.TranslatableString;
-import org.apache.isis.applib.services.message.MessageService;
-
-public abstract class MessageServiceNoop implements MessageService {
-
-    @Override
-    public void informUser(final String message) {
-        throw new UnsupportedOperationException("Not supported by this implementation of RuntimeContext");
-    }
-
-    @Override
-    public String informUser(
-            final TranslatableString message,
-            final Class<?> contextClass,
-            final String contextMethod) {
-        throw notSupported();
-    }
-    
-    @Override
-    public String informUser(TranslatableString message, String translationContext) {
-        throw notSupported();
-    }
-
-    @Override
-    public void warnUser(final String message) {
-        throw notSupported();
-    }
-
-    @Override public String warnUser(
-            final TranslatableString message,
-            final Class<?> contextClass,
-            final String contextMethod) {
-        throw notSupported();
-    }
-    
-    @Override
-    public String warnUser(TranslatableString message, String translationContext) {
-        throw notSupported();
-    }
-
-    @Override
-    public void raiseError(final String message) {
-        throw notSupported();
-    }
-
-    @Override public String raiseError(
-            final TranslatableString message,
-            final Class<?> contextClass,
-            final String contextMethod) {
-        throw notSupported();
-    }
-    
-    @Override
-    public String raiseError(TranslatableString message, String translationContext) {
-        throw notSupported();
-    }
-    
-    // -- HELPER
-    
-    private static UnsupportedOperationException notSupported() {
-        return new UnsupportedOperationException("Not supported by this implementation of RuntimeContext");
-    }
-    
-
-}
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 7ef0cd1..6ab0162 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
@@ -60,7 +60,8 @@ public class WeldFactory {
 	                    "org.apache.isis.core.wrapper.WrapperFactoryDefault",
 	                    "org.apache.isis.viewer.wicket.viewer.IsisWicketModule",
 	                    "org.apache.isis.applib.services.jdosupport.IsisJdoSupportDN5",
-	                    "org.apache.isis.core.runtime.services.persistsession.PersistenceSessionServiceInternalDefault",
+	                    "org.apache.isis.core.runtime.services.ServiceInstantiator",
+	                    "org.apache.isis.core.runtime.services.i18n.po.TranslationServicePo", //why?
 	                    
 	                    "org.apache.wicket.cdi.AutoConversation"
 	                    
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
index f103c84..b7904e8 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/i18n/po/TranslationServicePo.java
@@ -22,37 +22,36 @@ import static org.apache.isis.config.internal._Config.getConfiguration;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-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.context._Context;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import lombok.AccessLevel;
+import lombok.Getter;
 
-@Singleton
+@ApplicationScoped //FIXME [2033] cannot provision with @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;
-
     /**
-     * Defaults to writer mode because the service won't have been init'd while the metamodel is bring instantiated,
+     * Defaults to writer mode because the service won't have been init'd while the metamodel is being instantiated,
      * and we want to ensure that we capture all requests for translation.
      */
-    public TranslationServicePo() {
-        po = new PoWriter(this);
-    }
+    private PoAbstract po = new PoWriter(this);
+
 
     // -- init, shutdown
 
-    @Programmatic
     @PostConstruct
     public void init() {
 
@@ -89,7 +88,6 @@ public class TranslationServicePo implements TranslationService {
         return _Context.isPrototyping();
     }
 
-    @Programmatic
     @PreDestroy
     public void shutdown() {
         po.shutdown();
@@ -98,7 +96,6 @@ public class TranslationServicePo implements TranslationService {
 
 
     @Override
-    @Programmatic
     public String translate(final String context, final String text) {
         return po.translate(context, text);
     }
@@ -116,7 +113,6 @@ public class TranslationServicePo implements TranslationService {
     /**
      * Not API
      */
-    @Programmatic
     public String toPot() {
         if (!getMode().isWrite()) {
             return null;
@@ -130,7 +126,6 @@ public class TranslationServicePo implements TranslationService {
     /**
      * Not API
      */
-    @Programmatic
     void clearCache() {
         if (!getMode().isRead()) {
             return;
@@ -144,7 +139,6 @@ public class TranslationServicePo implements TranslationService {
     /**
      * Not API
      */
-    @Programmatic
     public void toggleMode() {
         if(getMode().isRead()) {
             previousPoReader = (PoReader) po;
@@ -168,20 +162,11 @@ public class TranslationServicePo implements TranslationService {
 
     // //////////////////////////////////////
 
-    @javax.inject.Inject
+    @Inject @Getter(AccessLevel.PACKAGE) 
     private TranslationsResolver translationsResolver;
 
-    @Programmatic
-    TranslationsResolver getTranslationsResolver() {
-        return translationsResolver;
-    }
-
-    @javax.inject.Inject
+    @Inject @Getter(AccessLevel.PACKAGE)
     private LocaleProvider localeProvider;
-
-    @Programmatic
-    LocaleProvider getLocaleProvider() {
-        return localeProvider;
-    }
+    
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/message/MessageServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/message/MessageServiceDefault.java
index 8e00941..5e8f515 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/message/MessageServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/message/MessageServiceDefault.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.core.runtime.services.message;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.apache.isis.applib.RecoverableException;
@@ -104,10 +105,7 @@ public class MessageServiceDefault implements MessageService {
         return isisSessionFactory.getCurrentSession().getAuthenticationSession().getMessageBroker();
     }
 
-    @javax.inject.Inject
-    IsisSessionFactory isisSessionFactory;
-
-    @javax.inject.Inject
-    TranslationService translationService;
+    @Inject IsisSessionFactory isisSessionFactory;
+    @Inject TranslationService translationService;
 
 }
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 40751e4..0e53df2 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
@@ -46,7 +46,6 @@ public class IsisSessionProducerBean {
 		return produceIsisSessionFactory().getPersistenceSessionFactory();
 	}
 	
-	
 	// -- HELPER
 	
 	private final _Lazy<IsisSessionFactory> isisSessionFactorySingleton = 
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 ad8159e..35ff7b5 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
@@ -30,17 +30,10 @@ import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
-import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Blackhole;
-import org.apache.isis.commons.internal.base._With;
-import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.AppConfigLocator;
-import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
-import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
 import org.apache.isis.core.webapp.modules.WebModule;
 import org.apache.isis.core.webapp.modules.WebModuleContext;
 import org.slf4j.Logger;
@@ -67,21 +60,6 @@ public class IsisWebAppContextListener implements ServletContextListener {
     
     private final List<ServletContextListener> activeListeners = new ArrayList<>();
 
-    // -- SANITY CHECK 
-
- 	public static void verifyCDISetup() {
- 		_CDI.getBeanManager();
- 		_With.requires(_CDI.getSingleton(IsisConfiguration.class), "IsisConfiguration");
- 		_With.requires(_CDI.getSingleton(ServiceRegistry.class), "ServiceRegistry");
- 		_With.requires(_CDI.getSingleton(AuthenticationManager.class), "AuthenticationManager");
- 		_With.requires(_CDI.getSingleton(AuthorizationManager.class), "AuthorizationManager");
- 		_With.requires(_CDI.getSingleton(IsisSessionFactory.class), "IsisSessionFactory");
- 		
- 		
- 		// TODO list registered beans
- 		
- 	}
-    
     // -- INTERFACE IMPLEMENTATION
     
     @Override
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/jee/IsisCDIBeanScanInterceptor.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/jee/IsisCDIBeanScanInterceptor.java
index aed018a..8705feb 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/jee/IsisCDIBeanScanInterceptor.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/jee/IsisCDIBeanScanInterceptor.java
@@ -28,11 +28,13 @@ import javax.enterprise.inject.spi.BeforeBeanDiscovery;
 import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.ProcessAnnotatedType;
 
+import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
+import org.apache.isis.applib.services.metrics.MetricsService;
+import org.apache.isis.commons.internal.debug._Probe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
-import org.apache.isis.applib.services.metrics.MetricsService;
+import lombok.val;
 
 /**
  *
@@ -54,6 +56,8 @@ import org.apache.isis.applib.services.metrics.MetricsService;
 public final class IsisCDIBeanScanInterceptor implements Extension {
 
     private static final Logger log = LoggerFactory.getLogger(IsisCDIBeanScanInterceptor.class);
+    private final static _Probe probe = 
+    		_Probe.unlimited().label("IsisCDIBeanScanInterceptor");
 
     /**
      * Declaration of Beans that are managed by Isis and should be ignored by CDI.
@@ -74,7 +78,16 @@ public final class IsisCDIBeanScanInterceptor implements Extension {
         final Class<?> clazz = event.getAnnotatedType().getJavaClass();
         final String className = clazz.getName();
 
-        if(isTabu(clazz, event)) {
+        val logScope = className.startsWith("org.apache.isis.") ||
+        		className.startsWith("domainapp.");
+        
+        val isTabu = isTabu(clazz, event);
+
+        if(logScope) {
+        	probe.println("processAnnotatedType(%s)", className);
+        } 
+        
+        if(isTabu) {
             log.debug("veto type: " + className);
             event.veto();
         } else {
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
index aa9d868..0b9ed20 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
@@ -19,29 +19,25 @@
 package org.apache.isis.viewer.wicket.viewer.services;
 
 import java.util.Locale;
+
+import javax.inject.Singleton;
+
+import org.apache.isis.applib.services.i18n.LocaleProvider;
 import org.apache.wicket.Application;
 import org.apache.wicket.Session;
 import org.apache.wicket.request.cycle.RequestCycle;
 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;
 
 
 /**
  * An implementation that provides the locale of the current session.
  */
-@DomainService(
-        nature = NatureOfService.DOMAIN,
-        menuOrder = "" + Integer.MAX_VALUE
-        )
+@Singleton
 public class LocaleProviderWicket implements LocaleProvider {
 
     public static final Logger LOG = LoggerFactory.getLogger(LocaleProviderWicket.class);
 
-    @Programmatic
     @Override
     public Locale getLocale() {
         // Request Cycle can be null, e.g. during the start of an application
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 0d68991..9e2c238 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
@@ -25,33 +25,31 @@ import java.nio.file.Path;
 import java.util.Collections;
 import java.util.List;
 import java.util.regex.Pattern;
+
+import javax.inject.Singleton;
 import javax.servlet.ServletContext;
+
+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 org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.google.common.base.Charsets;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.config.WebAppConstants;
-
 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.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.i18n.TranslationsResolver;
-import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication;
 
 
 /**
  * An implementation that reads from /WEB-INF/...
  */
-@DomainService(
-        nature = NatureOfService.DOMAIN,
-        menuOrder = "" + Integer.MAX_VALUE
-        )
+@Singleton
 public class TranslationsResolverWicket implements TranslationsResolver {
 
     public static Logger LOG = LoggerFactory.getLogger(TranslationsResolverWicket.class);