Java tutorial
/* * Copyright 2015 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 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 annis.gui; import annis.gui.admin.CorpusAdminPanel; import annis.gui.admin.GroupManagementPanel; import annis.gui.admin.ImportPanel; import annis.gui.admin.UserManagementPanel; import annis.gui.admin.controller.CorpusController; import annis.gui.admin.controller.GroupController; import annis.gui.admin.controller.UserController; import annis.gui.admin.model.CorpusManagement; import annis.gui.admin.model.GroupManagement; import annis.gui.admin.model.UserManagement; import annis.gui.admin.model.WebResourceProvider; import annis.gui.admin.view.UIView; import annis.gui.admin.view.UIView.Listener; import annis.libgui.Background; import annis.libgui.Helper; import com.google.common.util.concurrent.FutureCallback; import com.sun.jersey.api.client.AsyncWebResource; import com.sun.jersey.api.client.WebResource; import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.FontAwesome; import com.vaadin.server.Page; import com.vaadin.ui.Component; import com.vaadin.ui.Notification; import com.vaadin.ui.TabSheet; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; /** * * @author Thomas Krause <krauseto@hu-berlin.de> */ public class AdminView extends VerticalLayout implements View, UIView, LoginListener, TabSheet.SelectedTabChangeListener, WebResourceProvider { public static final String NAME = "admin"; private final UserController userController; private final GroupController groupManagementController; private final CorpusController corpusController; private final List<UIView.Listener> listeners = new LinkedList<>(); private final TabSheet tabSheet; private final ImportPanel importPanel; private final CorpusAdminPanel corpusAdminPanel; private final UserManagementPanel userManagementPanel; private final GroupManagementPanel groupManagementPanel; private MainToolbar toolbar; private transient WebResource webResource; private transient AsyncWebResource asyncWebResource; public AdminView(AnnisUI ui) { Page.getCurrent().setTitle("ANNIS Adminstration"); UserManagement userManagement = new UserManagement(); userManagement.setWebResourceProvider(AdminView.this); GroupManagement groupManagement = new GroupManagement(); groupManagement.setWebResourceProvider(AdminView.this); CorpusManagement corpusManagement = new CorpusManagement(); corpusManagement.setWebResourceProvider(AdminView.this); boolean isLoggedIn = Helper.getUser() != null; corpusAdminPanel = new CorpusAdminPanel(); corpusController = new CorpusController(corpusManagement, corpusAdminPanel, this, isLoggedIn); userManagementPanel = new UserManagementPanel(); userController = new UserController(userManagement, userManagementPanel, this, isLoggedIn); groupManagementPanel = new GroupManagementPanel(); groupManagementController = new GroupController(groupManagement, corpusManagement, groupManagementPanel, this, userManagementPanel, isLoggedIn); importPanel = new ImportPanel(); tabSheet = new TabSheet(); tabSheet.addTab(importPanel, "Import Corpus", FontAwesome.UPLOAD); tabSheet.addTab(corpusAdminPanel, "Corpus management", FontAwesome.LIST_ALT); tabSheet.addTab(userManagementPanel, "User management", FontAwesome.USER); tabSheet.addTab(groupManagementPanel, "Group management", FontAwesome.USERS); tabSheet.setSizeFull(); tabSheet.addSelectedTabChangeListener(AdminView.this); addComponents(tabSheet); setSizeFull(); setExpandRatio(tabSheet, 1.0f); tabSheet.addStyleName(ValoTheme.TABSHEET_FRAMED); } public void setToolbar(MainToolbar newToolbar) { // remove old one if necessary if (this.toolbar != null) { removeComponent(this.toolbar); this.toolbar = null; } // add new toolbar if (newToolbar != null) { this.toolbar = newToolbar; addComponent(this.toolbar, 0); setExpandRatio(this.toolbar, 0.0f); this.toolbar.addLoginListener(this); } } @Override public void enter(ViewChangeListener.ViewChangeEvent event) { boolean kickstarter = Helper.isKickstarter(getSession()); importPanel.updateMode(kickstarter, Helper.getUser() != null); // group and user management are not applicable in kickstarter tabSheet.getTab(groupManagementPanel).setVisible(!kickstarter); tabSheet.getTab(userManagementPanel).setVisible(!kickstarter); Component selectedTab = getComponentForFragment(event.getParameters()); if (selectedTab != null && selectedTab != tabSheet.getSelectedTab()) { // Select the component given by the fragment, This will call // the selection change handler and thus we don't have // to call the listeners here. tabSheet.setSelectedTab(selectedTab); } else { // nothing to change in the tab selection, call the listeners manually selectedTab = tabSheet.getSelectedTab(); for (UIView.Listener l : listeners) { l.loadedTab(selectedTab); } setFragmentParameter(getFragmentForComponent(selectedTab)); } } @Override public void detach() { // inform the controllers that no tab is active any longer for (UIView.Listener l : listeners) { l.loadedTab(null); } super.detach(); } private Component getComponentForFragment(String fragment) { if (fragment != null) { switch (fragment) { case "import": return importPanel; case "corpora": return corpusAdminPanel; case "users": return userManagementPanel; case "groups": return groupManagementPanel; default: break; } } return null; } private String getFragmentForComponent(Component c) { if (c == importPanel) { return "import"; } else if (c == corpusAdminPanel) { return "corpora"; } else if (c == userManagementPanel) { return "users"; } else if (c == groupManagementPanel) { return "groups"; } return ""; } @Override public void selectedTabChange(TabSheet.SelectedTabChangeEvent event) { Component selected = event.getTabSheet().getSelectedTab(); for (UIView.Listener l : listeners) { l.loadedTab(selected); } setFragmentParameter(getFragmentForComponent(selected)); } private void setFragmentParameter(String param) { Page.getCurrent().setUriFragment("!" + NAME + "/" + param, false); } @Override public void addListener(UIView.Listener listener) { listeners.add(listener); } @Override public void showInfo(String info, String description) { Notification.show(info, description, Notification.Type.HUMANIZED_MESSAGE); } @Override public void showBackgroundInfo(String info, String description) { Notification.show(info, description, Notification.Type.TRAY_NOTIFICATION); } @Override public void showWarning(String error, String description) { Notification.show(error, description, Notification.Type.WARNING_MESSAGE); } @Override public void showError(String error, String description) { Notification.show(error, description, Notification.Type.ERROR_MESSAGE); } @Override public void onLogin() { for (UIView.Listener l : listeners) { l.loginChanged(true); } // TODO: make import panel a normal UI view listener if (importPanel != null) { importPanel.onLogin(); } } @Override public void onLogout() { for (UIView.Listener l : listeners) { l.loginChanged(false); } // TODO: make import panel a normal UI view listener if (importPanel != null) { importPanel.onLogout(); } } @Override public <T> void runInBackground(Callable<T> job, final FutureCallback<T> callback) { Background.runWithCallback(job, callback); } @Override public WebResource getWebResource() { if (webResource == null) { webResource = Helper.getAnnisWebResource(); } return webResource; } @Override public AsyncWebResource getAsyncWebResource() { if (asyncWebResource == null) { asyncWebResource = Helper.getAnnisAsyncWebResource(); } return asyncWebResource; } @Override public void invalidateWebResource() { asyncWebResource = null; webResource = null; } }