/** Licensed Materials - Property of IBM IBM Cognos Products: DOCS (C) Copyright IBM Corp. 2005, 2013 US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ /** * Logon.java * * Copyright (C) 2008 Cognos ULC, an IBM Company. All rights reserved. * Cognos (R) is a trademark of Cognos ULC, (formerly Cognos Incorporated). * * Description: This code sample demonstrates how to log on * and how to log off using the following methods: * * - logon * Use this method to log on through the SDK. If authenticated * by a third party security provider, the action is * successful and a passport is created in the biBusHeader. * - logoff * Use this method to log off through the SDK. If the action is * successful, the passport is removed from the biBusHeader. * - query * Use this method to request objects from the content store. */ import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import org.apache.axis.client.Stub; import org.apache.axis.message.SOAPHeaderElement; import com.cognos.developer.schemas.bibus._3.Account; import com.cognos.developer.schemas.bibus._3.BaseClass; import com.cognos.developer.schemas.bibus._3.BiBusHeader; import com.cognos.developer.schemas.bibus._3.DisplayObject; import com.cognos.developer.schemas.bibus._3.PromptOption; 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.SearchPathSingleObject; import com.cognos.developer.schemas.bibus._3.Sort; import com.cognos.developer.schemas.bibus._3.XmlEncodedXML; public class Logon implements ActionListener { private static String logon = "logon"; private static String cancel = "cancel"; private static String userID = ""; private static String password = ""; private static String nameSpace = ""; private static String credentialString = ""; private static String anonUserID = ""; private static String anonNameSpace = ""; private JTextField userNameField = new JTextField(10); private JPasswordField passwordField = new JPasswordField(10); private JDialog loginDialog; private JComboBox namespaceBox; /** * Use this Java method to log on, bypassing * any prompts. * * @param connection * Connection to Server * * @param namespace * Specifies the namespace where the user ID is stored. * @param uid * Specifies the ID of the user. * @param pwd * Specifies the password of the user. * @return * Returns a string containing status information. */ public String quickLogon( CRNConnect connection, String namespace, String uid, String pwd) throws Exception { // sn_dg_prm_sdk_method_contentManagerService_logon_start_1 StringBuffer credentialXML = new StringBuffer(); credentialXML.append(""); credentialXML.append(""); credentialXML.append(namespace); credentialXML.append(""); credentialXML.append(""); credentialXML.append(uid); credentialXML.append(""); credentialXML.append(""); credentialXML.append(pwd); credentialXML.append(""); credentialXML.append(""); String encodedCredentials = credentialXML.toString(); credentialString = encodedCredentials; connection.getCMService().logon(new XmlEncodedXML(encodedCredentials), new SearchPathSingleObject[] {}); // sn_dg_prm_sdk_method_contentManagerService_logon_end_1 return ("Logon successful as " + uid); } /** * Use this Java method to logon. * * @param connection * Connection to Server * * @return Returns a string containing status information. */ public String logon(CRNConnect connection) { loginDialog = new JDialog(); JPanel userNamePanel = new JPanel(); JPanel passwordPanel = new JPanel(); JPanel namespacePanel = new JPanel(); // NOTE: If you are already logged on, you must first log off // before you can log on as a different user. logoff(connection); String namespaceInfo[] = getNamespaces(connection); if (namespaceInfo == null) { JOptionPane.showMessageDialog( null, "Unable to connect", "Connect Failed", JOptionPane.ERROR_MESSAGE); return "Unable to connect to server"; } //namespaceInfo is name/ID pairs -- always even String namespaces[] = new String[namespaceInfo.length / 2]; String namespaceIDs[] = new String[namespaceInfo.length / 2]; for (int j = 0, k = 0; k < namespaceInfo.length; j++, k++) { namespaces[j] = namespaceInfo[k++]; namespaceIDs[j] = namespaceInfo[k]; } // Setup the username field JLabel userNameLabel = new JLabel("User Name: "); userNameLabel.setLabelFor(userNameField); userNamePanel.add(userNameLabel, BorderLayout.WEST); userNamePanel.add(userNameField, BorderLayout.EAST); // Setup the password field passwordField.setEchoChar('*'); JLabel passwordLabel = new JLabel("Password: "); passwordLabel.setLabelFor(passwordField); passwordPanel.add(passwordLabel, BorderLayout.WEST); passwordPanel.add(passwordField, BorderLayout.EAST); // Setup the namespace field namespaceBox = new JComboBox(namespaces); namespaceBox.setSelectedItem(null); JLabel namespaceLabel = new JLabel("Namespace: "); namespaceLabel.setLabelFor(namespaceBox); namespacePanel.add(namespaceLabel, BorderLayout.WEST); namespacePanel.add(namespaceBox, BorderLayout.EAST); // Add the fields to the panel JPanel loginPanel = new JPanel(new GridLayout(3, 0)); loginPanel.add(userNamePanel); loginPanel.add(passwordPanel); loginPanel.add(namespacePanel); // Set up the ButtonPanel JPanel buttonPanel = createButtonPanel(); // Set up and display the window loginDialog.setTitle("Logon"); Container loginContentPane = loginDialog.getContentPane(); loginContentPane.add(loginPanel, BorderLayout.CENTER); loginContentPane.add(buttonPanel, BorderLayout.SOUTH); loginDialog.pack(); loginDialog.setResizable(false); loginDialog.setModal(true); loginDialog.setVisible(true); // Process the user input if (userID == "") { return ""; } // Find NamespaceID boolean found = false; int i = 0; while(!found && i < namespaces.length) { if (nameSpace.compareToIgnoreCase(namespaces[i]) == 0) found = true; else i++; } StringBuffer credentialXML = new StringBuffer(); credentialXML.append(""); credentialXML.append(""); credentialXML.append(namespaceIDs[i]); credentialXML.append(""); credentialXML.append(""); credentialXML.append(userID); credentialXML.append(""); credentialXML.append(""); credentialXML.append(password); credentialXML.append(""); credentialXML.append(""); String encodedCredentials = credentialXML.toString(); credentialString = encodedCredentials; try { connection.getCMService().logon(new XmlEncodedXML(encodedCredentials), new SearchPathSingleObject[] {}); SOAPHeaderElement x = ((Stub)connection.getCMService()).getResponseHeader("http://developer.cognos.com/schemas/bibus/3/", "biBusHeader"); ((Stub)connection.getCMService()).setHeader(x); password = ""; } catch (java.rmi.RemoteException remoteEx) { userID = ""; password = ""; nameSpace = ""; credentialString = ""; return ""; } return ("Logon successful."); } /** * Use this Java method to log off. * * @param connection * Connection to Server * * @return Returns a string containing status information. */ public String logoff(CRNConnect connection) { nameSpace = ""; userID = ""; password = ""; try { // sn_dg_sdk_method_contentManagerService_logoff_start_1 connection.getCMService().logoff(); // sn_dg_sdk_method_contentManagerService_logoff_end_1 } catch (java.rmi.RemoteException remoteEx) { return (remoteEx.toString()); } return ("Logoff successful."); } public static boolean loggedIn(CRNConnect connection) { return (userID != "" || userID == null || doTestForAnonymous(connection)); } /** * Use this Java method to get account information for the current user. * * @param connection * Specifies the object that provides the connection to * the server. * @return Returns a string containing user information. */ public String logonInfo(CRNConnect connection) { String output = new String(); if (connection != null) { Account myAccount = getLogonAccount(connection); if (myAccount == null) { output = "You are not currently logged on.\n"; return output; } String logonName = myAccount.getDefaultName().getValue(); if (logonName == null) { output = "You are not currently logged on.\n"; return output; } output = output.concat( "You are currently logged on as: " + logonName + "\n"); if (myAccount.getUserName().getValue() != null) { output = output.concat( "Your user name is: " + myAccount.getUserName().getValue() + "\n"); } output = output.concat( "Your searchPath is: " + myAccount.getSearchPath().getValue() + "\n"); if (myAccount.getNotificationEMail().getValue() == null) { output = output.concat("You do not have a notification email address defined.\n"); } else { // sn_dg_sdk_task_querycontent_start_2 output = output.concat( "Your alert email address is: " + myAccount.getNotificationEMail().getValue()); // sn_dg_sdk_task_querycontent_end_2 } } else { output = output.concat("Invalid parameter passed to function logon."); } return output; } /** * Use this Java method to find out if Anonymous access is enabled * * @param connection * Connection to Server * * @return Returns a boolean indicating whether or not * Anonymous access is enabled (true) or disabled (false). */ public static boolean doTestForAnonymous(CRNConnect connection) { boolean doTestForAnonymous = false; try { BaseClass bc[] = connection.getCMService().query( new SearchPathMultipleObject("/content"), new PropEnum[] {}, new Sort[] {}, new QueryOptions()); if (bc != null) { doTestForAnonymous = true; } else { doTestForAnonymous = false; } } catch (java.rmi.RemoteException remoteEx) { System.out.println(""); //Ignore this, it means that Anonymous access is denied... } return doTestForAnonymous; } // Get account information for the current user. public static Account getLogonAccount(CRNConnect connection) { // sn_dg_sdk_task_querycontent_start_0 PropEnum props[] = new PropEnum[] {PropEnum.searchPath, PropEnum.defaultName, PropEnum.policies, PropEnum.userName, PropEnum.notificationEMail }; Account myAccount = null; // sn_dg_sdk_task_querycontent_end_0 if (connection.getCMService() == null) { System.out.println("Invalid parameter passed to function logon."); return myAccount; } try { // sn_dg_sdk_task_querycontent_start_1 BaseClass bc[] = connection.getCMService().query(new SearchPathMultipleObject("~"), props, new Sort[] {}, new QueryOptions()); if ((bc != null) && (bc.length > 0)) { for (int i = 0; i < bc.length; i++) { myAccount = (Account)bc[i]; } } // sn_dg_sdk_task_querycontent_end_1 } catch (java.rmi.RemoteException remoteEx) { //An exception here likely indicates the client is not currently //logged in, so the query fails. System.out.println( "Caught RemoteException:\n" + remoteEx.getMessage()); } return myAccount; } /** * Use this Java method to retrieve the available namespaces. * * @param connection * Connection to Server * * @return Returns an array of strings containing all available namespaces. */ public String[] getNamespaces(CRNConnect connection) //throws Exception { // This call to the query method provides the logon information. // The authentication will fail and the SOAP:Header // will contain all the information required to log on. try { connection.getCMService().query( new SearchPathMultipleObject("/content"), new PropEnum[] {}, new Sort[] {}, new QueryOptions()); } catch (java.rmi.RemoteException remoteEx) { // Ignore this exception because the query was expected to fail. } // Retrieve the biBusHeader SOAP:Header that contains // the logon information. BiBusHeader bibus = BIBusHeaderHelper.getHeaderObject(((Stub)connection.getCMService()).getResponseHeader("http://developer.cognos.com/schemas/bibus/3/", "biBusHeader")); // Initialize the return values container String[] namespaces = new String[] {}; // Look in the displayObjects for namespace prompt options and capture // all the namespaces defined there. try { DisplayObject[] dob = bibus .getCAM() .getException() .getPromptInfo() .getDisplayObjects(); for (int i = 0; i < dob.length; i++) { if (dob[i].getName().equalsIgnoreCase("CAMNamespace")) { PromptOption[] pop = dob[i].getPromptOptions(); // Check to see how many namespaces exist. // If there is an array, there are many namespaces. // Otherwise there is only one namespace. if (pop != null) { namespaces = new String[pop.length * 2]; for (int j = 0, k = 0; k < pop.length; j++, k++) { namespaces[j] = pop[k].getValue(); namespaces[++j] = pop[k].getId(); } } else // There is only one namespace. { namespaces = new String[2]; //check the next display object for the name, if there is one if((i+1)"); credentialXML.append(""); credentialXML.append(anonNameSpace); credentialXML.append(""); credentialXML.append(""); credentialXML.append(anonUserID); credentialXML.append(""); credentialXML.append(""); return credentialXML.toString(); } return credentialString; } }