summaryrefslogtreecommitdiffstats
path: root/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
diff options
context:
space:
mode:
authorElgarL <ElgarL@palmergames.com>2011-11-02 22:33:29 +0000
committerElgarL <ElgarL@palmergames.com>2011-11-02 22:33:29 +0000
commitceba3e08993f29598a99196773f4699d753cfde2 (patch)
tree4d7c6210f967c4a8ad7234bd245670cf908907b3 /EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
parent4ee2f557a85d45770a712f891f653ba9f2db1955 (diff)
downloadEssentials-ceba3e08993f29598a99196773f4699d753cfde2.tar
Essentials-ceba3e08993f29598a99196773f4699d753cfde2.tar.gz
Essentials-ceba3e08993f29598a99196773f4699d753cfde2.tar.lz
Essentials-ceba3e08993f29598a99196773f4699d753cfde2.tar.xz
Essentials-ceba3e08993f29598a99196773f4699d753cfde2.zip
GM will now check to see if it's data files have been changed at each
scheduled save. If the files have been altered (on disc) it will reload, so long as the in-memory data hasn't changed. If the files on Disc have changed AND there have been changes to it's in-memory data it will show a warning. You then MUST issue a '/mansave force' to overwrite the disc files, or a '/manload' to overwrite the memory data.
Diffstat (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java')
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java94
1 files changed, 74 insertions, 20 deletions
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
index f5b55a25a..8ea8e28c9 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
@@ -160,47 +160,97 @@ public class WorldsHolder {
public void reloadWorld(String worldName) {
getWorldData(worldName).reload();
}
+
+ /**
+ * Wrapper to retain backwards compatibility
+ * (call this function to auto overwrite files)
+ */
+ public void saveChanges() {
+ saveChanges(true);
+ }
/**
*
*/
- public void saveChanges() {
+ public void saveChanges(boolean overwrite) {
ArrayList<WorldDataHolder> alreadyDone = new ArrayList<WorldDataHolder>();
+ Tasks.removeOldFiles(plugin, plugin.getBackupFolder());
+
for (OverloadedWorldHolder w : worldsData.values()) {
if (alreadyDone.contains(w)) {
continue;
}
- Tasks.removeOldFiles(plugin, plugin.getBackupFolder());
if (w == null) {
GroupManager.logger.severe("WHAT HAPPENED?");
continue;
}
if (w.haveGroupsChanged()) {
- //String groupsFolderName = w.getGroupsFile().getParentFile().getName();
- File backupGroups = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + "_g_" + Tasks.getDateString() + ".yml");
- try {
- Tasks.copy(w.getGroupsFile(), backupGroups);
- } catch (IOException ex) {
- GroupManager.logger.log(Level.SEVERE, null, ex);
- }
- WorldDataHolder.writeGroups(w, w.getGroupsFile());
- w.removeGroupsChangedFlag();
+ if (overwrite || (!overwrite && (w.getTimeStampGroups() >= w.getGroupsFile().lastModified()))) {
+ // Backup Groups file
+ backupFile(w,true);
+
+ WorldDataHolder.writeGroups(w, w.getGroupsFile());
+ //w.removeGroupsChangedFlag();
+ } else {
+ // Newer file found.
+ GroupManager.logger.log(Level.WARNING, "Newer Groups file found for " + w.getName() + ", but we have local changes!");
+ throw new IllegalStateException("Unable to save unless you issue a '/mansave force'");
+ }
+ } else {
+ //Check for newer file as no local changes.
+ if (w.getTimeStampGroups() < w.getGroupsFile().lastModified()) {
+ System.out.print("Newer Groups file found (Loading changes)!");
+ // Backup Users file
+ backupFile(w,false);
+ w.reloadGroups();
+ }
}
if (w.haveUsersChanged()) {
- File backupUsers = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + "_u_" + Tasks.getDateString() + ".yml");
- try {
- Tasks.copy(w.getUsersFile(), backupUsers);
- } catch (IOException ex) {
- GroupManager.logger.log(Level.SEVERE, null, ex);
- }
- WorldDataHolder.writeUsers(w, w.getUsersFile());
- w.removeUsersChangedFlag();
+ if (overwrite || (!overwrite && (w.getTimeStampUsers() >= w.getUsersFile().lastModified()))) {
+ // Backup Users file
+ backupFile(w,false);
+
+ WorldDataHolder.writeUsers(w, w.getUsersFile());
+ //w.removeUsersChangedFlag();
+ } else {
+ // Newer file found.
+ GroupManager.logger.log(Level.WARNING, "Newer Users file found for " + w.getName() + ", but we have local changes!");
+ throw new IllegalStateException("Unable to save unless you issue a '/mansave force'");
+ }
+ } else {
+ //Check for newer file as no local changes.
+ if (w.getTimeStampUsers() < w.getUsersFile().lastModified()) {
+ System.out.print("Newer Users file found (Loading changes)!");
+ // Backup Users file
+ backupFile(w,false);
+ w.reloadUsers();
+ }
}
alreadyDone.add(w);
}
// Write Global Groups
if (GroupManager.getGlobalGroups().haveGroupsChanged()) {
- GroupManager.getGlobalGroups().writeGroups();
+ GroupManager.getGlobalGroups().writeGroups(overwrite);
+ } else {
+ if (GroupManager.getGlobalGroups().getTimeStampGroups() < GroupManager.getGlobalGroups().getGlobalGroupsFile().lastModified()) {
+ System.out.print("Newer GlobalGroups file found (Loading changes)!");
+ GroupManager.getGlobalGroups().load();
+ }
+ }
+ }
+
+ /**
+ * Backup the Groups/Users file
+ * @param w
+ * @param groups
+ */
+ private void backupFile(OverloadedWorldHolder w, Boolean groups) {
+
+ File backupFile = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + (groups ? "_g_" : "_u_") + Tasks.getDateString() + ".yml");
+ try {
+ Tasks.copy((groups ? w.getGroupsFile() : w.getUsersFile()), backupFile);
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
}
}
@@ -407,6 +457,10 @@ public class WorldsHolder {
}
try {
OverloadedWorldHolder thisWorldData = new OverloadedWorldHolder(WorldDataHolder.load(worldName, groupsFile, usersFile));
+
+ // Set the file TimeStamps as it will be default from the initial load.
+ thisWorldData.setTimeStamps();
+
if (thisWorldData != null) {
GroupManager.logger.finest("Successful load of world " + worldName + "...");
worldsData.put(worldName.toLowerCase(), thisWorldData);