Используйте конкретную локаль для Seam logger - PullRequest
1 голос
/ 15 марта 2011

Регистратор Seam использует, глубоко внутри, класс MessageFormat Java для форматирования, например. номера. Используемая для этого локаль взята из org.jboss.seam.core.locale, если я правильно интерпретирую код. Однако я не знаю, как действовать дальше. Я хочу, чтобы регистратор использовал только английскую локаль (любая английская локаль подойдет), потому что все наши журналы ведутся на английском. Система или пользователь могут иметь другую локаль, но это не должно влиять на ведение журнала.

1 Ответ

0 голосов
/ 25 марта 2011

Это не так уж и элегантно, потому что вам приходится дублировать практически весь код, кроме одной строки, но вы можете переопределить встроенную реализацию компонента Interpolator.

/**
 * Interpolates EL expressions in Strings
 * 
 * @author Gavin King
 */
@BypassInterceptors
@Scope(STATELESS)
@Name("org.jboss.seam.core.interpolator")
@Install(precedence=APPLICATION)
public class Interpolator extends org.jboss.seam.core.Interpolator  
{

    private static final LogProvider log = Logging.getLogProvider(Interpolator.class);


    /**
     * Replace all EL expressions in the form #{...} with their evaluated
     * values.
     * 
     * @param string a template
     * @return the interpolated string
     */
    @Override
    public String interpolate(String string, Object... params) 
    {
        if (params == null) {
            params = new Object[0];
        }

        if (params.length>10) {
            throw new IllegalArgumentException("more than 10 parameters");
        }

        if (string.indexOf('#')>=0 || string.indexOf('{')>=0) {
            string = interpolateExpressions(string, params);
        }

        return string;
    }

    private String interpolateExpressions(String string, Object... params)
    {
        StringTokenizer tokens = new StringTokenizer(string, "#{}", true);
        StringBuilder builder = new StringBuilder(string.length());
        try {
            while (tokens.hasMoreTokens()) {
                String tok = tokens.nextToken();

                if ("#".equals(tok) && tokens.hasMoreTokens()) {
                    String nextTok = tokens.nextToken();

                    while (nextTok.equals("#") && tokens.hasMoreTokens()) {
                        builder.append(tok);
                        nextTok = tokens.nextToken();
                    }

                    if ("{".equals(nextTok)) {
                        String expression = "#{" + tokens.nextToken() + "}";
                        try {
                            Object value = Expressions.instance().createValueExpression(expression).getValue();
                            if (value!=null) builder.append(value);
                        } catch (Exception e) {
                            log.debug("exception interpolating string: " + string, e);
                        }
                        tokens.nextToken(); // the trailing "}"

                    } else if (nextTok.equals("#"))  {
                        // could be trailing # 
                        builder.append("#");

                    } else {
                        int index;
                        try {
                            index = Integer.parseInt(nextTok.substring(0, 1));
                            if (index>=params.length) {
                                //log.warn("parameter index out of bounds: " + index + " in: " + string);
                                builder.append("#").append(nextTok);
                            } else {
                                builder.append(params[index]).append(nextTok.substring(1));
                            }
                        } catch (NumberFormatException nfe) {
                            builder.append("#").append(nextTok);
                        }
                    }
                } else if ("{".equals(tok)) {
                    StringBuilder expr = new StringBuilder();

                    expr.append(tok);
                    int level = 1;

                    while (tokens.hasMoreTokens()) {
                        String nextTok = tokens.nextToken();
                        expr.append(nextTok);

                        if (nextTok.equals("{")) {
                            ++level;
                        } else if (nextTok.equals("}")) {
                            if (--level == 0) {
                                try {
                                    if (params.length == 0)
                                    {
                                        builder.append(expr.toString());
                                    }
                                    else
                                    {
                                        //String value = new MessageFormat(expr.toString(), Locale.instance()).format(params);
                                        // always use Locale.ENGLISH
                                        String value = new MessageFormat(expr.toString(), Locale.ENGLISH).format(params);
                                        builder.append(value);

                                    }
                                } catch (Exception e) {
                                    // if it is a bad message, use the expression itself
                                    builder.append(expr);                             
                                }
                                expr = null;
                                break;
                            }
                        }
                    } 

                    if (expr != null) {
                        builder.append(expr);
                    }
                } else {
                    builder.append(tok);
                }
            }
        } catch (Exception e) {
            log.debug("exception interpolating string: " + string, e);
        }

        return builder.toString();
    }

}
...