Fix default settings leaking when getting configuration sections

- Default settings and custom settings are in separate YamlConfiguration instances now to prevent leaking
- When getting a configuration section you now know that either it is from the current default.yml file or the default.yml file in the jar (querying settings from the section will always have the same source)
- Fixed a startup null pointer
- Fixed #266
This commit is contained in:
Thijs Wiefferink 2016-12-23 14:07:26 +01:00
parent b18a7cc6d5
commit b525c5902c
2 changed files with 59 additions and 25 deletions

View File

@ -39,6 +39,7 @@ public class FileManager {
private YamlConfiguration groupsConfig = null;
private String defaultPath = null;
private YamlConfiguration defaultConfig = null;
private YamlConfiguration defaultConfigFallback = null;
private boolean saveGroupsRequired = false;
private Set<String> worldRegionsRequireSaving;
@ -112,10 +113,14 @@ public class FileManager {
public Collection<RegionGroup> getGroups() {
return groups.values();
}
public YamlConfiguration getDefaultSettings() {
public YamlConfiguration getRegionSettings() {
return defaultConfig;
}
public YamlConfiguration getFallbackRegionSettings() {
return defaultConfigFallback;
}
public YamlConfiguration getConfig() {
return config;
@ -763,9 +768,8 @@ public class FileManager {
if(defaultConfig.getKeys(false).size() == 0) {
AreaShop.warn("File 'default.yml' is empty, check for errors in the log.");
result = false;
} else {
defaultConfig.addDefaults(YamlConfiguration.loadConfiguration(normal));
}
defaultConfigFallback = YamlConfiguration.loadConfiguration(normal);
} catch(IOException e) {
result = false;
}

View File

@ -7,7 +7,6 @@ import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.features.Feature;
import me.wiefferink.areashop.features.FriendsFeature;
import me.wiefferink.areashop.features.SignsFeature;
import me.wiefferink.areashop.interfaces.GeneralRegionInterface;
@ -43,8 +42,6 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
private FriendsFeature friendsFeature;
private SignsFeature signsFeature;
private Map<Class, Feature> features;
// Enum for region types
public enum RegionType {
RENT("rent"),
@ -160,13 +157,8 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
* Setup the features of this class
*/
private void setupFeatures() {
addFeature(new FriendsFeature(this));
addFeature(new SignsFeature(this));
}
private void addFeature(Feature feature) {
features.put(feature.getClass(), feature);
friendsFeature = new FriendsFeature(this);
signsFeature = new SignsFeature(this);
}
/**
@ -1277,11 +1269,15 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
if(found) {
return result;
}
if(this.getFileManager().getDefaultSettings().isString(path)) {
return this.getFileManager().getDefaultSettings().getString(path).equalsIgnoreCase("true");
if(this.getFileManager().getRegionSettings().isString(path)) {
return this.getFileManager().getRegionSettings().getString(path).equalsIgnoreCase("true");
}
if(this.getFileManager().getRegionSettings().isSet(path)) {
return this.getFileManager().getRegionSettings().getBoolean(path);
} else {
return this.getFileManager().getFallbackRegionSettings().getBoolean(path);
}
return this.getFileManager().getDefaultSettings().getBoolean(path);
}
/**
@ -1309,7 +1305,12 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
if(found) {
return result;
}
return this.getFileManager().getDefaultSettings().getInt(path);
if(this.getFileManager().getRegionSettings().isSet(path)) {
return this.getFileManager().getRegionSettings().getInt(path);
} else {
return this.getFileManager().getFallbackRegionSettings().getInt(path);
}
}
/**
@ -1337,7 +1338,12 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
if(found) {
return result;
}
return this.getFileManager().getDefaultSettings().getDouble(path);
if(this.getFileManager().getRegionSettings().isSet(path)) {
return this.getFileManager().getRegionSettings().getDouble(path);
} else {
return this.getFileManager().getFallbackRegionSettings().getDouble(path);
}
}
/**
@ -1365,7 +1371,12 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
if(found) {
return result;
}
return this.getFileManager().getDefaultSettings().getLong(path);
if(this.getFileManager().getRegionSettings().isSet(path)) {
return this.getFileManager().getRegionSettings().getLong(path);
} else {
return this.getFileManager().getFallbackRegionSettings().getLong(path);
}
}
/**
@ -1393,7 +1404,12 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
if(found) {
return result;
}
return this.getFileManager().getDefaultSettings().getString(path);
if(this.getFileManager().getRegionSettings().isSet(path)) {
return this.getFileManager().getRegionSettings().getString(path);
} else {
return this.getFileManager().getFallbackRegionSettings().getString(path);
}
}
/**
@ -1421,7 +1437,12 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
if(found) {
return result;
}
return this.getFileManager().getDefaultSettings().getStringList(path);
if(this.getFileManager().getRegionSettings().isSet(path)) {
return this.getFileManager().getRegionSettings().getStringList(path);
} else {
return this.getFileManager().getFallbackRegionSettings().getStringList(path);
}
}
/**
@ -1449,7 +1470,12 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
if(found) {
return result;
}
return this.getFileManager().getDefaultSettings().getConfigurationSection(path);
if(this.getFileManager().getRegionSettings().isSet(path)) {
return this.getFileManager().getRegionSettings().getConfigurationSection(path);
} else {
return this.getFileManager().getFallbackRegionSettings().getConfigurationSection(path);
}
}
/**
@ -1493,7 +1519,11 @@ public abstract class GeneralRegion implements GeneralRegionInterface, Comparabl
}
}
if(!found) {
result = this.getFileManager().getDefaultSettings().get(path);
if(this.getFileManager().getRegionSettings().isSet(path)) {
result = this.getFileManager().getRegionSettings().getConfigurationSection(path);
} else {
result = this.getFileManager().getFallbackRegionSettings().getConfigurationSection(path);
}
}
}