com.jgeppert.struts2.jquery.chart.components.ChartData.java Source code

Java tutorial

Introduction

Here is the source code for com.jgeppert.struts2.jquery.chart.components.ChartData.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package com.jgeppert.struts2.jquery.chart.components;

import java.awt.Point;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts2.util.MakeIterator;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import org.apache.struts2.views.annotations.StrutsTagSkipInheritance;

import com.jgeppert.struts2.jquery.components.AbstractContainer;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;

/**
 * <!-- START SNIPPET: javadoc -->
 * <p>
 * Data for the Chart Element
 * </p>
 * <!-- END SNIPPET: javadoc -->
 * 
 * @author <a href="http://www.jgeppert.com">Johannes Geppert</a>
 * 
 */
@StrutsTag(name = "chartData", tldTagClass = "com.jgeppert.struts2.jquery.chart.views.jsp.ui.ChartDataTag", description = "Data for the Chart Element", allowDynamicAttributes = true)
public class ChartData extends AbstractContainer {

    public static final String TEMPLATE = "chart-data";
    public static final String TEMPLATE_CLOSE = "chart-data-close";
    public static final String COMPONENT_NAME = ChartData.class.getName();
    protected final static Logger LOG = LoggerFactory.getLogger(ChartData.class);
    private final static transient Random RANDOM = new Random();

    protected String color;
    protected String label;
    protected String lines;
    protected String bars;
    protected String points;
    protected String xaxis;
    protected String yaxis;
    protected String clickable;
    protected String hoverable;
    protected String shadowSize;
    protected String fillBetween;
    protected String curvedLines;
    protected String curvedLinesFit;
    protected String curvedLinesFill;
    protected String curvedLinesFillColor;
    protected String curvedLinesLineWidth;
    protected String stack;

    protected String data;
    protected Object list;
    protected String listKey;
    protected String listValue;

    public ChartData(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
        super(stack, request, response);
    }

    public String getDefaultOpenTemplate() {
        return TEMPLATE;
    }

    protected String getDefaultTemplate() {
        return TEMPLATE_CLOSE;
    }

