001    import java.util.ArrayList;
002    import java.util.Collections;
003    import java.util.HashMap;
004    import java.util.List;
005    import java.util.Map;
006    import java.util.logging.Level;
007    import java.util.logging.Logger;
008    import net.minecraft.server.MinecraftServer;
009    
010    /**
011     * DataSource.java - Abstract class for implementing new data sources.
012     * 
013     * @author James
014     */
015    public abstract class DataSource {
016    
017        protected static final Logger log = Logger.getLogger("Minecraft");
018        protected List<Group> groups = new ArrayList<Group>();
019        protected List<Kit> kits = new ArrayList<Kit>();
020        protected List<Warp> homes = new ArrayList<Warp>();
021        protected List<Warp> warps = new ArrayList<Warp>();
022        protected List<Ban> bans = new ArrayList<Ban>();
023        protected Map<String, Integer> items = new HashMap<String, Integer>();
024        protected MinecraftServer server;
025        protected final Object groupLock = new Object(), kitLock = new Object(), banLock = new Object();
026        protected final Object homeLock = new Object(), warpLock = new Object(), itemLock = new Object();
027    
028        /**
029         * Initializes the data source
030         */
031        abstract public void initialize();
032    
033        /**
034         * Loads all groups
035         */
036        abstract public void loadGroups();
037    
038        /**
039         * Loads all kits
040         */
041        abstract public void loadKits();
042    
043        /**
044         * Loads all homes
045         */
046        abstract public void loadHomes();
047    
048        /**
049         * Loads all warps
050         */
051        abstract public void loadWarps();
052    
053        /**
054         * Loads all items
055         */
056        abstract public void loadItems();
057    
058        /**
059         * Loads the ban list
060         */
061        abstract public void loadBanList();
062    
063        /**
064         * Adds user to the list
065         * 
066         * @param player
067         */
068        abstract public void addPlayer(Player player);
069    
070        /**
071         * Modifies the provided user
072         * 
073         * @param player
074         */
075        abstract public void modifyPlayer(Player player);
076    
077        /**
078         * Checks to see if the specified player exists
079         * 
080         * @param player
081         * @return true if player exists
082         */
083        abstract public boolean doesPlayerExist(String player);
084    
085        /**
086         * Returns specified user
087         * 
088         * @param name
089         * @return user
090         */
091        abstract public Player getPlayer(String name);
092    
093        /**
094         * Adds specified group to the list of groups
095         * 
096         * @param group
097         */
098        abstract public void addGroup(Group group);
099    
100        /**
101         * Modifies group
102         * 
103         * @param group
104         */
105        abstract public void modifyGroup(Group group);
106    
107        /**
108         * Returns specified group
109         * 
110         * @param name
111         * @return group
112         */
113        public Group getGroup(String name) {
114            synchronized (groupLock) {
115                for (Group group : groups) {
116                    if (group.Name.equalsIgnoreCase(name)) {
117                        return group;
118                    }
119                }
120            }
121    
122            if (!name.equals("")) {
123                log.log(Level.INFO, "Unable to find group '" + name + "'. Are you sure you have that group?");
124            }
125    
126            return null;
127        }
128    
129        /**
130         * Returns the default group
131         * 
132         * @return default group
133         */
134        public Group getDefaultGroup() {
135            synchronized (groupLock) {
136                for (Group group : groups) {
137                    if (group.DefaultGroup) {
138                        return group;
139                    }
140                }
141            }
142            return null;
143        }
144    
145        /**
146         * Adds kit to list of kits
147         * 
148         * @param kit
149         */
150        abstract public void addKit(Kit kit);
151    
152        /**
153         * Modifies kit
154         * 
155         * @param kit
156         */
157        abstract public void modifyKit(Kit kit);
158    
159        /**
160         * Returns specified kit
161         * 
162         * @param name
163         * @return kit
164         */
165        public Kit getKit(String name) {
166            synchronized (kitLock) {
167                for (Kit kit : kits) {
168                    if (kit.Name.equalsIgnoreCase(name)) {
169                        return kit;
170                    }
171                }
172            }
173            return null;
174        }
175    
176        /**
177         * Returns true if there are any kits
178         * 
179         * @return true if there are kits
180         */
181        public boolean hasKits() {
182            synchronized (kitLock) {
183                return kits.size() > 0;
184            }
185        }
186    
187        /**
188         * Returns a list of all kits names separated by commas
189         * 
190         * @param player
191         * @return string list of kits
192         */
193        public String getKitNames(Player player) {
194            StringBuilder builder = new StringBuilder();
195            builder.append(""); // incaseofnull
196    
197            synchronized (kitLock) {
198                for (Kit kit : kits) {
199                    if (player.isInGroup(kit.Group) || kit.Group.equals("")) {
200                        builder.append(kit.Name).append(" ");
201                    }
202                }
203            }
204    
205            return builder.toString();
206        }
207    
208        /**
209         * Adds home to list of homes
210         * 
211         * @param home
212         */
213        abstract public void addHome(Warp home);
214    
215        /**
216         * Modifies home
217         * 
218         * @param home
219         */
220        abstract public void changeHome(Warp home);
221    
222        /**
223         * Returns specified home
224         * 
225         * @param name
226         * @return home
227         */
228        public Warp getHome(String name) {
229            synchronized (homeLock) {
230                for (Warp home : homes) {
231                    if (home.Name.equalsIgnoreCase(name)) {
232                        return home;
233                    }
234                }
235            }
236            return null;
237        }
238    
239        /**
240         * Adds warp to list of warps
241         * 
242         * @param warp
243         */
244        abstract public void addWarp(Warp warp);
245    
246        /**
247         * Modifies warp
248         * 
249         * @param warp
250         */
251        abstract public void changeWarp(Warp warp);
252    
253        /**
254         * Removes warp from list of warps
255         * 
256         * @param warp
257         */
258        abstract public void removeWarp(Warp warp);
259    
260        /**
261         * Returns specified warp
262         * 
263         * @param name
264         * @return warp
265         */
266        public Warp getWarp(String name) {
267            synchronized (warpLock) {
268                for (Warp warp : warps) {
269                    if (warp.Name.equalsIgnoreCase(name)) {
270                        return warp;
271                    }
272                }
273            }
274            return null;
275        }
276    
277        /**
278         * Returns true if there are any warps
279         * 
280         * @return true if there are warps
281         */
282        public boolean hasWarps() {
283            synchronized (warpLock) {
284                return warps.size() > 0;
285            }
286        }
287    
288        /**
289         * Returns a string containing all warp names the player has access to
290         * 
291         * @param player
292         * @return string list of warps
293         */
294        public String getWarpNames(Player player) {
295            StringBuilder builder = new StringBuilder();
296            builder.append(""); // incaseofnull
297    
298            synchronized (warpLock) {
299                for (Warp warp : warps) {
300                    if (player.isInGroup(warp.Group) || warp.Group.equals("")) {
301                        builder.append(warp.Name).append(" ");
302                    }
303                }
304            }
305    
306            return builder.toString();
307        }
308    
309        /**
310         * Returns item id corresponding to item name
311         * 
312         * @param name
313         * @return item id
314         */
315        public int getItem(String name) {
316            synchronized (itemLock) {
317                if (items.containsKey(name)) {
318                    return items.get(name);
319                }
320            }
321            return 0;
322        }
323    
324        /**
325         * Returns the name of the item corresponding to the ID
326         * 
327         * @param id
328         *            id of item
329         * @return name of item
330         */
331        public String getItem(int id) {
332            synchronized (itemLock) {
333                for (String name : items.keySet()) {
334                    if (items.get(name) == id) {
335                        return name;
336                    }
337                }
338            }
339            return String.valueOf(id);
340        }
341    
342        /**
343         * Returns an unmodifiable map of items
344         * 
345         * @return unmodifiable map of items
346         */
347        public Map<String, Integer> getItems() {
348            return Collections.unmodifiableMap(items);
349        }
350    
351        /**
352         * Adds player to whitelist
353         * 
354         * @param name
355         */
356        abstract public void addToWhitelist(String name);
357    
358        /**
359         * Removes player from whitelist
360         * 
361         * @param name
362         */
363        abstract public void removeFromWhitelist(String name);
364    
365        /**
366         * Returns true if whitelist is enabled
367         * 
368         * @return true if whitelist is enabled
369         * @deprecated use etc.getInstance().isWhitelistEnabled() instead
370         */
371        @Deprecated
372        public boolean hasWhitelist() {
373            return etc.getInstance().isWhitelistEnabled();
374        }
375    
376        /**
377         * Returns true if the player is on the whitelist
378         * 
379         * @param user
380         * @return true if player is on whitelist
381         */
382        abstract public boolean isUserOnWhitelist(String user);
383    
384        /**
385         * Adds player to reservelist
386         * 
387         * @param name
388         */
389        abstract public void addToReserveList(String name);
390    
391        /**
392         * Removes player from reservelist
393         * 
394         * @param name
395         */
396        abstract public void removeFromReserveList(String name);
397    
398        /**
399         * Returns true if player is on reservelist
400         * 
401         * @param user
402         * @return true if player is on reserve list
403         */
404        abstract public boolean isUserOnReserveList(String user);
405    
406        /**
407         * Adds or modifies specified ban
408         * 
409         * @param ban
410         *            Ban to add or modify
411         */
412        abstract public void modifyBan(Ban ban);
413    
414        /**
415         * Checks to see if this player or IP is on the ban list
416         * 
417         * @param player
418         *            Player name
419         * @param ip
420         *            IP Address
421         * @return true if either name or IP is on the ban list
422         */
423        public boolean isOnBanList(String player, String ip) {
424            synchronized (banLock) {
425                for (Ban ban : bans) {
426                    if (ban.getName().equalsIgnoreCase(player) || ban.getIp().equalsIgnoreCase(ip)) {
427                        return true;
428                    }
429                }
430            }
431            return false;
432        }
433    
434        /**
435         * Retrieves the ban details
436         * 
437         * @param player
438         *            Player name
439         * @param ip
440         *            IP Address
441         * @return the ban
442         */
443        public Ban getBan(String player, String ip) {
444            synchronized (banLock) {
445                for (Ban ban : bans) {
446                    if (ban.getName().equalsIgnoreCase(player) || ban.getIp().equalsIgnoreCase(ip)) {
447                        return ban;
448                    }
449                }
450            }
451            return null;
452        }
453    }