/* * File : PersistentSettings.java * Created : 28-jun-2002 16:20 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.*; import java.util.Enumeration; import java.util.Properties; import java.util.StringTokenizer; import java.util.prefs.Preferences; import javax.swing.JOptionPane; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class PersistentSettings { public static final String BASE=".edu.xtec.properties"; public static final String BASE_OLD="edu.xtec.properties"; public static final String BUNDLE="messages.PersistentPathsMessages"; public static final String BASE_PREFS_NODE="/edu/xtec"; public static final String JCLIC_PREFS_NODE="/edu/xtec/jclic"; public static Preferences userPrefs = Preferences.userRoot().node(BASE_PREFS_NODE); public static Preferences systemPrefs = Preferences.systemRoot().node(JCLIC_PREFS_NODE); // Gets basic preferences for "edu.xtec" programs. private static Properties getProperties() throws Exception{ Properties prop=new Properties(); // Try to read from new "Preferences" object String [] keys=userPrefs.keys(); if(keys.length==0){ // No keys left. Try to load from previous settings StringBuilder sb=new StringBuilder(300); sb.append(System.getProperty("user.dir")); sb.append(File.pathSeparator); sb.append(System.getProperty("user.home")); sb.append(File.pathSeparator); sb.append(System.getProperty("java.home")).append(File.separator).append("lib"); sb.append(File.pathSeparator).append(System.getProperty("java.ext.dirs")); File baseFile=null; StringTokenizer st=new StringTokenizer(sb.substring(0), File.pathSeparator); while(baseFile==null && st.hasMoreTokens()){ String s=st.nextToken(); File dir=new File(s); if(dir.exists() && dir.isDirectory()){ File testFile=new File(dir, BASE); if(testFile.canRead()){ baseFile=testFile; } else{ testFile=new File(dir, BASE_OLD); if(testFile.canRead()){ baseFile=testFile; } } } } if(baseFile!=null) { // Found old settings // Read it and store into "userPrefs" InputStream is=new FileInputStream(baseFile); prop.load(is); is.close(); saveSettings(prop); } } else { // Read current settings from "userPrefs" for(String k : keys){ prop.put(k, userPrefs.get(k,"")); } } return prop; } public static File getBasePathTo(String programName, Options options) throws Exception{ Properties prop=getProperties(); String path=(String)prop.get(programName); if(path!=null){ File d=new File(path); if(!d.exists() || !d.isDirectory()){ path=null; } } if(path==null){ // "Program Files" path is no longer used as default for storing data // instead, we will use always {user.home}/programName // String sPath=getSystemProgramsPath(options)+File.separator+programName; String sPath=System.getProperty("user.home")+File.separator+programName; Messages messages=getMessages(options, BUNDLE); String msg=messages.get("cl_alert"); int i=msg.indexOf('$'); if(i>=0){ msg=msg.substring(0, i)+programName+msg.substring(i+1); } boolean done=false; File d=new File(sPath); while(!done){ String result=(String)JOptionPane.showInputDialog( options.getMainComponent(), msg, messages.get("cl_prompt_title"), JOptionPane.QUESTION_MESSAGE, null, null, sPath); if(result==null) throw new Exception("bad user input!"); d=new File(result); try{ if(!d.exists() || !d.isDirectory()) d.mkdirs(); done=d.exists() && d.isDirectory(); } catch(Exception ex){ messages.showErrorWarning(options.getMainComponent(), "cl_err_unableToCreateDir", ex); } } path=d.getAbsolutePath(); prop.setProperty(programName, path); saveSettings(prop); } return new File(path); } private static void saveSettings(Properties prop) throws Exception{ Enumeration keys=prop.keys(); while(keys.hasMoreElements()){ String key=(String)keys.nextElement(); String value=prop.getProperty(key, ""); userPrefs.put(key, value); } userPrefs.flush(); } public static Messages getMessages(Options options, String bundle) throws Exception{ Messages msg=(Messages)options.get(Messages.MESSAGES); if(msg==null){ boolean mustSave=false; String l=(String)options.get(Messages.LANGUAGE); Properties prop=null; if(l==null){ prop=getProperties(); l=prop.getProperty(Messages.LANGUAGE); if(l!=null) options.put(Messages.LANGUAGE, l); else mustSave=true; } else{ options.put(Options.LANGUAGE_BY_PARAM, Options.BTRUE); } msg=Messages.getMessages(options, bundle); if(mustSave && prop!=null){ prop.setProperty(Messages.LANGUAGE, (String)options.get(Messages.LANGUAGE)); saveSettings(prop); } } else if (bundle!=null) msg.addBundle(bundle); return msg; } public static String getFilePath(String programName, String fileName, Options options, boolean createFile){ String result = null; File base; try{ base=getBasePathTo(programName, options); } catch(Exception ex){ base=new File(System.getProperty("user.home")); } File testFile=new File(base, fileName); if(testFile.canRead()) result=testFile.getAbsolutePath(); else if(createFile) try{ FileOutputStream fos=new FileOutputStream(testFile); fos.close(); testFile.delete(); } catch(Exception ex){ // Unable to create file in selected dir // It will be created on {user.dir} testFile=new File(fileName); } finally { result = testFile.getAbsolutePath(); } return result; } }