Skip to Content
Technical Articles
Author's profile photo Daniel Paulsen

SAP BI Platform Promotion Management SDK

As of BI4.2 SP5 release, a new Java SDK for Promotion Management is available for managing the transport of objects between systems. The SDK provides 3 scenario based workflows as does the Performance Management tool in the CMC and the LCM command line interface. These scenarios are:

  • An import scenario, importing from an LCM archive to a live system
  • A promote scenario, promoting between two live systems
  • An export scenario, exporting from a live system to an LCM archive

Each of these scenarios can be run on demand or scheduled to run at a later time.

 

The SDK follows the same basic workflow as when creating a Promotion job in the Promotion Management UI.

  • Log onto a system that will run the job
  • Create a new Promotion Management Job
  • Log onto your source CMS or specify an import LCM archive
  • Log onto your target CMS or specify an export LCM archive
  • Browse to the objects to be added to the job
  • Test and/or run the job.
  • Log off

You can find the SDK Reference guide in the Development section of the following link:
https://help.sap.com/viewer/product/SAP_BUSINESSOBJECTS_BUSINESS_INTELLIGENCE_PLATFORM/

The title of the guide is: “SAP Business Intelligence Platform Promotion Management SDK Reference”  (Note you must be logged on to view the material)

The SDK is available in the lcm.jar file as of BI 4.2 Support Package 5 release. The jar can be found in the following location: <BO Install dir>\SAP BusinessObjects Enterprise XI 4.0\java\lib

The classes in the SDK can generally be broken down into categories. In order to try and help understand the purpose of these classes, I will compare the categories to different steps when creating a Promotion Management Job in the CMC.

Category Class Description
Host support

HostFactory

Host

A Host is equivalent to a new job in the Promotion Management tool.
LCM Archive Support

LcmArchiveFactory

LcmArchive

Used to set the import or export Lcm Archive filename and path depending on the scenario
Scenario Support

ImportScenario

ExportScenario

PromoteScenario

ScenarioOptions

Defines the scenario to be created and run by the Host. You can run, schedule or test promote (dryRun) the scenario. The ScenarioOptions class allows setting security, comment and rollback options.
Resource Selection

ObjectBrowser

ObjectMatcher

Similar to the Add Objects window, these classes let you add or remove objects as InfoObjects, CUIDs or from a query and compute dependencies.
Execution Support

RunResult

SchedulingStatus

Allows for tracking the status of a job while executing
User Feedback

Logger

ILoggerOutput

IProgressMonitor

AbstractProgressMonitor.

This is not part of the UI but these classes provide the ability to log and follow progress of a job.

 

The sample code below steps through the export scenario to demonstrate the basic workflow.

public class ExportToLcmbiar {

	
// Export Scenario for Live to LCMBiar
public static void main(String[] args) throws SDKException, LCMException {
				
	// log on to CMS that will run the job
	IEnterpriseSession mySession;
	ISessionMgr sessionManager = CrystalEnterprise.getSessionMgr();
	mySession = sessionManager.logon( userName, password, myCMS, authType);
	mySession.setLocale(Locale.ENGLISH);
		
	// check that logged on user has Admin Rights
	boolean isAdmin = com.businessobjects.sdk.lcm.SDKUtils.isConnectedAsAdmin(mySession);
	System.out.println("user is Admin: " + isAdmin);

	//get all objects from the folder with ID 1234
	String qry = "SELECT SI_CUID from CI_INFOOBJECTS where SI_PARENTID=1234";
	
	//Create a new LCM Job to export to lcmbiar file
	Host host = HostFactory.newInstance(mySession);
	ExportScenario myScenario = host.newExportScenario("LCMSDK_ExportTest");
		
	//Log onto Source CMS
	IEnterpriseSession sourceSession = sessionManager.logon(srcUserName, srcPassword, srcCMS, authType);
		
	//set the export destination for the LCMBiar file
	LcmArchive myExport = LcmArchiveFactory.newInstance("c:\\test\\SDKExport.lcmbiar");
	myScenario.setDestination(myExport);
	
	//Add objects to be exported
	ObjectBrowser oBrowser = myScenario.setSource(sourceSession);
	oBrowser.addQuery(qry);
	oBrowser.computeDependencies();
	for (Set<IInfoObject> dependencies :oBrowser.getDependencies().values())
	{
		oBrowser.addObjects(dependencies);
	}
	
	//Run the scenario and release the host
	myScenario.run();
	host.release();
			
	//log off
	sourceSession.logoff();
	mySession.logoff();
	System.out.println("Session Logged off");
}

 

The above code will not persist the job in the CMS. The job is deleted when the host is released. In order to persist and see the job in the Promotion Management Tool, a scheduled job should be created instead.

The progress is logged to the output window. The below output is from the above code:

