KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > security > implementation > cloudcontext > User


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.security.implementation.cloudcontext;
11
12 import java.util.*;
13
14 import org.mmbase.security.implementation.cloudcontext.builders.*;
15 import org.mmbase.module.core.*;
16 import org.mmbase.security.*;
17 import org.mmbase.security.SecurityException;
18 import org.mmbase.util.HashCodeUtil;
19 import org.mmbase.util.logging.Logger;
20 import org.mmbase.util.logging.Logging;
21
22 /**
23  * Implementation of UserContext (the security presentation of a User).
24  * Most implementation is delegated to the Users builder.
25  *
26  * @author Eduard Witteveen
27  * @author Pierre van Rooden
28  * @author Michiel Meeuwissen
29  * @version $Id: User.java,v 1.22.2.1 2006/10/13 15:55:44 nklasens Exp $
30  * @see org.mmbase.security.implementation.cloudcontext.builders.Users
31  */

32 public class User extends BasicUser implements MMBaseObserver {
33     private static final Logger log = Logging.getLoggerInstance(User.class);
34
35     private static final long serialVersionUID = 1L;
36
37     protected MMObjectNode node;
38     protected long key;
39
40     /**
41      * @javadoc
42      */

43     public User(MMObjectNode n, long l, String JavaDoc app) {
44         super(app);
45         if (n == null) throw new IllegalArgumentException JavaDoc();
46         node = n;
47         key = l;
48 // Adding local observers seems like a plan, but unfortunately there is no way to unregister
49
// a user that got out of use. This results in a nasty memoryleak and, eventually,
50
// bad to almost stand-still perfromance when you craete new users...
51
//
52
// Users.getBuilder().addLocalObserver(this);
53
}
54
55     // javadoc inherited
56
public String JavaDoc getIdentifier() {
57         if (node == null) {
58             return "anonymous";
59         } else {
60             MMObjectBuilder builder = node.getBuilder();
61             if (builder.hasField(Users.FIELD_USERNAME)) {
62                 return node.getStringValue(Users.FIELD_USERNAME);
63             } else {
64                 return null;
65             }
66         }
67     }
68
69     // javadoc inherited
70
public Rank getRank() throws SecurityException JavaDoc {
71         if (node == null) {
72             return Rank.ANONYMOUS;
73         } else {
74             return Users.getBuilder().getRank(node);
75         }
76     }
77
78     // javadoc inherited
79
public String JavaDoc getOwnerField() {
80         if (node == null) {
81             return "system";
82         } else {
83             return Users.getBuilder().getDefaultContext(node);
84         }
85     }
86
87     /**
88      * @javadoc
89      */

90     protected long getKey() {
91         return key;
92     }
93
94     /**
95      * @javadoc
96      */

97     public boolean isValidNode() {
98         return (node == null) || Users.getBuilder().isValid(node);
99     }
100
101
102     public SortedSet getGroups() {
103         return Groups.getBuilder().getGroups(node.getNumber());
104     }
105
106
107     /**
108      * An MMObjectNode (of type 'mmbaseusers') is associated with this User object.
109      * This function returns it.
110      */

111     public MMObjectNode getNode() {
112         if (node == null) throw new SecurityException JavaDoc("Account has been removed.");
113         return node;
114     }
115
116     public boolean nodeRemoteChanged(String JavaDoc machine, String JavaDoc number, String JavaDoc builder, String JavaDoc ctype) {
117         return nodeChanged(number, ctype);
118     }
119
120     public boolean nodeLocalChanged(String JavaDoc machine, String JavaDoc number, String JavaDoc builder, String JavaDoc ctype) {
121         return nodeChanged(number, ctype);
122     }
123
124     private boolean nodeChanged(String JavaDoc number, String JavaDoc ctype) {
125         if ((node != null) && (node.getNumber() == Integer.parseInt(number))) {
126             if (ctype.equals("d")) {
127                 log.service("Node was invalidated!");
128                 node = null; // invalidate
129
} else if (ctype.equals("c")) {
130                 node = Users.getBuilder().getNode(number);
131             }
132         }
133         return true;
134     }
135
136     private void readObject(java.io.ObjectInputStream JavaDoc in) throws java.io.IOException JavaDoc, ClassNotFoundException JavaDoc {
137         final int number = in.readInt();
138         key = in.readLong();
139         if (number == -1) {
140             log.warn("Found node -1 on deserialization!. Interpreting as 'null'. User object was probably not correctly serialized, or not assiociated with a real node.");
141             node = null;
142         } else {
143             org.mmbase.util.ThreadPools.jobsExecutor.execute(new Runnable JavaDoc() {
144                     public void run() {
145                         org.mmbase.bridge.LocalContext.getCloudContext().assertUp();
146                         node = Users.getBuilder().getNode(number);
147                     }
148                 });
149         }
150     }
151
152
153     private void writeObject(java.io.ObjectOutputStream JavaDoc out) throws java.io.IOException JavaDoc {
154         out.writeInt(node == null ? -1 : node.getNumber());
155         out.writeLong(key);
156     }
157
158     public boolean equals(Object JavaDoc o) {
159         if (o instanceof User) {
160             User ou = (User) o;
161             return
162                 super.equals(o) &&
163                 (node == null ? ou.node == null : node.getNumber() == ou.node.getNumber()) &&
164                 key == ou.key;
165         } else {
166             return false;
167         }
168     }
169
170     public int hashCode() {
171         int result = super.hashCode();
172         result = HashCodeUtil.hashCode(result, node);
173         result = HashCodeUtil.hashCode(result, key);
174         return result;
175     }
176
177 }
178
Popular Tags