From ad9eb24753d1486113cfbc19d8080f15ce5ff68a Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 14 Oct 2015 11:06:16 +0000 Subject: [PATCH] Clean up before implementing i18n support git-svn-id: https://svn.argeo.org/commons/trunk@8482 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../src/org/argeo/cms/auth/AuthConstants.java | 8 ----- .../argeo/cms/auth/UserAdminLoginModule.java | 26 ++++++-------- org.argeo.cms/src/org/argeo/cms/i18n/Msg.java | 6 ++-- .../internal/auth/ConsoleCallbackHandler.java | 8 ++--- .../argeo/cms/internal/kernel/Activator.java | 6 +++- .../org/argeo/cms/internal/kernel/Kernel.java | 7 ++-- .../cms/internal/kernel/KernelConstants.java | 2 ++ .../cms/internal/kernel/KernelHeader.java | 5 +++ .../org/argeo/cms/widgets/auth/CmsLogin.java | 7 ++++ .../auth/CompositeCallbackHandler.java | 14 ++++---- .../argeo/eclipse/ui/specific/UiContext.java | 10 ++++++ .../security/ui/rap/SecureEntryPoint.java | 5 ++- ...{LocaleCallback.java => LocaleChoice.java} | 35 ++++++++----------- 13 files changed, 74 insertions(+), 65 deletions(-) create mode 100644 org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelHeader.java rename org.argeo.util/src/org/argeo/util/{LocaleCallback.java => LocaleChoice.java} (82%) diff --git a/org.argeo.cms/src/org/argeo/cms/auth/AuthConstants.java b/org.argeo.cms/src/org/argeo/cms/auth/AuthConstants.java index 932b847e3..26b96d43c 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/AuthConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/AuthConstants.java @@ -8,10 +8,6 @@ public interface AuthConstants { final static String LOGIN_CONTEXT_SYSTEM = "SYSTEM"; final static String LOGIN_CONTEXT_SINGLE_USER = "SINGLE_USER"; - // HTTP - @Deprecated - final static String ACCESS_CONTROL_CONTEXT = "org.argeo.node.accessControlContext"; - // RESERVED ROLES public final static String ROLE_KERNEL = "OU=node"; public final static String ROLES_BASEDN = "ou=roles,ou=node"; @@ -23,8 +19,4 @@ public interface AuthConstants { // user U anonymous = everyone public final static String ROLE_USER = "cn=user," + ROLES_BASEDN; public final static String ROLE_ANONYMOUS = "cn=anonymous," + ROLES_BASEDN; - - // SHARED STATE KEYS - //public final static String BUNDLE_CONTEXT_KEY = "org.argeo.security.bundleContext"; - //public final static String AUTHORIZATION_KEY = "org.argeo.security.authorization"; } diff --git a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java index ea8821185..53e48e8c1 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java @@ -2,12 +2,14 @@ package org.argeo.cms.auth; import java.io.IOException; import java.util.Iterator; +import java.util.Locale; import java.util.Map; import java.util.Set; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.LanguageCallback; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; @@ -19,6 +21,7 @@ import javax.servlet.http.HttpSession; import org.argeo.ArgeoException; import org.argeo.cms.internal.kernel.Activator; +import org.argeo.eclipse.ui.specific.UiContext; import org.osgi.framework.BundleContext; import org.osgi.service.http.HttpContext; import org.osgi.service.useradmin.Authorization; @@ -60,9 +63,10 @@ public class UserAdminLoginModule implements LoginModule, AuthConstants { NameCallback nameCallback = new NameCallback("User"); PasswordCallback passwordCallback = new PasswordCallback( "Password", false); + LanguageCallback langCallback = new LanguageCallback(); try { callbackHandler.handle(new Callback[] { httpCallback, - nameCallback, passwordCallback }); + nameCallback, passwordCallback, langCallback }); } catch (IOException e) { throw new LoginException("Cannot handle http callback: " + e.getMessage()); @@ -77,20 +81,12 @@ public class UserAdminLoginModule implements LoginModule, AuthConstants { authorization = (Authorization) request.getSession() .getAttribute(HttpContext.AUTHORIZATION); } - // if (authorization == null || authorization.getName() == null) - // if (!isAnonymous) { - // // ask for username and password - // NameCallback nameCallback = new NameCallback("User"); - // PasswordCallback passwordCallback = new PasswordCallback( - // "Password", false); - // - // // handle callbacks - // try { - // callbackHandler.handle(new Callback[] { nameCallback, - // passwordCallback }); - // } catch (Exception e) { - // throw new ArgeoException("Cannot handle callbacks", e); - // } + + // i18n + Locale locale = langCallback.getLocale(); + if (locale == null) + locale = Locale.getDefault(); + UiContext.setLocale(locale); if (authorization == null) { // create credentials diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java b/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java index b87b7b3d5..64982f6c7 100644 --- a/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java +++ b/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java @@ -6,7 +6,7 @@ import java.util.Locale; import java.util.ResourceBundle; import org.argeo.cms.CmsException; -import org.eclipse.rap.rwt.RWT; +import org.argeo.eclipse.ui.specific.UiContext; /** A single message to be internationalised. */ public class Msg { @@ -49,7 +49,7 @@ public class Msg { /** When used as the first word of a sentence. */ public String lead() { String raw = toString(); - return raw.substring(0, 1).toUpperCase(RWT.getLocale()) + return raw.substring(0, 1).toUpperCase(UiContext.getLocale()) + raw.substring(1); } @@ -67,7 +67,7 @@ public class Msg { int lastDot = key.lastIndexOf('.'); String className = key.substring(0, lastDot); String fieldName = key.substring(lastDot + 1); - Locale locale = RWT.getLocale(); + Locale locale = UiContext.getLocale(); ResourceBundle rb = ResourceBundle.getBundle(className, locale, msg.getClassLoader()); return rb.getString(fieldName); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/auth/ConsoleCallbackHandler.java b/org.argeo.cms/src/org/argeo/cms/internal/auth/ConsoleCallbackHandler.java index 7ea9c0737..d5c6f0024 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/auth/ConsoleCallbackHandler.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/auth/ConsoleCallbackHandler.java @@ -14,7 +14,7 @@ import javax.security.auth.callback.TextOutputCallback; import javax.security.auth.callback.UnsupportedCallbackException; import org.argeo.ArgeoException; -import org.argeo.util.LocaleCallback; +import org.argeo.util.LocaleChoice; /** Callback handler to be used with a command line UI. */ public class ConsoleCallbackHandler implements CallbackHandler { @@ -49,9 +49,9 @@ public class ConsoleCallbackHandler implements CallbackHandler { char[] answer = console.readPassword(); callback.setPassword(answer); Arrays.fill(answer, ' '); - } else if (callbacks[i] instanceof LocaleCallback) { - LocaleCallback callback = (LocaleCallback) callbacks[i]; - writer.write(callback.getPrompt()); + } else if (callbacks[i] instanceof LocaleChoice) { + LocaleChoice callback = (LocaleChoice) callbacks[i]; + writer.write("Language"); writer.write("\n"); for (int j = 0; j < callback.getAvailableLocales().size(); j++) { Locale locale = callback.getAvailableLocales().get(j); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java index a942b4b18..1d40c9946 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java @@ -22,7 +22,7 @@ public class Activator implements BundleActivator { } private static BundleContext bundleContext; - private Kernel kernel; + private static Kernel kernel; @Override public void start(BundleContext context) throws Exception { @@ -54,6 +54,10 @@ public class Activator implements BundleActivator { return bundleContext; } + public static KernelHeader getKernelHeader() { + return kernel; + } + /** * @return a String which is guaranteed to be unique between and constant * within a Java static context (typically a VM launch) diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java index 68b3fa289..b95c19558 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java @@ -54,7 +54,7 @@ import bitronix.tm.TransactionManagerServices; *
  • OS access
  • * */ -final class Kernel implements KernelConstants, ServiceListener { +final class Kernel implements KernelHeader, KernelConstants, ServiceListener { /* * REGISTERED SERVICES */ @@ -100,12 +100,13 @@ final class Kernel implements KernelConstants, ServiceListener { } private void doInit() { + long begin = System.currentTimeMillis(); + + // Use CMS bundle classloader ClassLoader currentContextCl = Thread.currentThread() .getContextClassLoader(); Thread.currentThread().setContextClassLoader( Kernel.class.getClassLoader()); - long begin = System.currentTimeMillis(); - // KernelUtils.logFrameworkProperties(log); try { diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java index f528f6f70..9f45edb7f 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java @@ -18,6 +18,8 @@ public interface KernelConstants { final static String TRANSACTIONS_HOME = "argeo.node.transactions.home"; + final static String I18N_AVAILABLE_LOCALES = "argeo.i18n.availableLocales"; + // Node Security final static String ROLES_URI = "argeo.node.roles.uri"; /** URI to an LDIF file or LDAP server used as initialization or backend */ diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelHeader.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelHeader.java new file mode 100644 index 000000000..f4d4d843a --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelHeader.java @@ -0,0 +1,5 @@ +package org.argeo.cms.internal.kernel; + +public interface KernelHeader { + +} diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java index 3f784407a..04e4f3c9f 100644 --- a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java +++ b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java @@ -8,6 +8,7 @@ import java.io.IOException; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.LanguageCallback; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; @@ -21,6 +22,7 @@ import org.argeo.cms.CmsView; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.auth.HttpRequestCallback; import org.argeo.cms.util.CmsUtils; +import org.argeo.util.LocaleChoice; import org.eclipse.rap.rwt.RWT; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; @@ -38,6 +40,7 @@ import org.eclipse.swt.widgets.Text; public class CmsLogin implements CmsStyles, CallbackHandler { private Text username, password; private Composite credentialsBlock; + private LocaleChoice localeChoice = null; private final CmsView cmsView; @@ -177,6 +180,10 @@ public class CmsLogin implements CmsStyles, CallbackHandler { .getTextChars()); else if (callback instanceof HttpRequestCallback) ((HttpRequestCallback) callback).setRequest(RWT.getRequest()); + else if (callback instanceof LanguageCallback + && localeChoice != null) + ((LanguageCallback) callback).setLocale(localeChoice + .getSelectedLocale()); } } diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CompositeCallbackHandler.java b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CompositeCallbackHandler.java index a87a1458c..bc99bc48b 100644 --- a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CompositeCallbackHandler.java +++ b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CompositeCallbackHandler.java @@ -10,7 +10,7 @@ import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.TextOutputCallback; import javax.security.auth.callback.UnsupportedCallbackException; -import org.argeo.util.LocaleCallback; +import org.argeo.util.LocaleChoice; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; @@ -40,7 +40,7 @@ import org.eclipse.swt.widgets.Text; *

    * Supported Argeo {@link Callback}s are:
    *

    *

    */ @@ -98,7 +98,7 @@ public class CompositeCallbackHandler extends Composite implements if (callback instanceof TextOutputCallback || callback instanceof NameCallback || callback instanceof PasswordCallback - || callback instanceof LocaleCallback) { + || callback instanceof LocaleChoice) { return; } else { throw new UnsupportedCallbackException(callback); @@ -137,8 +137,8 @@ public class CompositeCallbackHandler extends Composite implements createNameHandler(composite, (NameCallback) callback); } else if (callback instanceof PasswordCallback) { createPasswordHandler(composite, (PasswordCallback) callback); - } else if (callback instanceof LocaleCallback) { - createLocaleHandler(composite, (LocaleCallback) callback); + } else if (callback instanceof LocaleChoice) { + createLocaleHandler(composite, (LocaleChoice) callback); } } } @@ -220,12 +220,12 @@ public class CompositeCallbackHandler extends Composite implements } protected Combo createLocaleHandler(Composite composite, - final LocaleCallback callback) { + final LocaleChoice callback) { String[] labels = callback.getSupportedLocalesLabels(); if (labels.length == 0) return null; Label label = new Label(composite, SWT.NONE); - label.setText(callback.getPrompt()); + label.setText("Language"); final Combo combo = new Combo(composite, SWT.READ_ONLY); combo.setItems(labels); diff --git a/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java b/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java index ce50873f8..82b606124 100644 --- a/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java +++ b/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java @@ -1,5 +1,7 @@ package org.argeo.eclipse.ui.specific; +import java.util.Locale; + import javax.servlet.http.HttpServletRequest; import org.eclipse.rap.rwt.RWT; @@ -12,6 +14,14 @@ public class UiContext { return RWT.getRequest(); } + public static Locale getLocale() { + return RWT.getUISession().getLocale(); + } + + public static void setLocale(Locale locale) { + RWT.getUISession().setLocale(locale); + } + /** Can always be null */ @SuppressWarnings("unchecked") public static T getData(String key) { diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java index 6a582f83f..c176ba62b 100644 --- a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java +++ b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java @@ -15,8 +15,6 @@ */ package org.argeo.security.ui.rap; -import static org.argeo.cms.auth.AuthConstants.ACCESS_CONTROL_CONTEXT; - import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedAction; @@ -49,6 +47,7 @@ import org.eclipse.ui.PlatformUI; * subject. */ public class SecureEntryPoint implements EntryPoint { + final static String ACCESS_CONTROL_CONTEXT = "org.argeo.node.accessControlContext"; private final static Log log = LogFactory.getLog(SecureEntryPoint.class); /** @@ -77,7 +76,7 @@ public class SecureEntryPoint implements EntryPoint { HttpServletRequest httpRequest = RWT.getRequest(); final HttpSession httpSession = httpRequest.getSession(); AccessControlContext acc = (AccessControlContext) httpSession - .getAttribute(AuthConstants.ACCESS_CONTROL_CONTEXT); + .getAttribute(ACCESS_CONTROL_CONTEXT); final Subject subject; if (acc != null diff --git a/org.argeo.util/src/org/argeo/util/LocaleCallback.java b/org.argeo.util/src/org/argeo/util/LocaleChoice.java similarity index 82% rename from org.argeo.util/src/org/argeo/util/LocaleCallback.java rename to org.argeo.util/src/org/argeo/util/LocaleChoice.java index ac47e542a..aaf719db4 100644 --- a/org.argeo.util/src/org/argeo/util/LocaleCallback.java +++ b/org.argeo.util/src/org/argeo/util/LocaleChoice.java @@ -16,33 +16,31 @@ package org.argeo.util; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Locale; -import javax.security.auth.callback.Callback; import javax.security.auth.callback.LanguageCallback; /** Choose in a list of locales. TODO: replace with {@link LanguageCallback} */ -public class LocaleCallback implements Callback { +public class LocaleChoice { private List availableLocales = new ArrayList(); private Integer selectedIndex = null; private Integer defaultIndex = null; - private String prompt = "Language"; - public LocaleCallback(Integer defaultIndex, List availableLocales) { - this.availableLocales = Collections - .unmodifiableList(new ArrayList(availableLocales)); - this.defaultIndex = defaultIndex; - this.selectedIndex = defaultIndex; - } + // public LocaleCallback(Integer defaultIndex, List + // availableLocales) { + // this.availableLocales = Collections + // .unmodifiableList(new ArrayList(availableLocales)); + // this.defaultIndex = defaultIndex; + // this.selectedIndex = defaultIndex; + // } /** * Convenience constructor based on a comma separated list of iso codes (en, * en_US, fr_CA, etc.). Default selection is default locale. */ - public LocaleCallback(String locales) { + public LocaleChoice(String locales, Locale defaultLocale) { if (locales == null || locales.trim().equals("")) return; String[] codes = locales.split(","); @@ -59,7 +57,7 @@ public class LocaleCallback implements Callback { locale = new Locale(code); } availableLocales.add(locale); - if (locale.equals(Locale.getDefault())) + if (locale.equals(defaultLocale)) defaultIndex = i; } @@ -100,19 +98,14 @@ public class LocaleCallback implements Callback { return defaultIndex; } - public String getPrompt() { - // TODO localize it? - return prompt; - } - - public void setPrompt(String prompt) { - this.prompt = prompt; - } - public List getAvailableLocales() { return availableLocales; } + public Locale getDefaultLocale() { + return availableLocales.get(getDefaultIndex()); + } + public static void main(String[] args) { for (String isoL : Locale.getISOLanguages()) { Locale locale = new Locale(isoL); -- 2.30.2