diff options
author | Jiri Vanek <[email protected]> | 2013-03-28 15:51:38 +0100 |
---|---|---|
committer | Jiri Vanek <[email protected]> | 2013-03-28 15:51:38 +0100 |
commit | 8d2d31514295a2d0eff5971887246f6d4211fc6d (patch) | |
tree | d66ce4fb57c823a2aa8894bb6894b33bdbe162f6 /plugin | |
parent | 58b4d6e3dc3a95cfbc6f369287aca04763522e48 (diff) |
Added code to parse properties and to find correct configuration files from c++ part of plugin.
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/icedteanp/IcedTeaParseProperties.cc | 244 | ||||
-rw-r--r-- | plugin/icedteanp/IcedTeaParseProperties.h | 53 | ||||
-rw-r--r-- | plugin/icedteanp/IcedTeaPluginUtils.cc | 17 | ||||
-rw-r--r-- | plugin/icedteanp/IcedTeaPluginUtils.h | 7 |
4 files changed, 321 insertions, 0 deletions
diff --git a/plugin/icedteanp/IcedTeaParseProperties.cc b/plugin/icedteanp/IcedTeaParseProperties.cc new file mode 100644 index 0000000..7203d79 --- /dev/null +++ b/plugin/icedteanp/IcedTeaParseProperties.cc @@ -0,0 +1,244 @@ +/* IcedTeaRunnable.cc + + Copyright (C) 2013 Red Hat + +This file is part of IcedTea. + +IcedTea 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. + +IcedTea 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 IcedTea; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +#include <unistd.h> +#include <sys/types.h> +#include <pwd.h> +#include <cstdio> +#include <cstdlib> +#include <string> +#include <functional> +#include <cctype> +#include <locale> +#include <iostream> +#include <fstream> + + +#include "IcedTeaPluginUtils.h" + +#include "IcedTeaParseProperties.h" +/* + The public api is nearly impossible to test due to "hardcoded paths" + All public methods have theirs equivalents wit set-up-able files, and those are + tested. +*/ + +using namespace std; +//private api + +void remove_all_spaces(string& str); +bool get_property_value(string c, string& dest); +bool starts_with(string c1, string c2); +string user_properties_file(); +string main_properties_file(); +string default_java_properties_file(); +//for passing three dummy files +bool find_system_config_file(string main_file, string custom_jre_file, bool usecustom_jre, string default_java_file, string& dest); +bool find_property(string filename, string property, string& dest); +//for passing two dummy files +bool read_deploy_property_value(string user_file, string system_file, bool usesystem_file, string property, string& dest); +//for passing two dummy files +bool find_custom_jre(string user_file, string main_file,string& dest); +//end of non-public IcedTeaParseProperties api + + +void remove_all_spaces(string& str) +{ + for(int i=0; i<str.length(); i++){ + if(str[i] == ' ' || str[i] == '\n' || str[i] == '\t') { + str.erase(i,1); + i--; + } + } +} + +bool get_property_value(string c, string& dest){ + int i = c.find("="); + if (i < 0) return false; + int l = c.length(); + dest = c.substr(i+1, l-i); + IcedTeaPluginUtilities::trim(dest); + return true; +} + + +bool starts_with(string c1, string c2){ + return (c1.find(c2) == 0); +} + + +string user_properties_file(){ + int myuid = getuid(); + struct passwd *mypasswd = getpwuid(myuid); + return string(mypasswd->pw_dir)+"/.icedtea/"+default_file_ITW_deploy_props_name; +} + + +string main_properties_file(){ + return "/etc/.java/deployment/"+default_file_ITW_deploy_props_name; +} + +string default_java_properties_file(){ + return ICEDTEA_WEB_JRE "/lib/"+default_file_ITW_deploy_props_name; +} + + +/* this is the same search done by icedtea-web settings: + try the main file in /etc/.java/deployment + if found, then return this file + try to find setUp jre + if found, then try if this file exists and end + if no jre custom jvm is set, then tries default jre + if its deploy file exists, then return + not found otherwise*/ +bool find_system_config_file(string& dest){ + string jdest; + bool found = find_custom_jre(jdest); + if (found) { + jdest = jdest + "/lib/"+default_file_ITW_deploy_props_name; + } + return find_system_config_file(main_properties_file(), jdest, found, default_java_properties_file(), dest); +} +//abstraction for testing purposes +bool find_system_config_file(string main_file, string custom_jre_file, bool usecustom_jre, string default_java_file, string& dest){ + if (IcedTeaPluginUtilities::file_exists(main_file)) { + dest = main_file; + return true; + } else { + if (usecustom_jre){ + if(IcedTeaPluginUtilities::file_exists(custom_jre_file) ) { + dest = custom_jre_file; + return true; + } + } else { + if(IcedTeaPluginUtilities::file_exists(default_java_file)) { + dest = default_java_file; + return true; + } + } + } +return false; //nothing of above found +} + +//Returns whether property was found, if found stores result in 'dest' +bool find_property(string filename, string property, string& dest){ + string property_matcher(property); + IcedTeaPluginUtilities::trim( property_matcher); + property_matcher= property_matcher+"="; + ifstream input( filename.c_str() ); + for( string line; getline( input, line ); ){ /* read a line */ + string copy = line; + //java tolerates spaces around = char, remove them for matching + remove_all_spaces(copy); + if (starts_with(copy, property_matcher)) { + //provide non-spaced value, trimming is done in get_property_value + get_property_value(line, dest); + return true; + } + } + + return false; + } + + +/* this is reimplementation of itw-settings operations + first check in user's settings, if found, return + then check in global file (see the magic of find_system_config_file)*/ +bool read_deploy_property_value(string property, string& dest){ + string futurefile; + bool found = find_system_config_file(futurefile); + return read_deploy_property_value(user_properties_file(), futurefile, found, property, dest); +} +//abstraction for testing purposes +bool read_deploy_property_value(string user_file, string system_file, bool usesystem_file, string property, string& dest){ + //is it in user's file? + bool found = find_property(user_file, property, dest); + if (found) { + return true; + } + //is it in global file? + if (usesystem_file) { + return find_property(system_file, property, dest); + } + return false; +} + +//This is different from common get property, as it is avoiding to search in *java* +//properties files +bool find_custom_jre(string& dest){ + return find_custom_jre(user_properties_file(), main_properties_file(), dest); +} +//abstraction for testing purposes +bool find_custom_jre(string user_file, string main_file,string& dest){ + string key = custom_jre_key; + if(IcedTeaPluginUtilities::file_exists(user_file)) { + bool a = find_property(user_file, key, dest); + if (a) { + return true; + } + } + if(IcedTeaPluginUtilities::file_exists(main_file)) { + return find_property(main_file, key, dest); + } +return false; +} + + + +int test_main(void){ + cout << ("user's settings file\n"); + cout << user_properties_file(); + cout << ("\nmain settings file:\n"); + cout << (main_properties_file()); + cout << ("\njava settings file \n"); + cout << (default_java_properties_file()); + cout << ("\nsystem config file\n"); + string a1; + find_system_config_file(a1); + cout << a1; + cout << ("\ncustom jre\n"); + string a2; + find_custom_jre(a2); + cout << a2; + cout << ("\nsome custom property\n"); + string a3; + read_deploy_property_value("deployment.security.level", a3); + cout << a3; + cout << ("\n"); + return 0; +} diff --git a/plugin/icedteanp/IcedTeaParseProperties.h b/plugin/icedteanp/IcedTeaParseProperties.h new file mode 100644 index 0000000..7fa054d --- /dev/null +++ b/plugin/icedteanp/IcedTeaParseProperties.h @@ -0,0 +1,53 @@ +/* IcedTeaPluginUtils.h + + Copyright (C) 2013 Red Hat + +This file is part of IcedTea. + +IcedTea 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. + +IcedTea 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 IcedTea; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +/** + * Utility classes for parsing values from properties files + */ +#include <string> + + +//public api +std::string user_properties_file(); +bool find_system_config_file(std::string& dest); +bool find_custom_jre(std::string& dest); +bool read_deploy_property_value(std::string property, std::string& dest); +//half public api +const std::string default_file_ITW_deploy_props_name = "deployment.properties"; +const std::string custom_jre_key = "deployment.jre.dir"; +//end of public api diff --git a/plugin/icedteanp/IcedTeaPluginUtils.cc b/plugin/icedteanp/IcedTeaPluginUtils.cc index 6e41c19..d365b05 100644 --- a/plugin/icedteanp/IcedTeaPluginUtils.cc +++ b/plugin/icedteanp/IcedTeaPluginUtils.cc @@ -39,6 +39,7 @@ exception statement from your version. */ #include "IcedTeaNPPlugin.h" #include "IcedTeaScriptablePluginObject.h" #include "IcedTeaPluginUtils.h" +#include <fstream> /** * Misc. utility functions used by the plugin @@ -1068,6 +1069,21 @@ processAsyncCallQueue(void* param /* ignored */) } while(1); } +void IcedTeaPluginUtilities::trim(std::string& str) { + size_t start = str.find_first_not_of(" \t\n"), end = str.find_last_not_of(" \t\n"); + if (start == std::string::npos) { + return; + } + str = str.substr(start, end - start + 1); +} + +bool IcedTeaPluginUtilities::file_exists(std::string filename) +{ + std::ifstream infile(filename.c_str()); + return infile.good(); +} + + /****************************************** * Begin JavaMessageSender implementation * ****************************************** @@ -1203,3 +1219,4 @@ MessageBus::post(const char* message) PLUGIN_DEBUG("%p unlocked...\n", &msg_queue_mutex); } + diff --git a/plugin/icedteanp/IcedTeaPluginUtils.h b/plugin/icedteanp/IcedTeaPluginUtils.h index a6915c2..2887f46 100644 --- a/plugin/icedteanp/IcedTeaPluginUtils.h +++ b/plugin/icedteanp/IcedTeaPluginUtils.h @@ -279,6 +279,11 @@ class IcedTeaPluginUtilities /* Posts call in async queue and waits till execution completes */ static void callAndWaitForResult(NPP instance, void (*func) (void *), AsyncCallThreadData* data); + + /*cutting whitespaces from end and start of string*/ + static void trim(std::string& str); + static bool file_exists(std::string filename); + }; /* @@ -345,4 +350,6 @@ class MessageBus void post(const char* message); }; + + #endif // __ICEDTEAPLUGINUTILS_H__ |