Showing posts with label cognos sdk. Show all posts
Showing posts with label cognos sdk. Show all posts

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

Monday, September 30, 2013

Of Busy Schedules and (busier) Recurring Schedules!!

I was recently asked to create a schedule for multiple reports and jobs. Now, creating the schedule for one report is fairly simple. You login into the portal, navigate to the report that you would like to schedule, set the schedule options, and viola! You are all set.

Creating the schedule for multiple reports posed more of a challenge. I did not want to manually navigate to each report path and edit the schedule for each report when I could whip up a simple script for doing the same automatically. Little did I know that the simple script would turn out to be not-so-simple.

I had a looooooong list of requirements that pretty much included having the entire list of options available on the portal UI such as

  • Having the flexibility of being able to choose which of the output formats (HTML, PDF, XLS 2003, XLS 2007, CSV) would be needed for which report.
  • Having the flexibility of being able to choose if the report should be saved to the file system.
  • Having the flexibility of being able to choose if the report (link or attachment or both) should be emailed, and if yes then the list of email addresses.
  • And of course, the schedule (daily / weekly / monthly), start time, end time, recurrence pattern, etc.

The below code snippets are part of what I use to perform these operations. They are written in VB.NET. Some of the code is taken from the original Cognos SDK sample code. The part that is not, is mine.

Create a new Schedule object

            Dim newSched As New schedule()

Set up options to set the schedule start time and date, frequency / recurrence pattern, etc
These are available as methods under the newSched object which is of class schedule

For the schedule to work, the system has to have valid user credentials. Below code gets the user credentials. That would be the current logged on user through the SDK

getCredential is a function that I wrote to get the credential of the current logged on user

            Dim schedCred As credential = getCredential()
            Dim credentials As New baseClassArrayProp()
            credentials.value = New baseClass() {schedCred}
            newSched.credential = credentials

Save the report output. Note that this saves the output under the same report output and not as a reportView

            saveOutput.name = runOptionEnum.saveOutput
            saveOutput.value = True

Set schedule email options

            Dim deliveryOptionString As New deliveryOptionString
            deliveryOptionString.name = deliveryOptionEnum.subject
            deliveryOptionString.value = reportName

            Dim deliveryOptionAddrSMTPArray As New deliveryOptionAddressSMTPArray
            deliveryOptionAddrSMTPArray.name = deliveryOptionEnum.toAddress
            Dim addrSMTP As addressSMTP() = New addressSMTP(1) {}
            addrSMTP(0) = New addressSMTP
            addrSMTP(0).Value = "email@emailprovider.com"

            addrSMTP(1) = New addressSMTP
            addrSMTP(1).Value = "email2@emailprovider.com"

            deliveryOptionAddrSMTPArray.value = addrSMTP

            Dim deliveryOptionMemoPart As New deliveryOptionMemoPart
            deliveryOptionMemoPart.name = deliveryOptionEnum.memoPart

            Dim memoPart As New memoPartComposite
            memoPart.contentDisposition = smtpContentDispositionEnum.inline
            memoPart.contentType = smtpContentTypeEnum.alternative

            deliveryOptionMemoPart.value = memoPart

            Dim parts As memoPart() = New memoPart(1) {}

            Dim memoPartString As New memoPartString
            memoPartString.contentDisposition = smtpContentDispositionEnum.inline
            memoPartString.text = "Report Body"

            Dim memoPartMIMEAttachment As New memoPartMIMEAttachment
            memoPartMIMEAttachment.contentDisposition = smtpContentDispositionEnum.inline
            memoPartMIMEAttachment.dataType = "text/html"
            memoPartMIMEAttachment.dataSize = "0"

            Dim bArr() As Byte = System.Text.Encoding.UTF8.GetBytes("asdf")

            memoPartMIMEAttachment.data = bArr ' Byte array
            parts(0) = memoPartString
            parts(1) = memoPartMIMEAttachment

            emailAsAttachment.name = runOptionEnum.emailAsAttachment
            emailAsAttachment.value = True

            emailAsUrl.name = runOptionEnum.emailAsURL
            emailAsUrl.value = True

            email.name = runOptionEnum.email
            email.value = True

END Set schedule email options

Once the schedule email options are added, these options need to be added into an array of type 'option'.

Dim opts() As [option] = New [option](5) {}
            opts(0) = emailAsAttachment
            opts(1) = emailAsUrl
            opts(2) = deliveryOptionString
            opts(3) = deliveryOptionAddrSMTPArray
            opts(4) = deliveryOptionMemoPart
            opts(5) = email

Next, this options array will have to be added to the schedule object
           
            Dim schOpts As New optionArrayProp
            schOpts.value = opts
            newSched.options = schOpts

Finally, create a new schedule (or update an existing schedule) for the report / job by using the add method of the contentmanagerservice1 class

Saturday, May 5, 2012

Sample Script to Login

This is a sample script that is part of the various scripts that I use to login into a Cognos environment using  SDK. Once the contentManagerService1 object has the logged in credentials, you can use it to perform any task such as automatically importing / exporting a package, create a new DSN, create a new skin, basically anything that you would use the portal / UI for.

Part of this script is taken from the original SDK sample code that is provided. I have just customized it for my own use in my environment.

Try
            Dim m_CMS as New contentManagerService1
            m_CMS.url = "http://localhost:9300/p2pd/servlet/dispatch"
            Dim m_nmsp, m_uname, m_pwd as String


            Dim credentialXML As StringBuilder
         
            credentialXML = New StringBuilder("<credential>")

            credentialXML.Append("<namespace>")
            credentialXML.Append(m_nmsp)
            credentialXML.Append("</namespace>")

            credentialXML.Append("<username>")
            credentialXML.Append(m_uname)
            credentialXML.Append("</username>")

            credentialXML.Append("<password>")
            credentialXML.Append(m_pwd)
            credentialXML.Append("</password>")

            credentialXML.Append("</credential>")

            Dim encodedCredentials As String = credentialXML.ToString()
            Dim xmlEncodedCredentials As New xmlEncodedXML
            xmlEncodedCredentials.Value = encodedCredentials

            m_CMS.logon(xmlEncodedCredentials, Nothing)

            MsgBox("Success in logon!")
            Return True

Catch ex as Exception
       MsgBox ex.Message
       Return False
End Try