KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > security > implementation > cloudcontext > builders > Ranks


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.builders;
11
12 import java.util.*;
13 import org.mmbase.module.core.*;
14 import org.mmbase.storage.search.*;
15 import org.mmbase.storage.search.implementation.*;
16 import org.mmbase.security.Rank;
17 import org.mmbase.security.SecurityException;
18 import org.mmbase.util.logging.Logger;
19 import org.mmbase.util.logging.Logging;
20
21 /**
22  * This MMObjectBuilder implementation belongs to the object type
23  * 'mmbaseusers' It contains functionality to MD5 encode passwords,
24  * and so on.
25  *
26  * @author Michiel Meeuwissen
27  * @version $Id: Ranks.java,v 1.13 2005/07/14 11:48:01 michiel Exp $
28  * @since MMBase-1.7
29  */

30 public class Ranks extends MMObjectBuilder {
31
32     private static final Logger log = Logging.getLoggerInstance(Ranks.class);
33
34     public Ranks() {
35         super();
36     }
37
38     /**
39      * Returns the Ranks builder.
40      */

41     public static Ranks getBuilder() {
42         return (Ranks) MMBase.getMMBase().getBuilder("mmbaseranks");
43     }
44
45     // javadoc inherited
46
public boolean init() {
47         boolean res = super.init();
48         mmb.addLocalObserver(getTableName(), CacheInvalidator.getInstance());
49         mmb.addRemoteObserver(getTableName(), CacheInvalidator.getInstance());
50         try {
51             Iterator i = getNodes(new NodeSearchQuery(this)).iterator();
52             while (i.hasNext()) {
53                 MMObjectNode rank = (MMObjectNode) i.next();
54                 String JavaDoc name = rank.getStringValue("name");
55                 Rank r = Rank.getRank(name);
56                 if (r == null) {
57                     Rank.createRank(rank.getIntValue("rank"), name);
58                 }
59             }
60         } catch (SearchQueryException sqe) {
61             log.error(sqe + Logging.stackTrace(sqe));
62         }
63          return res;
64     }
65     /**
66      * If a rank is inserted, it must be registered
67      */

68     public int insert(String JavaDoc owner, MMObjectNode node) {
69         int res = super.insert(owner, node);
70         int rank = node.getIntValue("rank");
71         String JavaDoc name = node.getStringValue("name");
72         try {
73             Iterator i = getNodes(new NodeSearchQuery(this)).iterator();
74             while (i.hasNext()) {
75                 MMObjectNode otherNode = (MMObjectNode) i.next();
76                 if (node.getNumber() == otherNode.getNumber()) continue;
77                 Rank r = getRank(otherNode);
78                 if(r.getInt() == rank) {
79                     // there is a unique key on rank so insert will have failed.
80
// this tells us why.
81
throw new SecurityException JavaDoc("Cannot insert rank '" + name + "', because there is already is a rank with rank weight " + rank + " (" + r + ")");
82                 }
83                 if(r.toString().equals(name)) {
84                     // there is a unique key on name so insert will have failed.
85
// this tells us why.
86
throw new SecurityException JavaDoc("Cannot insert rank '" + name + "', because there is already a rank with that name");
87                 }
88
89                 // TODO, fix core! peculiar checks, only because core give unclear messages!!
90
}
91         } catch (SearchQueryException sqe) {
92             log.error(sqe + Logging.stackTrace(sqe));
93         }
94         Rank.createRank(rank, name);
95         return res;
96     }
97
98
99     /**
100      * A rank may only be removed if there are no users of that rank.
101      *
102      */

103     public void removeNode(MMObjectNode node) {
104         List users = node.getRelatedNodes("mmbaseusers", RelationStep.DIRECTIONS_SOURCE);
105         if (users.size() > 1) {
106             // cannot happen?
107
throw new SecurityException JavaDoc("Rank " + node + " cannot be removed because there are users with this rank: " + users);
108         }
109         String JavaDoc name = node.getStringValue("name");
110         Rank.deleteRank(name);
111         super.removeNode(node);
112     }
113
114
115
116     /**
117      * Converts this MMObjectNode to a real rank.
118      */

119     public Rank getRank(MMObjectNode node) {
120         int rank = node.getIntValue("rank");
121         if (rank == -1) {
122             throw new SecurityException JavaDoc("odd rank " + rank);
123         } else {
124             String JavaDoc name = node.getStringValue("name");
125             Rank r = Rank.getRank(name);
126             return r;
127         }
128     }
129
130     /**
131      * Gets the rank node with given rank, or if no such node, the node with the highest rank
132      * smaller than given rank.
133      * @since MMBase-1.8
134      */

135     public MMObjectNode getRankNode(Rank rank) {
136         NodeSearchQuery q = new NodeSearchQuery(this);
137         org.mmbase.core.CoreField rankFieldDefs = getField("rank");
138         StepField rankField = q.getField(rankFieldDefs);
139         BasicFieldValueConstraint cons = new BasicFieldValueConstraint(rankField, new Integer JavaDoc(rank.getInt()));
140         cons.setOperator(FieldValueConstraint.LESS_EQUAL);
141         BasicSortOrder s = q.addSortOrder(rankField);
142         s.setDirection(SortOrder.ORDER_DESCENDING);
143         q.setConstraint(cons);
144         q.setMaxNumber(1);
145         try {
146             Iterator i = getNodes(q).iterator();
147             if (i.hasNext()) {
148                 return (MMObjectNode) i.next();
149             } else {
150                 return null;
151             }
152         } catch (org.mmbase.storage.search.SearchQueryException sqe) {
153             log.error(sqe);
154             return null;
155         }
156     }
157
158
159     /**
160      * Only the description of a rarnk may be changed.
161      *
162      */

163     public boolean setValue(MMObjectNode node, String JavaDoc field, Object JavaDoc originalValue) {
164         if (field.equals("name") || field.equals("rank")) {
165             if ( (!node.getValue(field).equals(originalValue)) && (originalValue != null)) {
166                 throw new SecurityException JavaDoc("Cannot change " + field + " field of rank objects");
167             }
168         }
169         return true;
170     }
171
172     //javadoc inherited
173
public void setDefaults(MMObjectNode node) {
174         // does not work because setValue disallowes changing
175
//setUniqueValue(node, "name", "rank");
176
//setUniqueValue(node, "rank", 200);
177
}
178
179
180 }
181
Popular Tags