package ring.system; import java.util.Scanner; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; import ring.main.RingModule; /** * Manages MUD system preferences. These are internal configuration values for the * MUD itself. Users and developers should rarely have to mess with these, except perhaps * during initial setup. * @author jeff * */ public class PreferencesManager implements RingModule { private static void clear(String pref) { boolean all = false; System.out.println("You are about to clear " + pref); System.out.println("Enter y to continue, or n to cancel."); String answer = readFromKeyboard(); if (answer.equals("y")) { doClear(PreferencesManager.class.getName(), pref, all); } else { System.out.println("Clear aborted."); } } private static void doClear(String className, String pref, boolean all) { try { Preferences prefs = getPrefs(className); if (all) { prefs.clear(); } else { prefs.remove(pref); } prefs.flush(); System.out.println("Preference(s) cleared."); } catch (BackingStoreException e) { System.err.println("Error clearing: " + e.getCause().getMessage()); System.exit(1); } } private static String readFromKeyboard() { Scanner s = new Scanner(System.in); return s.nextLine(); } /** * Parses the class and preference name, received in the form of * java.pkg.name.prefName. * @param string * @return A String[] array of length 2, containing the class name and pref name. */ /*private static String[] parseClassAndPref(String arg) { String[] ret = new String[2]; int lastDot = arg.lastIndexOf("."); String prefName = arg.substring(lastDot + 1, arg.length()); String className = arg.substring(0, lastDot); if (prefName.equals("")) { System.err.println("Error: Can't have an empty preference name."); System.exit(1); } ret[0] = className; ret[1] = prefName; return ret; }*/ public void execute(String[] args) { if (args.length == 0) { usage(); System.exit(0); } if (args[0].equals("set")) { set(args[1], args[2]); } else if (args[0].equals("get")) { displayPreferenceValue(args[1]); } else if (args[0].equals("clear")) { clear(args[1]); } else if (args[0].equals("fclear")) { doClear(PreferencesManager.class.getName(), args[1], true); } else { usage(); } } private static void usage() { System.out.println("PreferencesManager: Unrecognized option. Try:"); System.out.println("\tset prefName prefValue: Sets a preference"); System.out.println("\tget prefName: Prints preference value"); System.out.println("\tclear prefName Clears a preference"); System.out.println("\tfclear prefName: Clears preference without asking"); System.out.println("Example syntax:"); System.out.println("prefs set configLocation /path/to/configfile"); } private static void displayPreferenceValue(String pref) { //TODO implement displaying list of all prefs with * character. String value = getString(pref); if (value != null) System.out.println(pref + " = " + value); else System.out.println("\"" + pref + "\" is not set."); } public static void set(String prefName, String prefValue) { set(PreferencesManager.class.getName(), prefName, prefValue); } private static void set(String className, String prefName, String prefValue) { Preferences prefs = null; prefs = getPrefs(className); prefs.put(prefName, prefValue); try { prefs.flush(); System.out.println("Set " + className + "." + prefName + " = " + prefValue); } catch (BackingStoreException e) { System.err.println("Error setting perference: " + e.getCause().getMessage()); } } public static String getString(String pref) { return getString(PreferencesManager.class.getName(), pref); } protected static String getString(String className, String pref) { try { Class<?> c = Class.forName(className); Preferences prefs = getPrefs(c); return prefs.get(pref, null); } catch (ClassNotFoundException e) { System.err.println("PreferencesManager: Unrecgonized class component " + className); System.exit(1); return null; } } private static Preferences getPrefs(Class<?> c) { return Preferences.systemNodeForPackage(c); } private static Preferences getPrefs(String className) { try { Class<?> c = Class.forName(className); return getPrefs(c); } catch (ClassNotFoundException e) { System.err.println("PreferencesManager: Unrecognized class component " + className); System.exit(1); return null; //not reachable } } @Override public boolean usesDatabase() { return false; } }