    @SuppressWarnings("rawtypes")
    public void evaluateExtraParams() {
        super.evaluateExtraParams();
        if (color != null)
            addParameter("color", findString(color));
        if (label != null)
            addParameter("label", findString(label));
        if (lines != null)
            addParameter("lines", findString(lines));
        if (bars != null)
            addParameter("bars", findString(bars));
        if (points != null)
            addParameter("points", findString(points));
        if (xaxis != null)
            addParameter("xaxis", findValue(xaxis, Integer.class));
        if (yaxis != null)
            addParameter("yaxis", findValue(yaxis, Integer.class));
        if (clickable != null)
            addParameter("clickable", findValue(this.clickable, Boolean.class));
        if (hoverable != null)
            addParameter("hoverable", findValue(this.hoverable, Boolean.class));
        if (shadowSize != null)
            addParameter("shadowSize", findValue(shadowSize, Integer.class));
        if (fillBetween != null)
            addParameter("fillBetween", findString(fillBetween));
        if (curvedLines != null)
            addParameter("curvedLines", findValue(this.curvedLines, Boolean.class));
        if (curvedLinesFit != null)
            addParameter("curvedLinesFit", findValue(this.curvedLinesFit, Boolean.class));
        if (curvedLinesFill != null)
            addParameter("curvedLinesFill", findValue(this.curvedLinesFill, Boolean.class));
        if (curvedLinesFillColor != null)
            addParameter("curvedLinesFillColor", findString(curvedLinesFillColor));
        if (curvedLinesLineWidth != null)
            addParameter("curvedLinesLineWidth", findValue(curvedLinesLineWidth, Integer.class));
        if (stack != null)
            addParameter("stack", findString(stack));

        if ((this.id == null || this.id.length() == 0)) {
            // resolves Math.abs(Integer.MIN_VALUE) issue reported by FindBugs
            // http://findbugs.sourceforge.net/bugDescriptions.html#RV_ABSOLUTE_VALUE_OF_RANDOM_INT
            int nextInt = RANDOM.nextInt();
            nextInt = nextInt == Integer.MIN_VALUE ? Integer.MAX_VALUE : Math.abs(nextInt);
            this.id = "chartdata" + String.valueOf(nextInt);
            addParameter("id", this.id);
        }

        Chart chart = (Chart) findAncestor(Chart.class);
        if (chart != null) {
            addParameter("chart", chart.getId());
        }

        if (this.href != null && !this.href.equals("#")) {
            if (list != null) {
                addParameter("remoteList", findString(list.toString()));
            }
            if (listKey != null) {
                addParameter("remoteListKey", findString(listKey));
            }
            if (listValue != null) {
                addParameter("remoteListValue", findString(listValue));
            }
        } else if (data != null) {
            addParameter("data", findString(data));
        } else {
            if (list == null) {
                list = parameters.get("list");
            }

            Object listObject = findValue(list.toString());

            if (listObject instanceof String) {
                addParameter("data", listObject);
            } else if (listObject instanceof Map) {
                Map map = (Map) listObject;
                Set keySet = map.keySet();

                StringBuffer data = new StringBuffer();
                data.append("[");

                boolean setComma = false;
                for (Object key : keySet) {
                    if (setComma) {
                        data.append(",");
                    }
                    if (!setComma) {
                        setComma = true;
                    }
                    data.append("[");
                    if (key instanceof Date) {
                        data.append(((Date) key).getTime());
                    } else {
                        data.append(key.toString());
                    }
                    data.append(",");
                    data.append(map.get(key));
                    data.append("]");
                }
                data.append("]");
                addParameter("data", data.toString());
            } else {
                Iterator iterator = null;
                if (listObject instanceof Collection) {
                    iterator = ((Collection) listObject).iterator();
                } else {
                    iterator = MakeIterator.convert(listObject);
                }

                if (iterator != null) {
                    StringBuffer data = new StringBuffer();
                    data.append("[");

                    Object item = iterator.next();
                    boolean iterat = true;
                    int count = 0;
                    while (iterat) {
                        count++;
                        if (item == null) {
                            data.append("null");
                        } else {
                            if (item instanceof Point) {
                                data.append("[");
                                Point point = (Point) item;
                                data.append(point.getX());
                                data.append(",");
                                data.append(point.getY());
                                data.append("]");
                            } else {
                                data.append("[");
                                if (listKey != null) {
                                    String key = findString(listKey);
                                    Object itemKey = null;
                                    try {
                                        itemKey = PropertyUtils.getSimpleProperty(item, key);
                                    } catch (IllegalAccessException e) {
                                        LOG.warn("Cannot read listKey", e);
                                    } catch (InvocationTargetException e) {
                                        LOG.warn("Cannot read listKey", e);
                                    } catch (NoSuchMethodException e) {
                                        LOG.warn("Cannot read listKey", e);
                                    }

                                    if (itemKey != null) {
                                        if (itemKey instanceof Date) {
                                            data.append(((Date) itemKey).getTime());
                                        } else {
                                            data.append(itemKey.toString());
                                        }
                                    } else {
                                        data.append(count);
                                    }
                                } else {
                                    data.append(count);
                                }

                                data.append(",");

                                if (listValue != null) {
                                    String value = findString(listValue);
                                    Object itemValue = null;
                                    try {
                                        itemValue = PropertyUtils.getSimpleProperty(item, value);
                                    } catch (IllegalAccessException e) {
                                        LOG.warn("Cannot read listValue", e);
                                    } catch (InvocationTargetException e) {
                                        LOG.warn("Cannot read listValue", e);
                                    } catch (NoSuchMethodException e) {
                                        LOG.warn("Cannot read listValue", e);
                                    }

                                    if (itemValue != null) {
                                        if (itemValue instanceof Date) {
                                            data.append(((Date) itemValue).getTime());
                                        } else {
                                            data.append(itemValue.toString());
                                        }
                                    } else {
                                        data.append(item.toString());
                                    }
                                } else {
                                    data.append(item.toString());
                                }
                                data.append("]");
                            }
                        }

                        if (iterator.hasNext()) {
                            data.append(",");
                            item = iterator.next();
                        } else {
                            iterat = false;
                        }
                    }

                    data.append("]");
                    addParameter("data", data.toString());
                }
            }
        }
    }

