ODIExperts.com

The blog for Oracle Data Integrator ( ODI )

Export and Importing Scenarios based on Project (or)Folder

Hi Everyone,

Keeping our “java series” we have one more piece of code to share.

I hope you “enjoy” it!

The below code is used to Export and Import all the Scenario from Development Work Rep to Execution Work Rep .

For Export there are 3 different options either Export all the scenario

  • For a Project (or)
  • For a Folder (or)
  • Scenarios matching a particular Time period .

Note : – Make sure you either delete the folder or delete all the scenario inside the Export Folder once successful import is done .

package odi.sdk;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

import oracle.odi.core.OdiInstance;
import oracle.odi.core.config.MasterRepositoryDbInfo;
import oracle.odi.core.config.OdiInstanceConfig;
import oracle.odi.core.config.PoolingAttributes;
import oracle.odi.core.config.WorkRepositoryDbInfo;
import oracle.odi.core.persistence.transaction.ITransactionStatus;
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition;
import oracle.odi.core.security.Authentication;
import oracle.odi.domain.project.IOdiScenarioSourceContainer;
import oracle.odi.domain.project.OdiFolder;
import oracle.odi.domain.project.OdiProject;
import oracle.odi.domain.project.finder.IOdiFolderFinder;
import oracle.odi.domain.project.finder.IOdiProjectFinder;
import oracle.odi.domain.runtime.scenario.OdiScenario;
import oracle.odi.domain.runtime.scenario.finder.IOdiScenarioFinder;
import oracle.odi.impexp.EncodingOptions;
import oracle.odi.impexp.OdiImportException;
import oracle.odi.impexp.support.ExportServiceImpl;
import oracle.odi.impexp.support.ImportServiceImpl;

public class ExportImport {

     private static String Project_Code;
     private static OdiProject project;
     private static String   Folder_Name;
     private static OdiFolder folder;

     /**
     * @param args
     * @throws IOException
     * @throws OdiImportException
     * @throws ParseException
     */

