1 19 package freecs.core; 20 21 import java.io.File ; 22 import java.io.FileInputStream ; 23 import java.util.HashMap ; 24 import java.util.Iterator ; 25 import java.util.Properties ; 26 import java.util.Set ; 27 import java.util.Vector ; 28 29 import freecs.Server; 30 import freecs.interfaces.IReloadable; 31 import freecs.util.FileMonitor; 32 33 34 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 memberships = new HashMap (); 48 49 private File configFile; 50 private long configLastModified; 51 private boolean configFileAvailable; 52 53 private MembershipManager() { 54 init(); 55 FileMonitor.getFileMonitor ().addReloadable(this); 56 } 57 58 63 public static File getDefaultConfigFile() { 64 return new File (Server.srv.getConfigDir(), "membership.properties"); 65 } 66 67 private void init() { 68 init (getDefaultConfigFile()); 69 } 70 71 private void init(File configFile) { 72 try { 73 this.configFile = configFile; 74 this.configLastModified = configFile.lastModified(); 75 this.configFileAvailable = configFile.exists(); 76 FileInputStream in = new FileInputStream (configFile); 77 Properties props = new Properties (); 78 props.load (in); 79 in.close (); 80 init (props); 81 } catch (Exception 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 props) { 87 HashMap hm = new HashMap (); 89 for (Iterator i = props.keySet().iterator(); i.hasNext(); ) { 90 String currKey = (String ) i.next(); 91 int idx = currKey.indexOf("."); 92 if (idx < 0) 93 continue; 94 String currMembershipKey = currKey.substring(0, idx); 95 String currValue = props.getProperty(currKey); 96 Properties p = (Properties ) hm.get(currMembershipKey); 97 if (p == null) { 98 p = new Properties (); 99 hm.put(currMembershipKey, p); 100 } 101 p.setProperty(currKey.substring(idx+1), currValue); 102 } 103 104 HashMap tempMap = new HashMap (); 106 Vector newMemberships = new Vector (); 107 for (Iterator i = hm.keySet().iterator(); i.hasNext(); ) { 108 String key = (String ) i.next(); 109 Membership m = (Membership) memberships.get(key); 110 if (m!=null) { 111 m.update((Properties ) hm.get(key)); 113 } else { 114 m = new Membership(key, (Properties ) hm.get(key)); 116 newMemberships.add(m); 117 } 118 tempMap.put(key, m); 119 } 120 Set old = memberships.keySet(); 122 Set fresh = tempMap.keySet(); 123 old.removeAll(fresh); 124 for (Iterator i = old.iterator(); i.hasNext(); ) { 125 String key = ((String ) 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 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 148 public Membership getMembership(String key) { 149 return (Membership) memberships.get(key.trim().toLowerCase()); 150 } 151 152 153 155 160 public File getFile() { 161 return configFile; 162 } 163 164 168 public boolean filePresent() { 169 return this.configFileAvailable; 170 } 171 172 176 public long lastModified() { 177 return this.configLastModified; 178 } 179 180 184 public void changed() { 185 synchronized (this) { 186 this.init(configFile); 187 } 188 } 189 190 194 public void removed() { 195 synchronized (this) { 196 this.init (new Properties ()); 197 } 198 } 199 200 204 public void created() { 205 synchronized (this) { 206 this.init (configFile); 207 } 208 } 209 } 210 | Popular Tags |