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

       
 

Tuesday, January 6, 2015

Copying (and pasting) new year resolutions .. and a few other things as well

My new years' resolution for 2015 is to complete my resolution from 2014, which is to make sure I post more often on my blog which I continued in 2013 that I started in 2012!!

So, without further ado .. here goes!!

As part of a recent deployment, I was asked to copy a specific report (or maybe even a group of reports) to the 'My Folders' of multiple users.

There are two ways around this.
  1. Create the report under the [Public Folders], provide the path to the report to the end users, and ask them to copy it to their [My Folders]. 
  2. If you want something done right, do it yourself!!

Now, we know how *ahem* efficient users can be when asked to perform certain tasks. Some had updated versions of the report because they followed the instructions, and the rest, obviously didn't.

Vox populi not working well in this situation? Probably.

I pulled up a small script to copy the new report from one source path to multiple destinations. Obviously, one would have to call this code multiple times based on the destination.

Few important pointers.

  • sourceSearchPath is a string variable with the path of the folder where the source report exists. NOTE: Report Name should NOT be in the sourceSearchPath
  • GetAllPropsList is a function that returns ALL properties
  • destinationSearchPath is a string variable with the path of the destination folder


Try

            ' Interesting to note that the source search path is an object of type searchPathMultipleObject.
            ' This shows that multiple source objects can be copied

            Dim spmo As New searchPathMultipleObject
            spmo.Value = sourceSearchPath

            Dim bcrpt() = m_CMS.query(spmo, GetAllPropsList, New sort() {}, New queryOptions)

            ' Destination search path is an object of type searchPathSingleObject.
            ' The logic would be that multiple source objects can be copied to a single destination

            Dim spso As New searchPathSingleObject
            spso.Value = destinationSearchPath

            Dim co As New copyOptions
            co.updateAction = updateActionEnum.replace
            co.recursive = True

            m_CMS.copy(bcrpt, spso, co)
            LogWriter("Report " & reportName & " copied from " & sourceSearchPath & " to " & destinationSearchPath)
            Return True
        Catch ex As Exception
            LogWriter("Error in copy report: " & ex.Message)
            Return False
        End Try