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:
*
- * - {@link LocaleCallback}
+ * - {@link LocaleChoice}
*
*
*/
@@ -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