/* Create an ODI procedure. Set the technology to "Groovy" Paste the code below in the "command on target" field Update the connectivity parameters and project / folder / interface names Save and run with a standalone agent */ import oracle.odi.core.OdiInstance import oracle.odi.core.config.OdiInstanceConfig import oracle.odi.core.config.MasterRepositoryDbInfo import oracle.odi.core.config.WorkRepositoryDbInfo import oracle.odi.core.security.Authentication import oracle.odi.core.config.PoolingAttributes import oracle.odi.domain.project.OdiProject import oracle.odi.domain.project.finder.IOdiProjectFinder import oracle.odi.domain.project.finder.IOdiFolderFinder import oracle.odi.domain.project.finder.IOdiInterfaceFinder import oracle.odi.domain.model.finder.IOdiDataStoreFinder import oracle.odi.domain.topology.finder.IOdiContextFinder import oracle.odi.domain.project.OdiFolder import oracle.odi.domain.project.OdiInterface import oracle.odi.domain.project.interfaces.DataSet import oracle.odi.domain.model.OdiDataStore import oracle.odi.domain.topology.OdiContext import oracle.odi.core.persistence.transaction.ITransactionStatus import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition import oracle.odi.interfaces.TargetIsTemporaryException import oracle.odi.interfaces.basic.NoSourceSetException import oracle.odi.interfaces.basic.support.BasicInterfaceCreationHelperWithActionsHelper import oracle.odi.interfaces.interactive.support.actions.InterfaceActionOnTargetDataStoreComputeAutoMapping import oracle.odi.interfaces.interactive.support.InteractiveInterfaceHelperWithActions import oracle.odi.interfaces.interactive.support.actions.InterfaceActionAddSourceDataStore import oracle.odi.interfaces.interactive.support.actions.InterfaceActionSetTargetDataStore import oracle.odi.interfaces.interactive.support.aliascomputers.AliasComputerDoubleChecker import oracle.odi.interfaces.interactive.support.clauseimporters.ClauseImporterLazy import oracle.odi.interfaces.interactive.support.mapping.automap.AutoMappingComputerLazy import oracle.odi.interfaces.interactive.support.mapping.matchpolicy.MappingMatchPolicyLazy import oracle.odi.interfaces.interactive.support.targetkeychoosers.TargetKeyChooserPrimaryKey import java.util.Collection import java.io.* /* ----------------------------------------------------------------------------------------- Parse the list od all projects and folders (no sub folders). List all interfaces. Modify a value in the interface(s) Save the change(s) ----------------------------------------------------------------------------------------- */ /* -------- Begin update section Replace the follwing values with your connectivity information. Alternatively, you can use ODI substitution APIs to fill in these parameters dynamically ----------- */ def url = "jdbc:oracle:thin:@localhost:1521:orcl" /*Master Repository: JDBC URL */ def driver = "oracle.jdbc.OracleDriver" /*Master Repository: JDBC driver */ def schema = "ODIM1115" /*Master Repository: Database user for schema access*/ def schemapwd = "ODIM1115PWD" /*Master Repository JDBC URL */ def workrep = "WORKREP1" /*Name of the Work Repository */ def odiuser= "SUPERVISOR" /* ODI User name used to connect to the repositories */ def odiuserpwd = "SUNOPSIS" /* ODI User password to connect to the repositories */ /* Replace the following with your own project name, folder name and interface name You can also easily adapt the code to modify more than one interface... */ def projectName = "Real Life" def folder = "First Folder" /*Folder Name*/ def interf = "0. LoadRoot" /* -------- End of update section ----------- */ def masterInfo = new MasterRepositoryDbInfo(url, driver, schema, schemapwd.toCharArray(), new PoolingAttributes()) def workInfo = new WorkRepositoryDbInfo(workrep, new PoolingAttributes()) def odiInstance = OdiInstance.createInstance(new OdiInstanceConfig(masterInfo, workInfo)) def auth = odiInstance.getSecurityManager().createAuthentication(odiuser, odiuserpwd.toCharArray()) odiInstance.getSecurityManager().setCurrentThreadAuthentication(auth) def txnDef = new DefaultTransactionDefinition() def tm = odiInstance.getTransactionManager() def txnStatus = tm.getTransaction(txnDef) /*parse the list of all projects print all project names and codes save the list of folders for the selected project */ def odiProjectsList = (odiInstance.getTransactionalEntityManager().findAll(OdiProject.class)) for (p in odiProjectsList) { /* look for a match on project name - if found,store the matching code and retrieve the list of folders for that project*/ if (p.getName().equals(projectName)){ project=p.getCode() odiFoldersList = p.getFolders() println('Project name: ' + p.getName() + ' \t +++ Code:' + p.getCode()) } println('Project name: ' + p.getName() + ' \t +++ Code:' + p.getCode()) } /* Retrieve the folders names and interface names for all folders found in the project*/ println "\nList of folders and interfaces for project " + projectName for (f in odiFoldersList) { folder= f.getName() OdiInterfacesList = ((IOdiInterfaceFinder)odiInstance.getTransactionalEntityManager().getFinder(OdiInterface.class)).findByProject(project, folder) println("*** Listing all interfaces for Folder " + folder) for (i in OdiInterfacesList) { interfaceName=i.getName() println(i.getName()) /* ---- Here we are making the change on a single interface called "0. Load Root". Using the same logic, you could easily make massive change to all interfaces ---- */ if (interfaceName.equals(interf)){ if (!i.stagingArea.isOnTarget()) { i.stagingArea.setOnTarget(true) println "*** Corrected staging area to be on Target *** " odiInstance.getTransactionalEntityManager().persist(i) }else{ println "*** Already on Target *** " } } } } tm.commit(txnStatus)