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

org.wicketstuff.gchart.DataTable Maven / Gradle / Ivy

Go to download

Integrate Google Charts API (v45) with wicket. The API tries not to hide all details of the Google API, but makes use of the JSON lib of wicket to mix Java, JavaScript and JSON in a transparent way..

The newest version!
/* 
 * Licensed 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 org.wicketstuff.gchart;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.wicket.util.io.IClusterable;

import com.github.openjson.JSONArray;
import com.github.openjson.JSONObject;

/**
 * Abstraction of a datatable.
 *
 * @author Dieter Tremel
 */
public class DataTable implements IClusterable, Jsonable, JavaScriptable {

    private static final long serialVersionUID = 1L;

    private final String name;
    private final List columnDescs;
    private final List rows;
    private final Map properties;

    public DataTable(String name, Collection columDescs, Collection rows) {
        this.name = name;
        this.columnDescs = new ArrayList<>(columDescs);
        this.rows = new ArrayList<>(rows);
        this.properties = new HashMap<>(8);
    }

    public DataTable(String name, Collection columDescs, Collection rows, Map properties) {
        this.name = name;
        this.columnDescs = new ArrayList<>(columDescs);
        this.rows = new ArrayList<>(rows);
        this.properties = properties;
    }

    /**
     * Create rows for the datatable from an array.
     *
     * @param data Two dimensional array with data series. First index over
     * rows, second index over columns. Do not include header in data, use
     * {@link ColumnDeclaration} for that.
     * @return List of DataRows suited for {@link #DataTable(java.lang.String, java.util.Collection, java.util.Collection)
     * }.
     */
    public static List fromArray(Object[][] data) {
        ArrayList rows = new ArrayList<>(data.length);
        for (Object[] arrayRow : data) {
            DataRow row = new DataRow(arrayRow.length);
            row.addAll(Arrays.asList(arrayRow));
            rows.add(row);
        }
        return rows;
    }

    /**
     * Generate declaration js for datatable variable. Field {@code name} is used for variable
     * identifier.
     *
     * @return Declaration js.
     */
    @Override
    public String toJavaScript() {
        return toJavaScript(name);
    }

    /**
     * Generate declaration js for datatable variable.
     *
     * @param varname Name of datatable variable identifier.
     * @return Declaration js
     */
    public String toJavaScript(String varname) {
        if (varname == null || varname.isEmpty()) {
            throw new IllegalArgumentException("Name must not be null or empty for Javascript generation of chart datatable.");
        }
        StringBuilder sb = new StringBuilder();
        sb.append("var ").append(varname).append(" = new google.visualization.DataTable(");
        sb.append(toJSON().toString());
        sb.append(");").append("\n");
        return sb.toString();
    }

    @Override
    public JSONObject toJSON() {
        JSONObject datatable = new JSONObject();

        // column definitions
        JSONArray cols = new JSONArray();
        for (ColumnDeclaration columnDesc : columnDescs) {
            cols.put(columnDesc.toJSON());
        }
        datatable.put("cols", cols);

        // data rows
        JSONArray rowsJSON = new JSONArray();
        for (DataRow row : rows) {
            rowsJSON.put(row.toJSON());
        }
        datatable.put("rows", rowsJSON);

        // properties
        if (properties != null && !properties.isEmpty()) {
            datatable.put("p", new JSONObject(properties));
        }

        return datatable;
    }

    public String getName() {
        return name;
    }

    public List getColumnDescs() {
        return columnDescs;
    }

    public List getRows() {
        return rows;
    }

    public Map getProperties() {
        return properties;
    }

    public boolean addRow(DataRow newRow) {
        return rows.add(newRow);
    }

    public boolean addRow(Collection newRow) {
        return rows.add(new DataRow(newRow));
    }

}