/*
* Copyright 2011 Corpuslinguistic working group Humboldt University Berlin.
*
* 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 Licsense 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 annis.gui;
import annis.gui.components.ExceptionDialog;
import annis.gui.flatquerybuilder.FlatQueryBuilderPlugin;
import annis.gui.objects.QueryUIState;
import annis.gui.querybuilder.TigerQueryBuilderPlugin;
import annis.libgui.Helper;
import static annis.libgui.Helper.DEFAULT_CONFIG;
import annis.service.objects.CorpusConfig;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.vaadin.annotations.Push;
import com.vaadin.annotations.Theme;
import com.vaadin.navigator.Navigator;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.server.ErrorHandler;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.communication.PushMode;
import com.vaadin.shared.ui.ui.Transport;
import java.io.IOException;
import net.xeoh.plugins.base.PluginManager;
import net.xeoh.plugins.base.util.uri.ClassURI;
import org.slf4j.LoggerFactory;
/**
* GUI for searching in corpora.
*
* @author Thomas Krause <krauseto@hu-berlin.de>
*/
@Theme("annis")
@Push(value = PushMode.AUTOMATIC, transport = Transport.LONG_POLLING)
public class AnnisUI extends CommonUI
implements ErrorHandler, ViewChangeListener
{
private static final org.slf4j.Logger log = LoggerFactory.getLogger(
AnnisUI.class);
private transient Cache<String, CorpusConfig> corpusConfigCache;
private final QueryUIState queryState = new QueryUIState();
private QueryController queryController;
private SearchView searchView;
private AdminView adminView;
private Navigator nav;
/**
* A re-usable toolbar for different views.
*/
private MainToolbar toolbar;
public AnnisUI()
{
super("");
initTransients();
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
{
in.defaultReadObject();
initTransients();
}
private void initTransients()
{
corpusConfigCache = CacheBuilder.newBuilder().maximumSize(250).build();
}
@Override
protected void init(VaadinRequest request)
{
super.init(request);
setErrorHandler(this);
searchView = new SearchView(AnnisUI.this);
adminView = new AdminView(AnnisUI.this);
queryController = new QueryController(searchView, AnnisUI.this);
toolbar = new MainToolbar();
toolbar.setQueryController(queryController);
toolbar.addLoginListener(searchView);
toolbar.addLoginListener(adminView);
nav = new Navigator(AnnisUI.this, AnnisUI.this);
nav.addView(SearchView.NAME, searchView);
nav.addView(AdminView.NAME, adminView);
nav.addViewChangeListener(AnnisUI.this);
addExtension(toolbar.getScreenshotExtension());
loadInstanceFonts();
}
@Override
public boolean beforeViewChange(ViewChangeEvent event)
{
// make sure the toolbar is removed from the old view
searchView.setToolbar(null);
adminView.setToolbar(null);
toolbar.setSidebar(null);
if (event.getNewView() == searchView)
{
searchView.setToolbar(toolbar);
toolbar.setSidebar(searchView);
toolbar.setNavigationTarget(MainToolbar.NavigationTarget.ADMIN);
}
else if (event.getNewView() == adminView)
{
adminView.setToolbar(toolbar);
toolbar.setNavigationTarget(MainToolbar.NavigationTarget.SEARCH);
}
else
{
toolbar.setNavigationTarget(null);
}
return true;
}
@Override
public void afterViewChange(ViewChangeEvent event)
{
}
public boolean canReportBugs()
{
if (toolbar != null)
{
return toolbar.canReportBugs();
}
return false;
}
public void reportBug()
{
toolbar.reportBug();
}
public void reportBug(Throwable cause)
{
toolbar.reportBug(cause);
}
@Override
public void error(com.vaadin.server.ErrorEvent event)
{
log.error("Unknown error in some component: " + event.getThrowable().
getLocalizedMessage(),
event.getThrowable());
// get the source throwable (thus the one that triggered the error)
Throwable source = event.getThrowable();
if (source != null)
{
while (source.getCause() != null)
{
source = source.getCause();
}
ExceptionDialog.show(source);
}
}
@Override
protected void addCustomUIPlugins(PluginManager pluginManager)
{
super.addCustomUIPlugins(pluginManager);
pluginManager.addPluginsFrom(new ClassURI(TigerQueryBuilderPlugin.class).
toURI());
pluginManager.addPluginsFrom(new ClassURI(FlatQueryBuilderPlugin.class).
toURI());
}
/**
* Get a cached version of the {@link CorpusConfig} for a corpus.
*
* @param corpus
* @return
*/
public CorpusConfig getCorpusConfigWithCache(String corpus)
{
CorpusConfig config = new CorpusConfig();
if (corpusConfigCache != null)
{
config = corpusConfigCache.getIfPresent(corpus);
if (config == null)
{
if (corpus.equals(DEFAULT_CONFIG))
{
config = Helper.getDefaultCorpusConfig();
}
else
{
config = Helper.getCorpusConfig(corpus);
}
corpusConfigCache.put(corpus, config);
}
}
return config;
}
public void clearCorpusConfigCache()
{
if (corpusConfigCache != null)
{
corpusConfigCache.invalidateAll();
}
}
public QueryController getQueryController()
{
return queryController;
}
public SearchView getSearchView()
{
return searchView;
}
public QueryUIState getQueryState()
{
return queryState;
}
}