|
|
|
@ -20,7 +20,6 @@ import java.util.Map; |
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.context.MessageSource; |
|
|
|
import org.springframework.context.MessageSource; |
|
|
|
import org.springframework.context.MessageSourceResolvable; |
|
|
|
import org.springframework.context.MessageSourceResolvable; |
|
|
|
import org.springframework.context.expression.MapAccessor; |
|
|
|
|
|
|
|
import org.springframework.core.style.ToStringCreator; |
|
|
|
import org.springframework.core.style.ToStringCreator; |
|
|
|
import org.springframework.expression.AccessException; |
|
|
|
import org.springframework.expression.AccessException; |
|
|
|
import org.springframework.expression.EvaluationContext; |
|
|
|
import org.springframework.expression.EvaluationContext; |
|
|
|
@ -40,13 +39,13 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso |
|
|
|
private String[] codes; |
|
|
|
private String[] codes; |
|
|
|
|
|
|
|
|
|
|
|
private Map<String, Object> args; |
|
|
|
private Map<String, Object> args; |
|
|
|
|
|
|
|
|
|
|
|
private String defaultText; |
|
|
|
private String defaultText; |
|
|
|
|
|
|
|
|
|
|
|
private ExpressionParser expressionParser; |
|
|
|
private ExpressionParser expressionParser; |
|
|
|
|
|
|
|
|
|
|
|
public DefaultMessageResolver(Severity severity, String[] codes, Map<String, Object> args, |
|
|
|
public DefaultMessageResolver(Severity severity, String[] codes, Map<String, Object> args, String defaultText, |
|
|
|
String defaultText, ExpressionParser expressionParser) { |
|
|
|
ExpressionParser expressionParser) { |
|
|
|
this.severity = severity; |
|
|
|
this.severity = severity; |
|
|
|
this.codes = codes; |
|
|
|
this.codes = codes; |
|
|
|
this.args = args; |
|
|
|
this.args = args; |
|
|
|
@ -67,8 +66,7 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso |
|
|
|
try { |
|
|
|
try { |
|
|
|
StandardEvaluationContext context = new StandardEvaluationContext(); |
|
|
|
StandardEvaluationContext context = new StandardEvaluationContext(); |
|
|
|
context.setRootObject(args); |
|
|
|
context.setRootObject(args); |
|
|
|
context.addPropertyAccessor(new MapAccessor()); |
|
|
|
context.addPropertyAccessor(new MessageArgumentAccessor(messageSource, locale)); |
|
|
|
context.addPropertyAccessor(new MessageSourceResolvableAccessor(messageSource, locale)); |
|
|
|
|
|
|
|
String text = (String) message.getValue(context); |
|
|
|
String text = (String) message.getValue(context); |
|
|
|
return new TextMessage(severity, text); |
|
|
|
return new TextMessage(severity, text); |
|
|
|
} catch (EvaluationException e) { |
|
|
|
} catch (EvaluationException e) { |
|
|
|
@ -116,37 +114,44 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static class MessageSourceResolvableAccessor implements PropertyAccessor { |
|
|
|
static class MessageArgumentAccessor implements PropertyAccessor { |
|
|
|
|
|
|
|
|
|
|
|
private MessageSource messageSource; |
|
|
|
private MessageSource messageSource; |
|
|
|
|
|
|
|
|
|
|
|
private Locale locale; |
|
|
|
private Locale locale; |
|
|
|
|
|
|
|
|
|
|
|
public MessageSourceResolvableAccessor(MessageSource messageSource, Locale locale) { |
|
|
|
public MessageArgumentAccessor(MessageSource messageSource, Locale locale) { |
|
|
|
this.messageSource = messageSource; |
|
|
|
this.messageSource = messageSource; |
|
|
|
this.locale = locale; |
|
|
|
this.locale = locale; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public boolean canRead(EvaluationContext context, Object target, String name) throws AccessException { |
|
|
|
public boolean canRead(EvaluationContext context, Object target, String name) throws AccessException { |
|
|
|
return true; |
|
|
|
return (((Map) target).containsKey(name)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException { |
|
|
|
public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException { |
|
|
|
// TODO this does not get called when resolving MessageSourceResolvable variables; only when accessing properties on MessageSourceResolvable targets.
|
|
|
|
Object o = ((Map) target).get(name); |
|
|
|
return new TypedValue(messageSource.getMessage((MessageSourceResolvable)target, locale)); |
|
|
|
if (o instanceof MessageSourceResolvable) { |
|
|
|
|
|
|
|
String message = messageSource.getMessage((MessageSourceResolvable) o, locale); |
|
|
|
|
|
|
|
return new TypedValue(message); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
return new TypedValue(o); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public boolean canWrite(EvaluationContext context, Object target, String name) throws AccessException { |
|
|
|
public boolean canWrite(EvaluationContext context, Object target, String name) throws AccessException { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void write(EvaluationContext context, Object target, String name, Object newValue) throws AccessException { |
|
|
|
public void write(EvaluationContext context, Object target, String name, Object newValue) |
|
|
|
|
|
|
|
throws AccessException { |
|
|
|
throw new UnsupportedOperationException("Should not be called"); |
|
|
|
throw new UnsupportedOperationException("Should not be called"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public Class<?>[] getSpecificTargetClasses() { |
|
|
|
|
|
|
|
return new Class[] { MessageSourceResolvable.class }; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Class[] getSpecificTargetClasses() { |
|
|
|
|
|
|
|
return new Class[] { Map.class }; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |