com.data2semantics.yasgui.client.tab.results.output.ResultGrid.java Source code

Java tutorial

Introduction

Here is the source code for com.data2semantics.yasgui.client.tab.results.output.ResultGrid.java

Source

package com.data2semantics.yasgui.client.tab.results.output;

/*
 * #%L
 * YASGUI
 * %%
 * Copyright (C) 2013 Laurens Rietveld
 * %%
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * #L%
 */

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

import com.data2semantics.yasgui.client.View;
import com.data2semantics.yasgui.client.helpers.Helper;
import com.data2semantics.yasgui.client.settings.Imgs;
import com.data2semantics.yasgui.client.tab.results.input.ResultsHelper;
import com.data2semantics.yasgui.client.tab.results.input.SparqlResults;
import com.data2semantics.yasgui.shared.Prefix;
import com.google.gwt.user.client.Window;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLPane;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.grid.CellFormatter;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.SortNormalizer;
import com.smartgwt.client.widgets.layout.HLayout;

public class ResultGrid extends ListGrid {
    private static String SOLUTION_ATTRIBUTE = "yasgui___solution";
    private HashMap<Integer, HashMap<String, HashMap<String, String>>> solutions = new HashMap<Integer, HashMap<String, HashMap<String, String>>>();
    private View view;
    private SparqlResults sparqlResults;
    private HashMap<String, Prefix> queryPrefixes = new HashMap<String, Prefix>();
    private ListGridRecord rollOverRecord;
    private HLayout rollOverCanvas;
    private Canvas emptyRollOverCanvas;

    public ResultGrid(final View view, SparqlResults sparqlResults, HTMLPane html) {
        this.view = view;
        this.sparqlResults = sparqlResults;
        setWidth100();
        setHeight100();
        setShowRecordComponents(true);
        setShowRecordComponentsByCell(true);
        setShowRowNumbers(true);
        setFixedRecordHeights(false);
        setWrapCells(true);
        setCanResizeFields(true);
        setShowRollOverCanvas(true);
        setUseCellRollOvers(true);
        queryPrefixes = Helper.getPrefixHashMapFromQuery(view.getSelectedTabSettings().getQueryString());
        drawQueryResults();

    }

    protected Canvas getRollOverCanvas(final Integer rowNum, Integer colNum) {
        rollOverRecord = getRecord(rowNum);
        if (rollOverRecord != null) {
            String varName = getFieldName(colNum);
            final String value = rollOverRecord.getAttribute(varName);

            if (value != null && value.startsWith("http")) {
                //the check above is done to avoid needing to use the solutions hashtable (might be a performance thingy)
                if (rollOverCanvas == null) {
                    rollOverCanvas = new HLayout();
                    rollOverCanvas.setSnapTo("TR");
                    rollOverCanvas.setWidth(22);
                    rollOverCanvas.setHeight(22);

                    ImgButton openExtLink = new ImgButton();
                    openExtLink.setShowDown(false);
                    openExtLink.setShowRollOver(false);
                    openExtLink.setLayoutAlign(Alignment.CENTER);
                    openExtLink.setSrc(Imgs.get(Imgs.EXTERNAL_LINK));
                    openExtLink.setPrompt("Open resource in new browser window");
                    openExtLink.setHeight(16);
                    openExtLink.setWidth(16);
                    openExtLink.addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                            Window.open(value, "_blank", "");
                        }
                    });

                    rollOverCanvas.addMember(openExtLink);

                }
                return rollOverCanvas;
            }
        }
        //this isnt a url. don't show rollover
        return getEmptyCanvas();

    }

    private Canvas getEmptyCanvas() {
        if (emptyRollOverCanvas == null) {
            emptyRollOverCanvas = new Canvas();
            emptyRollOverCanvas.setWidth(1);
            emptyRollOverCanvas.setHeight(1);
        }
        return emptyRollOverCanvas;
    }

    /**
     * Take json string from query results, parse it, and draw in this table
     * 
     * @param jsonString
     */
    public void drawQueryResults() {
        setVarsAsListGridFields(sparqlResults.getVariables());
        setSolutionsAsGridRecords(sparqlResults.getBindings());
    }

    /**
     * Get solutions from json object, and add as object to listgridrecords (i.e. table row)
     * 
     * @param solutions
     * @return
     */
    private void setSolutionsAsGridRecords(ArrayList<HashMap<String, HashMap<String, String>>> solutions) {
        ArrayList<ListGridRecord> rows = new ArrayList<ListGridRecord>();
        for (HashMap<String, HashMap<String, String>> solution : solutions) {
            this.solutions.put(solution.hashCode(), solution);
            ListGridRecord row = new ListGridRecord();
            row.setAttribute(SOLUTION_ATTRIBUTE, solution.hashCode());
            for (Entry<String, HashMap<String, String>> entry : solution.entrySet()) {
                String variable = entry.getKey();
                row.setAttribute(variable, entry.getValue().get("value"));
            }
            rows.add(row);
        }
        setData(rows.toArray(new ListGridRecord[rows.size()]));
    }

    /**
     * Get used vars from json object, and add them as variables (i.e. columns) to this listgrid 
     * @param vars
     * @return
     */
    private void setVarsAsListGridFields(ArrayList<String> vars) {
        ArrayList<ListGridField> listGridFields = new ArrayList<ListGridField>();
        for (final String var : vars) {
            ListGridField field = new ListGridField(var, var);
            field.setSortNormalizer(new SortNormalizer() {
                public Object normalize(ListGridRecord record, String fieldName) {
                    HashMap<String, HashMap<String, String>> bindings = solutions
                            .get(record.getAttributeAsInt(SOLUTION_ATTRIBUTE));
                    HashMap<String, String> binding = bindings.get(fieldName);
                    return binding.get("value");
                }
            });
            field.setCellFormatter(new CellFormatter() {
                @Override
                public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
                    HashMap<String, HashMap<String, String>> bindings = solutions
                            .get(record.getAttributeAsInt(SOLUTION_ATTRIBUTE));
                    HashMap<String, String> binding = bindings.get(var);
                    if (binding != null) {
                        String type = binding.get("type");
                        if (type.equals("uri")) {
                            return ResultsHelper.getOpenAsResourceLinkForUri(binding, queryPrefixes);
                        } else if (type.equals("literal") || binding.get("type").equals("typed-literal")) {
                            return ResultsHelper.getLiteralFromBinding(binding);
                        }
                    }
                    return (String) value;

                }
            });
            field.setCellAlign(Alignment.LEFT);
            field.setAlign(Alignment.CENTER); //for header

            listGridFields.add(field);
        }
        setFields(listGridFields.toArray(new ListGridField[listGridFields.size()]));
    }

    public String getDownloadFilename() {
        String filename = view.getSelectedTabSettings().getTabTitle() + ".csv";
        return filename;
    }

}