From: Stefan F. <ste...@us...> - 2012-03-04 07:44:58
|
rails/common/Config.java | 10 +++++ rails/common/ConfigManager.java | 66 +++++++++++++++++++++++++++++++-------- rails/common/ConfigProfile.java | 63 ++++++++++++++++++++++++++++--------- rails/ui/swing/ConfigWindow.java | 3 - rails/util/SystemOS.java | 33 ++++++++++++++++--- 5 files changed, 141 insertions(+), 34 deletions(-) New commits: commit f8a91a293dd23a4e5c763346a9c96b0b6ab4dd62 Author: Stefan Frey <ste...@we...> Date: Sun Mar 4 08:43:31 2012 +0100 Added recent file mechanism Added sorting to profile selection diff --git a/rails/common/Config.java b/rails/common/Config.java index bce5142..30af858 100644 --- a/rails/common/Config.java +++ b/rails/common/Config.java @@ -4,7 +4,7 @@ import rails.game.GameManager; import rails.util.Util; /** - * Proxy class to the ConfigManager + * Proxy class to the ConfigManager */ public class Config { @@ -42,6 +42,14 @@ public class Config { return getSpecific(key, GameManager.getInstance().getGameName()); } + public static String getRecent(String key) { + return ConfigManager.getInstance().getRecent(key); + } + public static boolean storeRecent(String key, String value) { + return ConfigManager.getInstance().storeRecent(key, value); + } } + + diff --git a/rails/common/ConfigManager.java b/rails/common/ConfigManager.java index c2420c9..ca4f7c9 100644 --- a/rails/common/ConfigManager.java +++ b/rails/common/ConfigManager.java @@ -1,11 +1,12 @@ package rails.common; +import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; -import java.util.Set; import org.apache.log4j.Logger; @@ -15,6 +16,7 @@ import rails.common.parser.ConfigurationException; import rails.common.parser.Tag; import rails.game.Game; import rails.game.GameManagerI; +import rails.util.SystemOS; import rails.util.Util; /** @@ -42,6 +44,9 @@ public class ConfigManager implements ConfigurableComponentI { private static final String SECTION_TAG = "Section"; private static final String ITEM_TAG = "Property"; + // Recent property file + private static final String RECENT_FILE = "rails.recent"; + // singleton configuration for ConfigManager private static final ConfigManager instance = new ConfigManager(); @@ -50,6 +55,9 @@ public class ConfigManager implements ConfigurableComponentI { // configuration items: replace with Multimap in Rails 2.0 private final Map<String, List<ConfigItem>> configSections = new HashMap<String, List<ConfigItem>>(); + // recent data + private final Properties recentData = new Properties(); + // profile storage private ConfigProfile activeProfile; @@ -142,13 +150,19 @@ public class ConfigManager implements ConfigurableComponentI { private void init() { + // load recent data + File recentFile = new File(SystemOS.get().getConfigurationFolder(false), RECENT_FILE); + ConfigProfile.loadProperties(recentData, recentFile.getAbsolutePath(), false); + // define profiles ConfigProfile.readPredefined(); ConfigProfile.readUser(); - // load root and default profile + // load root profile ConfigProfile.loadRoot(); - changeProfile(ConfigProfile.getDefault()); + + // change to start profile (cli, recent or default) + changeProfile(ConfigProfile.getStartProfile()); initVersion(); } @@ -195,8 +209,15 @@ public class ConfigManager implements ConfigurableComponentI { return activeProfile.getType() == ConfigProfile.Type.USER; } - public Set<String> getProfiles() { - return ConfigProfile.getListofProfiles(); + public List<String> getProfiles() { + // sort and convert to names + List<ConfigProfile> profiles = new ArrayList<ConfigProfile>(ConfigProfile.getProfiles()); + Collections.sort(profiles); + List<String> profileNames = new ArrayList<String>(); + for (ConfigProfile profile:profiles){ + profileNames.add(profile.getName()); + } + return profileNames; } public Map<String, List<ConfigItem>> getConfigSections() { @@ -213,12 +234,9 @@ public class ConfigManager implements ConfigurableComponentI { } private void changeProfile(ConfigProfile profile) { - // check if profiles have been loaded - if (!profile.isLoaded()) { - profile.load(); - } activeProfile = profile; - + activeProfile.makeActive(); + // define configItems for (List<ConfigItem> items:configSections.values()) { for (ConfigItem item:items) { @@ -254,6 +272,30 @@ public class ConfigManager implements ConfigurableComponentI { return saveProfile(applyInitMethods); } - - + String getRecent(String key) { + // get value from active profile (this escalates) + String value = recentData.getProperty(key); + if (Util.hasValue(value)) { + return value.trim(); + } else { + return null; + } + } + + boolean storeRecent(String key, String value) { + // check conditions + if (key == null) return false; + if (getRecent(key) == null || !getRecent(key).equals(value) ) { + if (value == null) { + recentData.remove(key); + } else { + recentData.setProperty(key, value); + } + File recentFile = new File(SystemOS.get().getConfigurationFolder(true), RECENT_FILE); + return ConfigProfile.storeProperties(recentData, recentFile); + } + // nothing has changed + return true; + } + } diff --git a/rails/common/ConfigProfile.java b/rails/common/ConfigProfile.java index dda3d13..1fed682 100644 --- a/rails/common/ConfigProfile.java +++ b/rails/common/ConfigProfile.java @@ -6,10 +6,10 @@ import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Properties; -import java.util.Set; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOCase; @@ -23,19 +23,24 @@ import rails.util.Util; * A profile storing configuration settings */ -public final class ConfigProfile { +public final class ConfigProfile implements Comparable<ConfigProfile> { protected static Logger log = Logger.getLogger(ConfigProfile.class.getPackage().getName()); // available profile types - public enum Type {SYSTEM, PREDEFINED, USER}; + public enum Type {SYSTEM(0), PREDEFINED(1), USER(2); + private Integer sort; Type(int sort) {this.sort = sort;} + }; // Filename extension of profiles public static final String PROFILE_EXTENSION = ".rails_profile"; private static final String PREDEFINED_EXTENSION = ".predefined"; - // Location of predefined profiles + // Locations + // user inside configuration folder + private static final String PROFILE_FOLDER = "profiles/"; + // predefined inside jar private static final String PREDEFINED_FOLDER = "data/profiles/"; // predefined default profiles @@ -45,7 +50,7 @@ public final class ConfigProfile { // the profile selected at the start ... private static final String STANDARD_PROFILE = "pbem"; // ... unless a cli option has been set - private static final String STANDARD_CLI_OPTION ="profile"; + private static final String CLI_AND_RECENT_OPTION ="profile"; // file that stores the list of predefined profiles @@ -98,7 +103,7 @@ public final class ConfigProfile { } static void readUser() { - File userFolder = SystemOS.get().getConfigurationFolder(false); + File userFolder = SystemOS.get().getConfigurationFolder(PROFILE_FOLDER, false); if (userFolder == null) return; FilenameFilter filter = new SuffixFileFilter(PROFILE_EXTENSION, IOCase.SYSTEM); for (String fileName:userFolder.list(filter)) { @@ -106,11 +111,18 @@ public final class ConfigProfile { } } - static ConfigProfile getDefault() { - String profile = System.getProperty(STANDARD_CLI_OPTION); + static ConfigProfile getStartProfile() { + // first checks cli + String profile = System.getProperty(CLI_AND_RECENT_OPTION); if (Util.hasValue(profile) && profiles.containsKey(profile)) { return profiles.get(profile); } + // second check recent + profile = Config.getRecent(CLI_AND_RECENT_OPTION); + if (Util.hasValue(profile) && profiles.containsKey(profile)) { + return profiles.get(profile); + } + // third return standard profile return profiles.get(STANDARD_PROFILE); } @@ -118,8 +130,8 @@ public final class ConfigProfile { return profiles.get(name); } - static Set<String> getListofProfiles() { - return profiles.keySet(); + static Collection<ConfigProfile> getProfiles() { + return profiles.values(); } private ConfigProfile(Type type, String name) { @@ -180,6 +192,16 @@ public final class ConfigProfile { properties.remove(key); } } + + + void makeActive(){ + // check if is already loaded + if (!isLoaded()) { + load(); + } + // and store it to recent + Config.storeRecent(CLI_AND_RECENT_OPTION, getName()); + } ConfigProfile deriveUserProfile(String name) { ConfigProfile newProfile = new ConfigProfile(Type.USER, name); @@ -242,7 +264,7 @@ public final class ConfigProfile { } private boolean loadUser() { - File folder = SystemOS.get().getConfigurationFolder(false); + File folder = SystemOS.get().getConfigurationFolder(PROFILE_FOLDER, false); if (folder == null) { return false; } else { @@ -267,7 +289,7 @@ public final class ConfigProfile { boolean store() { if (type != Type.USER) return false; loaded = true; - File folder = SystemOS.get().getConfigurationFolder(true); + File folder = SystemOS.get().getConfigurationFolder(PROFILE_FOLDER, true); if (folder == null) { return false; } else { @@ -306,8 +328,21 @@ public final class ConfigProfile { } return result; } - - + + private int compare(ConfigProfile a, ConfigProfile b) { + if (a.type.sort != b.type.sort) { + return a.type.sort.compareTo(b.type.sort); + } else { + return a.getName().compareTo(b.getName()); + } + } + + /** + * Compares first on Type.sort than on name + */ + public int compareTo(ConfigProfile other) { + return compare(this, other); + } } diff --git a/rails/ui/swing/ConfigWindow.java b/rails/ui/swing/ConfigWindow.java index e6c0842..7d0d061 100644 --- a/rails/ui/swing/ConfigWindow.java +++ b/rails/ui/swing/ConfigWindow.java @@ -10,7 +10,6 @@ import java.beans.PropertyChangeListener; import java.io.File; import java.util.Map; import java.util.List; -import java.util.Set; import rails.common.ConfigItem; import rails.common.LocalText; @@ -464,7 +463,7 @@ class ConfigWindow extends JFrame { private boolean saveAsConfig() { // get Names - Set<String> allProfileNames = cm.getProfiles(); + List<String> allProfileNames = cm.getProfiles(); String newProfile = null; do { newProfile = JOptionPane.showInputDialog(ConfigWindow.this, LocalText.getText("CONFIG_NEW_MESSAGE"), diff --git a/rails/util/SystemOS.java b/rails/util/SystemOS.java index 5f221cc..79b9d7a 100644 --- a/rails/util/SystemOS.java +++ b/rails/util/SystemOS.java @@ -41,6 +41,8 @@ public enum SystemOS { } /** + * Returns the folder that contains all rails specific user data + * Returns null if the operations fails * @param create set to true creates the folder if it does not exist * @return rails specific configuration folder */ public File getConfigurationFolder(boolean create) { @@ -63,14 +65,35 @@ public enum SystemOS { } // locate railsFolder - File railsFolder = new File(folder, appName); + return locateFolder(folder, appName, create); + } + + /** + * Returns a sub-folder inside the Rails configuration folder + * Returns null if the operations fails + * @param subFolder the folder inside + * @param create set to true creates the subFolder and/or + * configFolder if it does not exist + * @return rails specific configuration folder + */ + public File getConfigurationFolder(String subFolder, boolean create) { + File railsFolder = getConfigurationFolder(create); + + if (railsFolder == null) return null; + + // locate subFolder + return locateFolder(railsFolder, subFolder, create); + } + + private File locateFolder(File folder, String sub, boolean create) { + File subFolder = new File(folder, sub); - if (!railsFolder.exists() && create) { - createFolder(railsFolder); + if (!subFolder.exists() && create) { + createFolder(subFolder); } - if (railsFolder.exists() && railsFolder.isDirectory()) { - return railsFolder; + if (subFolder.exists() && subFolder.isDirectory()) { + return subFolder; } else { return null; } |