COGNOiSe.com - The IBM Cognos Community

IBM Cognos Analytics Platform => Cognos Analytics => SDK => Topic started by: gohabsgo on 01 Mar 2018 01:56:12 PM

Title: Sample code to update a database connection string
Post by: gohabsgo on 01 Mar 2018 01:56:12 PM
Hey Folks,
Anyone have some sample code that will modify the connection string of an existing database connection?

Appreciate in advance
Title: Re: Sample code to update a database connection string
Post by: aussieadam on 01 Mar 2018 02:14:51 PM
if you can find search path which should be something like
CAMID(:)/dataSource[@name=dataSource]/dataSourceConnection

you should be able to use the ContentManagerService_PortType object to find and modify it.

SearchPathMultipleObject spm = new SearchPathMultipleObject();
spm.set_value(dataSourceConnectionSearchPath);
PropEnum[] prop = new PropEnum[] { PropEnum.capabilities, PropEnum.permissions, PropEnum.searchPath, PropEnum.user, PropEnum.properties,
                    PropEnum.members, PropEnum.groupAndRoleSettings, PropEnum.defaultName,PropEnum.datasourceConnectionName };
DataSourceConnection dataSourceConnection = (DataSourceConnection) cmService.query(spm,props, new QueryOptions());
dataSourceConnection.setConnectionString(new StringProp(null,dataSourceConnectionString));
cmService.update(new BaseClass[] {dataSourceConnection},new UpdateOptions());
     


I wrote this without testing, so there may be some syntax errors, but that should generally do it.
let me know if it doesn't work and i can fully code an example and send it.
Title: Re: Sample code to update a database connection string
Post by: gohabsgo on 01 Mar 2018 04:42:03 PM
Thank you kindly, testing it shortly!
Title: Re: Sample code to update a database connection string
Post by: aussieadam on 02 Mar 2018 09:46:07 AM
Decided to give a solution to everyone. I'm a big fan of the SDK, it's a free and powerful option for customizing and automating Cognos. so the more people who can use it the better.

Some notes:
If something isn't working I may be using a different import than your default, check my imports at the top just in case.
I use the 11.0.8 version of the Cognos SDK and axis.
It's bad to have all of this in 1 main class, bad for re usability and customization.
I also wouldn't store connection details in java, either pass through as a parameter or read from db or encrypted file.
With that said, below is the class that should do it. Let me know if you need any more help.

package app;

import java.net.URL;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;

import com.cognos.developer.schemas.bibus._3.BaseClass;
import com.cognos.developer.schemas.bibus._3.BiBusHeader;
import com.cognos.developer.schemas.bibus._3.ContentManagerService_PortType;
import com.cognos.developer.schemas.bibus._3.ContentManagerService_ServiceLocator;
import com.cognos.developer.schemas.bibus._3.DataSourceConnection;
import com.cognos.developer.schemas.bibus._3.PropEnum;
import com.cognos.developer.schemas.bibus._3.QueryOptions;
import com.cognos.developer.schemas.bibus._3.SearchPathMultipleObject;
import com.cognos.developer.schemas.bibus._3.Sort;
import com.cognos.developer.schemas.bibus._3.StringProp;
import com.cognos.developer.schemas.bibus._3.UpdateOptions;
import com.cognos.developer.schemas.bibus._3.XmlEncodedXML;
import com.cognos.org.apache.axis.client.Stub;
import com.cognos.org.apache.axis.message.SOAPHeaderElement;

public class ChangeDataSourceConnectionString {

    private static ContentManagerService_PortType cmService;
    private static String sessionID;
    private static final String DEVELOPER_URL = "http://developer.cognos.com/schemas/bibus/3/";
    private static final String BUS_HEADER = "biBusHeader";

    // constructor to hide the default public constructor
    private ChangeDataSourceConnectionString() {}

