/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* 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.dashbuilder.renderer.google.client;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import com.googlecode.gwt.charts.client.ChartLoader;
import com.googlecode.gwt.charts.client.ChartPackage;
import org.dashbuilder.displayer.DisplayerSettings;
import org.dashbuilder.displayer.DisplayerSubType;
import org.dashbuilder.displayer.DisplayerType;
import org.dashbuilder.displayer.client.AbstractRendererLibrary;
import org.dashbuilder.displayer.client.Displayer;
import static org.dashbuilder.displayer.DisplayerType.*;
import static org.dashbuilder.displayer.DisplayerSubType.*;
import java.util.EnumSet;
/**
* Google's Visualization API based renderer.
*/
@ApplicationScoped
public class GoogleRenderer extends AbstractRendererLibrary {
public static final String UUID = "gwtcharts";
private static Map<DisplayerType,ChartPackage> _packageTypes = new HashMap<DisplayerType,ChartPackage>();
static {
_packageTypes.put(BARCHART, ChartPackage.CORECHART);
_packageTypes.put(PIECHART, ChartPackage.CORECHART);
_packageTypes.put(AREACHART, ChartPackage.CORECHART);
_packageTypes.put(LINECHART, ChartPackage.CORECHART);
_packageTypes.put(BUBBLECHART, ChartPackage.CORECHART);
_packageTypes.put(METERCHART, ChartPackage.GAUGE);
_packageTypes.put(TABLE, ChartPackage.TABLE);
_packageTypes.put(MAP, ChartPackage.GEOCHART);
}
private List<DisplayerType> _supportedTypes = Arrays.asList(
BARCHART,
PIECHART,
AREACHART,
LINECHART,
BUBBLECHART,
METERCHART,
TABLE,
MAP);
public String getUUID() {
return UUID;
}
@Override
public String getName() {
return "GWT Charts";
}
@Override
public boolean isDefault(DisplayerType type) {
return BARCHART.equals(type) ||
PIECHART.equals(type) ||
AREACHART.equals(type) ||
LINECHART.equals(type) ||
BUBBLECHART.equals(type) ||
METERCHART.equals(type) ||
MAP.equals(type);
}
@Override
public List<DisplayerType> getSupportedTypes() {
return _supportedTypes;
}
@Override
public List<DisplayerSubType> getSupportedSubtypes(DisplayerType displayerType) {
switch (displayerType) {
case BARCHART:
return Arrays.asList(BAR, BAR_STACKED, COLUMN, COLUMN_STACKED);
case PIECHART:
return Arrays.asList(PIE, PIE_3D, DONUT);
case AREACHART:
return Arrays.asList(AREA, AREA_STACKED /*,STEPPED*/);
case LINECHART:
return Arrays.asList(LINE, SMOOTH);
case MAP:
return Arrays.asList(MAP_REGIONS, MAP_MARKERS);
default:
return Arrays.asList();
}
}
public Displayer lookupDisplayer(DisplayerSettings displayerSettings) {
DisplayerType displayerType = displayerSettings.getType();
if (BARCHART.equals(displayerType)) {
GoogleBarChartDisplayer displayer = new GoogleBarChartDisplayer();
((GoogleBarChartDisplayerView) displayer.getView()).setRenderer(this);
return displayer;
}
if (PIECHART.equals(displayerType)) {
GooglePieChartDisplayer displayer = new GooglePieChartDisplayer();
((GooglePieChartDisplayerView) displayer.getView()).setRenderer(this);
return displayer;
}
if (AREACHART.equals(displayerType)) {
GoogleAreaChartDisplayer displayer = new GoogleAreaChartDisplayer();
((GoogleAreaChartDisplayerView) displayer.getView()).setRenderer(this);
return displayer;
}
if (LINECHART.equals(displayerType)) {
GoogleLineChartDisplayer displayer = new GoogleLineChartDisplayer();
((GoogleLineChartDisplayerView) displayer.getView()).setRenderer(this);
return displayer;
}
if (BUBBLECHART.equals(displayerType)) {
GoogleBubbleChartDisplayer displayer = new GoogleBubbleChartDisplayer();
((GoogleBubbleChartDisplayerView) displayer.getView()).setRenderer(this);
return displayer;
}
if (METERCHART.equals(displayerType)) {
GoogleMeterChartDisplayer displayer = new GoogleMeterChartDisplayer();
((GoogleMeterChartDisplayerView) displayer.getView()).setRenderer(this);
return displayer;
}
if (TABLE.equals(displayerType)) {
GoogleTableDisplayer displayer = new GoogleTableDisplayer();
((GoogleTableDisplayerView) displayer.getView()).setRenderer(this);
return displayer;
}
if (MAP.equals(displayerType)) {
GoogleMapDisplayer displayer = new GoogleMapDisplayer();
((GoogleMapDisplayerView) displayer.getView()).setRenderer(this);
return displayer;
}
return null;
}
/**
* In Google the renderer mechanism is asynchronous.
*/
public void draw(final List<Displayer> displayerList) {
// Get the modules to load.
Set<ChartPackage> packageList = EnumSet.noneOf(ChartPackage.class);
for (Displayer displayer : displayerList) {
try {
GoogleDisplayer googleDisplayer = (GoogleDisplayer) displayer;
packageList.add(_packageTypes.get(googleDisplayer.getDisplayerSettings().getType()));
} catch (ClassCastException e) {
// Just ignore non Google displayers.
}
}
// Create an array of packages.
ChartPackage[] packageArray = new ChartPackage[packageList.size()];
int i = 0;
for (ChartPackage pkg : packageList) {
packageArray[i++] = pkg;
}
// Load the visualization API
ChartLoader chartLoader = new ChartLoader(packageArray);
chartLoader.loadApi(new Runnable() {
// Called when the visualization API has been loaded.
public void run() {
for (Displayer displayer : displayerList) {
try {
GoogleDisplayer googleDisplayer = (GoogleDisplayer) displayer;
googleDisplayer.ready();
} catch (ClassCastException e) {
// Just ignore non Google displayers.
}
}
}
});
}
}