How to change universe of a webi document using BO RE Java SDK

Web Intelligence documents use one or many universes. Sometimes it is necessary to change universes for a bunch of reports. Changing universe might be very difficult if you need to modify dozens of documents. Luckily it is possible to utilize BusinessObjects Report Engine Java SDK.

There is a number of Webi documents in a folder which use a number of universes. The task is to make a copy of these on the same BOE server.

It is easy to copy documents (in CMC) and universes (using Universe Designer. The complex problem is to change a copied document to use the copied universes.

The manual procedure of changing universe for a document is the following:

  • Open Webi document in Web Intelligence¬†in edit mode.
  • Click Edit query.
  • For each query, change universe in the query properties.
  • Changing universe you have to confirm mapping. If you change a universe to its copy, you do not need to do anything in this mapping. But just confirming it takes few seconds.

The automated procedure for all documents will do the following:

  • Get list of universe IDs that used by the copied documents.
  • Get list of all available universes.
  • Create a mapping of IDs.
  • Map all reports from the original universes to their copies using the mapping.

If you have to modify 5 documents, the writing code might take even more time then do it manually, but anyway coding is more fun then clicking :)

If you have to modify 50  documents, think twice before starting manual work.

Java Function

public static boolean changeUniverses(DocumentInstance widoc,
                                      HashMap<String, String> mapping)
{
   boolean failed = false;
   DataProviders dps = widoc.getDataProviders();
   HashSet<DataSource> dataSources = new HashSet<DataSource>();
   for (int i = 0; i < dps.getCount(); ++i) {
      DataProvider dp = (DataProvider) dps.getItem(i);
      dataSources.add(dp.getDataSource());
   }
   for (DataSource ds: dataSources) {
      String universeId = ds.getUniverseID();
      String oldID = universeId;
      String newID = mapping.get(oldID);
      System.out.println(oldID + "->" + newID);
      dps.changeUniverse(oldID, newID, true);
      if (dps.mustFillChangeUniverseMapping()) {
         ChangeUniverseMapping unvMapping = dps.getChangeUniverseMapping();
         ChangeDataSourceMapping[] dsMappings = unvMapping.getDataSourceMappings();
         for (ChangeDataSourceMapping dsMapping : dsMappings) {
            ChangeDataSourceObjectMapping[] objMappings = dsMapping.getAllMappings();
            for (ChangeDataSourceObjectMapping objMapping : objMappings) {
               if (objMapping.getToObject() == null) {
                  failed = true;
               }
            }
         }
         dps.setChangeUniverseMapping();
         if (widoc.getMustFillContexts()) {
            failed = true;
         }
         widoc.applyFormat();
         widoc.refresh();
      }
      if (failed) {
         return false;
      }
   }
   return true;
}

BTW, the universe id is something like:

UnivCUID=ASiM_T4jxmJIj0aKWpbeXro;UnivID=41709;ShortName=Finance;UnivName=Finance

Complete code

http://bukhantsov.org/tools/WidRemapping.zip