You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2009/11/20 00:48:28 UTC
svn commit: r882365 -
/labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/LocaleHolder.java
Author: simoneg
Date: Thu Nov 19 23:48:28 2009
New Revision: 882365
URL: http://svn.apache.org/viewvc?rev=882365&view=rev
Log:
LABS-494 : improving i18n matching system to see if we canuse it for more generic purposes
Modified:
labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/LocaleHolder.java
Modified: labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/LocaleHolder.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/LocaleHolder.java?rev=882365&r1=882364&r2=882365&view=diff
==============================================================================
--- labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/LocaleHolder.java (original)
+++ labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/LocaleHolder.java Thu Nov 19 23:48:28 2009
@@ -43,14 +43,14 @@
*/
public class LocaleHolder {
- protected static final ContextMatrix CACHE_NONE = new ContextMatrix("none", "none");
+ protected static final String CACHE_NONE = "___NONE___";
protected Locale locale;
protected SettingsHolder messages = new SettingsHolder();
- protected Map<String, ContextMatrix> cache = new HashMap<String, ContextMatrix>();
+ protected Map<String, String> cache = new HashMap<String, String>();
- protected Map<String, List<ContextMatrix>> firstLookup = new HashMap<String, List<ContextMatrix>>();
+ protected Map<String, List<String[]>> firstLookup = new HashMap<String, List<String[]>>();
/**
* Creates an instance
@@ -62,6 +62,9 @@
buildMatrix();
}
+ /**
+ * Loads correct messages cnsidering the locale.
+ */
protected void initMessages() {
messages.initing();
if (messages.isInited()) return;
@@ -116,14 +119,16 @@
public void buildMatrix() {
Map<String, String> all = messages.getAll();
for (Map.Entry<String, String> entry : all.entrySet()) {
- ContextMatrix cm = new ContextMatrix(entry.getKey(), entry.getValue());
- String discriminator = cm.getMainDiscriminator();
- List<ContextMatrix> list = firstLookup.get(discriminator);
+ String[] parts = entry.getKey().split("\\.");
+ parts = Arrays.copyOf(parts, parts.length + 1);
+ parts[parts.length - 1] = entry.getValue();
+ String discriminator = parts[parts.length - 2];
+ List<String[]> list = firstLookup.get(discriminator);
if (list == null) {
- list = new ArrayList<ContextMatrix>();
+ list = new ArrayList<String[]>();
firstLookup.put(discriminator, list);
}
- list.add(cm);
+ list.add(parts);
}
}
@@ -138,14 +143,17 @@
*/
public String getMessage(Stack<ContextElement> ct, String original) {
String deh = normalize(original);
- List<ContextMatrix> list = firstLookup.get(deh);
+ List<String[]> list = firstLookup.get(deh);
+ // Fast not found case
if (list == null || list.size() == 0) return original;
+
+ // Fast found xxxx=yyyyy case
if (list.size() == 1) {
- if (list.get(0).getParts().length == 1) {
- return list.get(0).getValue();
+ if (list.get(0).length == 2) {
+ return list.get(0)[1];
}
}
- //ct.push(deh);
+
String[] strings = stringify(ct);
StringBuilder keysb = new StringBuilder();
for (String string : strings) {
@@ -153,15 +161,15 @@
keysb.append('.');
}
String key = keysb.toString();
- ContextMatrix winner = cache.get(key);
+ String winner = cache.get(key);
if (winner == CACHE_NONE) return original;
if (winner == null) {
int topscore = -1;
- for (ContextMatrix cm : list) {
- int score = cm.getScore(strings);
+ for (String[] cm : list) {
+ int score = getScore(cm, strings);
if (score > topscore) {
topscore = score;
- winner = cm;
+ winner = cm[cm.length - 1];
}
}
//ct.pop();
@@ -172,9 +180,36 @@
cache.put(key, winner);
}
}
- return winner.getValue();
+ return winner;
}
+ /**
+ * Checks the score of two string arrays.
+ * @param parts The keys in the property file
+ * @param mc The keys of the context
+ * @return -1 for no match, 0 for one step match (x=y), increasingly higher score for more in depth match
+ */
+ protected static int getScore(String[] parts, String[] mc) {
+ if (parts.length == 1) return 0;
+ int total = -1;
+ int upto = 0;
+ int pos = 1;
+ for (String seg : mc) {
+ pos++;
+ if (parts[upto].equalsIgnoreCase(seg)) {
+ upto++;
+ total += pos;
+ if (upto == parts.length - 2) return total;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Converts a stack of context elements to an array of strings.
+ * @param ct The stack of the current context
+ * @return A string array, interpreting {@link I18nMultiSegmentContextElement} with correct elements
+ */
protected static String[] stringify(Stack<ContextElement> ct) {
String[] ret = new String[ct.size() * 2];
int i = 0;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org