    public static void main(String[] args) throws IOException, OdiImportException, ParseException {

     /****** Please change these Parameters *********/

    /** Development Repository ****/

     String Url = "jdbc:oracle:thin:@localhost:1521:xe";
     String Driver="oracle.jdbc.OracleDriver";
     String Master_User="ODI_MASTER_11G";
     String Master_Pass="ODI_MASTER_11G";
     String WorkRep="WORKREP1";
     String Odi_User="SUPERVISOR";
     String Odi_Pass="SUNOPSIS";

     /*** Execution Repository ***/
     // In case if your Execution rep is linked to a different Master repository please appropriately create new variables
     // The present codes assumes that Development and Execution are linked to the same Master Repository.

     String WorkRep_Execution="WORKREP_EXECUTION";

     /***************************************************/

     //Exporting Scenario Options

     String ExportFolderPath="/home/oracle/Documents/ODIExport";

     // While providing path in windows make sure you use \
     Boolean ExportPackageScen      = true;
     Boolean ExportInterfaceScen    = true;
     Boolean ExportProcedureScen    = true;
     Boolean ExportVariableScen     = false;
     Boolean RecursiveExport        = true;
     Boolean OverWriteFile          = true;

     Project_Code   ="XMT";
     Folder_Name    ="FOLDER2";

     // Date based on which the scenario is compared
     SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy");
     Date date =df.parse("11-23-2011");

     /********************************************/

MasterRepositoryDbInfo masterInfo = new MasterRepositoryDbInfo(Url, Driver, Master_User,Master_Pass.toCharArray(), new PoolingAttributes());

/// Development Repository
WorkRepositoryDbInfo workInfo = new WorkRepositoryDbInfo(WorkRep, new PoolingAttributes());
OdiInstance odiInstance=OdiInstance.createInstance(new OdiInstanceConfig(masterInfo,workInfo));
Authentication auth = odiInstance.getSecurityManager().createAuthentication(Odi_User,Odi_Pass.toCharArray());
odiInstance.getSecurityManager().setCurrentThreadAuthentication(auth);
ITransactionStatus trans = odiInstance.getTransactionManager().getTransaction(new DefaultTransactionDefinition());

//Execution Repository

WorkRepositoryDbInfo workInfo_exec = new WorkRepositoryDbInfo(WorkRep_Execution, new PoolingAttributes());
OdiInstance odiInstance_exec=OdiInstance.createInstance(new OdiInstanceConfig(masterInfo,workInfo_exec));
Authentication auth_exec = odiInstance_exec.getSecurityManager().createAuthentication(Odi_User,Odi_Pass.toCharArray());
odiInstance_exec.getSecurityManager().setCurrentThreadAuthentication(auth_exec);
ITransactionStatus trans_exec = odiInstance_exec.getTransactionManager().getTransaction(new DefaultTransactionDefinition());

        //Export All Scenario by Project
        // Get Project
        project = ((IOdiProjectFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiProject.class)).findByCode(Project_Code);
        ExportServiceImpl export=new ExportServiceImpl(odiInstance);
        EncodingOptions EncdOption = new EncodingOptions();
        System.out.println( " Exporting all Scenario for the Project " +Project_Code);
        export.exportAllScenarii(project, ExportFolderPath, ExportPackageScen, ExportInterfaceScen, ExportProcedureScen, ExportVariableScen, EncdOption, RecursiveExport, OverWriteFile);

        // ( or )

        // Export All Scenario by Folder
        // Find the folder
        Collection<OdiFolder> fold = ((IOdiFolderFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiFolder.class)).findByName(Folder_Name, Project_Code);
        for (Iterator<OdiFolder> it = fold.iterator(); it.hasNext();) {
             folder = (OdiFolder) it.next();
        }

        ExportServiceImpl export=new ExportServiceImpl(odiInstance);
        EncodingOptions EncdOption = new EncodingOptions();
        System.out.println( " Exporting all Scenario for the Project " +Project_Code+ " and Folder "+Folder_Name);
        export.exportAllScenarii(folder, ExportFolderPath, ExportPackageScen, ExportInterfaceScen, ExportProcedureScen, ExportVariableScen, EncdOption, RecursiveExport, OverWriteFile);

        // ( or )

        // Export Selected Scenario based on date

        ExportServiceImpl export=new ExportServiceImpl(odiInstance);
        EncodingOptions EncdOption = new EncodingOptions();

        //Reading all scenario

        Collection odiscen= ((IOdiScenarioFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiScenario.class)).findAll();
        for (Object scen : odiscen) {
            OdiScenario odiscenario =(OdiScenario)scen ;
            if (odiscenario.getLastDate().before(date)) {
                System.out.println(" Exporting scenario  "+odiscenario.getName());
                export.exportToXml(odiscenario, ExportFolderPath, OverWriteFile, RecursiveExport, EncdOption);
            }
        }

        //Importing Scenarios in INSERT_UPDATE Mode
        // The below code import all the scenarios present in the Exported Folder path , so make sure older files are deleted
        ImportServiceImpl importsrvc=new ImportServiceImpl(odiInstance_exec);
        String[] XMLFiles=getXMLFiles(ExportFolderPath).split("n");
        for (String xmlfile : XMLFiles) {
            System.out.println(" Importing scenario  XML "+xmlfile);
            importsrvc.importObjectFromXml(importsrvc.IMPORT_MODE_SYNONYM_INSERT_UPDATE, xmlfile, true);
        }

       // Commit and Close Transaction
       odiInstance.close();
       odiInstance_exec.getTransactionManager().commit(trans_exec);
       odiInstance_exec.close();

    }

    //Reading all the XML Files
    public static String getXMLFiles(String DirectoryName){

        String xmlfiles="";
        String files;
        File folder = new File(DirectoryName);
        File[] listOfFiles = folder.listFiles();
          for (int i = 0; i < listOfFiles.length; i++)
          {
           if (listOfFiles[i].isFile())
           {
           files = listOfFiles[i].getName();
               if (files.endsWith(".xml") || files.endsWith(".XML"))
               {
                   xmlfiles+=DirectoryName+"/"+files+"n";
                }
           }}
        return xmlfiles;
  }

}

Good to see you around and please, keep visiting us!

