|
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;
}
|