// This file is part of AceWiki.
// Copyright 2008-2013, AceWiki developers.
//
// AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
// even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
// not, see http://www.gnu.org/licenses/.
package ch.uzh.ifi.attempto.acewiki.core;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* This class stands for the set of registered users for a particular AceWiki instance.
*
* @author Tobias Kuhn
*/
public class UserBase {
private Ontology ontology;
private AceWikiStorage storage;
private long idCount = 0;
private Map<String, User> userNameMap = new HashMap<String, User>();
private Map<Long, User> userIdMap = new HashMap<Long, User>();
/**
* Creates a new user base for the given ontology.
*
* @param ontology The ontology.
*/
UserBase(Ontology ontology, AceWikiStorage storage) {
this.ontology = ontology;
this.storage = storage;
}
/**
* Adds a user to this user base.
*
* @param user The user to be added.
*/
void addUser(User user) {
if (user == null) return;
if (user.getId() > idCount) idCount = user.getId();
userNameMap.put(user.getName(), user);
userIdMap.put(user.getId(), user);
}
/**
* Checks whether a user with the respective name exists.
*
* @param name The user name.
* @return true if the user exists.
*/
public boolean containsUser(String name) {
return userNameMap.containsKey(name);
}
/**
* Returns the user with the given id, or null if no user with this id exists.
*
* @param id The user id.
* @return The user object.
*/
public User getUser(long id) {
return userIdMap.get(id);
}
/**
* Returns the number of registered users.
*
* @return The number of users.
*/
public int getUserCount() {
return userIdMap.size();
}
/**
* Tries to login a user. The user object is returned if the login was successful. Null is
* returned otherwise.
*
* @param name The name of the user.
* @param password The password in plain text.
* @return The user object.
*/
public User login(String name, String password) {
User user = userNameMap.get(name);
if (user == null) return null;
if (user.isCorrectPassword(password)) {
user.setUserData("lastlogin", getTimeNow());
user.addToUserDataCounter("logincount", 1);
return user;
}
return null;
}
/**
* Tries to do an auto-login. The user object is returned if the login was successful. Null is
* returned otherwise.
*
* @param name The name of the user.
* @param clientToken The auto-login-token from the client browser.
* @return The user object.
*/
public User autoLogin(String name, String clientToken) {
User user = userNameMap.get(name);
if (user == null) return null;
String serverToken = user.getUserData("stayloggedintoken");
if (clientToken.equals(serverToken)) {
user.setUserData("lastlogin", getTimeNow());
user.addToUserDataCounter("logincount", 1);
return user;
}
return null;
}
/**
* Registers a new user. The new user object is returned if the registration was successful.
* Null is returned otherwise.
*
* @param name The name of the new user.
* @param email The email address of the new user.
* @param password The password for the new user.
* @return The new user object.
*/
public User register(String name, String email, String password) {
if (userNameMap.get(name) != null) return null;
Map<String,String> userdata = new HashMap<String, String>();
userdata.put("email", email);
String now = getTimeNow();
userdata.put("registerdate", now);
userdata.put("lastlogin", now);
userdata.put("logincount", "1");
long id = ++idCount;
User user = User.createUser(id, name, password, userdata, this);
addUser(user);
return user;
}
/**
* Returns the ontology object.
*
* @return The ontology.
*/
public Ontology getOntology() {
return ontology;
}
/**
* Returns the storage object.
*
* @return The storage.
*/
public AceWikiStorage getStorage() {
return storage;
}
private String getTimeNow() {
return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
}
}