/*
* 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.admin.model.UserManagement;
import annis.gui.admin.view.UIView;
import annis.gui.admin.view.UserListView;
import annis.security.User;
import com.google.common.base.Joiner;
import com.google.common.util.concurrent.FutureCallback;
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 UserController implements UserListView.Listener, UIView.Listener
{
private final UserManagement model;
private final UserListView view;
private final UIView uiView;
private boolean isLoggedIn = false;
private boolean viewIsActive = false;
public UserController(UserManagement model,
UserListView view, UIView uiView, boolean isLoggedIn)
{
this.model = model;
this.view = view;
this.uiView = uiView;
this.isLoggedIn = isLoggedIn;
view.addListener(UserController.this);
uiView.addListener(UserController.this);
}
private void clearModel()
{
model.clear();
view.setUserList(model.getUsers());
}
private void fetchFromService()
{
view.setLoadingAnimation(true);
uiView.runInBackground(new Callable<Boolean>()
{
@Override
public Boolean call() throws Exception
{
return model.fetchFromService();
}
}, new FutureCallback<Boolean>()
{
@Override
public void onSuccess(Boolean result)
{
view.setLoadingAnimation(false);
if (result)
{
view.setUserList(model.getUsers());
}
else
{
uiView.showWarning("Cannot get the user list", null);
view.setUserList(new LinkedList<User>());
}
view.addAvailableGroupNames(model.getUsedGroupNames());
view.addAvailablePermissions(model.getUsedPermissions());
}
@Override
public void onFailure(Throwable t)
{
view.setLoadingAnimation(false);
uiView.showWarning("Cannot get the user list", t.getMessage());
view.setUserList(new LinkedList<User>());
view.addAvailableGroupNames(new TreeSet<String>());
}
});
}
@Override
public void userUpdated(User user)
{
model.createOrUpdateUser(user);
}
@Override
public void passwordChanged(String userName, String newPassword)
{
model.setPassword(userName, newPassword);
view.setUserList(model.getUsers());
}
@Override
public void addNewUser(String userName)
{
if (userName == null || userName.isEmpty())
{
uiView.showError("User name is empty", null);
}
else if (model.getUser(userName) != null)
{
uiView.showError("User already exists", null);
}
else
{
// create new user with empty password
User u = new User(userName);
// each user should be per default able to see the same corpora as a non-logged in user
u.getGroups().add("anonymous");
if (model.createOrUpdateUser(u))
{
view.askForPasswordChange(userName);
view.setUserList(model.getUsers());
view.emptyNewUserNameTextField();
}
}
}
@Override
public void deleteUsers(Set<String> userName)
{
for (String u : userName)
{
model.deleteUser(u);
}
view.setUserList(model.getUsers());
if (userName.size() == 1)
{
uiView.showInfo("User \"" + userName.iterator().next() + "\" was deleted",
null);
}
else
{
uiView.showInfo("Deleted users: " + Joiner.on(", ").join(userName), null);
}
}
@Override
public void loginChanged(boolean isLoggedIn)
{
this.isLoggedIn = isLoggedIn;
if (model.getWebResourceProvider() != null)
{
model.getWebResourceProvider().invalidateWebResource();
}
if (isLoggedIn && viewIsActive)
{
fetchFromService();
}
else
{
clearModel();
}
}
@Override
public void loadedTab(Object selectedTab)
{
viewIsActive = selectedTab == view;
if (isLoggedIn && viewIsActive)
{
fetchFromService();
}
}
}