/* * Copyright 2014 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.admin.controller; import annis.gui.CriticalServiceQueryException; import annis.gui.ServiceQueryException; import annis.gui.admin.model.CorpusManagement; import annis.gui.admin.model.GroupManagement; import annis.gui.admin.view.GroupListView; import annis.gui.admin.view.UIView; import annis.gui.admin.view.UserListView; import annis.security.Group; import com.google.common.base.Joiner; import com.google.common.util.concurrent.FutureCallback; import java.io.Serializable; import java.util.LinkedList; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.Callable; /** * * @author Thomas Krause <krauseto@hu-berlin.de> */ public class GroupController implements GroupListView.Listener, UIView.Listener, Serializable { private final GroupManagement model; private final CorpusManagement corpusModel; private final GroupListView view; private final UIView uiView; private final UserListView userView; private boolean isLoggedIn = false; private boolean viewIsActive = false; public GroupController(GroupManagement model, CorpusManagement corpusModel, GroupListView view, UIView uiView, UserListView userView, boolean isLoggedIn) { this.model = model; this.corpusModel = corpusModel; this.view = view; this.uiView = uiView; this.userView = userView; this.isLoggedIn = isLoggedIn; this.view.addListener(GroupController.this); this.uiView.addListener(GroupController.this); } private void clearModel() { model.clear(); corpusModel.clear(); view.setGroupList(model.getGroups()); } private void fetchDataFromService() { view.setLoadingAnimation(true); uiView.runInBackground(new Callable<Boolean>() { @Override public Boolean call() throws Exception { boolean result = model.fetchFromService(); corpusModel.fetchFromService(); return result; } }, new FutureCallback<Boolean>() { @Override public void onSuccess(Boolean result) { view.setLoadingAnimation(false); if (result) { view.setGroupList(model.getGroups()); } else { uiView.showWarning("Cannot get the group list", null); view.setGroupList(new LinkedList<Group>()); } view.addAvailableCorpusNames(corpusModel.getCorpusNames()); updateUserUI(); } @Override public void onFailure(Throwable ex) { view.setLoadingAnimation(false); if(ex instanceof CriticalServiceQueryException) { uiView.showWarning(ex.getMessage(), ((CriticalServiceQueryException) ex).getDescription()); } else if(ex instanceof ServiceQueryException) { uiView.showInfo(ex.getMessage(), ((ServiceQueryException)ex).getDescription()); } else { uiView.showWarning("Cannot get the group list", ex.getMessage()); view.setGroupList(new LinkedList<Group>()); } updateUserUI(); } }); } private void updateUserUI() { Set<String> names = new TreeSet<>(model.getGroupNames()); names.add("*"); userView.addAvailableGroupNames(names); } @Override public void loginChanged(boolean isLoggedIn) { this.isLoggedIn = isLoggedIn; if(model.getWebResourceProvider() != null) { model.getWebResourceProvider().invalidateWebResource(); } if(corpusModel.getWebResourceProvider() != null) { corpusModel.getWebResourceProvider().invalidateWebResource(); } if (isLoggedIn && viewIsActive) { fetchDataFromService(); } else { clearModel(); } } @Override public void groupUpdated(Group user) { model.createOrUpdateGroup(user); } @Override public void addNewGroup(String groupName) { if (groupName == null || groupName.isEmpty()) { uiView.showError("Group name is empty", null); } else if (model.getGroup(groupName) != null) { uiView.showError("Group already exists", null); } else { Group g = new Group(groupName); model.createOrUpdateGroup(g); view.setGroupList(model.getGroups()); view.emptyNewGroupNameTextField(); updateUserUI(); } } @Override public void deleteGroups(Set<String> groupName) { for (String g : groupName) { model.deleteGroup(g); } view.setGroupList(model.getGroups()); if (groupName.size() == 1) { uiView.showInfo( "Group \"" + groupName.iterator().next() + "\" was deleted", null); } else { uiView. showInfo("Deleted groups: " + Joiner.on(", ").join(groupName), null); } updateUserUI(); } @Override public void loadedTab(Object selectedTab) { viewIsActive = selectedTab == view; if (isLoggedIn && viewIsActive) { fetchDataFromService(); } } }