/*
* Copyright 2012
* Ubiquitous Knowledge Processing (UKP) Lab and FG Language Technology
* Technische Universität Darmstadt
*
* 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 de.tudarmstadt.ukp.clarin.webanno.brat.annotation;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.behavior.AbstractAjaxBehavior;
import org.apache.wicket.markup.head.CssHeaderItem;
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.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.handler.TextRequestHandler;
import org.apache.wicket.spring.injection.annot.SpringBean;
import com.googlecode.wicket.jquery.ui.resource.JQueryUIResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.api.DocumentService;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratAjaxResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratAnnotatorUiResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratConfigurationResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratCssUiReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratCssVisReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratDispatcherResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratUtilResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratVisualizerResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.BratVisualizerUiResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.JQueryJsonResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.JQuerySvgDomResourceReference;
import de.tudarmstadt.ukp.clarin.webanno.brat.resource.JQuerySvgResourceReference;
/**
* Base class for displaying a BRAT visualization. Override methods {@code #getCollectionData()}
* and {@code #getDocumentData()} to provide the actual data.
*
*/
public abstract class BratVisualizer
extends Panel
{
private static final long serialVersionUID = -1537506294440056609L;
protected static final String EMPTY_DOC = "{text: ''}";
protected WebMarkupContainer vis;
protected AbstractAjaxBehavior collProvider;
protected AbstractAjaxBehavior docProvider;
private @SpringBean DocumentService repository;
public BratVisualizer(String id, IModel<?> aModel)
{
super(id, aModel);
vis = new WebMarkupContainer("vis");
vis.setOutputMarkupId(true);
// Provides collection-level information like type definitions, styles, etc.
collProvider = new AbstractAjaxBehavior()
{
private static final long serialVersionUID = 1L;
@Override
public void onRequest()
{
getRequestCycle().scheduleRequestHandlerAfterCurrent(
new TextRequestHandler("application/json", "UTF-8", getCollectionData()));
}
};
// Provides the actual document contents
docProvider = new AbstractAjaxBehavior()
{
private static final long serialVersionUID = 1L;
@Override
public void onRequest()
{
getRequestCycle().scheduleRequestHandlerAfterCurrent(
new TextRequestHandler("application/json", "UTF-8", getDocumentData()));
}
};
add(vis);
add(collProvider, docProvider);
}
@Override
public void renderHead(IHeaderResponse aResponse)
{
super.renderHead(aResponse);
// CSS
aResponse.render(CssHeaderItem.forReference(BratCssVisReference.get()));
aResponse.render(CssHeaderItem.forReference(BratCssUiReference.get()));
// Libraries
aResponse.render(JavaScriptHeaderItem.forReference(JQueryUIResourceReference.get()));
aResponse.render(JavaScriptHeaderItem.forReference(JQuerySvgResourceReference.get()));
aResponse.render(JavaScriptHeaderItem.forReference(JQuerySvgDomResourceReference.get()));
aResponse.render(JavaScriptHeaderItem.forReference(JQueryJsonResourceReference.get()));
// BRAT helpers
aResponse.render(JavaScriptHeaderItem.forReference(BratConfigurationResourceReference.get()));
aResponse.render(JavaScriptHeaderItem.forReference(BratUtilResourceReference.get()));
//aResponse.render(JavaScriptHeaderItem.forReference(BratAnnotationLogResourceReference.get()));
//aResponse.render(JavaScriptHeaderItem.forReference(BratSpinnerResourceReference.get()));
// BRAT modules
aResponse.render(JavaScriptHeaderItem.forReference(BratDispatcherResourceReference.get()));
aResponse.render(JavaScriptHeaderItem.forReference(BratAjaxResourceReference.get()));
aResponse.render(JavaScriptHeaderItem.forReference(BratVisualizerResourceReference.get()));
aResponse.render(JavaScriptHeaderItem.forReference(BratVisualizerUiResourceReference.get()));
aResponse.render(JavaScriptHeaderItem.forReference(BratAnnotatorUiResourceReference.get()));
//aResponse.render(JavaScriptHeaderItem.forReference(BratUrlMonitorResourceReference.get()));
// BRAT call to load the BRAT JSON from our collProvider and docProvider.
String[] script = new String[] {
"Util.embedByURL(",
" '"+vis.getMarkupId()+"',",
" '"+collProvider.getCallbackUrl()+"', ",
" '"+docProvider.getCallbackUrl()+"', ",
" null);",
};
// This doesn't work with head.js because the onLoad event is fired before all the
// JavaScript references are loaded.
aResponse.render(OnLoadHeaderItem.forScript("\n"+StringUtils.join(script, "\n")));
}
protected abstract String getDocumentData();
protected String getCollectionData()
{
return "{}";
}
}