/**
* Copyright 2012 Universitat Pompeu Fabra.
*
* 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.onexus.website.api.widgets.jheatmap;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.HeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnLoadHeaderItem;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.resource.JQueryPluginResourceReference;
import org.onexus.collection.api.ICollectionManager;
import org.onexus.collection.api.IEntityTable;
import org.onexus.collection.api.query.Query;
import org.onexus.resource.api.ORI;
import org.onexus.website.api.WebsiteApplication;
import org.onexus.website.api.widgets.Widget;
import org.onexus.website.api.widgets.tableviewer.columns.ColumnConfig;
import javax.inject.Inject;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
public class HeatmapViewer extends Widget<HeatmapViewerConfig, HeatmapViewerStatus> {
private static final HeaderItem CSS = CssHeaderItem.forReference(new CssResourceReference(HeatmapViewer.class, "css/jheatmap-1.0.0-alpha.css"));
private static final HeaderItem JS_JHEATMAP = JavaScriptHeaderItem.forReference(new JQueryPluginResourceReference(HeatmapViewer.class, "js/jheatmap-1.0.0-alpha.js"));
private static final ResourceReference LOADING_IMG = new PackageResourceReference(HeatmapViewer.class, "images/loading.gif");
@Inject
private ICollectionManager collectionManager;
public HeatmapViewer(String componentId, IModel<HeatmapViewerStatus> status) {
super(componentId, status);
add(new Image("loading", LOADING_IMG));
}
@Override
public void renderHead(IHeaderResponse response) {
response.render(CSS);
response.render(JS_JHEATMAP);
response.render(OnLoadHeaderItem.forScript(newJavaScriptHeatmap()));
}
private String newJavaScriptHeatmap() {
StringBuilder code = new StringBuilder();
HeatmapViewerConfig config = getConfig();
List<IColumn<IEntityTable, String>> columns = new ArrayList<IColumn<IEntityTable, String>>();
ORI parentUri = getPageBaseOri();
for (ColumnConfig column : getConfig().getColumns()) {
column.addColumns(columns, parentUri, false);
}
int lastColumnFields = columns.size();
columns.clear();
for (ColumnConfig row : getConfig().getRows()) {
row.addColumns(columns, parentUri, false);
}
int lastRowFields = lastColumnFields + columns.size();
columns.clear();
// Webservice URL
code.append(
"$('#heatmap').heatmap({\n" +
" data : {\n" +
" values: new jheatmap.readers.TsvMatrixReader({ url: \"" + getQueryUrl() + "\"}), \n");
code.append("\t\t\t\tcols_annotations : [");
if (config.getColAnnotations() == null) {
for (int i = 0; i < lastColumnFields; i++) {
if (i != 0) {
code.append(",");
}
code.append(i);
}
} else {
code.append(config.getColAnnotations());
}
code.append("], \n");
code.append("\t\t\t\trows_annotations : [");
if (config.getRowAnnotations() == null) {
for (int i = lastColumnFields; i < lastRowFields; i++) {
if (i != lastColumnFields) {
code.append(",");
}
code.append(i);
}
} else {
code.append(config.getRowAnnotations());
}
code.append("]\n" +
" },\n" +
" init : function(heatmap) {\n");
code.append(config.getInit());
code.append("$('.footer').css( 'position', 'relative');");
code.append("}});");
return code.toString();
}
private String getQueryUrl() {
String serviceMount = collectionManager.getMount();
String webserviceUrl = WebsiteApplication.toAbsolutePath('/' + serviceMount);
Query query = getQuery();
String strQuery = query.toString();
String fileName = "file-" + Integer.toHexString(strQuery.hashCode()) + ".tsv";
return webserviceUrl + "?query=" + URLEncoder.encode(strQuery) + "&filename=" + fileName;
}
}