SpringErrors.java

package sk.iway.iwcm.tags;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

import sk.iway.iwcm.Tools;
import sk.iway.iwcm.system.spring.webjet_component.WebjetError;
import sk.iway.iwcm.system.spring.webjet_component.WebjetErrors;

public class SpringErrors extends BodyTagSupport {

    private static final long serialVersionUID = 1L;

    private String wrapper = "div";
    private String listTag = "ul";
    private String itemTag = "li";

    private Map<String, String> wrapperOptionsMap;
    private Map<String, String> listTagOptionsMap;
    private Map<String, String> itemTagOptionsMap;

    private HttpServletRequest request;

    public int doEndTag() throws JspException {

        request = (HttpServletRequest) pageContext.getRequest();
        List<WebjetError> errors = getErrors();

        if (errors.isEmpty()) {
            return super.doEndTag();
        }

        StringBuilder sb = new StringBuilder();

        String wrapper = getWrapper();
        String listTag = getListTag();
        String itemTag = getItemTag();

        if (Tools.isNotEmpty(wrapper)) {
            sb.append("<")
                .append(getWrapper())
                .append(getOptions(getWrapperOptionsMap()))
                .append(">");
        }

        //this.writeDefaultAttributes(tagWriter);

        if (Tools.isNotEmpty(listTag)) {
            sb.append("<")
                .append(getListTag())
                .append(getOptions(getListTagOptionsMap()))
                .append(">");
        }

        for (WebjetError error : errors) {
            String field = error.getField();
            String message = error.getMessage();

            if (Tools.isNotEmpty(itemTag)) {
                sb.append("<")
                    .append(getItemTag())
                    .append(getOptions(getItemTagOptionsMap()))
                    .append(">");
            }

            if (Tools.isNotEmpty(field)) {
                sb.append(error.getField()).append(" - ");
            }

            sb.append(message);

            if (Tools.isNotEmpty(itemTag)) {
                sb.append("</")
                    .append(getItemTag())
                    .append(">");
            }
        }

        if (Tools.isNotEmpty(listTag)) {
            sb.append("</")
                .append(getListTag())
                .append(">");
        }

        if (Tools.isNotEmpty(wrapper)) {
            sb.append("</")
                .append(getWrapper())
                .append(">");
        }

        try {
            pageContext.getOut().write(sb.toString());
        } catch (IOException e) {
            sk.iway.iwcm.Logger.error(e);
        }

        return super.doEndTag();
    }

    private String getOptions(Map<String, String> options) {
        StringBuilder sb = new StringBuilder();

        if (options != null && !options.isEmpty()) {
            for (Map.Entry<String, String> entry : options.entrySet()) {
                sb.append(" ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
            }
        }

        return sb.toString();
    }

    private List<WebjetError> getErrors() throws JspException {
        List<WebjetError> result = new ArrayList<>();

        if (request.getAttribute("errors") != null && request.getAttribute("errors").getClass().isAssignableFrom(WebjetErrors.class)) {
            WebjetErrors errors = (WebjetErrors) request.getAttribute("errors");
            List<WebjetError> errorsList = errors.getErrors();
            result.addAll(errorsList);
        }

        return result;
    }

    public String getWrapper() {
        return wrapper;
    }

    public void setWrapper(String wrapper) {
        this.wrapper = wrapper;
    }

    public String getListTag() {
        return listTag;
    }

    public void setListTag(String listTag) {
        this.listTag = listTag;
    }

    public String getItemTag() {
        return itemTag;
    }

    public void setItemTag(String itemTag) {
        this.itemTag = itemTag;
    }

    public void setWrapperOptions(String wrapperOptions) {
        if (wrapperOptionsMap == null) {
            wrapperOptionsMap = new HashMap<>();
        }
        addToMap(wrapperOptionsMap, wrapperOptions);
    }

    public void setListTagOptions(String listTagOptions) {
        if (listTagOptionsMap == null) {
            listTagOptionsMap = new HashMap<>();
        }
        addToMap(listTagOptionsMap, listTagOptions);
    }

    public void setItemTagOptions(String itemTagOptions) {
        if (itemTagOptionsMap == null) {
            itemTagOptionsMap = new HashMap<>();
        }
        addToMap(itemTagOptionsMap, itemTagOptions);
    }

    public Map<String, String> getWrapperOptionsMap() {
        return wrapperOptionsMap;
    }

    public Map<String, String> getListTagOptionsMap() {
        return listTagOptionsMap;
    }

    public Map<String, String> getItemTagOptionsMap() {
        return itemTagOptionsMap;
    }

    private void addToMap(Map<String, String> map, String str) {
        if (!str.contains("=")) {
            return;
        }

        String[] arr = Tools.getTokens(str, ",");
        for (String val : arr) {
            String[] values = Tools.getTokens(val, "=");

            if (values.length == 2) {
                map.put(values[0], values[1]);
            }
        }
    }
}