    @Override
    @StrutsTagSkipInheritance
    public void setTheme(String theme) {
        super.setTheme(theme);
    }

    @Override
    public String getTheme() {
        return "jquery";
    }

    @StrutsTagAttribute(description = "color or number")
    public void setColor(String color) {
        this.color = color;
    }

    @StrutsTagAttribute(description = "The Data Label")
    public void setLabel(String label) {
        this.label = label;
    }

    @StrutsTagAttribute(description = "specific lines options")
    public void setLines(String lines) {
        this.lines = lines;
    }

    @StrutsTagAttribute(description = "specific bars options")
    public void setBars(String bars) {
        this.bars = bars;
    }

    @StrutsTagAttribute(description = "specific points options")
    public void setPoints(String points) {
        this.points = points;
    }

    @StrutsTagAttribute(description = "1 or 2", type = "Integer")
    public void setXaxis(String xaxis) {
        this.xaxis = xaxis;
    }

    @StrutsTagAttribute(description = "1 or 2", type = "Integer")
    public void setYaxis(String yaxis) {
        this.yaxis = yaxis;
    }

    @StrutsTagAttribute(description = "can be set to false to disable interactivity for specific series if interactivity is turned on in the plot Default: true", defaultValue = "false", type = "Boolean")
    public void setClickable(String clickable) {
        this.clickable = clickable;
    }

    @StrutsTagAttribute(description = "can be set to false to disable interactivity for specific series if interactivity is turned on in the plot Default: true", defaultValue = "true", type = "Boolean")
    public void setHoverable(String hoverable) {
        this.hoverable = hoverable;
    }

    @StrutsTagAttribute(description = "Shadow Size", type = "Integer")
    public void setShadowSize(String shadowSize) {
        this.shadowSize = shadowSize;
    }

    @StrutsTagAttribute(description = "fill the area between two series.")
    public void setFillBetween(String fillBetween) {
        this.fillBetween = fillBetween;
    }

    @StrutsTagAttribute(description = "Chart Data. Don't use list and data attributes together. When using a Pie Chart data can be a numerical value like 10.")
    public void setData(String data) {
        this.data = data;
    }

    @StrutsTagAttribute(description = "Iterable source to populate from. If the list is a Map (key, value), the Map key will become the option 'value'"
            + " parameter and the Map value will become the option body.", required = false)
    public void setList(Object list) {
        this.list = list;
    }

    @StrutsTagAttribute(description = " Property of list objects to get field value from")
    public void setListKey(String listKey) {
        this.listKey = listKey;
    }

    @StrutsTagAttribute(description = "Property of list objects to get field content from")
    public void setListValue(String listValue) {
        this.listValue = listValue;
    }

    @StrutsTagAttribute(description = "Try to display lines in a smoother way.", type = "Boolean", defaultValue = "false")
    public void setCurvedLines(String curvedLines) {
        this.curvedLines = curvedLines;
    }

    @StrutsTagAttribute(description = "forces the max,mins of the curve to be on the datapoints.", type = "Boolean", defaultValue = "false")
    public void setCurvedLinesFit(String curvedLinesFit) {
        this.curvedLinesFit = curvedLinesFit;
    }

    @StrutsTagAttribute(description = "lines get filled.", type = "Boolean", defaultValue = "false")
    public void setCurvedLinesFill(String curvedLinesFill) {
        this.curvedLinesFill = curvedLinesFill;
    }

    @StrutsTagAttribute(description = "the color that should be used for filling")
    public void setCurvedLinesFillColor(String curvedLinesFillColor) {
        this.curvedLinesFillColor = curvedLinesFillColor;
    }

    @StrutsTagAttribute(description = "the width of the line.", type = "Integer")
    public void setCurvedLinesLineWidth(String curvedLinesLineWidth) {
        this.curvedLinesLineWidth = curvedLinesLineWidth;
    }

    @StrutsTagAttribute(description = "Stacking data sets, i.e. putting them on top of each other, for accumulative graphs")
    public void setStack(String stack) {
        this.stack = stack;
    }
}