Mercurial > 510Connectbot
diff src/org/tn5250j/GlobalConfigure.java @ 79:01d939969b10
merge tn5250 branch into default
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Mon, 16 Jun 2014 08:24:00 -0700 |
parents | b29b39f386a4 |
children | 8f23b05a51f7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/tn5250j/GlobalConfigure.java Mon Jun 16 08:24:00 2014 -0700 @@ -0,0 +1,508 @@ +/** + * 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 com.five_ten_sg.connectbot.TerminalView; +import org.tn5250j.interfaces.ConfigureFactory; +import android.util.Log; + + +/** + * 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 { + private static final String TAG = "GlobalConfigure"; + 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 + + + /** + * 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 { + Log.i(TAG,"Settings folder '"+settingsfolder+"' doesn't exist. Will created now."); + f.mkdir(); + } catch (Exception e) { + Log.w(TAG,"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() { + Log.i(TAG,"reloading settings"); + loadSettings(); + loadSessions(); + loadMacros(); + loadKeyStrokes(); + Log.i(TAG,"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.i(TAG," Information Message: " + + fnfea.getMessage() + ". The file " + settingsFile() + + " will be created for first time use."); + saveSettings(); + } + catch (IOException ioea) { + Log.w(TAG,"IO Exception accessing File " + + settingsFile() + " for the following reason : " + + ioea.getMessage()); + } + catch (SecurityException sea) { + Log.w(TAG,"Security Exception for file " + + settingsFile() + " This file can not be " + + "accessed because : " + sea.getMessage()); + } + } + + /** + * 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.w(TAG,"File not found : writing file " + + fileName + ". Description of error is " + + fnfe.getMessage()); + } + catch (IOException ioe) { + Log.w(TAG,"IO Exception : writing file " + + fileName + ". Description of error is " + + ioe.getMessage()); + } + catch (SecurityException se) { + Log.w(TAG,"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.i(TAG," Information Message: " + fnfe.getMessage() + + ". The file " + fileName + " will" + + " be created for first time use."); + + saveSettings(regKey,header); + + } + else { + + Log.i(TAG," Information Message: " + fnfe.getMessage() + + "."); + + } + } + catch (IOException ioe) { + Log.w(TAG,"IO Exception accessing File "+ fileName + + " for the following reason : " + + ioe.getMessage()); + } + catch (SecurityException se) { + Log.w(TAG,"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.i(TAG," 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.i(TAG," Information Message: " + fnfe.getMessage() + + "."); + + } + } + catch (IOException ioe) { + Log.w(TAG,"IO Exception accessing File "+ fileName + + " for the following reason : " + + ioe.getMessage()); + } + catch (SecurityException se) { + Log.w(TAG,"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; + } + +}