KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > freecs > core > MembershipManager


1 /**
2  * Copyright (C) 2004 ManfredAndres
3  * Created: 11.10.2004 (15:23:50)
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */

19 package freecs.core;
20
21 import java.io.File JavaDoc;
22 import java.io.FileInputStream JavaDoc;
23 import java.util.HashMap JavaDoc;
24 import java.util.Iterator JavaDoc;
25 import java.util.Properties JavaDoc;
26 import java.util.Set JavaDoc;
27 import java.util.Vector JavaDoc;
28
29 import freecs.Server;
30 import freecs.interfaces.IReloadable;
31 import freecs.util.FileMonitor;
32
33
34 /**
35  * @author Manfred Andres
36  *
37  * This Class acts as a single point for memberships. The definitions
38  * for all Memberships will be loaded here and the corresponding
39  * Membership-objects will also be constructed here. All Membership-objects
40  * will be unique, meaning, that there will only be one instance of each
41  * Membership-object, having the same name. This makes it possible to
42  * check equality of Membership-objects by using "==".
43  */

44 public class MembershipManager implements IReloadable {
45     public static MembershipManager instance = new MembershipManager();
46     public static final Membership undefined = new Membership ("undefined", null);
47     public volatile HashMap JavaDoc memberships = new HashMap JavaDoc();
48
49     private File JavaDoc configFile;
50     private long configLastModified;
51     private boolean configFileAvailable;
52     
53     private MembershipManager() {
54         init();
55         FileMonitor.getFileMonitor ().addReloadable(this);
56     }
57
58     /**
59      * returns a reference to the membership config. by default called
60      * membership.properties in server config directory
61      * @see freecs.Server#getConfigDir()
62      */

63     public static File JavaDoc getDefaultConfigFile() {
64         return new File JavaDoc(Server.srv.getConfigDir(), "membership.properties");
65     }
66     
67     private void init() {
68         init (getDefaultConfigFile());
69     }
70
71     private void init(File JavaDoc configFile) {
72         try {
73             this.configFile = configFile;
74             this.configLastModified = configFile.lastModified();
75             this.configFileAvailable = configFile.exists();
76             FileInputStream JavaDoc in = new FileInputStream JavaDoc (configFile);
77             Properties JavaDoc props = new Properties JavaDoc ();
78             props.load (in);
79             in.close ();
80             init (props);
81         } catch (Exception JavaDoc e) {
82             Server.debug (null, "can't read authentication config from " + configFile + " (" + e.toString() + ")", e, Server.MSG_ERROR, Server.LVL_MAJOR);
83         }
84     }
85
86     private void init (Properties JavaDoc props) {
87         // seperate the propterties for each membership
88
HashMap JavaDoc hm = new HashMap JavaDoc();
89         for (Iterator JavaDoc i = props.keySet().iterator(); i.hasNext(); ) {
90             String JavaDoc currKey = (String JavaDoc) i.next();
91             int idx = currKey.indexOf(".");
92             if (idx < 0)
93                 continue;
94             String JavaDoc currMembershipKey = currKey.substring(0, idx);
95             String JavaDoc currValue = props.getProperty(currKey);
96             Properties JavaDoc p = (Properties JavaDoc) hm.get(currMembershipKey);
97             if (p == null) {
98                 p = new Properties JavaDoc();
99                 hm.put(currMembershipKey, p);
100             }
101             p.setProperty(currKey.substring(idx+1), currValue);
102         }
103         
104         // create or update the membership-objects according to the config
105
HashMap JavaDoc tempMap = new HashMap JavaDoc();
106         Vector JavaDoc newMemberships = new Vector JavaDoc();
107         for (Iterator JavaDoc i = hm.keySet().iterator(); i.hasNext(); ) {
108             String JavaDoc key = (String JavaDoc) i.next();
109             Membership m = (Membership) memberships.get(key);
110             if (m!=null) {
111                 // update membership-object
112
m.update((Properties JavaDoc) hm.get(key));
113             } else {
114                 // a new membership-object has been found
115
m = new Membership(key, (Properties JavaDoc) hm.get(key));
116                 newMemberships.add(m);
117             }
118             tempMap.put(key, m);
119         }
120         // get the membership-objects, which have been removed
121
Set JavaDoc old = memberships.keySet();
122         Set JavaDoc fresh = tempMap.keySet();
123         old.removeAll(fresh);
124         for (Iterator JavaDoc i = old.iterator(); i.hasNext(); ) {
125             String JavaDoc key = ((String JavaDoc) i.next()).trim().toLowerCase();
126             Membership m = (Membership) memberships.get(key);
127             m.cleanup();
128         }
129         memberships = tempMap;
130         
131         User[] usrArr = UserManager.mgr.ustr.toArray();
132         for (int i = 0; i < usrArr.length; i++) {
133             User u = usrArr[i];
134             for (Iterator JavaDoc j = newMemberships.iterator(); j.hasNext(); ) {
135                 Membership m = (Membership) j.next();
136                 if (u.getMembership(m.key) == undefined)
137                     u.addMembership(m.key, m);
138             }
139         }
140     }
141     
142     /**
143      * This method is used to retrieve membership-objects corresponding
144      * to the given key.
145      * @param key the key to the Membership-object
146      * @return the Membership-object identified by the given key
147      */

148     public Membership getMembership(String JavaDoc key) {
149         return (Membership) memberships.get(key.trim().toLowerCase());
150     }
151
152     
153     // INTERFACE IReloadable
154

155     /**
156      * returns the config-file, which will be checked for
157      * changes.
158      * @see freecs.interfaces.IReloadable#filePresent()
159      */

160     public File JavaDoc getFile() {
161         return configFile;
162     }
163
164     /**
165      * returns true, if the monitored file was present the last time
166      * @see freecs.interfaces.IReloadable#filePresent()
167      */

168     public boolean filePresent() {
169         return this.configFileAvailable;
170     }
171
172     /**
173      * returns the last known modification-time of this file
174      * @see freecs.interfaces.IReloadable#lastModified()
175      */

176     public long lastModified() {
177         return this.configLastModified;
178     }
179
180     /**
181      * the monitored file has been changed
182      * @see freecs.interfaces.IReloadable#changed()
183      */

184     public void changed() {
185         synchronized (this) {
186             this.init(configFile);
187         }
188     }
189
190     /**
191      * the monitored file has been removed
192      * @see freecs.interfaces.IReloadable#removed()
193      */

194     public void removed() {
195         synchronized (this) {
196             this.init (new Properties JavaDoc());
197         }
198     }
199
200     /**
201      * the monitored file has been created
202      * @see freecs.interfaces.IReloadable#created()
203      */

204     public void created() {
205         synchronized (this) {
206             this.init (configFile);
207         }
208     }
209 }
210
Popular Tags