Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
mantid
Manage
Activity
Members
Labels
Plan
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Deploy
Releases
Model registry
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Code review analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
mantidproject
mantid
Commits
372f2958
Commit
372f2958
authored
14 years ago
by
Janik Zikovsky
Browse files
Options
Downloads
Patches
Plain Diff
Refs #2584: Use an environment var to specify the mantid.properties file instead.
parent
a809fc6b
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
Code/Mantid/Framework/Kernel/src/ConfigService.cpp
+75
-55
75 additions, 55 deletions
Code/Mantid/Framework/Kernel/src/ConfigService.cpp
Code/Mantid/Framework/Kernel/test/ConfigServiceTest.h
+25
-4
25 additions, 4 deletions
Code/Mantid/Framework/Kernel/test/ConfigServiceTest.h
with
100 additions
and
59 deletions
Code/Mantid/Framework/Kernel/src/ConfigService.cpp
+
75
−
55
View file @
372f2958
...
...
@@ -34,14 +34,14 @@
namespace
Mantid
{
/**
* Get the welcome message for Mantid.
* @returns A string containing the welcome message for Mantid.
*/
std
::
string
welcomeMessage
()
{
return
"Welcome to Mantid - Manipulation and Analysis Toolkit for Instrument Data"
;
}
/**
* Get the welcome message for Mantid.
* @returns A string containing the welcome message for Mantid.
*/
std
::
string
welcomeMessage
()
{
return
"Welcome to Mantid - Manipulation and Analysis Toolkit for Instrument Data"
;
}
namespace
Kernel
{
...
...
@@ -121,7 +121,8 @@ ConfigServiceImpl::ConfigServiceImpl() :
m_pConf
(
NULL
),
m_pSysConfig
(
NULL
),
g_log
(
Logger
::
get
(
"ConfigService"
)),
m_changed_keys
(),
m_ConfigPaths
(),
m_AbsolutePaths
(),
m_strBaseDir
(
""
),
m_PropertyString
(
""
),
m_properties_file_name
(
"Mantid.properties"
),
m_user_properties_file_name
(
"Mantid.user.properties"
),
m_DataSearchDirs
(),
m_UserSearchDirs
(),
m_instr_prefixes
()
m_user_properties_file_name
(
"Mantid.user.properties"
),
m_DataSearchDirs
(),
m_UserSearchDirs
(),
m_instr_prefixes
()
{
//getting at system details
m_pSysConfig
=
new
WrappedObject
<
Poco
::
Util
::
SystemConfiguration
>
;
...
...
@@ -136,16 +137,25 @@ ConfigServiceImpl::ConfigServiceImpl() :
Poco
::
SignalChannel
,
Poco
::
Channel
>
);
// Define the directory to search for the Mantid.properties file.
//check the executable directory to see if it includes a mantid.properties file
m_strBaseDir
=
Mantid
::
Kernel
::
getDirectoryOfExecutable
();
Poco
::
File
f
(
m_strBaseDir
+
m_properties_file_name
);
Poco
::
File
f
;
// First directory: the current working
m_strBaseDir
=
Poco
::
Path
::
current
();
f
=
Poco
::
File
(
m_strBaseDir
+
m_properties_file_name
);
if
(
!
f
.
exists
())
{
if
(
Poco
::
Environment
::
has
(
"MANTIDPATH"
))
// Check the executable directory to see if it includes a mantid.properties file
m_strBaseDir
=
Mantid
::
Kernel
::
getDirectoryOfExecutable
();
f
=
Poco
::
File
(
m_strBaseDir
+
m_properties_file_name
);
if
(
!
f
.
exists
())
{
// Here we have to follow the convention of the rest of this code and add a trailing slash.
// Note: adding it to the MANTIDPATH itself will make other parts of the code crash.
m_strBaseDir
=
Poco
::
Environment
::
get
(
"MANTIDPATH"
)
+
"/"
;
// Last, use the MANTIDPATH environment var
if
(
Poco
::
Environment
::
has
(
"MANTIDPATH"
))
{
// Here we have to follow the convention of the rest of this code and add a trailing slash.
// Note: adding it to the MANTIDPATH itself will make other parts of the code crash.
m_strBaseDir
=
Poco
::
Environment
::
get
(
"MANTIDPATH"
)
+
"/"
;
}
}
}
...
...
@@ -165,14 +175,32 @@ ConfigServiceImpl::ConfigServiceImpl() :
m_ConfigPaths
.
insert
(
std
::
make_pair
(
"mantidqt.python_interfaces_directory"
,
true
));
//attempt to load the default properties file that resides in the directory of the executable
std
::
string
propertiesFilesList
;
updateConfig
(
getPropertiesDir
()
+
m_properties_file_name
,
false
,
false
);
//and then append the user properties
updateConfig
(
getUserFilename
(),
true
,
true
);
propertiesFilesList
=
getPropertiesDir
()
+
m_properties_file_name
;
if
(
Poco
::
Environment
::
has
(
"MANTIDPROPERTIES"
))
{
//and then append the user properties
updateConfig
(
getUserFilename
(),
true
,
false
);
propertiesFilesList
+=
", "
+
getUserFilename
();
//and the extra one from the environment
updateConfig
(
Poco
::
Environment
::
get
(
"MANTIDPROPERTIES"
),
true
,
true
);
propertiesFilesList
+=
", "
+
Poco
::
Environment
::
get
(
"MANTIDPROPERTIES"
);
}
else
{
// Just do the user properties
updateConfig
(
getUserFilename
(),
true
,
true
);
propertiesFilesList
+=
", "
+
getUserFilename
();
}
updateFacilities
();
g_log
.
debug
()
<<
"ConfigService created."
<<
std
::
endl
;
g_log
.
debug
()
<<
"Configured Mantid.properties directory of application as "
<<
getPropertiesDir
()
<<
std
::
endl
;
g_log
.
debug
()
<<
"Configured Mantid.properties directory of application as "
<<
getPropertiesDir
()
<<
std
::
endl
;
g_log
.
information
()
<<
"Properties file(s) loaded: "
<<
propertiesFilesList
<<
std
::
endl
;
g_log
.
information
()
<<
"This is Mantid Version "
<<
MANTID_VERSION
<<
std
::
endl
;
g_log
.
information
()
<<
"Logging to: "
<<
m_logFilePath
<<
std
::
endl
;
...
...
@@ -293,10 +321,6 @@ void ConfigServiceImpl::configureLogging()
//Ensure that the logging directory exists
m_logFilePath
=
getString
(
"logging.channels.fileChannel.path"
);
// Look in the environment for a variable to override where the log file ends up.
if
(
Poco
::
Environment
::
has
(
"MANTIDLOGPATH"
))
m_logFilePath
=
Poco
::
Environment
::
get
(
"MANTIDLOGPATH"
);
Poco
::
Path
logpath
(
m_logFilePath
);
// An absolute path makes things simpler
...
...
@@ -319,16 +343,17 @@ void ConfigServiceImpl::configureLogging()
FILE
*
fp
=
fopen
(
m_logFilePath
.
c_str
(),
"a+"
);
if
(
fp
==
NULL
)
{
std
::
cerr
<<
"Error writing to log file path given in properties file:
\"
"
<<
m_logFilePath
<<
"
\"
. Will use a default path instead."
<<
std
::
endl
;
std
::
cerr
<<
"Error writing to log file path given in properties file:
\"
"
<<
m_logFilePath
<<
"
\"
. Will use a default path instead."
<<
std
::
endl
;
// Clear the path; this will make it use the default
m_logFilePath
=
""
;
}
else
fclose
(
fp
);
}
catch
(
std
::
exception
&
)
}
catch
(
std
::
exception
&
)
{
std
::
cerr
<<
"Error writing to log file path given in properties file:
\"
"
<<
m_logFilePath
<<
"
\"
. Will use a default path instead."
<<
std
::
endl
;
std
::
cerr
<<
"Error writing to log file path given in properties file:
\"
"
<<
m_logFilePath
<<
"
\"
. Will use a default path instead."
<<
std
::
endl
;
// ERROR! Maybe the file is not writable!
// Clear the path; this will make it use the default
m_logFilePath
=
""
;
...
...
@@ -357,8 +382,7 @@ void ConfigServiceImpl::configureLogging()
// Configure the logging framework
Poco
::
Util
::
LoggingConfigurator
configurator
;
configurator
.
configure
(
m_pConf
);
}
catch
(
std
::
exception
&
e
)
}
catch
(
std
::
exception
&
e
)
{
std
::
cerr
<<
"Trouble configuring the logging framework "
<<
e
.
what
()
<<
std
::
endl
;
}
...
...
@@ -464,7 +488,7 @@ std::string ConfigServiceImpl::makeAbsolute(const std::string & dir, const std::
// Backward slashes cannot be allowed to go into our properties file
// Note this is a temporary fix for ticket #2445.
// Ticket #2460 prompts a review of our path handling in the config service.
boost
::
replace_all
(
converted
,
"
\\
"
,
"/"
);
boost
::
replace_all
(
converted
,
"
\\
"
,
"/"
);
return
converted
;
}
...
...
@@ -518,8 +542,8 @@ void ConfigServiceImpl::cacheUserSearchPaths()
*/
bool
ConfigServiceImpl
::
isInDataSearchList
(
const
std
::
string
&
path
)
const
{
std
::
vector
<
std
::
string
>::
const_iterator
it
=
std
::
find_if
(
m_DataSearchDirs
.
begin
(),
m_DataSearchDirs
.
end
(),
std
::
bind2nd
(
std
::
equal_to
<
std
::
string
>
(),
path
));
std
::
vector
<
std
::
string
>::
const_iterator
it
=
std
::
find_if
(
m_DataSearchDirs
.
begin
(),
m_DataSearchDirs
.
end
(),
std
::
bind2nd
(
std
::
equal_to
<
std
::
string
>
(),
path
));
return
(
it
!=
m_DataSearchDirs
.
end
());
}
...
...
@@ -531,7 +555,8 @@ void ConfigServiceImpl::createUserPropertiesFile() const
{
try
{
std
::
fstream
filestr
((
getUserPropertiesDir
()
+
m_user_properties_file_name
).
c_str
(),
std
::
fstream
::
out
);
std
::
fstream
filestr
((
getUserPropertiesDir
()
+
m_user_properties_file_name
).
c_str
(),
std
::
fstream
::
out
);
filestr
<<
"# This file can be used to override any properties for this installation."
<<
std
::
endl
;
filestr
...
...
@@ -650,7 +675,8 @@ void ConfigServiceImpl::saveConfig(const std::string & filename) const
{
// If we are not in line continuation mode then need
// a fresh start line
if
(
!
line_continuing
)
output
=
""
;
if
(
!
line_continuing
)
output
=
""
;
line_continuing
=
true
;
output
+=
file_line
+
"
\n
"
;
continue
;
...
...
@@ -769,12 +795,11 @@ void ConfigServiceImpl::setString(const std::string & key, const std::string & v
try
{
old
=
m_pConf
->
getString
(
key
);
}
catch
(
Poco
::
NotFoundException
&
)
}
catch
(
Poco
::
NotFoundException
&
)
{
old
=
""
;
}
//Ensure we keep a correct full path
std
::
map
<
std
::
string
,
bool
>::
const_iterator
itr
=
m_ConfigPaths
.
find
(
key
);
if
(
itr
!=
m_ConfigPaths
.
end
())
...
...
@@ -804,8 +829,8 @@ void ConfigServiceImpl::setString(const std::string & key, const std::string & v
}
m_pConf
->
setString
(
key
,
value
);
if
(
value
!=
old
)
if
(
value
!=
old
)
m_notificationCenter
.
postNotification
(
new
ValueChanged
(
key
,
value
,
old
));
}
...
...
@@ -963,11 +988,11 @@ void ConfigServiceImpl::setDataSearchDirs(const std::string &searchDirs)
*/
void
ConfigServiceImpl
::
appendDataSearchDir
(
const
std
::
string
&
path
)
{
if
(
!
isInDataSearchList
(
path
)
)
if
(
!
isInDataSearchList
(
path
))
{
std
::
string
newSearchString
;
std
::
vector
<
std
::
string
>::
const_iterator
it
=
m_DataSearchDirs
.
begin
();
for
(
;
it
!=
m_DataSearchDirs
.
end
();
++
it
)
for
(
;
it
!=
m_DataSearchDirs
.
end
();
++
it
)
{
newSearchString
.
append
(
*
it
);
newSearchString
.
append
(
";"
);
...
...
@@ -977,7 +1002,6 @@ void ConfigServiceImpl::appendDataSearchDir(const std::string & path)
}
}
/**
* Return the list of user search paths
* @returns A vector of strings containing the defined search directories
...
...
@@ -987,7 +1011,6 @@ const std::vector<std::string>& ConfigServiceImpl::getUserSearchDirs() const
return
m_UserSearchDirs
;
}
/**
* Return the search directory for XML instrument definition files (IDFs)
* @returns Full path of instrument search directory
...
...
@@ -1003,7 +1026,7 @@ const std::string ConfigServiceImpl::getInstrumentDirectory() const
directoryName
=
Poco
::
Path
(
getPropertiesDir
()).
resolve
(
"../Instrument"
).
toString
();
}
if
(
!
Poco
::
File
(
directoryName
).
isDirectory
()
)
if
(
!
Poco
::
File
(
directoryName
).
isDirectory
())
{
g_log
.
error
(
"Unable to locate instrument search directory at: "
+
directoryName
);
}
...
...
@@ -1011,7 +1034,6 @@ const std::string ConfigServiceImpl::getInstrumentDirectory() const
return
directoryName
;
}
/**
* Load facility information from instrumentDir/Facilities.xml file if fName parameter
* is not set
...
...
@@ -1063,11 +1085,10 @@ void ConfigServiceImpl::updateFacilities(const std::string& fName)
pDoc
->
release
();
throw
std
::
runtime_error
(
"The facility definition file "
+
fileName
+
" defines no facilities"
);
}
pNL_facility
->
release
();
pDoc
->
release
();
}
catch
(
std
::
exception
&
e
)
}
catch
(
std
::
exception
&
e
)
{
g_log
.
error
(
e
.
what
());
}
...
...
@@ -1088,22 +1109,21 @@ const FacilityInfo& ConfigServiceImpl::Facility() const
}
/** Add an observer to a notification
@param observer :: Reference to the observer to add
@param observer :: Reference to the observer to add
*/
void
ConfigServiceImpl
::
addObserver
(
const
Poco
::
AbstractObserver
&
observer
)
const
void
ConfigServiceImpl
::
addObserver
(
const
Poco
::
AbstractObserver
&
observer
)
const
{
m_notificationCenter
.
addObserver
(
observer
);
m_notificationCenter
.
addObserver
(
observer
);
}
/** Remove an observer
@param observer :: Reference to the observer to remove
@param observer :: Reference to the observer to remove
*/
void
ConfigServiceImpl
::
removeObserver
(
const
Poco
::
AbstractObserver
&
observer
)
const
void
ConfigServiceImpl
::
removeObserver
(
const
Poco
::
AbstractObserver
&
observer
)
const
{
m_notificationCenter
.
removeObserver
(
observer
);
m_notificationCenter
.
removeObserver
(
observer
);
}
/**
* Get a facility
* @param fName :: Facility name
...
...
This diff is collapsed.
Click to expand it.
Code/Mantid/Framework/Kernel/test/ConfigServiceTest.h
+
25
−
4
View file @
372f2958
...
...
@@ -283,6 +283,23 @@ public:
settings
.
setString
(
"default.facility"
,
"ISIS"
);
}
/// Make a properties file with a single line
std
::
string
makePropertiesFile
(
std
::
string
logPathStr
)
{
Poco
::
Path
path
(
Poco
::
Path
::
home
());
path
.
append
(
Poco
::
Path
(
"Mantid.test.properties"
));
path
=
path
.
absolute
();
std
::
string
pathStr
=
path
.
toString
();
FILE
*
fp
=
fopen
(
pathStr
.
c_str
(),
"w"
);
if
(
fp
!=
NULL
)
{
fprintf
(
fp
,
"logging.channels.fileChannel.path = %s
\n
"
,
logPathStr
.
c_str
());
fclose
(
fp
);
}
return
pathStr
;
}
/** If you set MANTIDLOGPATH environment then you change where the log ends up */
void
testOverrideLogFile
()
{
...
...
@@ -293,22 +310,26 @@ public:
std
::
string
logPathStr
=
logPath
.
toString
();
// std::cout << logPathStr << std::endl;
std
::
string
propFile
=
makePropertiesFile
(
logPathStr
);
// Remove the file
if
(
Poco
::
File
(
logPathStr
).
exists
())
Poco
::
File
(
logPathStr
).
remove
();
TS_ASSERT
(
!
Poco
::
File
(
"ConfigServiceTest.log"
).
exists
());
Poco
::
Environment
::
set
(
"MANTID
LOGPATH"
,
logPathStr
);
c
on
st
std
::
string
propfile
=
getDirectoryOfExecutable
()
+
"MantidTest.properties"
;
ConfigService
::
Instance
().
updateConfig
(
propfile
);
//
Poco::Environment::set("MANTID
PROPERTIES", propFile
);
C
on
figService
::
Instance
().
updateConfig
(
propFile
)
;
Logger
&
log1
=
Logger
::
get
(
"logTest1"
);
log1
.
warning
()
<<
"ConfigServiceTest.testOverrideLogFile test output"
<<
std
::
endl
;
// The file was written?
TS_ASSERT
(
Poco
::
File
(
logPath
).
exists
());
// Clean up
if
(
Poco
::
File
(
logPath
).
exists
())
Poco
::
File
(
logPath
).
remove
();
if
(
Poco
::
File
(
propFile
).
exists
())
Poco
::
File
(
propFile
).
remove
();
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment