package org.priki.bo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.priki.bo.Wikiword.Visibility;
import org.priki.utils.StringMap;
public class AccessManager implements Serializable {
public static final long serialVersionUID= 1L;
public static enum SignUp { AsUser, AsReader, AsEditor };
public static final String DEFAULT_ADMIN = "admin";
public static final String DEFAULT_PASSWD = "priki";
public static final SignUp DEFAULT_SIGNUP = SignUp.AsEditor;
public static final boolean DEFAULT_READONLY = false;
public static final boolean DEFAULT_ACCEPT_ANONYMOUS_EDITOR = true;
public static final boolean DEFAULT_ACCEPT_ANONYMOUS_READER = true;
private StringMap<User> users;
private Set<User> admins;
private Set<User> readers;
private Set<User> editors;
private SignUp signup = DEFAULT_SIGNUP;
private boolean defaultCaseSensitive = true;
private Visibility defaultVisibility = Wikiword.Visibility.Public;
private boolean readonly = DEFAULT_READONLY;
private boolean acceptAnonymousEditor = DEFAULT_ACCEPT_ANONYMOUS_EDITOR;
private boolean acceptAnonymousReader = DEFAULT_ACCEPT_ANONYMOUS_READER;
private Set<User> readers() {
if (readers == null) readers = new HashSet<User>();
return readers;
}
private Set<User> editors() {
if (editors == null) editors = new HashSet<User>();
return editors;
}
private StringMap<User> users() {
if (users == null) {
users = new StringMap<User>();
users.put(DEFAULT_ADMIN, new User(DEFAULT_ADMIN, DEFAULT_PASSWD, "Administrator", "") );
addAdmin(DEFAULT_ADMIN);
}
return users;
}
private Set<User> admins() {
if (admins== null) {
admins = new HashSet<User>();
addAdmin(DEFAULT_ADMIN);
}
return admins;
}
public boolean isReadonly() { return this.readonly; }
public void setReadonly(boolean readonly) { this.readonly = readonly; }
public boolean isAcceptAnonymousEditor() { return acceptAnonymousEditor; }
public void setAcceptAnonymousEditor(boolean acceptAnonymousEditor) { this.acceptAnonymousEditor = acceptAnonymousEditor; }
public boolean isAcceptAnonymousReader() { return acceptAnonymousReader; }
public void setAcceptAnonymousReader(boolean acceptAnonymousReader) { this.acceptAnonymousReader = acceptAnonymousReader; }
public boolean isDefaultCaseSensitive() { return defaultCaseSensitive; }
public void setDefaultCaseSensitive(boolean defaultCaseSensitive) { this.defaultCaseSensitive = defaultCaseSensitive; }
public Visibility getDefaultVisibility() {
if (defaultVisibility == null) {
defaultVisibility = Wikiword.Visibility.Public;
}
return defaultVisibility;
}
public void setDefaultVisibility(Visibility defaultVisibility) { this.defaultVisibility = defaultVisibility; }
public boolean isAdmin(User user) {
return admins().contains(user);
}
public boolean isAdmin(String user) {
return isAdmin(getUser(user));
}
public boolean isReader(String user) {
return isReader(getUser(user));
}
public boolean isReader(User user) {
return readers().contains(user);
}
public boolean isEditor(User user) {
return editors().contains(user);
}
public boolean isEditor(String user) {
return isEditor(getUser(user));
}
public boolean isUser(String login) {
return users().containsKey(login);
}
public User getUser(String login) {
return users().get(login);
}
public User getUserByCookieId(String cookie) {
if (cookie == null) return null;
for (User u : users().values()) {
if (cookie.equals(u.getCookieId()))
return u;
}
return null;
}
public User getUserByEmail(String email) {
if (email == null) return null;
for (User u : users().values()) {
if (email.equals(u.getEmail()))
return u;
}
return null;
}
public List<User> getEscortingUsers() {
List<User> ret = new ArrayList<User>();
for (User u : users().values()) {
if (u.isEscortWiki())
ret.add(u);
}
return ret;
}
public Set<User> getEscortingUsers(User user, Wikiword page) {
List<User> users = getEscortingUsers();
users.addAll(page.getEscortWikiWord());
Set<User> ret = new HashSet<User>();
for (User u : users) {
if (iCanRead(u.getIdentifier(), page)) {
ret.add(u);
}
}
return ret;
}
public void updateUser(User user) {
User inTheBase = users().get(user.getIdentifier());
// Update
inTheBase.setCompleteName(user.getCompleteName());
inTheBase.setEmail(user.getEmail());
inTheBase.setPassword(user.getPassword());
inTheBase.setEscortWiki(user.isEscortWiki());
}
public void addUser(User user) {
if (!isUser(user.getIdentifier())) {
users().put(user.getIdentifier(), user);
if (signup == SignUp.AsReader) {
addReader(user.getIdentifier());
}
if (signup == SignUp.AsEditor) {
addEditor(user.getIdentifier());
}
}
}
public void addAdmin(String userName) {
addReader(userName);
addEditor(userName);
if (isUser(userName)) {
admins().add(getUser(userName));
}
}
public void addEditor(String userName) {
addReader(userName);
if (isUser(userName)) {
editors().add(getUser(userName));
}
}
public void addReader(String userName) {
if (isUser(userName))
readers().add(getUser(userName));
}
public List<User> getAllUsers() {
return new ArrayList<User>(users().values());
}
public List<String> getAllAdmins() {
List<String> ret = new ArrayList<String>();
for (User u : admins()) {
ret.add(u.getKeyword());
}
return ret;
}
public void removeAdmin(String userName) {
if (isUser(userName))
admins().remove(getUser(userName));
}
public void removeEditor(String userName) {
removeAdmin(userName);
if (isUser(userName))
editors().remove(getUser(userName));
}
public void removeReader(String userName) {
removeAdmin(userName);
removeEditor(userName);
if (isUser(userName))
readers().remove(getUser(userName));
}
public int getUserCount() {
return users().size();
}
public int getReadersCount() {
return readers().size();
}
public int getEditorsCount() {
return editors().size();
}
public int getAdminsCount() {
return admins().size();
}
public void setSignUp(SignUp signup) {
this.signup = signup;
}
public void clear() {
editors().clear();
readers().clear();
users().clear();
admins().clear();
readonly = DEFAULT_READONLY;
acceptAnonymousEditor = DEFAULT_ACCEPT_ANONYMOUS_EDITOR;
acceptAnonymousReader = DEFAULT_ACCEPT_ANONYMOUS_READER;
admins.add(new User(DEFAULT_ADMIN, DEFAULT_PASSWD, "Administrator", "") );
}
public SignUp getSignUp() {
return signup;
}
public boolean iCanPost(String user, Wikiword w) {
if (readonly) return false;
User userObj = getUser(user);
if ((!isUser(user)) && (!acceptAnonymousEditor)) return false;
if (isUser(user) && !isEditor(userObj)) return false;
if (w != null && !w.isPublic()) {
if (w.isToUsers() && !isUser(user)) return false;
if (w.isToReaders() && !isReader(userObj)) return false;
if (w.isToEditors() && !isEditor(userObj)) return false;
if (w.isToAdmins() && !isAdmin(userObj)) return false;
}
return true;
}
public boolean iCanRead(String user, Wikiword w) {
User userObj = getUser(user);
if ((!isUser(user)) && (!acceptAnonymousReader)) return false;
if (isUser(user) && !isReader(userObj)) return false;
if (w != null && !w.isPublic()) {
if (w.isToUsers() && !isUser(user)) return false;
if (w.isToReaders() && !isReader(userObj)) return false;
if (w.isToEditors() && !isEditor(userObj)) return false;
if (w.isToAdmins() && !isAdmin(userObj)) return false;
}
return true;
}
public boolean checkLogin(String user, String password) {
if (user == null || password == null) return false;
User regUser = users().get(user);
if (regUser == null) {
regUser = getUserByEmail(user);
}
if (regUser == null) return false;
if (regUser.getPassword().equals(password)) {
return true;
}
return false;
}
public void setRoles(String userName, boolean isReader, boolean isEditor, boolean isAdmin) {
if (!isUser(userName)) return;
User user = getUser(userName);
if (isAdmin) {
readers().add(user);
editors().add(user);
admins().add(user);
} else if (isEditor) {
admins().remove(user);
editors().add(user);
readers().add(user);
} else if (isReader) {
admins().remove(user);
editors().remove(user);
readers().add(user);
} else {
admins().remove(user);
editors().remove(user);
readers().remove(user);
}
}
}