  •  user is Admin: true
  • Logging on to the central CMS “BIPW12R2:6400” …
  • Logged in to central as “Administrator”
  • Running housekeeping …
  • Housekeeping complete
  • Creating job “LCMSDK_ExportTest” …
  • Job created
  • Logging on to the source CMS “BIPW12R2:6400” …
  • Logged in to source as “Administrator”
  • Running query on browser …
  • Query returned 1 object(s)
  • Added 1 resource(s)
  • Computing dependencies …
  • Dependencies computed
  • Added 3 resource(s)
  • Saving job “LCMSDK_ExportTest” …
  • Job saved
  • Exporting resources from source “bipw12r2:6400” to file “SDKExport.lcmbiar” …
  • Resources exported
  • Session Logged off

 

Hopefully this brief introduction to the Promotion Management SDK helps explain how to use the SDK.

Since I cannot attach the source as a zip file, I have also included the Import and Promote (Live-to-Live) Scenarios below:

public class ImportFromLcmbiar {

	//Import Scenario from lcmbiar file to live CMS
	public static void main(String[] args) throws SDKException, LCMException {
		// TODO Auto-generated method stub
		
		// log on to host CMS
		IEnterpriseSession mySession;
		ISessionMgr sessionManager = CrystalEnterprise.getSessionMgr();
		mySession = sessionManager.logon( userName, password, myCMS, authType);
		mySession.setLocale(Locale.ENGLISH);
		
		// check that logged on user has Admin Rights
		boolean isAdmin = com.businessobjects.sdk.lcm.SDKUtils.isConnectedAsAdmin(mySession);
		System.out.println("user is Admin: " + isAdmin);
 
		
		//Create a new LCM Job to import lcmbiar file
		Host host = HostFactory.newInstance(mySession);
		ImportScenario myScenario = host.newImportScenario("LCMSDK_ImportTest");
		
		//load source file for import job.
		String importPath = "c:\\test\\SDKimport.lcmbiar";
		LcmArchive importFile = LcmArchiveFactory.newInstance(importPath);
		importFile.getFile();
		myScenario.setSource(importFile);
		
		//Log onto Destination CMS
		IEnterpriseSession destinationSession = sessionManager.logon(userName, password, destinationCMS, authType);
		myScenario.setDestination(destinationSession);

		myScenario.run();
		
		host.release();
		
		//Log off all sessions
		destinationSession.logoff();
		mySession.logoff();
		System.out.println("Session Logged off");

	}

 

public class promoteLiveToLive {
	
	static String myCMS = "localhost";
	static String sourceCMS = "192.168.1.65";
	static String destinationCMS = "localhost";
	static String authType = "secEnterprise";
	static String userName = "Administrator";
	static String password = "Secret123";


