@Override public final String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException { String[] codes = resolvable.getCodes(); if (codes == null) { codes = new String[0]; } for (String code : codes) { String msg = getMessageInternal(code, resolvable.getArguments(), locale); if (msg != null) { return msg; } } String defaultMessage = resolvable.getDefaultMessage(); if (defaultMessage != null) { return renderDefaultMessage(defaultMessage, resolvable.getArguments(), locale); } if (codes.length > 0) { String fallback = getDefaultMessage(codes[0]); if (fallback != null) { return fallback; } } throw new NoSuchMessageException(codes.length > 0 ? codes[codes.length - 1] : null, locale); }
/** * Searches through the given array of objects, finds any MessageSourceResolvable * objects and resolves them. * <p>Allows for messages to have MessageSourceResolvables as arguments. * @param args array of arguments for a message * @param locale the locale to resolve through * @return an array of arguments with any MessageSourceResolvables resolved */ @Override protected Object[] resolveArguments(Object[] args, Locale locale) { if (args == null) { return new Object[0]; } List<Object> resolvedArgs = new ArrayList<Object>(args.length); for (Object arg : args) { if (arg instanceof MessageSourceResolvable) { resolvedArgs.add(getMessage((MessageSourceResolvable) arg, locale)); } else { resolvedArgs.add(arg); } } return resolvedArgs.toArray(new Object[resolvedArgs.size()]); }
@Test public void messageSourceResolvable() { // first code valid String[] codes1 = new String[] {"message.format.example3", "message.format.example2"}; MessageSourceResolvable resolvable1 = new DefaultMessageSourceResolvable(codes1, null, "default"); assertTrue("correct message retrieved", MSG_TXT3_US.equals(sac.getMessage(resolvable1, Locale.US))); // only second code valid String[] codes2 = new String[] {"message.format.example99", "message.format.example2"}; MessageSourceResolvable resolvable2 = new DefaultMessageSourceResolvable(codes2, null, "default"); assertTrue("correct message retrieved", MSG_TXT2_US.equals(sac.getMessage(resolvable2, Locale.US))); // no code valid, but default given String[] codes3 = new String[] {"message.format.example99", "message.format.example98"}; MessageSourceResolvable resolvable3 = new DefaultMessageSourceResolvable(codes3, null, "default"); assertTrue("correct message retrieved", "default".equals(sac.getMessage(resolvable3, Locale.US))); // no code valid, no default String[] codes4 = new String[] {"message.format.example99", "message.format.example98"}; MessageSourceResolvable resolvable4 = new DefaultMessageSourceResolvable(codes4); exception.expect(NoSuchMessageException.class); sac.getMessage(resolvable4, Locale.US); }
@Test @SuppressWarnings("rawtypes") public void requestContext() throws ServletException { PageContext pc = createPageContext(); RequestContext rc = new RequestContext((HttpServletRequest) pc.getRequest(), pc.getServletContext()); assertEquals("test message", rc.getMessage("test")); assertEquals("test message", rc.getMessage("test", (Object[]) null)); assertEquals("test message", rc.getMessage("test", "default")); assertEquals("test message", rc.getMessage("test", (Object[]) null, "default")); assertEquals("test arg1 message arg2", rc.getMessage("testArgs", new String[] {"arg1", "arg2"}, "default")); assertEquals("test arg1 message arg2", rc.getMessage("testArgs", Arrays.asList(new String[] {"arg1", "arg2"}), "default")); assertEquals("default", rc.getMessage("testa", "default")); assertEquals("default", rc.getMessage("testa", (List) null, "default")); MessageSourceResolvable resolvable = new DefaultMessageSourceResolvable(new String[] {"test"}); assertEquals("test message", rc.getMessage(resolvable)); }
@Test @SuppressWarnings("rawtypes") public void requestContext() throws ServletException { PageContext pc = createPageContext(); RequestContext rc = new RequestContext((HttpServletRequest) pc.getRequest()); assertEquals("theme test message", rc.getThemeMessage("themetest")); assertEquals("theme test message", rc.getThemeMessage("themetest", (String[]) null)); assertEquals("theme test message", rc.getThemeMessage("themetest", "default")); assertEquals("theme test message", rc.getThemeMessage("themetest", (Object[]) null, "default")); assertEquals("theme test message arg1", rc.getThemeMessage("themetestArgs", new String[] {"arg1"})); assertEquals("theme test message arg1", rc.getThemeMessage("themetestArgs", Arrays.asList(new String[] {"arg1"}))); assertEquals("default", rc.getThemeMessage("themetesta", "default")); assertEquals("default", rc.getThemeMessage("themetesta", (List) null, "default")); MessageSourceResolvable resolvable = new DefaultMessageSourceResolvable(new String[] {"themetest"}); assertEquals("theme test message", rc.getThemeMessage(resolvable)); }
protected Warns convert(List<ObjectError> errors) { Warns warns = Warns.init(); errors.forEach((oe) -> { String field = ""; if (1 == oe.getCodes().length) { field = bindField(oe.getCodes()[0]); } else if (1 < oe.getCodes().length) { // low: プリフィックスは冗長なので外してます field = bindField(oe.getCodes()[1]); } List<String> args = Arrays.stream(oe.getArguments()) .filter((arg) -> !(arg instanceof MessageSourceResolvable)) .map(Object::toString) .collect(Collectors.toList()); String message = oe.getDefaultMessage(); if (0 <= oe.getCodes()[0].indexOf("typeMismatch")) { message = oe.getCodes()[2]; } warns.add(field, message, args.toArray(new String[0])); }); return warns; }
@Bean public Docket api(){ return new Docket(DocumentationType.SWAGGER_2) .useDefaultResponseMessages(false) .forCodeGeneration(false) .alternateTypeRules( getAlternateTypeRule(Collection.class, WildcardType.class, List.class, WildcardType.class), getAlternateTypeRule(Stream.class, WildcardType.class, List.class, WildcardType.class), getAlternateTypeRule(DeferredResult.class, List.class, WildcardType.class, List.class, WildcardType.class)) .ignoredParameterTypes(PagedResourcesAssembler.class, Pageable.class) .directModelSubstitute(MessageSourceResolvable.class, String.class) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.regex("/api/.*")) .build() .apiInfo(apiInfo()); }
@Override public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { { if (value instanceof I18nMessage) { return ((I18nMessage) value).i18n(); } if (value instanceof MessageSourceResolvable) { return ((MessageSourceResolvable) value).getDefaultMessage(); } String s = value.toString(); if (s != null && s.length() > 0) { return s; } } return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus); }
@Override public Class<?> getColumnClass(int columnIndex) { switch (columnIndex) { case INDEX_COLUMN : return Integer.class; case NAME_COLUMN : return String.class; case TYPE_COLUMN : return MessageSourceResolvable.class; case BLOCKING_COLUMN : return Boolean.class; case ENABLED_COLUMN : return Boolean.class; default : throw new SanityCheckException("Unsupported index [" + columnIndex + "]"); } }
private MessageSourceResolvable parse2(String code, Object[] args, String defaultMessage) { List<MessageSourceResolvable> params = new ArrayList<>(); Matcher m = pattern.matcher(code); boolean result = m.find(); if (!result) { return new DefaultMessageSourceResolvable(new String[] { code }, getArgs(params, args), defaultMessage); } StringBuffer sb = new StringBuffer(); do { String s = m.group(1); params.add(create(sb.toString(), s)); m.appendReplacement(sb, "[]"); result = m.find(); } while (result); m.appendTail(sb); return new DefaultMessageSourceResolvable(new String[] { code, sb.toString() }, getArgs(params, args), defaultMessage); }
public void testRequestContext() throws ServletException { PageContext pc = createPageContext(); RequestContext rc = new RequestContext((HttpServletRequest) pc.getRequest(), pc.getServletContext()); assertEquals("test message", rc.getMessage("test")); assertEquals("test message", rc.getMessage("test", (Object[]) null)); assertEquals("test message", rc.getMessage("test", "default")); assertEquals("test message", rc.getMessage("test", (Object[]) null, "default")); assertEquals("test arg1 message arg2", rc.getMessage("testArgs", new String[] {"arg1", "arg2"}, "default")); assertEquals("test arg1 message arg2", rc.getMessage("testArgs", Arrays.asList(new String[] {"arg1", "arg2"}), "default")); assertEquals("default", rc.getMessage("testa", "default")); assertEquals("default", rc.getMessage("testa", (List) null, "default")); MessageSourceResolvable resolvable = new DefaultMessageSourceResolvable(new String[] {"test"}); assertEquals("test message", rc.getMessage(resolvable)); }
public void testRequestContext() throws ServletException { PageContext pc = createPageContext(); RequestContext rc = new RequestContext((HttpServletRequest) pc.getRequest()); assertEquals("theme test message", rc.getThemeMessage("themetest")); assertEquals("theme test message", rc.getThemeMessage("themetest", (String[]) null)); assertEquals("theme test message", rc.getThemeMessage("themetest", "default")); assertEquals("theme test message", rc.getThemeMessage("themetest", (Object[]) null, "default")); assertEquals("theme test message arg1", rc.getThemeMessage("themetestArgs", new String[] {"arg1"})); assertEquals("theme test message arg1", rc.getThemeMessage("themetestArgs", Arrays.asList(new String[] {"arg1"}))); assertEquals("default", rc.getThemeMessage("themetesta", "default")); assertEquals("default", rc.getThemeMessage("themetesta", (List) null, "default")); MessageSourceResolvable resolvable = new DefaultMessageSourceResolvable(new String[] {"themetest"}); assertEquals("theme test message", rc.getThemeMessage(resolvable)); }
@Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof MessageSourceResolvable)) { return false; } MessageSourceResolvable otherResolvable = (MessageSourceResolvable) other; return ObjectUtils.nullSafeEquals(getCodes(), otherResolvable.getCodes()) && ObjectUtils.nullSafeEquals(getArguments(), otherResolvable.getArguments()) && ObjectUtils.nullSafeEquals(getDefaultMessage(), otherResolvable.getDefaultMessage()); }
@Override public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException { if (this.parentMessageSource != null) { return this.parentMessageSource.getMessage(resolvable, locale); } else { if (resolvable.getDefaultMessage() != null) { return renderDefaultMessage(resolvable.getDefaultMessage(), resolvable.getArguments(), locale); } String[] codes = resolvable.getCodes(); String code = (codes != null && codes.length > 0 ? codes[0] : null); throw new NoSuchMessageException(code, locale); } }
/** * For some reason Spring puts MessageSourceResolvable as argument so need to remove it */ private List<String> getArguments(ObjectError error) { if (error.getArguments() == null) { return emptyList(); } return Arrays.stream(error.getArguments()) .filter(arg -> !(arg instanceof MessageSourceResolvable)) .map(Object::toString) .collect(toList()); }
@Test public void nestedMessageSourceWithParamInChild() { StaticMessageSource source = new StaticMessageSource(); StaticMessageSource parent = new StaticMessageSource(); source.setParentMessageSource(parent); source.addMessage("param", Locale.ENGLISH, "value"); parent.addMessage("with.param", Locale.ENGLISH, "put {0} here"); MessageSourceResolvable resolvable = new DefaultMessageSourceResolvable( new String[] {"with.param"}, new Object[] {new DefaultMessageSourceResolvable("param")}); assertEquals("put value here", source.getMessage(resolvable, Locale.ENGLISH)); }
@Test public void nestedMessageSourceWithParamInParent() { StaticMessageSource source = new StaticMessageSource(); StaticMessageSource parent = new StaticMessageSource(); source.setParentMessageSource(parent); parent.addMessage("param", Locale.ENGLISH, "value"); source.addMessage("with.param", Locale.ENGLISH, "put {0} here"); MessageSourceResolvable resolvable = new DefaultMessageSourceResolvable( new String[] {"with.param"}, new Object[] {new DefaultMessageSourceResolvable("param")}); assertEquals("put value here", source.getMessage(resolvable, Locale.ENGLISH)); }
@Override public String getMessage(final MessageSourceResolvable resolvable, final Locale locale) throws NoSuchMessageException { try { return source.getMessage(resolvable, locale); } catch (NoSuchMessageException e) { return getUnknownMessages(resolvable.getCodes()); } }
@Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof MessageSourceResolvable)) { return false; } MessageSourceResolvable otherResolvable = (MessageSourceResolvable) other; return (ObjectUtils.nullSafeEquals(getCodes(), otherResolvable.getCodes()) && ObjectUtils.nullSafeEquals(getArguments(), otherResolvable.getArguments()) && ObjectUtils.nullSafeEquals(getDefaultMessage(), otherResolvable.getDefaultMessage())); }
/** * {@inheritDoc} */ public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException { for (String code : resolvable.getCodes()) { String message = getMessage(code, resolvable.getArguments(), locale); if (message != null && message.length() > 0) { return message; } } return resolvable.getDefaultMessage(); }
private Object[] resolveArguments(Object[] arguments) { if (arguments == null || arguments.length == 0) { return arguments; } for (int i = 0; i < arguments.length; i++) { Object arg = arguments[i]; if (arg instanceof MessageSourceResolvable) { MessageSourceResolvable resolvable = (MessageSourceResolvable)arg; String[] codes = resolvable.getCodes(); boolean resolved = false; if (this.messageResources != null) { for (int j = 0; j < codes.length; j++) { String code = codes[j]; if (this.messageResources.isPresent(this.locale, code)) { arguments[i] = this.messageResources.getMessage( this.locale, code, resolveArguments(resolvable.getArguments())); resolved = true; break; } } } if (!resolved) { arguments[i] = resolvable.getDefaultMessage(); } } } return arguments; }
@Override public <T> Response<T> createResponse(StatusCode statusCode, List<? extends MessageSourceResolvable> messages) { Response<T> response = new Response<>(); response.setStatusCode(statusCode.code()); response.setDescription(getMessageList(messages)); return response; }
@Override public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException { String message = null; for (ResourceBundleMessageSource source : sources) { try { message = source.getMessage(resolvable, locale); break; } catch (NoSuchMessageException e) { //continue } } if( message == null ) return super.getMessage(resolvable, locale); return message; }
@Override public final String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException { String[] codes = resolvable.getCodes(); if (codes == null) { codes = new String[0]; } ICUMessageArguments args = new ICUListMessageArguments(resolvable.getArguments()); for (String code : codes) { String msg = getMessageInternal(code, args, locale); if (msg != null) { return msg; } } String defaultMessage = resolvable.getDefaultMessage(); if (defaultMessage != null) { return renderDefaultMessage(defaultMessage, args, locale); } if (codes.length > 0) { String fallback = getDefaultMessage(codes[0]); if (fallback != null) { return fallback; } } throw new NoSuchMessageException(codes.length > 0 ? codes[codes.length - 1] : null, locale); }
/** * Searches through the given arguments, finds any MessageSourceResolvable * objects and resolves them. * <p>Allows for messages to have MessageSourceResolvables as arguments. * @param args arguments for a message * @param locale the locale to resolve through */ @Override protected ICUMessageArguments resolveArguments(ICUMessageArguments args, final Locale locale) { return args.transform(new ICUMessageArguments.Transformation() { @Override public Object transform(Object item) { if (item instanceof MessageSourceResolvable) return getMessage((MessageSourceResolvable) item, locale); return item; } }); }
public static List<String> getMessageList(List<MessageSourceResolvable> messages) { Locale locale = LocaleContextHolder.getLocale(); List<String> list = new ArrayList<>(messages.size()); for (MessageSourceResolvable resolvable : messages) { list.add(messageSource.getMessage(resolvable, locale)); } return list; }
@Test public void testResolveFromCode() { MessageSourceResolvable resolvable = LogicalErrorUtil.resolve(new Code<String>() { @Override public String code() { return "property"; } }); assertNotNull(resolvable.getCodes()); assertEquals(1, resolvable.getCodes().length); assertEquals("property", resolvable.getCodes()[0]); assertNotNull(resolvable.getArguments()); assertEquals(0, resolvable.getArguments().length); assertNull(resolvable.getDefaultMessage()); }
@Test public void testResolveFromString() { MessageSourceResolvable resolvable = LogicalErrorUtil.resolve("property"); assertNotNull(resolvable.getCodes()); assertEquals(1, resolvable.getCodes().length); assertEquals("property", resolvable.getCodes()[0]); assertNotNull(resolvable.getArguments()); assertEquals(0, resolvable.getArguments().length); assertNull(resolvable.getDefaultMessage()); }