/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.server.newuser;
import Sirius.util.collections.MultiMap;
import org.apache.log4j.Logger;
import java.rmi.RemoteException;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
/**
* DOCUMENT ME!
*
* @author schlob
* @version $Revision$, $Date$
*/
public class UserManager implements UserServer {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(UserManager.class);
//~ Instance fields --------------------------------------------------------
protected Hashtable users;
protected Hashtable ugs;
protected MultiMap memberships;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new UserManager object.
*/
public UserManager() {
this.users = new Hashtable();
this.ugs = new Hashtable();
this.memberships = new MultiMap();
}
//~ Methods ----------------------------------------------------------------
@Override
public User getUser(final String userGroupDomain,
final String userGroup,
final String userDomain,
final String user,
final String password) throws java.rmi.RemoteException, UserException {
final User u = (User)users.get(constructKey(user, userDomain));
if (LOG.isDebugEnabled()) {
LOG.debug("user found :: " + u + " for " + user + "@" + userDomain + " :: users available " + users); // NOI18N
}
// check ob membership
if (u == null) {
throw new UserException(
"UserException :: no User :: " // NOI18N
+ user
+ ", " // NOI18N
+ userDomain
+ ", " // NOI18N
+ userGroup
+ ", " // NOI18N
+ userGroupDomain
+ " registered", // NOI18N
true,
false,
false,
false);
} else if (!memberships.containsKey(u.getRegistryKey())) {
throw new UserException(
"UserException :: no User :: " // NOI18N
+ user
+ ", " // NOI18N
+ userDomain
+ ", " // NOI18N
+ userGroup
+ ", " // NOI18N
+ userGroupDomain
+ " registered", // NOI18N
true,
false,
false,
false);
} else // es ist mindestens eine Membership eingetragen
{
final List l = (List)memberships.get(u.getRegistryKey());
for (int i = 0; i < l.size(); i++) {
final Membership m = (Membership)l.get(i);
if (m.getUgDomain().equalsIgnoreCase(userGroupDomain) && m.getUg().equalsIgnoreCase(userGroup)) {
break;
}
if (i == (l.size() - 1)) // last element and no break
{
throw new UserException(
"UserException :: no UserGroup :: " // NOI18N
+ userGroup
+ ", " // NOI18N
+ userGroupDomain,
false,
false,
true,
false);
}
}
}
final UserGroup ug = (UserGroup)ugs.get(constructKey(userGroup, userGroupDomain));
u.setUserGroup(ug);
return u;
}
@Override
public Vector getUserGroupNames(final User user) throws RemoteException {
if (user == null) {
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("no user " + user); // NOI18N
}
}
return new Vector(0);
}
return getUserGroupNames(user.getName(), user.getDomain());
}
@Override
public Vector getUserGroupNames(final String userName, final String domain) throws java.rmi.RemoteException {
if ((userName == null) || (domain == null)) {
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("no user " + userName + "or no domain " + domain); // NOI18N
}
}
return new Vector(0);
}
final List l = (List)memberships.get(constructKey(userName, domain));
if (l == null) {
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("no usergroup for user " + userName); // NOI18N
}
}
return new Vector(0);
}
final Vector result = new Vector(l.size());
for (int i = 0; i < l.size(); i++) {
final Membership ug = (Membership)l.get(i);
if ((ug != null) && ug.getUgDomain().equalsIgnoreCase(ug.getUserDomain())) // fremde Nutzerrechte werden
// nicht in der Auswahl
// angeboten
{
final String[] userInfo = new String[2];
userInfo[0] = ug.getUg();
userInfo[1] = ug.getUgDomain();
result.add(userInfo);
}
}
return result;
}
@Override
public Vector getUserGroups() throws RemoteException {
return new Vector(ugs.values());
}
@Override
public Vector getUsers() throws RemoteException {
return new Vector(users.values());
}
@Override
public void registerUser(final User user) throws RemoteException {
if (LOG.isDebugEnabled()) {
LOG.debug("register user " + user); // NOI18N
}
users.put(user.getRegistryKey(), user);
}
@Override
public void registerUserGroup(final UserGroup userGroup) throws RemoteException {
if (LOG.isDebugEnabled()) {
LOG.debug("register userGroup " + userGroup); // NOI18N
}
ugs.put(userGroup.getKey(), userGroup);
}
@Override
public void registerUserGroups(final Vector userGroups) throws RemoteException {
for (int i = 0; i < userGroups.size(); i++) {
registerUserGroup((UserGroup)userGroups.get(i));
}
}
@Override
public boolean registerUserMembership(final Membership membership) throws RemoteException {
if (LOG.isDebugEnabled()) {
LOG.debug("register Membership " + membership); // NOI18N
}
memberships.put(membership.getUserKey(), membership);
return true; // unsinn
}
@Override
public void registerUserMemberships(final Vector memberships) throws RemoteException {
for (int i = 0; i < memberships.size(); i++) {
registerUserMembership((Membership)memberships.get(i));
}
}
@Override
public void registerUsers(final Vector users) throws RemoteException {
for (int i = 0; i < users.size(); i++) {
registerUser((User)users.get(i));
}
}
@Override
public void unregisterUser(final User user) throws RemoteException {
this.users.remove(user.getRegistryKey());
memberships.remove(user.getRegistryKey());
}
@Override
public void unregisterUserGroup(final UserGroup userGroup) throws RemoteException {
this.ugs.remove(userGroup.getKey());
// memberships
}
@Override
public void unregisterUserGroups(final Vector userGroups) throws RemoteException {
for (int i = 0; i < userGroups.size(); i++) {
unregisterUserGroup((UserGroup)userGroups.get(i));
}
}
@Override
public void unregisterUsers(final java.util.Vector users) throws RemoteException {
for (int i = 0; i < users.size(); i++) {
unregisterUser((User)users.get(i));
}
}
/**
* DOCUMENT ME!
*
* @param first DOCUMENT ME!
* @param second DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private String constructKey(final String first, final String second) {
if ((first == null) || (second == null)) {
return null;
} else {
return first + "@" + second; // NOI18N
}
}
}