Make ClassBasedTranslator compatible with Guice

This commit is contained in:
Sampo Niskanen 2012-10-15 07:33:24 +03:00
parent e78a7fe027
commit 811292286e
3 changed files with 68 additions and 29 deletions

View File

@ -17,7 +17,20 @@ public class ClassBasedTranslator implements Translator {
private final Translator translator; private final Translator translator;
private final String className; private String className;
private int levels;
/**
* Construct a translator by obtaining the base class name from the stack
* on the first execution of the get() method.
*
* @param translator the translator from which to obtain the translations.
*/
public ClassBasedTranslator(Translator translator, int levels) {
this.translator = translator;
this.levels = levels;
}
/** /**
* Construct a translator using a specified class name. * Construct a translator using a specified class name.
@ -30,20 +43,14 @@ public class ClassBasedTranslator implements Translator {
this.className = className; this.className = className;
} }
/**
* Construct a translator by obtaining the base class name from the stack.
*
* @param translator the translator from which to obtain the translations.
* @param levels the number of levels to move upwards in the stack from the point where this method is called.
*/
public ClassBasedTranslator(Translator translator, int levels) {
this(translator, getStackClass(levels));
}
@Override @Override
public String get(String key) { public String get(String key) {
if (className == null) {
className = findClassName();
}
String classKey = className + "." + key; String classKey = className + "." + key;
try { try {
@ -63,7 +70,6 @@ public class ClassBasedTranslator implements Translator {
} }
@Override @Override
public String get(String base, String text) { public String get(String base, String text) {
return translator.get(base, text); return translator.get(base, text);
@ -76,11 +82,10 @@ public class ClassBasedTranslator implements Translator {
private String findClassName() {
private static String getStackClass(int levels) {
TraceException trace = new TraceException(); TraceException trace = new TraceException();
StackTraceElement stack[] = trace.getStackTrace(); StackTraceElement stack[] = trace.getStackTrace();
final int index = levels + 2; final int index = 2 + levels;
if (stack.length <= index) { if (stack.length <= index) {
throw new BugException("Stack trace is too short, length=" + stack.length + ", expected=" + index, trace); throw new BugException("Stack trace is too short, length=" + stack.length + ", expected=" + index, trace);
} }
@ -91,9 +96,14 @@ public class ClassBasedTranslator implements Translator {
if (pos >= 0) { if (pos >= 0) {
cn = cn.substring(pos + 1); cn = cn.substring(pos + 1);
} }
return cn;
pos = cn.indexOf('$');
if (pos >= 0) {
cn = cn.substring(0, pos);
} }
return cn;
}

View File

@ -22,10 +22,17 @@ public class TestClassBasedTranslator {
@Test @Test
public void testClassName() { public void testClassName() {
ClassBasedTranslator cbt = new ClassBasedTranslator(null, 0); // @formatter:off
context.checking(new Expectations() {{
oneOf(translator).get("TestClassBasedTranslator.fake.key1"); will(returnValue("foobar"));
}});
// @formatter:on
ClassBasedTranslator cbt = new ClassBasedTranslator(translator, 0);
cbt.get("fake.key1");
assertEquals("TestClassBasedTranslator", cbt.getClassName()); assertEquals("TestClassBasedTranslator", cbt.getClassName());
cbt = new ClassBasedTranslator(null, "foobar"); cbt = new ClassBasedTranslator(translator, "foobar");
assertEquals("foobar", cbt.getClassName()); assertEquals("foobar", cbt.getClassName());
} }
@ -74,6 +81,28 @@ public class TestClassBasedTranslator {
} catch (MissingResourceException e) { } catch (MissingResourceException e) {
assertEquals("Neither key 'TestClassBasedTranslator.fake.key3' nor 'fake.key3' could be found", e.getMessage()); assertEquals("Neither key 'TestClassBasedTranslator.fake.key3' nor 'fake.key3' could be found", e.getMessage());
} }
}
@Test
public void testGetWithSubClass() {
ClassBasedTranslator cbt = new ClassBasedTranslator(translator, 0);
// @formatter:off
context.checking(new Expectations() {{
oneOf(translator).get("TestClassBasedTranslator.fake.key1"); will(returnValue("foobar"));
}});
// @formatter:on
assertEquals("foobar", new Subclass().get(cbt, "fake.key1"));
assertEquals("TestClassBasedTranslator", cbt.getClassName());
}
private class Subclass {
private String get(Translator trans, String key) {
return trans.get(key);
}
} }
} }