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