    public static void main(final String[] args) throws RemoteException {
        // change this to dispatcher URL
        final String dispatcherURL = "http://localhost:9300/p2pd/servlet/dispatch";
        final String nameSpaceID = "nameSpace";
        final String userName = "userName";
        final String password = "password";
       
        // get this from admin console
        final String dataSourceConnectionSearchPath = "CAMID(\":\")/dataSource[@name='datasource']/dataSourceConnection[@name='datasource']";
        final String dataSourceConnectionString = "newConnectionString";

        //these 2 methods are usually in a CognosConnection class with other connections besides cmService
        connectToCognos(dispatcherURL);
        logonToCognos(nameSpaceID, userName, password);

        final SearchPathMultipleObject spm = new SearchPathMultipleObject();
        spm.set_value(dataSourceConnectionSearchPath);
        final PropEnum[] props = new PropEnum[] { PropEnum.capabilities, PropEnum.permissions, PropEnum.searchPath, PropEnum.user,
                PropEnum.properties, PropEnum.members, PropEnum.groupAndRoleSettings, PropEnum.defaultName, PropEnum.connectionString };
        final DataSourceConnection dataSourceConnection = (DataSourceConnection) cmService
                .query(spm, props, new Sort[] {}, new QueryOptions())[0];

        dataSourceConnection.setConnectionString(new StringProp(null, dataSourceConnectionString));
        cmService.update(new BaseClass[] { dataSourceConnection }, new UpdateOptions());

        logoffFromCognos();

    }

    private static void connectToCognos(final String dispatcherURL) {
        final ContentManagerService_ServiceLocator cmServiceLocator = new ContentManagerService_ServiceLocator();
        try {
            final URL url = new URL(dispatcherURL);
            cmService = cmServiceLocator.getcontentManagerService(url);
        } catch (final Exception e) {
            throw new IllegalStateException("Unable to connect to Cognos", e);
        }

    }

    /**
     *  Bind credentials to the Cognos environment.
     * @param password
     * @param userName
     * @param nameSpaceID
     */
    private static void logonToCognos(final String nameSpaceID, final String userName, final String password) {

        final StringBuilder credentialXML = new StringBuilder();
        credentialXML.append("<credential>");
        credentialXML.append("<namespace>").append(nameSpaceID).append("</namespace>");
        credentialXML.append("<username>").append(userName).append("</username>");
        credentialXML.append("<password>").append(password).append("</password>");
        credentialXML.append("</credential>");

        final XmlEncodedXML xmlCredentials = new XmlEncodedXML();
        xmlCredentials.set_value(credentialXML.toString());

        try {
            //if you want any other services you need to add them here too, should be the same lines as below for other services
            cmService.logon(xmlCredentials, null);
           
            final SOAPHeaderElement temp = ((Stub) cmService).getResponseHeader(DEVELOPER_URL, BUS_HEADER);
            final BiBusHeader CMbibus = (BiBusHeader) temp.getValueAsType(new QName(DEVELOPER_URL, BUS_HEADER));

            if (CMbibus.getTracking().getSessionContext() != null) {
                sessionID = CMbibus.getTracking().getSessionContext();
            }

            ((Stub) cmService).setHeader(DEVELOPER_URL, BUS_HEADER, CMbibus);
        } catch (final Exception ex) {
            throw new IllegalStateException("Unable to authenticate against Cognos", ex);
        }

    }

    /**
     *  Log off from the Cognos environment.
     */
    public static void logoffFromCognos() {
        try {
            cmService.logoff();
        } catch (final Exception ex) {
            throw new IllegalStateException("Unable to log off from Cognos", ex);
        }
    }

}







Title: Re: Sample code to update a database connection string
Post by: raztos on 19 Sep 2019 02:50:50 AM
Hello aussieadam,

I have question, which axis are you using in the code above ?

I got inspired of following link : https://www.ibm.com/support/pages/sdk-how-use-sdk-libraries-including-axis-jar-files-software-application

but my code was not working with STEP3.

Which axis have you imported to your java project ?

Thanks