001 // This file is part of AceWiki. 002 // Copyright 2008-2012, AceWiki developers. 003 // 004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU 005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of 006 // the License, or (at your option) any later version. 007 // 008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 010 // Lesser General Public License for more details. 011 // 012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If 013 // not, see http://www.gnu.org/licenses/. 014 015 package ch.uzh.ifi.attempto.acewiki.core; 016 017 import java.text.SimpleDateFormat; 018 import java.util.Date; 019 import java.util.HashMap; 020 import java.util.Map; 021 022 /** 023 * This class stands for the set of registered users for a particular AceWiki instance. 024 * 025 * @author Tobias Kuhn 026 */ 027 public class UserBase { 028 029 private Ontology ontology; 030 private AceWikiStorage storage; 031 private long idCount = 0; 032 private Map<String, User> userNameMap = new HashMap<String, User>(); 033 private Map<Long, User> userIdMap = new HashMap<Long, User>(); 034 035 /** 036 * Creates a new user base for the given ontology. 037 * 038 * @param ontology The ontology. 039 */ 040 UserBase(Ontology ontology, AceWikiStorage storage) { 041 this.ontology = ontology; 042 this.storage = storage; 043 } 044 045 /** 046 * Adds a user to this user base. 047 * 048 * @param user The user to be added. 049 */ 050 void addUser(User user) { 051 if (user == null) return; 052 if (user.getId() > idCount) idCount = user.getId(); 053 userNameMap.put(user.getName(), user); 054 userIdMap.put(user.getId(), user); 055 } 056 057 /** 058 * Checks whether a user with the respective name exists. 059 * 060 * @param name The user name. 061 * @return true if the user exists. 062 */ 063 public boolean containsUser(String name) { 064 return userNameMap.containsKey(name); 065 } 066 067 /** 068 * Returns the user with the given id, or null if no user with this id exists. 069 * 070 * @param id The user id. 071 * @return The user object. 072 */ 073 public User getUser(long id) { 074 return userIdMap.get(id); 075 } 076 077 /** 078 * Returns the number of registered users. 079 * 080 * @return The number of users. 081 */ 082 public int getUserCount() { 083 return userIdMap.size(); 084 } 085 086 /** 087 * Tries to login a user. The user object is returned if the login was successful. Null is 088 * returned otherwise. 089 * 090 * @param name The name of the user. 091 * @param password The password in plain text. 092 * @return The user object. 093 */ 094 public User login(String name, String password) { 095 User user = userNameMap.get(name); 096 if (user == null) return null; 097 if (user.isCorrectPassword(password)) { 098 user.setUserData("lastlogin", getTimeNow()); 099 user.addToUserDataCounter("logincount", 1); 100 return user; 101 } 102 return null; 103 } 104 105 /** 106 * Tries to do an auto-login. The user object is returned if the login was successful. Null is 107 * returned otherwise. 108 * 109 * @param name The name of the user. 110 * @param clientToken The auto-login-token from the client browser. 111 * @return The user object. 112 */ 113 public User autoLogin(String name, String clientToken) { 114 User user = userNameMap.get(name); 115 if (user == null) return null; 116 String serverToken = user.getUserData("stayloggedintoken"); 117 if (clientToken.equals(serverToken)) { 118 user.setUserData("lastlogin", getTimeNow()); 119 user.addToUserDataCounter("logincount", 1); 120 return user; 121 } 122 return null; 123 } 124 125 /** 126 * Registers a new user. The new user object is returned if the registration was successful. 127 * Null is returned otherwise. 128 * 129 * @param name The name of the new user. 130 * @param email The email address of the new user. 131 * @param password The password for the new user. 132 * @return The new user object. 133 */ 134 public User register(String name, String email, String password) { 135 if (userNameMap.get(name) != null) return null; 136 Map<String,String> userdata = new HashMap<String, String>(); 137 userdata.put("email", email); 138 String now = getTimeNow(); 139 userdata.put("registerdate", now); 140 userdata.put("lastlogin", now); 141 userdata.put("logincount", "1"); 142 long id = ++idCount; 143 User user = User.createUser(id, name, password, userdata, this); 144 addUser(user); 145 return user; 146 } 147 148 /** 149 * Returns the ontology object. 150 * 151 * @return The ontology. 152 */ 153 public Ontology getOntology() { 154 return ontology; 155 } 156 157 /** 158 * Returns the storage object. 159 * 160 * @return The storage. 161 */ 162 public AceWikiStorage getStorage() { 163 return storage; 164 } 165 166 private String getTimeNow() { 167 return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date()); 168 } 169 170 }