	public static void main(String[] args) throws SDKException, LCMException {
		// TODO Auto-generated method stub
		
		// log on to source CMS
		IEnterpriseSession mySession;
		ISessionMgr sessionManager = CrystalEnterprise.getSessionMgr();
		mySession = sessionManager.logon( userName, password, myCMS, authType);
		mySession.setLocale(Locale.ENGLISH);
		
		// check that logged on user has Admin Rights
		boolean isAdmin = com.businessobjects.sdk.lcm.SDKUtils.isConnectedAsAdmin(mySession);
		System.out.println("user is Admin: " + isAdmin);

		//Create a new LCM Job to promote from an older system
		Host host = HostFactory.newInstance(mySession);
		PromoteScenario myScenario = host.newPromoteScenario("LCMSDK_PromoteTest");
		
		
		//Log onto Source CMS                                  
		IEnterpriseSession sourceSession = sessionManager.logon(userName, password, sourceCMS, authType);
		
		//contents of samples folder on older BI4.1SP5 system
		String qry = "SELECT SI_CUID from CI_INFOOBJECTS where SI_PARENTID=186681";

		//Add objects to be exported
		ObjectBrowser oBrowser = myScenario.setSource(sourceSession);
		oBrowser.addQuery(qry);
		oBrowser.computeDependencies();
		for (Set<IInfoObject> dependencies :oBrowser.getDependencies().values())
		{
			oBrowser.addObjects(dependencies);
		}

		//Log onto Destination CMS
		IEnterpriseSession destinationSession = sessionManager.logon(userName, password, destinationCMS, authType);
		myScenario.setDestination(destinationSession);

		myScenario.run();
		host.release();
		
		//log off all sessions
		mySession.logoff();
		sourceSession.logoff();
		destinationSession.logoff();
		System.out.println("Session Logged off");

	}

}

 

 

 

 

 

 

Assigned Tags

      9 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Jeff Fu
      Jeff Fu

      Great sharing!

      Author's profile photo Kunal Kharat
      Kunal Kharat

      Hi Daniel,

      Thank you for publishing this.

      Its truely a great share.

      Your article was very helpful.

       

      I have a question; based on the ExportToLCMbiar code. I am not sure if this is universal, but using computeDependencies()

      It spawns multiple threads, which keep running, even when the dependencies are computed and the lcmbiar is made. Due to this the code never exits. I have to manually hit Ctrl+C to exit from command line.

      Do you face a similar issue?

       

      Regards,

      Kunal Kharat

       

      Author's profile photo Feroz Ahmed
      Feroz Ahmed

      Hi Daniel,

       

      Thank you for sharing this information.

      We have created a program object to generate the backup of objects on schedule basis but the issue is this code never completes running and  get Expired. But it generate the biar file.

       

      Regards,

      Feroz

      Author's profile photo Rishi Jain
      Rishi Jain

      Hello Daniel,

       

      Thank you for publishing.. This is absolutely working like a charm.

      I have one question, since it is not holding the job information(what is promoted) so wanted to know if we also have a rollback option?

      Thanks

      ~Rishi Jain

      Author's profile photo Sukanta Paul
      Sukanta Paul

      Hi Daniel,

       

      Thanks for sharing the code, is there python compatible code or SDK available as well ? for promotion management, in python RestAPI reference guide do not see any promotion management API methods.

       

      Author's profile photo SIYING WANG
      SIYING WANG

      Hi Sukanta,

      I went across some of your questions about automating the promotion process - we want to start the same initiative. Would you mind sharing any progress? Thanks!

      Siying

      Author's profile photo Vinayak Basavaraddi
      Vinayak Basavaraddi

      Hi Daniel Paulsen,
      I have a question. Using computeDependencies(), the job keeps running even when the dependencies are computed and the code never exits. Any idea why is this happening?

      Author's profile photo Islam OUAHOUDA
      Islam OUAHOUDA

      Hi,

      Anyone has acces to jar libary files for the class  LcmArchiveFactory and SDKUtils i cannot find it on my sap install.

      Best regards

      Author's profile photo Ayman Salem
      Ayman Salem

      they are in the lcm.jar