6 Comments

  1. I have recenlty imported data from one env. to another. While running the Load plan, some of the mapping failed with following error:

    Caused By: com.sunopsis.tools.core.exception.SnpsSimpleMessageException: ODI-17517: Error during task interpretation.
    Task: 9
    java.lang.Exception: BeanShell script error: Sourced file: inline evaluation of: “ if (sUseDbLink.equals(“Y”) && (!sIsSDSDeployed.equals(“Y”))) { out.print(“\n\n . . . ” : Attempt to resolve method: equals() on undefined variable or class name: sUseDbLink : at Line: 1 : in file: inline evaluation of: “ if (sUseDbLink.equals(“Y”) && (!sIsSDSDeployed.equals(“Y”))) { out.print(“\n\n . . . ” : sUseDbLink .equals ( “Y” )
    BSF info: Create view on source at line: 0 column: columnNo
    at com.sunopsis.dwg.codeinterpretor.SnpTaskNameCodeInterpretor.transform(SnpTaskNameCodeInterpretor.java:570)
    at com.sunopsis.dwg.dbobj.SnpSessStep.createTaskLogs(SnpSessStep.java:819)
    at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java:468)
    at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:2093)
    at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:1896)
    at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor$2.doAction(StartScenRequestProcessor.java:580)
    at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:216)
    at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor$StartScenTask.doExecute(StartScenRequestProcessor.java:1068)
    at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:137)
    at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$2.run(DefaultAgentTaskExecutor.java:83)
    at java.lang.Thread.run(Thread.java:662)
    Caused by: org.apache.bsf.BSFException: BeanShell script error: Sourced file: inline evaluation of: “ if (sUseDbLink.equals(“Y”) && (!sIsSDSDeployed.equals(“Y”))) { out.print(“\n\n . . . ” : Attempt to resolve method: equals() on undefined variable or class name: sUseDbLink : at Line: 1 : in file: inline evaluation of: “ if (sUseDbLink.equals(“Y”) && (!sIsSDSDeployed.equals(“Y”))) { out.print(“\n\n . . . ” : sUseDbLink .equals ( “Y” )
    BSF info: Create view on source at line: 0 column: columnNo
    at bsh.util.BeanShellBSFEngine.eval(Unknown Source)
    at bsh.util.BeanShellBSFEngine.exec(Unknown Source)
    at com.sunopsis.dwg.codeinterpretor.SnpTaskNameCodeInterpretor.transform(SnpTaskNameCodeInterpretor.java:556)
    … 10 more
    Text:

    After a reasearch I found out that only those scenario’s which have been regenarated after importing to odi are failing… please reply….

  2. Hi Kshitiz,

    That works, it’s the solution I’m using presently, but to reduce complexity I’d prefer to export the folder. It’s strange that there’s no obvious implementation for this because the functionality is available in ODI Studio already. I’ve decompiled the ExportServiceImpl class and looking at the decompiled code, by playing with some snp classes I could export an array of odi scenarios but I’d prefer not to go down that road :)

    Cheers,
    Alex

  3. Hi Kshitiz,

    Thanks for your reply, unfortunatelly that package refers to load plans and i couldnt find anything related to Scenario Folders in there. I’ve looked in oracle.odi.domain.runtime.scenario and there’s a OdiScenarioFolder there. Playing with it i could enumerate my Load Plans/Scenarios contained in a Scenario Folder. Still the provided ExportServiceImpl.exportAllScenarii wont accept a OdiScenarioFolder as container. So maybe my initial question is a bit more clear now, do you know of any way to use a OdiScenarioFolder as the container for exportAllScenarii ?

    Cheers,
    Alex

    • Alex,
      I think we can loop through each scenario in the ScenarioFolder and export individual XML .
      Please find a sample code which i believe should solve your requirement. If i am able to figure out ExportAllScenario method i will let you ,but i highly doubt so it will work ,since Exportall takes Project or Folder as input .
      Any way please try this and let me know if this works .


      Boolean RecursiveExport = true;
      Boolean OverWriteFile = true;
      String ExportFolderPath="/home/oracle/Documents/ODIExport";

      ExportServiceImpl export=new ExportServiceImpl(odiInstance);
      EncodingOptions EncdOption = new EncodingOptions();

      OdiScenarioFolder Scenfolder=OdiScenarioFolder("FOLDER_NAME");
      Collection odiscen=Scenfolder.getScenarios();
      for (Object scen : odiscen) {
      OdiScenario odiscenario =(OdiScenario)scen ;
      export.exportToXml(odiscenario, ExportFolderPath, OverWriteFile, RecursiveExport, EncdOption);
      }

      Thanks
      Kshitiz

  4. Hi,

    First of all, thatnks for the great intros to the ODI Java SDK.

    Atm I’m trying to automate our export/deploy processes so we can avoid a lot of problems when the client deploys our ODI solution to their environment. Your example of exporting/importing scenarios from a project/folder is a great start but i was curious (and couldn’t find) on how to export a Scenario/LoadPlan folder (so mimic the ODI studio functionality to export a Load Plan and Scenario folder from the Load Plans and Scenarios section of the Designer accordion). Th reason is that sometimes we do incremental releases with a folder of selected scenarios load plans and we don’t want to use solutions for this. So any idea how? My current feeling is that there’s no built functionality to do this in the API and that i will just have to build my own exporter for this (the scenario folders are AbstractOdiEntity…)

    Appreciate your work,
    Alex

Leave a Reply

Required fields are marked *.