Mercurial > 510Connectbot
view src/org/tn5250j/GlobalConfigure.java @ 20:69a407d33146 tn5250
adding tn5250 files
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Tue, 03 Jun 2014 10:27:54 -0700 |
parents | |
children | 94abfc6441a4 |
line wrap: on
line source
/** * Title: GlobalConfigure.java * Copyright: Copyright (c) 2001, 2002, 2003 * Company: * @author Kenneth J. Pouncey * @version 0.1 * * Description: * * 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, 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. * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA * */ package org.tn5250j; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Hashtable; import java.util.Properties; import javax.swing.JOptionPane; import com.five-ten-sg.connectbot.TerminalView; import org.tn5250j.interfaces.ConfigureFactory; import org.tn5250j.tools.logging.TN5250jLogFactory; import org.tn5250j.tools.logging.TN5250jLogger; /** * Utility class for referencing global settings and functions of which at most * one instance can exist per VM. * * Use GlobalConfigure.instance() to access this instance. */ public class GlobalConfigure extends ConfigureFactory { public static final String TN5250J_FOLDER = ".tn5250j"; /** * A handle to the unique GlobalConfigure class */ static private GlobalConfigure _instance; /** * A handle to the the Global Properties */ static private Properties settings; static private Hashtable registry = new Hashtable(); static private Hashtable headers = new Hashtable(); //LUC GORRENS // Moved to ConfigureFactory // static final public String SESSIONS = "sessions"; static final public File ses = new File(SESSIONS); // static final public String MACROS = "macros"; // static final public String KEYMAP = "keymap"; private final TN5250jLogger log = TN5250jLogFactory.getLogger (this.getClass()); /** * The constructor is made protected to allow overriding. */ public GlobalConfigure() { if (_instance == null) { // initialize the settings information initialize(); // set our instance to this one. _instance = this; } } /** * * @return The unique instance of this class. */ static public GlobalConfigure instance() { if (_instance == null) { _instance = new GlobalConfigure(); } return _instance; } /** * Initialize the properties registry for use later. * */ private void initialize() { verifySettingsFolder(); loadSettings(); loadSessions(); loadMacros(); loadKeyStrokes(); } /** * check if folder %USERPROFILE%/.tn5250j exists * and create if necessary */ private void verifySettingsFolder() { final String settingsfolder = settingsFolder(); final File f = new File (settingsfolder); if (!f.exists()) { try { if (log.isInfoEnabled()) { log.info("Settings folder '"+settingsfolder+"' doesn't exist. Will created now."); } f.mkdir(); } catch (Exception e) { if (log.isWarnEnabled()) { log.warn("Couldn't create settings folder '"+settingsfolder+"'", e); } } } } /** * Load the sessions properties */ private void loadSessions() { setProperties(SESSIONS,SESSIONS,"------ Sessions --------",true); } /** * Load the macros */ private void loadMacros() { setProperties(MACROS,MACROS,"------ Macros --------",true); } private void loadKeyStrokes() { setProperties(KEYMAP,KEYMAP, "------ Key Map key=keycode,isShiftDown,isControlDown,isAltDown,isAltGrDown --------", true); } /** * Reload the environment settings. */ @Override public void reloadSettings() { if (log.isInfoEnabled()) { log.info("reloading settings"); } loadSettings(); loadSessions(); loadMacros(); loadKeyStrokes(); if (log.isInfoEnabled()) { log.info("Done (reloading settings)."); } } /** * Loads the emulator setting from the setting(s) file */ private void loadSettings() { FileInputStream in = null; settings = new Properties(); try { in = new FileInputStream(settingsFile()); settings.load(in); } catch (FileNotFoundException fnfea) { log.info(" Information Message: " + fnfea.getMessage() + ". The file " + settingsFile() + " will be created for first time use."); checkLegacy(); saveSettings(); } catch (IOException ioea) { log.warn("IO Exception accessing File " + settingsFile() + " for the following reason : " + ioea.getMessage()); } catch (SecurityException sea) { log.warn("Security Exception for file " + settingsFile() + " This file can not be " + "accessed because : " + sea.getMessage()); } } private void checkDirs() { // we now check to see if the settings directory is a directory. If not then we create it File sd = new File(settings.getProperty("emulator.settingsDirectory")); if (!sd.isDirectory()) sd.mkdirs(); } private void checkLegacy() { // we check if the sessions file already exists in the directory // if it does exist we are working with an old install so we // need to set the settings directory to the users directory // SESSIONS is declared as a string, so we just can use the keyword here. if(ses.exists()) { int cfc; cfc = JOptionPane.showConfirmDialog(null, "Dear User,\n\n" + "Seems you are using an old version of tn5250j.\n" + "In meanwhile the application became multi-user capable,\n" + "which means ALL the config- and settings-files are\n" + "placed in your home-dir to avoid further problems in\n" + "the near future.\n\n" + "You have the choice to choose if you want the files\n" + "to be copied or not, please make your choice !\n\n" + "Shall we copy the files to the new location ?", "Old install detected", JOptionPane.WARNING_MESSAGE, JOptionPane.YES_NO_OPTION); if (cfc == 0) { // Here we do a checkdir so we know the destination-dir exists checkDirs(); copyConfigs(SESSIONS); copyConfigs(MACROS); copyConfigs(KEYMAP); } else { JOptionPane.showMessageDialog(null, "Dear User,\n\n" + "You choosed not to copy the file.\n" + "This means the program will end here.\n\n" + "To use this NON-STANDARD behaviour start tn5250j\n" + "with -Demulator.settingsDirectory=<settings-dir> \n" + "as a parameter to avoid this question all the time.", "Using NON-STANDARD behaviour", JOptionPane.WARNING_MESSAGE); System.exit(0); } } } private void copyConfigs(String sesFile) { /** Copy the config-files to the user's home-dir */ String srcFile = System.getProperty("user.dir") + File.separator + sesFile; String dest = System.getProperty("user.home") + File.separator + TN5250J_FOLDER + File.separator + sesFile; File rmvFile = new File(sesFile); try { FileReader r = new FileReader(srcFile); BufferedReader b = new BufferedReader(r); FileWriter w = new FileWriter(dest); PrintWriter p = new PrintWriter(w); String regel = b.readLine(); while (regel != null) { p.println(regel); regel = b.readLine(); } b.close(); p.close(); rmvFile.delete(); } catch (FileNotFoundException e) { log.warn(srcFile + " not found !"); } catch (IOException e) { log.warn("Global io-error !"); } catch (ArrayIndexOutOfBoundsException e) { } } /** * Save the settings for the global configuration */ @Override public void saveSettings() { try { FileOutputStream out = new FileOutputStream(settingsFile()); settings.store(out,"----------------- tn5250j Global Settings --------------"); } catch (FileNotFoundException fnfe) {} catch (IOException ioe) {} } /** * Save the setting in the registry using the key passed in with no header * output. * * @param regKey */ @Override public void saveSettings(String regKey) { saveSettings(regKey,""); } /** * Save the settings in the registry using the key passed with a header * in the output. * * @param regKey * @param Header */ @Override public void saveSettings(String regKey, String header) { saveSettings(regKey,regKey,header); } /** * Save the settings in the registry using the key passed with a header * in the output. * * @param regKey * @param Header */ @Override public void saveSettings(String regKey, String fileName, String header) { if (registry.containsKey(regKey)) { try { FileOutputStream out = new FileOutputStream( settingsDirectory() + fileName); Properties props = (Properties)registry.get(regKey); props.store(out,header); out.flush(); out.close(); } catch (FileNotFoundException fnfe) { log.warn("File not found : writing file " + fileName + ". Description of error is " + fnfe.getMessage()); } catch (IOException ioe) { log.warn("IO Exception : writing file " + fileName + ". Description of error is " + ioe.getMessage()); } catch (SecurityException se) { log.warn("Security Exception : writing file " + fileName + ". Description of error is " + se.getMessage()); } } } /** * Place the Properties in the registry under a given registry name * * @param regKey * @param regProps */ @Override public void setProperties(String regKey, Properties regProps) { registry.put(regKey, regProps); } /** * Set the properties for the given registry key. * * @param regKey * @param fileName * @param header */ @Override public void setProperties(String regKey, String fileName, String header) { //LG NEW setProperties(regKey, fileName, header, false); } /** * Set the properties for the given registry key. * * @param regKey * @param fileName * @param header * @param createFile */ @Override public void setProperties(String regKey, String fileName, String header, boolean createFile) { FileInputStream in = null; Properties props = new Properties(); headers.put(regKey, header); try { in = new FileInputStream(settingsDirectory() + fileName); props.load(in); } catch (FileNotFoundException fnfe) { if (createFile) { log.info(" Information Message: " + fnfe.getMessage() + ". The file " + fileName + " will" + " be created for first time use."); saveSettings(regKey,header); } else { log.info(" Information Message: " + fnfe.getMessage() + "."); } } catch (IOException ioe) { log.warn("IO Exception accessing File "+ fileName + " for the following reason : " + ioe.getMessage()); } catch (SecurityException se) { log.warn("Security Exception for file "+ fileName + ". This file can not be accessed because : " + se.getMessage()); } registry.put(regKey,props); } /** * Returns the properties associated with a given registry key. * * @param regKey * @return */ @Override public Properties getProperties(String regKey) { if (registry.containsKey(regKey)) { return (Properties)registry.get(regKey); } return null; } public Properties getProperties() { return settings; } @Override public Properties getProperties(String regKey,String fileName) { return getProperties(regKey,fileName,false,"",false); } @Override public Properties getProperties(String regKey,String fileName, boolean createFile, String header) { return getProperties(regKey,fileName,false,"",false); } @Override public Properties getProperties(String regKey,String fileName, boolean createFile,String header, boolean reloadIfLoaded) { if (!registry.containsKey(regKey) || reloadIfLoaded) { FileInputStream in = null; Properties props = new Properties(); headers.put(regKey, header); try { in = new FileInputStream(settingsDirectory() + fileName); props.load(in); } catch (FileNotFoundException fnfe) { if (createFile) { log.info(" Information Message: " + fnfe.getMessage() + ". The file " + fileName + " will" + " be created for first time use."); registry.put(regKey,props); saveSettings(regKey,header); return props; } else { log.info(" Information Message: " + fnfe.getMessage() + "."); } } catch (IOException ioe) { log.warn("IO Exception accessing File "+ fileName + " for the following reason : " + ioe.getMessage()); } catch (SecurityException se) { log.warn("Security Exception for file "+ fileName + ". This file can not be accessed because : " + se.getMessage()); } registry.put(regKey,props); return props; } else { return (Properties)registry.get(regKey); } } /** * Returns the setting from the given key of the global properties or the * default passed if the property does not exist. * * @param key * @param def * @return */ @Override public String getProperty(String key, String def) { if (settings.containsKey(key)) return settings.getProperty(key); else return def; } /** * Returns the setting from the given key of the global properties. * * @param key * @return */ @Override public String getProperty(String key) { return settings.getProperty(key); } /** * Private helper to return the full path to the settings file * * @return */ private String settingsFile() { return settingsDirectory() + "tn5250jstartup.cfg"; } /** * Private helper to return the settings directory * * @return */ private String settingsDirectory() { return settingsFolder() + File.separator; } /** * Private helper to return the settings folder path * * @return */ private String settingsFolder() { return TerminalView.android_home_directory + File.separator + TN5250J_FOLDER; } /** * Not sure yet so be careful using this. * * @return */ public ClassLoader getClassLoader() { ClassLoader loader = GlobalConfigure.class.getClassLoader(); if (loader == null) loader = ClassLoader.getSystemClassLoader(); return loader; } }