Getting started with BusinessObjects Java SDK

BusinessObjects Report Engine Java SDK is primarily used for Web Intelligence customization. This post describes how to start development of a command line tool. Such tools can make life of report developers easier. They can be used for:

You will need:

  • A bit of programming experience
  • Eclipse IDE for Java Developers (http://www.eclipse.org/downloads/)
  • BusinessObjects Enterprise XI 3.1 server (to connect to)
  • BusinessObjects SDK libraries (see the list below)

New project in Eclipse

Download and extract Eclipse. Start it. Select default workspace folder (the new projects will be created in this folder). On the welcome page click “Go to Workbench”.

Create a new project:

1. File>New>Java Project

2. Specify project name (e.g. JavaTool).

3. Click Finish.

4. In the project folder on the disk (e.g. C:\Users\dbu\workspace\JavaTool\), create a folder lib and copy the jar files into it.

5. In Eclipse: Project>Properties>Java Build Path>Libraries, click “Add External JARs…”, OK.

6. Create package in the project. File>New>Package, type a name (e.g. org.bukhantsov.javatool), and click OK.

7. Create new class which will be starting point of the application. File>New>Class, type a name (e.g. Program), select option “public static void main” and click OK.

The generated class will be something like this:

package org.bukhantsov.javatool;
public class Program {
   /** 
   * @param args 
   */
   public static void main(String[] args) {
      // TODO Auto-generated method stub
   }
}

Let’s start

The first program will print all variables defined in Web Intelligence documents from a BOE server folder. Let’s consider functional blocks of the application.

Connect to CMS

The first thing you have to do is to connect to the BOE server.

ISessionMgr sessionMgr = CrystalEnterprise.getSessionMgr();
IEnterpriseSession enterpriseSession =
  sessionMgr.logon("Administrator", "", "localhost", "secEnterprise");

Replace “localhost” with the name of your BOE server.

Get Webi documents from CMS

When you connected, you can get the objects corresponding to Webi documents from CMS.

IInfoStore infoStore = (IInfoStore) enterpriseSession.getService("InfoStore");
String query = "select SI_NAME, SI_ID from CI_INFOOBJECTS "
             + "where SI_KIND = 'Webi' and SI_INSTANCE=0";
IInfoObjects infoObjects = (IInfoObjects) infoStore.query(query);

You can build and test the query in BusinessObjects Query Builder.

Get report engine proxy

To open Webi document, you need to get a proxy to Webi report engine web service.

ReportEngines reportEngines =
   (ReportEngines) enterpriseSession.getService("ReportEngines");
ReportEngine wiRepEngine =
   (ReportEngine) reportEngines.getService(
      ReportEngines.ReportEngineType.WI_REPORT_ENGINE);

Process Webi documents from a folder

In a loop you can process all Webi documents from a folder

for (Object object : infoObjects) {
   IInfoObject infoObject = (IInfoObject) object;
   String path = getInfoObjectPath(infoObject);
   if (path.startsWith("/")) {
      DocumentInstance widoc = wiRepEngine.openDocument(infoObject.getID());
      // process document
      widoc.closeDocument();
   }
}

The function getInfoObjectPath builds path to the Webi document. Parent of Webi document is folder, and parent of folder is folder. The root folder has id = 0.

public static String getInfoObjectPath(IInfoObject infoObject) throws SDKException {
   String path = "";
   while (infoObject.getParentID() != 0) {
      infoObject = infoObject.getParent();
      path = "/" + infoObject.getTitle() + path;
   }
   return path;
}

Print Webi document variables

ReportDictionary dic = widoc.getDictionary();
VariableExpression[] variables = dic.getVariables();
for (VariableExpression e : variables) {
   String name = e.getFormulaLanguageID();
   String expression = e.getFormula().getValue();
   System.out.println(" " + name + " " + expression);
}

Error handling

An important part of each program is error handling.

public static void main(String[] args) {
   IEnterpriseSession enterpriseSession = null;
   ReportEngines reportEngines = null;
   try {
      // * connect to CMS
      // * get report engine proxy
      // * get Webi documents from CMS 
      // * process the documents
   }
   catch (SDKException ex) {
      ex.printStackTrace();
   }
   finally {
      if (reportEngines != null) reportEngines.close();
      if (enterpriseSession != null) enterpriseSession.logoff();
   }
}

Put all together

The complete code can be downloaded from here (however without libs). You can import it from File menu: File > Import… > Existing Project into Workspace.

package org.bukhantsov.javatool;

import com.businessobjects.rebean.wi.DocumentInstance;
import com.businessobjects.rebean.wi.ReportDictionary;
import com.businessobjects.rebean.wi.ReportEngine;
import com.businessobjects.rebean.wi.ReportEngines;
import com.businessobjects.rebean.wi.VariableExpression;
import com.crystaldecisions.sdk.exception.SDKException;
import com.crystaldecisions.sdk.framework.CrystalEnterprise;
import com.crystaldecisions.sdk.framework.IEnterpriseSession;
import com.crystaldecisions.sdk.framework.ISessionMgr;
import com.crystaldecisions.sdk.occa.infostore.IInfoObject;
import com.crystaldecisions.sdk.occa.infostore.IInfoObjects;
import com.crystaldecisions.sdk.occa.infostore.IInfoStore;

public class Program {
   public static void main(String[] args) {
      IEnterpriseSession enterpriseSession = null;
      ReportEngines reportEngines = null;
      try {
         System.out.println("Connecting...");
         ISessionMgr sessionMgr = CrystalEnterprise.getSessionMgr();
         enterpriseSession = sessionMgr.logon("Administrator",
               "", "localhost", "secEnterprise");
         reportEngines = (ReportEngines) enterpriseSession
               .getService("ReportEngines");
         ReportEngine wiRepEngine = (ReportEngine) reportEngines
               .getService(ReportEngines.ReportEngineType.WI_REPORT_ENGINE);         

         IInfoStore infoStore =
               (IInfoStore) enterpriseSession.getService("InfoStore");
         String query = "select SI_NAME, SI_ID from CI_INFOOBJECTS "
                      + "where SI_KIND = 'Webi' and SI_INSTANCE=0";
         IInfoObjects infoObjects = (IInfoObjects) infoStore.query(query);
         for (Object object : infoObjects) {
            IInfoObject infoObject = (IInfoObject) object;
            String path = getInfoObjectPath(infoObject);
            if (path.startsWith("/")) {
               DocumentInstance widoc = wiRepEngine.openDocument(infoObject.getID());
               String doc = infoObject.getTitle();
               System.out.println(path + "/" + doc);               
               printDocumentVariables(widoc);
               widoc.closeDocument();
            }
         }
      }
      catch (SDKException ex) {
         ex.printStackTrace();
      }
      finally {
         if (reportEngines != null)
            reportEngines.close();
         if (enterpriseSession != null)
            enterpriseSession.logoff();
      }
      System.out.println("Finished!");
   }

   public static void printDocumentVariables(DocumentInstance widoc ) {
      ReportDictionary dic = widoc.getDictionary();
      VariableExpression[] variables = dic.getVariables();
      for (VariableExpression e : variables) {
         String name = e.getFormulaLanguageID();
         String expression = e.getFormula().getValue();
         System.out.println(" " + name + " " + expression);
      }
   }        

   public static String getInfoObjectPath(IInfoObject infoObject) 
                                        throws SDKException {
      String path = "";
      while (infoObject.getParentID() != 0) {
         infoObject = infoObject.getParent();
         path = "/" + infoObject.getTitle() + path;
      }
      return path;
   }
}

Compile and run

You can run the program Run>Run.

Getting started with BusinessObjects RE Java SDK

To build executable JAR: go File>Export, select Java>Runnable JAR file. Select launch configuration (you will probably have the only one), select destination, select “Package required libraries into generated JAR”, and click Finish.

You can run the program using the following command:

java -jar javatool.jar

Final notes

Before running your tool on a bunch of reports it should be carefully tested. Especially if you do modifications.

The purpose of the code was to demonstrate how to access report engine. It does not demonstrate the best programming practices.

Java SDK Libraries

The Java SDK libraries can be found in the installation folder with BusinessObjects client tools or on the server.

C:\Program Files (x86)\Business Objects\common\4.0\java\lib

Required libraries:

  boconfig.jar
  cecore.jar
  celib.jar
  cesdk.jar
  cesession.jar
  corbaidl.jar
  ebus405.jar
  jtools.jar
  logging.jar
  rebean.common.jar
  rebean.jar
  rebean.wi.jar
  wilog.jar
  xpp3.jar
  xpp3_min.jar
  SL_plugins.jar

Links

Webi Report Engine Documentation

150 thoughts on “Getting started with BusinessObjects Java SDK

  1. RAGHU

    Hi,

    Could you please explain the same for BO 4.0 environment. I am currently using fp3 and i am unable to run any code due to some jar inclusions. Not sure which jar is creating an issue. I also heard that there are many differences between 3.1 and 4.0 in SDK perspective.

    Regards,
    Raghu

    Like

    Reply
    1. dmytro Post author

      Hi Raghu

      First, the functionality of Java Report Engine SDK was significantly cut in BO 4.0. The described code will not work.

      To fix the problem with jars include all libraries from the folder: [SAP BusinessObjects]\SAP BusinessObjects Enterprise XI 4.0\java\lib

      /Dmytro

      Like

      Reply
  2. RAGHU

    Hi Dmytro,

    So is there any chance to get variables and objects being used in any report in BO 4.0 environment. I have added all the libraries from \SAP BusinessObjects Enterprise XI 4.0\java\lib which is resulting in my eclipse being not working for small code also. Once i remove the xternal jars. again my eclipse is working fine..
    Could you please specify any particular jar to be added or removed

    Regards,
    Raghu

    Like

    Reply
    1. dmytro Post author

      Hi Radghu

      It is enough to add the libraries from the lib folder, the subfolders of the lib folder are not required. I found some list of required libraries on the web (which is subset of the jars from lib folder), but that did not work for me, so I usually include all libraries. When an executable jar is built, only referenced libraries are packed.

      There is no way to get variables and objects using the public SDK in BO 4.0 at the moment. But of course it is possible! BO is working somehow using these libraries! 🙂 The perfect documentation of the existing BO libraries is Webi code. You can investigate the code and build your own code.

      I am going to dig into that as soon as I have some free time 🙂

      /Dmytro

      Like

      Reply
  3. BlackBird

    This is a wonderful start for starters.

    Can you please provide the code to schedule a webi report that has prompts and save the instance on to shared location, provided one has access to that location.

    Thanks very much for considering my request.

    Like

    Reply
      1. BlackBird

        Hi dmytro,

        I spent time on that and tried to convert the code but was not able to incorporate that into the code on this page.

        Essentially, I am trying to enhance your code by adding a subroutine that will execute a webi report that has prompts and save the instance on to shared location.

        Regards.

        Like

      2. dmytro Post author

        Do you want to run a report and export the result in a format (Excel, PDF) to a folder on a disk?

        Or, do you want to schedule the report to run immediately? (but it is not quite clear for me what do you mean by “save to a location”)

        Thanks

        Like

      3. BlackBird

        Hi Dmytro,

        I somehow do not get notified of your response – sorry about the late reply therefore.

        I am trying to export the result in a format (Excel, PDF) to a folder on a disk.

        Will really appreciate the code.

        Best Regards.

        Like

      4. Rakhy

        Hi BlackBird,

        Are you able to save an instance? I am trying to do something similar. Please let me know your thoughts and experience on that!

        Regards,
        Rakesh.

        Like

  4. Thomas

    Hi!

    nice Information thx. I tried to use this whole Java Programm but now i get some kind of errors…
    Exception in thread “main” java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserException
    at com.businessobjects.rebean.internal.xml.XmlUtilities.toString(Unknown Source)
    at com.businessobjects.rebean.wi.occa.OccaDocumentComAdapter.openDocument(Unknown Source)
    at com.businessobjects.rebean.occa.OccaReportEngineComAdapter.openDocument(Unknown Source)
    at com.businessobjects.rebean.wi.ReportEngineImpl.openDocument(Unknown Source)
    at com.businessobjects.rebean.wi.occa.WebiReportEngine.openDocument(Unknown Source)
    at org.chkGroupNames.javatool.Program.main(Program.java:55)

    I also cannot find the 2 .jar files…
    xpp3.jar
    xpp3_min.jar

    Is the error caused becaus i have not the 2 jar files?
    thx tom

    Like

    Reply
    1. dmytro Post author

      Yes, the issue is caused by the missing files, the list is the minimal set of necessary files.

      xpp3.jar and xpp3_min.jar are in the folder
      [Business Objects]\common\4.0\java\lib\external

      Like

      Reply
  5. Amit

    We are building BPM based web application in JSF/PrimeFaces and we need to add this war file within SAP BO, either as a Tab or as a link, such that our application gets embedded inside Webi dashboard. Can you pls guide us on the required steps.

    Like

    Reply
  6. Sachin

    HeyI am getting the problem in to the SDKexception like

    Multiple annotations found at this line:
    – Syntax error on token “(“, ; expected
    – Syntax error, insert “;” to complete
    LocalVariableDeclarationStatement

    Like

    Reply
  7. Balaji Karunakaran

    HI Expert,

    Is there a SDK (JAVA) code to convert the existing WEBI report pointing to from UNV to UNX.

    This could be a great help. For now no one has an answer for this thought you are an expert in SDK and can find a solution for this

    Thanks
    Balaji Karunakaran

    Like

    Reply
    1. dmytro Post author

      I am still working on this. I do have some code however it can currently handle only simple UNV-UNX remapping.

      Like

      Reply
  8. neetha

    Hi,

    I have few deski reports developed in BO 6.5 with macros(VB scripts). I have to convert these into webi reports in BO XI3.1 using Java SDK. I believw we should link .jar file to BO report, but not sure hoe to do it. I am pretty new to this arena. Can you please provide some generic steps to start up with a simple report using Java SDK.

    Thanks in Advance.

    Like

    Reply
  9. mriganka

    i have to create a crystal report and then upload the report in to SAP bussiness object BI platform 4 and from java i want to pass dsn of sql server and parameter and report type(pdf/excel) what jar i will use and what code i’ll write in java please advice.

    Thanks in advance

    Like

    Reply
    1. dmytro Post author

      I assume CrystalReportsSDK.jar but since it is 4.0 I would recommend to include all jar from the folder lib (without subfolders)

      Here is the 4.0 SDK docs: http://scn.sap.com/docs/DOC-27465. The relevant is Report Application Server Java SDK: Using the SDK > Data source connectivity.

      Like

      Reply
  10. Pintu

    Hi,

    I have two query and I want the second query to be execute depends on the result of first query like .

    first query

    result = “Select * from abc” ;

    second query

    =”select * from ‘+result+'”;

    how this would be possible using

    IInfoObjects infoObjects = (IInfoObjects)iStore.query(infoQuery);

    because here when I execute the first query I get the infoObjects null , I want the value of first query and giving to second query ?

    Please let me know if still find any confusion

    Like

    Reply
  11. sara

    Hi,
    First i wanna thank you for sharing this turotial.I tried to compile it but it gives me the following error : java.lang.SecurityException: Impossible de trouver une configuration de connexion.
    Do you know why?

    Like

    Reply
    1. sara

      Hello,
      In fact i managed to solve the problem: you just need to add this to your code
      System.setProperty(“java.security.auth.login.config”, “C:/WINNT/bscLogin.conf”);
      System.setProperty(“java.security.krb5.conf”, “C:/WINNT/krb5.ini”);
      where C:/WINNT/bscLogin.conf and excel are files that you create :
      http://devlibrary.businessobjects.com/businessobjectsxir2/en/en/BOE_SDK/boesdk_java_dg_doc/doc/boesdk_java_dg/SDKFundamentals78.html

      hope this will help.

      Like

      Reply
  12. pratik bagul

    i cannot get my program to connect, it gives me the below error even if i used administrator credentials i followed your program only please help:

    com.crystaldecisions.sdk.exception.SDKException$SecurityError: Active Directory Authentication failed to log you on. Please contact your system administrator to make sure you are a member of a valid mapped group and try again. If you are not a member of the default domain, enter your user name as UserName@DNS_DomainName, and then try again. (FWM 00006)
    cause:javax.security.auth.login.LoginException: No LoginModules configured for com.businessobjects.security.jgss.initiate
    detail:Active Directory Authentication failed to log you on. Please contact your system administrator to make sure you are a member of a valid mapped group and try again. If you are not a member of the default domain, enter your user name as UserName@DNS_DomainName, and then try again. (FWM 00006) No LoginModules configured for com.businessobjects.security.jgss.initiate
    at com.crystaldecisions.sdk.plugin.authentication.secwinad.internal.SecWinADError.ThrowException(SecWinADError.java:46)
    at com.crystaldecisions.sdk.plugin.authentication.secwinad.internal.SecWinADAuthentication.startKerbLogin(SecWinADAuthentication.java:283)
    at com.crystaldecisions.sdk.plugin.authentication.secwinad.internal.SecWinADAuthentication.startLogin(SecWinADAuthentication.java:152)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.doLogon(LogonService.java:337)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.doUserLogon(LogonService.java:684)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.userLogon(LogonService.java:295)
    at com.crystaldecisions.sdk.occa.security.internal.SecurityMgr.userLogon(SecurityMgr.java:162)
    at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon(SessionMgr.java:425)
    at texas.Texas.main(Texas.java:17)
    Caused by: javax.security.auth.login.LoginException: No LoginModules configured for com.businessobjects.security.jgss.initiate
    at javax.security.auth.login.LoginContext.init(LoginContext.java:273)
    at javax.security.auth.login.LoginContext.(LoginContext.java:418)
    at com.crystaldecisions.sdk.plugin.authentication.secwinad.internal.SecWinADAuthentication.startKerbLogin(SecWinADAuthentication.java:280)
    … 7 more

    Like

    Reply
  13. mfatih

    Hi,
    Thanks for great work. I want to add additional query filter( condition) to specific report.
    How should i do this?
    Which class should i use to achieve this task?

    Sorry for being new to BO.
    Thanks in advance…

    Like

    Reply
  14. deepali

    Is there any method/api with which one call view BO webi report schedule page and set scheduling parameters? I checked with openDoc url , it applies only to view and refresh webi report page.

    Can you please help on this issue? I searched a lot on internet however did not find anything.

    Like

    Reply
      1. Deepali

        Thanks dmytro for your response. I had checked this link however, it gives an example where in , it uses BO java sdk api to schedule the report by passing parameters to BO webi report. However in this case it will not open/launch BO webi schedule page , to set scheduling parameters.

        My requirement is , the way how opendoc helps to show BO webi report UI using opendoc url , like that i want an approach with which java program should open BO webi report page for scheduling(a page where it gives option for schedule, email ..etc in left side pane of BO webi report). Is there any way to do that?

        Like

      2. dmytro Post author

        So the scenario is: users enters the url in browser and it opens the page with scheduling parameters. I.e. you want the equivalent of the following GUI actions: InfoView > Document List > Select document > ‘Schedule’ from popup menu. After this, the report is scheduled by the user from the GUI. The goal is to implement the web application behind that url. Right? If so, I do not know how to implement this. It is probably possible but not that straightforward and with a little bit of hacking of InfoView.

        If you want a custom web application that allows users scheduling reports – this is more straightforward, but additionally to the SAP code that actually schedules, you will have to develop GUI with all required fields.

        Like

      3. Deepali

        Thanks dmytro for your inputs.Yes, that is the exact requirement I want to implement in java. After R&D and your inputs , it seems for this requirement , it would be better approach to schedule the reports from java using BO java sdk apis rather than tweaking InfoView object.

        I will go ahead with java api to achieve scheduling of the reports. Thanks a lot for your inputs.

        Like

  15. Deepali

    Hi dmytro,

    After this hurdle, now trying to get values from the prompts of BO reports e.g. If prompt1=list of countries and prompt2=list of states. In java, once I get list of value(LOV) of prompt1 and if I select specific country then in that case I want to get values of prompt2 as a list of states for selected country of prompt1. Is it possible to do that in java?

    I checked the API reference and came across QuerySpecification and Filer classes where we can set the value for a prompt. I am not sure if this is the right approach for above requirement. i.e. Using java api
    1. First get LOV for prompt1 ie. list of countries
    2. put a filter on selected country value for prompt2 and retrieve LOV of prompt2 i.e. list of states

    Would be correct approach?

    Like

    Reply
    1. dmytro Post author

      There is no functionality for linked prompts, i.e. all prompts and their lists of values in Webi document are independent. I assume it is possible to hack this on the universe level somehow but I do not think this be reliable.

      There are cascading prompts in Webi, see http://blog.davidg.com.au/2011/05/cascading-prompts.html. It is a single prompt but it allows to select a leaf value from a hierarchy. I have not tried to work with these from SDK. It seems it is not a part of public SDK, see http://scn.sap.com/thread/941998.

      If you are building own GUI and dynamic loading of states corresponding to country is not important, you can probably create a list of values for the prompt that contain two fields: Country and State, and imitate cascading prompts from your GUI.

      Like

      Reply
      1. Deepali

        Hi dmytro,

        Thank you for your inputs , it will help a lot to go ahead on this issue. Also, your tutorial-example on getting report drill filter is very informative and helpful.

        Thanks!

        Like

  16. arasu

    Hi,
    we have requirment to extract below information using sdk, could you pls help?
    1.how many reports running at the moment within that how many deski and webi reports
    2.those running reports, how long time it is in running state
    3.how many reports are in pending state based on start time (within that how many reports pending for events) count of webi and deski

    we are using BOXI3.1 SP5 /oracle 11 in our infrastructre
    thanks
    Arasu

    Like

    Reply
    1. dmytro Post author

      Hi Arasu

      BOE Auditing can provide you a lot of information about completed events. You may want to consider it. But I do not know if it can provide information about reports that are being run interactively from InfoView.

      Like

      Reply
  17. Arun Kumar

    Hello,

    I am working on a dashboard connected to webi through QaaWS by Webservice URL.
    At times I receive an error – com.businessobjects.rebean.wi.services.nooutputexception.

    Not sure this is an error or warning. Any suggestion on how to navigate from this?
    Appreciate your help.

    Arun

    Like

    Reply
    1. dmytro Post author

      This is about BI 4.0, right?

      I think the best would be to raise a support case with SAP since this problem has never been reported on the web or SAP support portal.

      I am not sure if it helps you: The error is thrown if the response recieved from server after running a report is invalid or empty (at com.businessobjects.rebean.wi.impl.services.ReportEngineOutputServiceImpl.internalGetPages(..))

      You might want to try to enable tracing on Web Intelligence Processing server and check the log for details about what is happening on the server when the error occurs.

      Like

      Reply
  18. jeet

    Hi Dmytro,

    Thanks for the detailed post. It helped me understand many things. We are converting from XI R2 to XI R4. Our application is a centralized reporting application and does all kind of crazy things. The code was written back in 1999 and many things changed. Currently, we are facing many issue with the way API used to work and how it is now with R4.

    One of them is below. Am I doing anything wrong?
    LineObject newLine = new LineObject();
    newLine.setTop(topOffset);
    newLine.setBottom(topOffset);
    newLine.setLeft(leftOffset);
    newLine.setRight(leftOffset + width);
    newLine.setLineStyle(lineStyle);
    newLine.setLineThickness(thickness);
    // newLine.setWidth(width);
    newLine.setEndSectionName(section.getName());
    newLine.setEnableExtendToBottomOfSection(moveToBottom);
    clientDoc.getReportDefController().getReportObjectController().add((IReportObject) newLine, section, -1);
    return newLine;

    This is how a line gets addedd to out reports. Now, in XI R4, this does not work.

    clientDoc.getReportDefController().getReportObjectController().add((IReportObject) newLine, section, -1);

    This line throws a NullPOinterException.

    java.lang.NullPointerException
    at com.crystaldecisions.sdk.occa.report.application.ReportObjectController.validateLineObject(ReportObjectController.java:4453)
    at com.crystaldecisions.sdk.occa.report.application.ReportObjectController.validateLineObject(ReportObjectController.java:4470)
    at com.crystaldecisions.sdk.occa.report.application.ReportObjectController.validateReportObject(ReportObjectController.java:6031)
    at com.crystaldecisions.sdk.occa.report.application.ReportObjectController.validateAddReportObject(ReportObjectController.java:3542)
    at com.crystaldecisions.sdk.occa.report.application.ReportObjectController.add(ReportObjectController.java:567)

    Thanks !!!

    Like

    Reply
  19. dhana

    That was a really great post and thanks for providing the detailed informtaion on SDK!!!!

    However when i tried to implement the above code i’m getting the following error. Could you please help what am i missing here. Thanks!

    Unable to initialize the Core Framework. You can find bellow:

    A) Resolution suggestions
    B) Discovery Mechanism Report
    C) Exception Stacktrace

    A) Resolution suggestions
    Configuration
    => Make sure your configuration is ok

    B) Discovery Mechanism Report
    MANIFEST found: jar:file:/C:/Documents%20and%20Settings/dkumar/workspace/Java%20tool/lib/boconfig.jar!/META-INF/MANIFEST.MF
    MANIFEST found: jar:file:/C:/Documents%20and%20Settings/dkumar/workspace/Java%20tool/lib/cecore.jar!/META-INF/MANIFEST.MF
    MANIFEST found: jar:file:/C:/Documents%20and%20Settings/dkumar/workspace/Java%20tool/lib/celib.jar!/META-INF/MANIFEST.MF
    MANIFEST found: jar:file:/C:/Documents%20and%20Settings/dkumar/workspace/Java%20tool/lib/cryptojFIPS.jar!/META-INF/MANIFEST.MF

    Like

    Reply
      1. Dhana

        Yes. “Unable to initialize the Core Framework” was the error message that i got. And thanks for getting back to me so quickly. Appreciate it.

        Like

      2. Dhana

        Digged into the code little bit and found out below is the code that is causing the error for me. Wondering am i missing any jar files?

        ReportEngine wiRepEngine =
        (ReportEngine) reportEngines.getService(
        ReportEngines.ReportEngineType.WI_REPORT_ENGINE);

        Like

      3. dmytro Post author

        That is a strange error message. I have never seen such before. This does not seem to be BO message. Are you trying to run the code from the post or you are doing something else?

        There is a list of necessary jars in the end of the post, if you are using BO XI 3.1.

        Like

  20. Wim

    Hi Dmytro,

    I installed eclipse, got java to work. I’ve imported your javatools and set the jar files in the buildpath. I don’t know java and only know some basics of the eclipse editor..
    I get the error “Could not find the main class” when I try to run the program.
    However, the run configuration Main class is set as “org.bukhantsov.javatool.Program”
    Hope you can point me to a solution?

    Like

    Reply
    1. dmytro Post author

      Try to build the program gradually. Start from “Hello World” program, create new project, add new class “Program” with main function specifying package org.bukhantsov.javatool. Try to run it. If works, replace the entire program with the program from the post, add jars. Make sure that there is no errors. Try to run again.

      Like

      Reply
      1. Wim

        Thanks for your time looking into my post! Ok I’m getting somewhere now, but get an error related to BO itself:

        I have minimalized the code to the below and started from a new program. it runs but throws the error:
        com.crystaldecisions.sdk.exception.SDKException$SecurityError: Active Directory Authentication failed to log you on.

        (seems to be similar to what Pratik above is experiencing)
        I know that the provided credential are ok, since I’m able to connect via VBA and .NET using the same credentials.

        public class Program {

        /**
        * @param args
        */
        public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
        System.out.println(“Connecting…”);
        ISessionMgr sessionMgr;
        sessionMgr = CrystalEnterprise.getSessionMgr();
        IEnterpriseSession enterpriseSession = sessionMgr.logon(“xxxx”, “xxx”, “xxxx”, “secWinAD”);
        System.out.println(“Done.”);

        } catch (SDKException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        }

        }

        Like

      2. dmytro Post author

        Well, I am aware about this issue with secWinAD but I do not know how to solve it for command line tool. The workaround is to use secEnterprise.

        Like

      3. Wim

        thanks for confirming that it is indeed an issue. I’ve been searching a bit via google but all I can find is the a Kerberos config file is needed.. but I don’t know anything about it.
        I’ll try to see if I also can get an Enterprise userid/pw.

        Like

  21. Dhana

    Yes. I followed your procedures exactly and i was able to successfully run the code till reportEngines = (ReportEngines) enterpriseSession
    .getService(“ReportEngines”);

    But when it steps into the next code which is ReportEngine wiRepEngine =
    (ReportEngine) reportEngines.getService(
    ReportEngines.ReportEngineType.WI_REPORT_ENGINE);
    i got the above mentioned error 😦

    Like

    Reply
      1. dmytro Post author

        It might be missing JAR if you are using 4.0
        Try adding all JARs from folder …\SAP BusinessObjects Enterprise XI 4.0\java\lib (but without subfolders)

        Like

      2. Dhana

        Thanks Dmytro!!! Yes it was because of the misssing jar files,i included all the jar files and the issue is fixed now…
        And do you know how can i get the list of objects/varibales used in the report if i’m using BOXI 4.0 because ReportDictionary class is not supported in the BOXI 4.0 version. Do you know is there any equivalent function similar to that?

        Like

    1. dmytro Post author

      As mentioned on the post, you need to add C:\Program Files (x86)\SAP BusinessObjects\Tomcat6\webapps\BOE\WEB-INF\eclipse\plugins\webpath.AnalyticalReporting\web\WEB-INF\lib\adv_ivcdzview.jar
      It should be copied from the BO server.

      Like

      Reply
  22. Dhana

    First of all thanks for patiently answering my questions….And i dont find such directory in my system…all i’m finding is C:\Program Files\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\warfiles\webapps\BOE\WEB-INF\eclipse\plugins… and after the plugins directory i dont see any other directory like “webpath.AnalyticalReporting\web\WEB-INF\lib\” as you mentioned

    Like

    Reply
      1. Dhana

        I’m almost there to get the list of objects…. But i’m getting the error “Type mismatch: cannot convert from element type object to Dictionary expression” in the following code.

        for (DictionaryExpression expr:list) {
        System.out.println(expr.getName());
        }
        Could you help me on this???

        Like

      2. Dhana

        No worries.. Found it out added the below line and it is working perfectly. List list = new ArrayList();

        Thank you so much Dmytro! This is really a great blog!!!

        Like

  23. Ash

    Hello Dmytro,
    Lots of good SDK related information on your site. It is very informative and great deal of work.

    I am trying to find out if there is a way in SDK to build a wrapper on @Prompt function to pass it a DYNAMIC default value.

    For ex in the @Prompt statement below I want to pass Default Option as sysdate which it doesnt allow today. Thinking if it can be achieved using java wrapper on top of @PROMPT universe function.
    @Prompt(‘Enter value(s) for Something:’,’A’,’Class\Something’,Multi,Free,Persistent,{‘Default Option’},User:0)

    Like

    Reply
      1. Ash

        Hello Dymtro,

        DO you know if I can get the list of all the reports where sql has been overridden. Probably using query builder or sdk. I tried looking at query builder tables but could find any such flag. I think may have to write sdk macro or jsp. Please let me know what are your thoughts.

        Thank you
        Ash

        Like

  24. danish

    I have a requirement to fetch all information related to crystal reports on server.(db, user info to be specific.)
    I have read through your wonderful blog. but got stuck with calling crystal report API.. getting the following error..could you please help me out
    error “Exception in thread “main” com.businessobjects.rebean.wi.ServerException: An internal error occured while calling ‘openDocument’ API. (Error: ERR_WIS_30270)
    at com.businessobjects.rebean.wi.occa.OccaDocumentComAdapter.checkOpenDocError(Unknown Source)
    at com.businessobjects.rebean.wi.occa.OccaDocumentComAdapter.openDocument(Unknown Source)
    at com.businessobjects.rebean.occa.OccaReportEngineComAdapter.openDocument(Unknown Source)
    at com.businessobjects.rebean.wi.ReportEngineImpl.openDocument(Unknown Source)
    at com.businessobjects.rebean.wi.occa.WebiReportEngine.openDocument(Unknown Source)
    at SandBoxinfoPkg.SandBoxClass.main(SandBoxClass.java:42)

    can you email or call 918-841-6858

    Like

    Reply
  25. Jabir

    Hi Dmytro,

    We have a requirement to develop a report with dynamic tabs in Web Intelligence4.0. Could you please advise with work around for this? I think there is some limitation with WEBI for this . So do you have any SDK to create new tabs for the report based on the field values selected by the user in report prompt?

    For example, for N number of Customer we need to create each tab for one customer.

    Environment: SAP BI 4.0 SP5.

    Thanks in advance for your help.

    Regards
    Jabir

    Like

    Reply
    1. dmytro Post author

      Currently, 4.0 SDK does not allow to do any modification of reports with SDK.
      “Tab” is “Report” in BO terms. The method for adding it is not functional as well as all other methods related to editing
      http://help.sap.com/javadocs/bip/40/re/en/com/businessobjects/rebean/wi/DocumentInstance.html#createReport(java.lang.String)
      Hopefully we will get API for Webi editing in 4.1.

      There are two nice standard features that may work as workaround: the Navigation Map (in view mode) and input controls.

      Like

      Reply
  26. Chai

    Hi Dmytro,
    We are on BO 4. Ofcourse, as you mentioned, this above code did not work. I get the following error(below). I copied all the jar files (entire lib folder). Still it gives me this error – any help? thanks – Chai

    com.crystaldecisions.sdk.exception.SDKException$UnsupportedEnterpriseVersion: SDK Version 1400 does not support Crystal Enterprise version 1250
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.checkVersionCompatibility(LogonService.java:724)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.doLogon(LogonService.java:1043)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.doUserLogon(LogonService.java:860)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.userLogon(LogonService.java:208)
    at com.crystaldecisions.sdk.occa.security.internal.SecurityMgr.userLogon(SecurityMgr.java:203)
    at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon_aroundBody0(SessionMgr.java:457)
    at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon_aroundBody1$advice(SessionMgr.java:512)
    at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon(SessionMgr.java:1)
    at Program.main(Program.java:22)

    Like

    Reply
  27. Cijoy

    Hi,

    I’m a newbie in BO and would like to know how to create dashboards in BO using Java SDK.

    Any pointers/inputs will be helpful.

    Thank you

    Like

    Reply
  28. Miller Zhou

    Hi Man,

    I have to say that this is great for me to start to learn BOE Java SDK. But I met a problem recently when I was told to use BOE Java SDK to create a universe with an existing database table. Is there any example for doing this?

    Regards,
    Miller

    Like

    Reply
  29. Chai

    Hi,
    Thank you for the post. One help though..can you please help me out with what class should I be using to extract Report query filter/prmpt conditions from BO4 webi report? Any example?

    thank you.
    Chai

    Like

    Reply
  30. hgp172

    Hi Dmytro,

    Thanks a lot for this amazing tutorial. Could you please help me in extracting all the report names, locations, size and author.

    I have done to get report names, path and author. But I’m not sure whether it’s fetching all the reports. Also, the main concern is how to get the size of a particular report.

    Many thanks in advance

    Regards,
    Hardik

    Like

    Reply
    1. hgp172

      I got it like this.. Thanks.

      IFiles ifiles = infoObject.getFiles();
      IFile boFile = null;
      long reportSize=0;
      for (int k=0; k<ifiles.size(); k++) {
      boFile = (IFile) ifiles.get(k);
      System.out.println("Size : " + boFile.getSize());
      reportSize += boFile.getSize();
      }
      System.out.println("Report Size : " + reportSize);

      Like

      Reply
  31. hgp172

    Hi Dymtro,

    What’s the best way to get the author of the BO report ?

    Currently I’m doing it in following way

    DocumentInstance widoc = wiRepEngine.openDocument(infoObject.getID());
    System.out.println(“Author : ” + idoc.getProperties().getProperty(“createdby”));

    But it’s taking too long. Is there any better way through IInfoObject ?

    Thanks in advance

    Like

    Reply
  32. Ibrahim H.

    Hello, I’ve a Null Exception at the getInfoObjectPath() method, here is my workaround:

    public static String getInfoObjectPath(IInfoObject infoObject) throws SDKException {
    String path = “/” + infoObject.getTitle();
    while ((infoObject.getParentID() != 0) && ((infoObject.getParent() != null))) {
    infoObject = infoObject.getParent();
    path = “/” + infoObject.getTitle() + path;
    }
    return path;
    }

    Like

    Reply
  33. Tamil

    Hi,

    Iam new to Java plat form.

    I have a requirement like. we have a region report(webi report)with region prompt we need to dynamically pass the parameters values to promt and that report results should be stored in unique location like if the parameter value is ‘Africa’ the report results (pdf and XL) stored in Africa folder

    Note: Prompt values and report destination paths (folder) details are available in database

    Please provide the sample code for my synario

    Thanks In advance

    Like

    Reply
  34. mizquierdo

    Hello,

    I want to know how can I include a macro already done with the sdk java in a report 4.1?

    I am waiting for your answer.

    Like

    Reply
  35. ali bangash

    Van Gogh was found shot dead in Amsterdam bby a Dutch Muslim, who staked a letter into Van Gogh’s chest with a
    knife threatening Ayaan Hirsi Ali’s life. * Wanted-Dead or Alive: Starring the muscular Salman Khan plus tthe
    voluptuous Ayyesha Takia, Wanted-Dead or Alive must remain the
    1st big bite of the greater part underneath rated musician of Bollywood, Ms.
    The center represents the now, soo the further you go awway from the
    now, the further it prevents you from knowing who you truly are.

    Like

    Reply
  36. Nithya

    Hi dmytro,
    I tried your code and am getting the following error

    Exception in thread “main” com.businessobjects.rebean.wi.CommunicationException: Cannot initialize Report Engine server. (Error: RWI 00226)
    at com.businessobjects.rebean.wi.occa.OccaConnection.doConnect(Unknown Source)
    at com.businessobjects.rebean.wi.occa.OccaConnection.(Unknown Source)
    at com.businessobjects.rebean.wi.occa.OccaServerConnectionManager.createConnection(Unknown Source)
    at com.businessobjects.rebean.occa.OccaReportEngineComAdapter.createCadenzaSession(Unknown Source)
    at com.businessobjects.rebean.occa.OccaReportEngineComAdapter.initNewCadenzaSession(Unknown Source)
    at com.businessobjects.rebean.occa.OccaReportEngineComAdapter.openDocument(Unknown Source)
    at com.businessobjects.rebean.wi.ReportEngineImpl.openDocument(Unknown Source)
    at com.businessobjects.rebean.wi.occa.WebiReportEngine.openDocument(Unknown Source)
    at sample.Sample1.main(Sample1.java:44)
    Caused by: com.crystaldecisions.enterprise.ocaframework.OCAFrameworkException$AllServicesDown: Unable to find servers in CMS 10.156.20.251:6400 and cluster @admin:6400 with kind webiserver and service null. All such servers could be down or disabled by the administrator. (FWM 01014)
    at com.crystaldecisions.enterprise.ocaframework.ServerController.validateServer(ServerController.java:431)
    at com.crystaldecisions.enterprise.ocaframework.ServiceMgr.validateServer(ServiceMgr.java:1127)
    at com.crystaldecisions.enterprise.ocaframework.ManagedSession.validateServer(ManagedSession.java:708)
    at com.crystaldecisions.enterprise.ocaframework.ManagedSession.validateStatelessService(ManagedSession.java:573)
    at com.crystaldecisions.enterprise.ocaframework.ManagedSession.newService(ManagedSession.java:911)
    at com.crystaldecisions.enterprise.ocaframework.ManagedSession.get(ManagedSession.java:273)
    at com.crystaldecisions.enterprise.ocaframework.ManagedSessions.get(ManagedSessions.java:297)
    at com.crystaldecisions.enterprise.ocaframework.ServiceMgr.getManagedService(ServiceMgr.java:702)
    … 9 more

    Could you please assist us in solving this issue?

    Like

    Reply
    1. dmytro Post author

      Is your BO system fine? It looks like Web Intelligence Processing Server is down (or it is not started yet). Can you open a Webi report through InfoView?

      Like

      Reply
      1. dmytro Post author

        The key error is this one:

        Caused by: com.crystaldecisions.enterprise.ocaframework.OCAFrameworkException$AllServicesDown: Unable to find servers in CMS 10.156.20.251:6400 and cluster @admin:6400 with kind webiserver and service null. All such servers could be down or disabled by the administrator. (FWM 01014)

        Are you using IP instead of server name? This usually does not work. Try to replace IP with server name. You might need to add corresponding line to hosts file, if the server name cannot be resolved.

        Like

      2. Nithya

        We are trying to fix this issue. Actually we are working on the extraction of webi report details. We are trying to extract the report details such as Universe, class, attributes, measures, underlying query and the format used in the report such as tables, charts and their properties like color, width, height and so on using com.businessobjects.rebean.wi package. we are new to this field and we would like to know whether is this possible and if so how to use the classes in the package to extract the details. Could you please share us some code for this? It will be highly helpful for us. Thanks in advance.

        Like

      3. dmytro Post author

        I am actually going to write a tool to export such report metadata. You may wait for few months. Maybe I will finally find time for that 🙂

        Like

  37. Сергей

    Здравствуйте, Дмитрий.
    По англ я не мастер, но как понял, чтобы выполнить данную программу в BO 4.1, необходимо просто добавить библиотеки из SAP BО/…/lib и все?

    If you dont understand sorry and just thank you for blog.

    Like

    Reply
    1. dmytro Post author

      Добрый день Сергей
      Чтобы скомпилировалось – да.
      Но работать оно по идее не будет (по крайней мере не работало в 4.0)
      Например, getDictionary() – Warning: This method is no longer functional from the SAP BusinessObjects 4.0 release onwards.
      В 4.1 для Webi есть RESTful Web Services SDK. См sbo41_webi_restful_ws_en.pdf

      Like

      Reply
      1. Сергей

        Спасибо,что ответили так быстро, у вас наверняка мало времени.
        А вообще, можете порекомендовать литературу или ссылки с большим количеством примеров по работе с SDK, помимо саповской документации , которые помогли вам в начале пути? Благодарю за потраченное время.

        Like

      2. dmytro Post author

        Наибольшее количество примеров, я думаю, на SAP портале http://scn.sap.com/docs/DOC-27465 > sample page. По-моему, неплохое введение по SDK в книге Crystal Reports 2008 Official Guide в последнем разделе (но книга довольно старая. Возможно для 4.1 она совсем не то что нужно). Саповские Developer Guides – тоже довольно ок. Я обычно пользуюсь API Reference и если что-то не понятно то гуглом.

        Like

      3. Сергей

        Спасибо!
        Есть еще вопрос: в одном из примеров вы открывали,обновляли и экспортировали отчет в pdf/xls/xml.
        Предположим, есть отчет “My report”, у него всего два столбца Year и Revenue, на Year стоит промт “выберите год”. Я беру ваш код из этого примера и просто меняю строку
        answers.put(“Year:”, new String[]{“FY2004”});
        на
        answers.put(“Year:”, new String[]{“2013”});
        при этом выводится
        “Выберите год
        ERROR: Mandatory prompts has not been entered”
        как я понимаю, значение “2013” не прошло, можете ли вы подсказать в чем я не прав?
        Java и BO я впервые увидел только на этой неделе, спасибо за сайт и помощь с литературой.
        ну и с меня пиво)

        Like

      4. dmytro Post author

        “Year:” это имя промта. Если имя в вашем случае “Выберите год” тогда и в коде нужно

        answers.put("Выберите год", new String[]{"2013"});
        

        Like

  38. sri

    Sir, could you please provide me the list of jar files for BO 4.0 SP6 to be uploaded into the lib folders.

    We have installed the BO 4.0 SP6 and the below “common” ,”4.0″, “java”, “lib” folders are not found to copy the given list from the below path.
    C:\Program Files (x86)\Business Objects\common\4.0\java\lib
    Required libraries:

    boconfig.jar
    cecore.jar
    celib.jar
    cesdk.jar
    cesession.jar
    corbaidl.jar
    ebus405.jar
    jtools.jar
    logging.jar
    rebean.common.jar
    rebean.jar
    rebean.wi.jar
    wilog.jar
    xpp3.jar
    xpp3_min.jar
    SL_plugins.jar

    But I have found cecore.jar, celib.jar, cesdk.jar,cesession.jar files

    in the below given path.
    C:\Users\Administrator\.businessobjects\upgrademanagementtool\configuration\org.eclipse.osgi\bundles\21\1\.cp\lib

    Please ….please help me. I’m very much interested to learn SDK on BO4.0.

    Thanks,
    Sri

    Like

    Reply
    1. dmytro Post author

      For 4.x, you have to include all libraries from
      C:\Program Files (x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\java\lib\
      (without subfolders)

      Note however that this code will not work for 4.x. ReportEngine SDK only supports viewing workflow. Another workflows are not functional. For instance: getDictionary() – Warning: This method is no longer functional from the SAP BusinessObjects 4.0 release onwards.
      In 4.1 there is RESTful Web Services SDK for Webi. See sbo41_webi_restful_ws_en.pdf

      Like

      Reply
      1. sri

        Thanks for your prompt response valuable advise Dmytro.

        Could you please provide me a small sdk code(On any application component such as CMS DB,AUDIT DB) so that I can try and explore on my existing version BO 4.0 SP7.

        I heart fully thanks once again for your help and waiting for you valuable advises to explore on SDK with BO 4.0 SP7.

        Like

  39. Suraj Bhosle

    Hi Dmytro,

    I am facing some issues while logging on to CMS using sdk.
    I am able to login on to infoview and CmcApp through web browser.

    But when i run above piece of code providing credentials to CMS server, I am getting below error:

    Note: The CMS server is on system infpw04267.
    and using link http://infpw04267.ltisap.com:8080/CmcApp/logon.faces?explicitLogoff=true I can log in to CMS.

    Eclipse error:
    com.crystaldecisions.enterprise.ocaframework.OCAFrameworkException$NotFoundInDirectory: Server infpw04267:6400 not found or server may be down (FWM 01003)
    cause:java.net.UnknownHostException: infpw04267
    detail:Server infpw04267:6400 not found or server may be down (FWM 01003) infpw04267
    at com.crystaldecisions.enterprise.ocaframework.RawSocketDirectory.find(RawSocketDirectory.java:211)
    at com.crystaldecisions.enterprise.ocaframework.APSServerHandler.buildBootstrapAPSInfo(APSServerHandler.java:445)
    at com.crystaldecisions.enterprise.ocaframework.APSServerHandler.buildAPSClusterInfo(APSServerHandler.java:881)
    at com.crystaldecisions.enterprise.ocaframework.APSServerHandler.buildServerInfo(APSServerHandler.java:359)
    at com.crystaldecisions.enterprise.ocaframework.ServerController.redirectServer(ServerController.java:549)
    at com.crystaldecisions.enterprise.ocaframework.ServiceMgr.redirectServer(ServiceMgr.java:1099)
    at com.crystaldecisions.enterprise.ocaframework.ManagedSessions.get(ManagedSessions.java:256)
    at com.crystaldecisions.enterprise.ocaframework.ServiceMgr.getManagedService(ServiceMgr.java:702)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.ensureServiceStub(LogonService.java:507)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.doUserLogon(LogonService.java:663)
    at com.crystaldecisions.sdk.occa.security.internal.LogonService.userLogon(LogonService.java:295)
    at com.crystaldecisions.sdk.occa.security.internal.SecurityMgr.userLogon(SecurityMgr.java:166)
    at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon(SessionMgr.java:425)
    at rmf.actions.BOCMS.authenticate(BOCMS.java:24)
    at rmf.actions.UNIVERSEverifyAction.execute(UNIVERSEverifyAction.java:35)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:167)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.net.UnknownHostException: infpw04267
    at java.net.InetAddress.getAllByName0(InetAddress.java:1157)
    at java.net.InetAddress.getAllByName(InetAddress.java:1083)
    at java.net.InetAddress.getAllByName(InetAddress.java:1019)
    at com.crystaldecisions.enterprise.ocaframework.RawSocketDirectory.find(RawSocketDirectory.java:153)
    … 130 more

    Like

    Reply
    1. dmytro Post author

      Try to use infpw04267.ltisap.com as server name
      Try to add infpw04267 and/or infpw04267.ltisap.com with corresponding IP to the hosts file

      Like

      Reply
  40. Suraj Bhosle

    Dymtro,

    Thank you for looking into my query.
    I did try infpw04267.ltisap.com and its corresponding IP as server name but faced similar error.

    Can it be because of some firewall restrictions on CMS server machine? Though i can log in to infoview and CmcApp from my local browser.

    Like

    Reply
    1. dmytro Post author

      The exception is “java.net.UnknownHostException: infpw04267” so it cannot resolve server. You added “infpw04267.ltisap.com” to hosts. Do you also use the same name to connect (not a shortened version infpw04267)?

      Try to connect using Webi rich client and open a document. If it works then it should be possible to make the code to work.

      Like

      Reply
      1. Suraj Bhosle

        Hi Dmytro,

        let me clarfy the scenario.

        CMS server is hosted on a remote machine with host name:INFPW04267 whose ip is 172.17.206.29. Since its a remote machine, adding host name with corresponding ip to host file will solve the issue?

        I am able login to CMS url: http://infpw04267.ltisap.com:8080/CmcApp/logon.faces?explicitLogoff=true

        I am using your code to login to that CMS server from my local machine by passing following parameters to sessionMgr.logon() method.

        hostname: INFPW04267 / INFPW04267:6400 / 172.17.206.29 / infpw04267.ltisap.com
        Username: username for above url
        Password: Password for above url
        Authentication: secEnterprise

        but eclipse is throwing below error:
        com.crystaldecisions.enterprise.ocaframework.OCAFrameworkException$CommunicationError: Communication error occurred when trying to connect to server 172.17.206.29 (FWM 01009)
        cause:com.crystaldecisions.thirdparty.org.omg.CORBA.COMM_FAILURE: gethostbyname() failed: java.net.UnknownHostException: INFPW04267 minor code: 0x4f4f000e completed: No
        detail:Communication error occurred when trying to connect to server 172.17.206.29 (FWM 01009) gethostbyname() failed: java.net.UnknownHostException: INFPW04267
        at com.crystaldecisions.enterprise.ocaframework.RawAPSDirectory.find(RawAPSDirectory.java:252)
        at com.crystaldecisions.enterprise.ocaframework.APSServerHandler.buildAPSClusterInfo(APSServerHandler.java:955)
        at com.crystaldecisions.enterprise.ocaframework.APSServerHandler.buildServerInfo(APSServerHandler.java:359)
        at com.crystaldecisions.enterprise.ocaframework.ServerController.redirectServer(ServerController.java:549)
        at com.crystaldecisions.enterprise.ocaframework.ServiceMgr.redirectServer(ServiceMgr.java:1094)
        at com.crystaldecisions.enterprise.ocaframework.ManagedSessions.get(ManagedSessions.java:256)
        at com.crystaldecisions.enterprise.ocaframework.ServiceMgr.getManagedService(ServiceMgr.java:697)
        at com.crystaldecisions.sdk.occa.security.internal.LogonService.ensureServiceStub(LogonService.java:507)
        at com.crystaldecisions.sdk.occa.security.internal.LogonService.doUserLogon(LogonService.java:654)
        at com.crystaldecisions.sdk.occa.security.internal.LogonService.userLogon(LogonService.java:295)
        at com.crystaldecisions.sdk.occa.security.internal.SecurityMgr.userLogon(SecurityMgr.java:162)
        at com.crystaldecisions.sdk.framework.internal.SessionMgr.logon(SessionMgr.java:425)
        at Program.main(Program.java:21)

        Need your expertise on this.

        Regards,
        Suraj Bhosle

        Like

      2. dmytro Post author

        Add the following line to the hosts file on your PC (usually C:\Windows\System32\drivers\etc\hosts)

        172.17.206.29    INFPW04267

        and try to connect using INFPW04267 again

        Like

      3. Suraj Bhosle

        Thank you Dmytro,

        I will try adding above entry to host file.
        But i did try providing IP address of the CMC host as well, but that didn’t work either?

        Anyways, i will change the host file and let you know the outcome.

        Like

  41. Suraj Bhosle

    Hi Guys,

    Upgrade Management Tool available in BO 4.0 is used to upgrade to BO 4.0.
    Can you tell me how much % conversion UMT can do?

    Like for, suppose We have complete and incremental upgrade options in UMT. Does complete upgrade mean 100% migration from BO 3.1 to BO 4.0.

    Thank you in Advance!!

    Like

    Reply
  42. Karthikeyan

    Hi,
    Great Work…Keep it up…..Thanks For Sharing….

    I am new to this… is there any query to find the relationship between
    1) user and universe (users who are all having access to universe)
    2) user and document (users who are all having access to document)

    I am using separate query for users and documents, then comparing it using two for loops

    say if i have 10000 users and 16000 documents

    i am comparing 1 user with 16000 documents…..so 10000 * 16000 times loop is rotating….

    Takes lot more time to execute…

    Thanks & Regard
    karthi

    Like

    Reply
  43. Pavlo

    Hi Dmitriy,

    Could you please help me to understand how IEnterpriseSession works?

    As I understand from documentation this type of “session” is persisted. Does this means that IEnterpriseSession has not timeout as concept? And what if I will not close IEnterpriseSession, will it be stored on BO servers for ever? Is there any purge procedure?

    Like

    Reply
  44. Imane93

    Thanks for this information,

    I need your help please! I can’t change format for “SI_UPDATE_TS” i use this instructions:

    // Display a date in day, month, year format 
    				
    Date date = userInfom.getUpdateTimeStamp();   
    String date2 = userInfom.properties().(\"SI_UPDATE_TS\");
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
    DateFormat formatter1 = new SimpleDateFormat("dd/MM/yyyy"); 
    String Creation_Time = formatter.format(date);
    String Creation = formatter1.format(date2);
    

    it’s run for getUpdateTimeStamp() i get what i want but i have a syntax erorr for “SI_UPDATE_TS” i don’t know what can i do,

    the second thing i want to know how can i get “SI_DISABLED if it’s true all false in SI_ALIASES for a List of Users, i try with this instruction:

    System.out.println(userInfom.properties().getProperties(“SI_ALIASES”)
    .get(“SI_DISABLED”));

    Thank you

    Like

    Reply

Leave a comment