Monday, September 7, 2015

Advanced configuration settings

         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.


  1. The language used is C#
  2. m_CMS is an object of type contentmanagerservice1
  3. 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;
    }
}