All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.jhorstmann.i18n.jsf.TranslationComponent Maven / Gradle / Ivy

The newest version!
package net.jhorstmann.i18n.jsf;

import javax.faces.component.FacesComponent;
import net.jhorstmann.i18n.I18N;

import javax.faces.FacesException;
import javax.faces.component.StateHelper;
import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import static net.jhorstmann.i18n.jsf.FacesResourceBundle.getResourceBundle;

@FacesComponent(value = TranslationComponent.COMPONENT_TYPE)
public class TranslationComponent extends UIComponentBase {
    public static final String COMPONENT_TYPE = "net.jhorstmann.i18n.jsf.TranslationComponent";
    public static final String COMPONENT_FAMILY = "javax.faces.Output";

    enum PropertyKeys {
        message, context, plural, num, comment
    }

    public TranslationComponent() {
        setRendererType(null);
    }

    @Override
    public String getFamily() {
        return COMPONENT_FAMILY;
    }

    @Override
    public boolean getRendersChildren() {
        return true;
    }

    @Override
    public void encodeChildren(FacesContext context) throws IOException {
    }

    @Override
    public void encodeBegin(FacesContext facesContext) throws IOException {
        super.encodeBegin(facesContext);
    }

    private Object[] getParameters() {
        List children = getChildren();
        if (children == null || children.isEmpty()) {
            return new Object[0];
        } else {
            List result = new ArrayList(children.size());
            for (UIComponent comp : children) {
                if (comp instanceof UIParameter) {
                    UIParameter param = (UIParameter) comp;
                    result.add(param.getValue());
                }
            }
            return result.toArray(new Object[result.size()]);
        }
    }

    @Override
    public void encodeEnd(FacesContext facesContext) throws IOException {
        if (isRendered()) {
            StateHelper state = getStateHelper();
            String message = (String) state.eval(PropertyKeys.message);
            String context = (String) state.eval(PropertyKeys.context);
            String plural = (String) state.eval(PropertyKeys.plural);
            Long num = (Long) state.eval(PropertyKeys.num);

            if (message == null) {
                throw new FacesException("Message id is null");
            }
            if (plural != null && num == null) {
                throw new FacesException("Message id '" + message + "' requires num parameter");
            }

            Object[] params = getParameters();
            ResourceBundle bundle = getResourceBundle(facesContext);
            String str = I18N.translate(bundle, context, message, plural, num == null ? 0L : num.longValue(), params);

            facesContext.getResponseWriter().writeText(str, null);
        }
        super.encodeEnd(facesContext);
    }

    public void setMessage(String message) {
        getStateHelper().put(PropertyKeys.message, message);
    }

    public String getMessage() {
        return (String) getStateHelper().get(PropertyKeys.message);
    }

    public void setContext(String context) {
        getStateHelper().put(PropertyKeys.context, context);
    }

    public String getContext() {
        return (String) getStateHelper().get(PropertyKeys.context);
    }

    public void setPlural(String plural) {
        getStateHelper().put(PropertyKeys.plural, plural);
    }

    public String getPlural() {
        return (String) getStateHelper().get(PropertyKeys.plural);
    }

    public void setComment(String comment) {
        getStateHelper().put(PropertyKeys.comment, comment);
    }

    public String getComment() {
        return (String) getStateHelper().get(PropertyKeys.comment);
    }

    public void setNum(Long num) {
        getStateHelper().put(PropertyKeys.num, num);
    }

    public Long getNum() {
        return (Long) getStateHelper().get(PropertyKeys.num);
    }
}