I was working on something a few weeks ago that required me to look up the configuration settings on a few dispatchers. You know .. when you go to Launch -> Cognos Administration -> System -> Configuration -> Properties .. THAT one.
I had to add changes to the configuration settings without making any changes to the existing options. I wasn't able to find a very efficient method of doing it, but what I did discover is that these configuration settings are returned in an XML format. And who can't work with XML ;-)
So I whipped up a quick script to retrieve the existing advanced configuration values (if any) and add new values to it.
Below is a generic format of how the settings are returned.
<settings>
<setting name='settingname'>settingvalue</setting>
<!-- below is an example of a configuration setting -->
<setting name='CM.DbConnectPoolMax'>50</setting>
</settings>
Below is a function to retrieve advanced settings. It retrieves the configuration values in the above XML format. A few general points of note.
- The language used is C#
- m_CMS is an object of type contentmanagerservice1
- log is an object of type Category from log4net logging library (http://logging.apache.org/log4net/). Its the .NET implementation of log4j and is an amazing library.
public String GetAdvancedSettings()
{
String config = "<settings></settings>";
try
{
searchPathMultipleObject spmo = new searchPathMultipleObject();
// Default and hard-coded search path of /configuration
spmo.Value = "/configuration";
/**
* Make sure you use ONLY the properties that you want
* I tried selecting ALL properties A-Z one time ...
* turns out it wasn't one of my finest moments ;-)
*/
propEnum[] props = new propEnum[] { propEnum.searchPath, propEnum.defaultName, propEnum.advancedSettings };
baseClass[] bcConf = m_CMS.query(spmo, props, new sort[] { }, new queryOptions());
if (bcConf.Length > 0)
{
configuration conf = (configuration)bcConf[0];
anyTypeProp atp = (anyTypeProp)conf.advancedSettings;
config = atp.value;
log.Debug("Successfully retrieved advanced settings.");
}
else {
log.Debug("No advanced settings set. Retrieved empty result");
}
}
catch (Exception ex)
{
log.Error("Error in setting configuration. Error: " + ex.Message);
}
return config;
}
And below is a function that makes use of the above function and saves additional settings to the content store.
public Boolean SetAdvancedSettings(String configname, String configvalue)
{
try
{
String config = GetAdvancedSettings();
// Dirty hack instead of using a proper XML reader / writer
// Gets the job done ;-)
config = config.Replace("</settings>", "");
config += "<setting name=\"" + configname + "\">" + configvalue + "</setting></settings>";
anyTypeProp atp = new anyTypeProp();
atp.value = config;
configuration conf = new configuration();
conf.advancedSettings = atp;
m_CMS.update(new baseClass[] { conf }, new updateOptions());
log.Debug("Successfully set advanced settings.");
return true;
}
catch (Exception ex)
{
log.Error("Error in setting configuration. Error: " + ex.Message);
return false;
}
}