ODI SDK gives ODI 11g a big edge and a large possibility of automation , smarter coding and cut down in development time . In this post I am going to use Eclipse to configure and setup the the SDK so we can start writing faster and smarter codes. Although there are many other tools to do the job , its just my preference and ease of use which made me use eclipse and write this post.
Setup Eclipse
Weblogic comes with Oracle Enterprise pack for Eclipse else you can Download the Eclipse Classic –http://www.eclipse.org/downloads/
Once Download , Extract the folder and double click the Eclipse.exe and you will be prompted for a Workspace folder. You can use the default or Create a new Folder use as the workspace.
Workspace is where Eclipse stores all the projects.
Now click on the icon as shown in the image and click on the Project .
Select Java Project and click Next
Provide a Project Name and eclipse would automatically select the default JRE in case it doesn’t you can click on Configure JREs and select the java folder . Finally click Next.
Go to the Libraries tab and click on the Add External JAR
Add JAR Files
Go and find the folder in oracledi.sdklib and select all the jar files under this folder. Although the main jar is odi-core.jar but it have some link with other jar inside and in order to avoid the confusion I have just selected all the jar inside the folder .
For my example the directory is – >
C:OracleMiddlewareOracle_ODI1oracledi.sdklib
Apart from the above jar files , we also need to include the database jar file where the ODI repository resides. For my example ODI Master and Work repository is on Oracle 11.2 version so ojdbc6.jar file .
Finally click the Finish button. Now we are ready to start our coding .
Creating First Code
Lets start creating out First piece of Code. Our first piece of code is to create a Project and a Folder.
To do so , Right click on Folder and select New and then Class
I have created a package called odi.sdk , you can use the main src or create a separate package which is recommended.
Provide the Class Name and select the option as show in the below image
copy paste this standard codes as this code will be the main skeleton for all ODI SDK development after this
public static void main (String [] args ) { << paste the below codes and change the connection credentials >> }
final SimpleOdiInstanceHandle odiInstanceHandle = SimpleOdiInstanceHandle.create ("jdbc:oracle:thin:@localhost:1521:XE", "oracle.jdbc.OracleDriver", "ODI_MASTER_11G", "ODI_MASTER_11G", "WORKREP1", "SUPERVISOR", "SUNOPSIS"); // Allocate an odisinstance of the name final OdiInstance odiInstance = odiInstanceHandle.getOdiInstance(); try { TransactionTemplate tx = new TransactionTemplate(odiInstance.getTransactionManager()); tx.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(ITransactionStatus pStatus) { /* * << ODI SDK Codes goes here >> */ } }); } finally { odiInstanceHandle.release(); }
For ODI 11.1.1.3 and later
/****** Please change these Parameters *********/ 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"; // Connection MasterRepositoryDbInfo masterInfo = new MasterRepositoryDbInfo(Url, Driver, Master_User,Master_Pass.toCharArray(), new PoolingAttributes()); 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()); /* * << ODI SDK Codes goes here >> */ // Finally close the Instance odiInstance.getTransactionManager().commit(trans); odiInstance.close();
As you can see some read mark on some of the codes and that is because we have not imported the required java libraries .
Importing library is just a matter of click now. Just place your mouse on the red underlined code . you will see options as shown in the image . Now click on the Import SimpleOdiInstanceHandle. Keep doing so for other underlined codes and eclipse will import automatically .
After doing that as you can see that eclipse has neatly and smartly import the required libraries.
Now go and change the connection properties and change it accordingly to connect to your Master and Work Repository.
Lets first make sure if we are connected and we can start playing around with more ODI SDK codes.
In order to test the connection and if I am connected I always use this code to test it .
OdiTechnology oracleTechnology =((IOdiTechnologyFinder)odiInstance.getTransactionalEntityManager(). getFinder(OdiTechnology.class)).findByCode("ORACLE"); System.out.println(oracleTechnology.getName());
As you can see the output will be like this , which mean the credentials are correct and now we are ready to write more codes.
Creating Project, Folder and Context
Lets start with creating a Project , Folder and Context and setting the Context as Default.
Also you would need this API document in better understanding arguments to be passed.
http://download.oracle.com/docs/cd/E14571_01/apirefs.1111/e17060/toc.htm
OdiProject proj = new OdiProject("XMT", "XMT"); //OdiProject(java.lang.String pName, java.lang.String pCode) OdiContext context=new OdiContext("XMT"); //OdiContext(java.lang.String pCode) context.setDefaultContext(true);
Searching the Classes
Lets see how to find the required class .
To search go to the above link (http://download.oracle.com/docs/cd/E14571_01/apirefs.1111/e17060/toc.htm ) and press find depending on your browser and type odiproject and browser will show the required alternative and click the class you were looking for .
As you can see for this example i searched for odiproject and found the class OdiProject and on the right side i can see all the Methods and Constructor and use the same in writing the SDK codes.
The Constructor of the OdiProject is
OdiProject(java.lang.String pName, java.lang.String pCode).
Here i am replacing the Name and code with XMT and so the codes will be
- OdiProject proj = new OdiProject(“XMT”, “XMT”);
The Constructor for OdiContext is OdiContext(java.lang.String pCode)
- OdiContext context=new OdiContext(“XMT”);
I also wanted to see the new context as the default context , so add the method setDefaultContext(boolean);
- context.setDefaultContext(true);
Eclipse can help you in writing the arguments .
Eclipse will show more method once you press (period) and as show in the below image, but we always need the help of the API so we can pass the correct arguments.
Lets Execute the code and lets see if the codes have been reflected in the ODI .
Its blank . hmm so we are missing something . We are missing the Persist .
Persist is like saving the codes into the Repository, so make sure we add the persist as required .
Lets add the persist and run it again.
As you can see the execution got successful and we can see the Project, Folder and Context in the ODI Designer.
IFinder
IFinder is used to find different ODI objects according to ODI object and there are different IFinder to find the respective ODI objects
For Ex – IOdiCKMFinder, IOdiColumnFinder, IOdiConditionFinder, IOdiContextFinder, IOdiContextualAgentMappingFinder, IOdiContextualSchemaMappingFinder
Writing the IFinder codes are very easy . Let me share with you the technique i use.
project = ((IOdiProjectFinder)odiInstance.getTransactionalEntityManager().getFinder(OdiProject.class))
Have a default template as shown above and accordingly change the Object type . Lets say if i want to search for OdiFolder
Replace the OdiProjectFinder to OdiFolderFinder and
OdiProject.class to OdiFolder.class and replace the variable project to folder etc.
Lets look at this simple example where I am using the IOdiProjectFinder to list all the project in the work repository.
// List all the projects Object[] project = ((IOdiProjectFinder)odiInstance.getTransactionalEntityManager(). getFinder(OdiProject.class)).findAll().toArray(); for ( int i =0 ;i <project.length ; i++ ) { OdiProject pro1=(OdiProject) project[i]; // We need to cast the object project accordingly, for this example OdiProject System.out.println("Project Name "+pro1.getName()); } // (or) for (Object object : project) { OdiProject pro2=(OdiProject) object; // Here i am casting the object as OdiProject System.out.println("Project Name "+pro2.getName()); } //Reading the List of the Folder under a Project // Collection fold1 = ((IOdiFolderFinder)odiInstance.getTransactionalEntityManager(). getFinder(OdiFolder.class)).findByProject("XMT"); for (Iterator iterator = fold1.iterator(); iterator.hasNext();) { OdiFolder object = (OdiFolder) iterator.next(); System.out.println("Folder Name "+object.getName()); }
Eclipse can help to write the for loop too.
To do so
type – for and press ( control + space keys ) and eclipse will show automatically the option and since we are writing for the collection select the required for loop and change the Object to OdiFolder .
Creating Data Server , Physical Schema and Logical Schema .
// Create a Data Server , Physical Schema, Logical Schema // First lets make sure if we have the Oracle Technology OdiTechnology oracleTechnology = ((IOdiTechnologyFinder) odiInstance .getTransactionalEntityManager().getFinder(OdiTechnology.class)).findByCode("ORACLE"); // using the IOdiTechnologyFinder to finder the required technology if (oracleTechnology != null) { oracleDataServer = new OdiDataServer(oracleTechnology,"ORCL_TARGET"); // connection settings //Providing the Url and Driver oracleDataServer.setConnectionSettings(new OdiDataServer.JdbcSettings( "jdbc:oracle:thin:@localhost:1521:orcl", "oracle.jdbc.driver.OracleDriver")); // UserName and Password oracleDataServer.setUsername("HR"); oracleDataServer.setPassword(ObfuscatedString.obfuscate("HR")); // ObfuscatedString.obfuscate will save the password in the encrypted format } // Creating a New Physical Schema OdiPhysicalSchema oraclePhysicalSchema = new OdiPhysicalSchema(oracleDataServer); // Set additional information on the schema oraclePhysicalSchema.setSchemaName("HR"); oraclePhysicalSchema.setWorkSchemaName("ODI_TEMP_11G"); // Create the logical schema and the mapping to it in the context OdiLogicalSchema oracleLogicalSchema = new OdiLogicalSchema(oracleTechnology, "HR"); new OdiContextualSchemaMapping(context,oracleLogicalSchema, oraclePhysicalSchema); // Saving the Data Server , Physical and Logical Schema in ODI odiInstance.getTransactionalEntityManager().persist(oracleTechnology);
As we have mentioned before we need API documentation to pass the correct arguments . After execution of the above codes
as you can see that Data Server , Physical and Logical schema is created and the connection is successful.
This post was more about getting started with ODI SDK codes and as odiexperts have always tried to provide the easy tutorial to make ODI an easy experience and this post was meant to get started with configuration and setup of ODI SDK in eclipse to write more easy and fun SDK codes.
More SDK codes are coming soon. 🙂
The Complete code
package odi.sdk; import oracle.odi.core.OdiInstance; import oracle.odi.core.persistence.transaction.ITransactionStatus; import oracle.odi.core.persistence.transaction.support.TransactionCallbackWithoutResult; import oracle.odi.core.persistence.transaction.support.TransactionTemplate; import oracle.odi.domain.project.OdiFolder; import oracle.odi.domain.project.OdiProject; import oracle.odi.domain.topology.OdiContext; import oracle.odi.domain.topology.OdiContextualSchemaMapping; import oracle.odi.domain.topology.OdiDataServer; import oracle.odi.domain.topology.OdiLogicalSchema; import oracle.odi.domain.topology.OdiPhysicalSchema; import oracle.odi.domain.topology.OdiTechnology; import oracle.odi.domain.topology.finder.IOdiTechnologyFinder; import oracle.odi.domain.util.ObfuscatedString; import oracle.odi.publicapi.samples.SimpleOdiInstanceHandle; public class MyFirstSKDCode { private static OdiDataServer oracleDataServer; protected static String pStringToObfuscate; protected static OdiContext context; /** * @param args */ public static void main(String[] args) { final SimpleOdiInstanceHandle odiInstanceHandle = SimpleOdiInstanceHandle .create("jdbc:oracle:thin:@localhost:1521:orcl", "oracle.jdbc.OracleDriver", "ODI_MASTER_11G", "ODI_MASTER_11G", "WORKREP1", "SUPERVISOR", "SUNOPSIS"); final OdiInstance odiInstance = odiInstanceHandle.getOdiInstance(); try { TransactionTemplate tx = new TransactionTemplate(odiInstance.getTransactionManager()); tx.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(ITransactionStatus pStatus) { // // ODI SDK Codes goes here // OdiProject proj = new OdiProject("XMT", "XMT"); OdiContext context = new OdiContext("XMT"); // New Context context.setDefaultContext(true); // Creating a New Folder OdiFolder fold = new OdiFolder(proj, "FOLDER"); // Persist Project and Context odiInstance.getTransactionalEntityManager().persist(proj); odiInstance.getTransactionalEntityManager().persist(context); // create a Data Server , Physical Schema, Logical Schema // First lets make sure if we have the Oracle Technology OdiTechnology oracleTechnology = ((IOdiTechnologyFinder) odiInstance .getTransactionalEntityManager().getFinder( OdiTechnology.class)).findByCode("ORACLE"); if (oracleTechnology != null) { oracleDataServer = new OdiDataServer(oracleTechnology,"ORCL_TARGET"); // connection settings oracleDataServer.setConnectionSettings(new OdiDataServer.JdbcSettings( "jdbc:oracle:thin:@localhost:1521:orcl","oracle.jdbc.driver.OracleDriver")); // UserName and Password oracleDataServer.setUsername("HR"); oracleDataServer.setPassword(ObfuscatedString.obfuscate("HR")); } // Creating a New Physical Schema OdiPhysicalSchema oraclePhysicalSchema = new OdiPhysicalSchema( oracleDataServer); // Set additional information on the schema oraclePhysicalSchema.setSchemaName("HR"); oraclePhysicalSchema.setWorkSchemaName("ODI_TEMP_11G"); // Create the logical schema and the mapping to it in the // context OdiLogicalSchema oracleLogicalSchema = new OdiLogicalSchema(oracleTechnology, "HR"); new OdiContextualSchemaMapping(context,oracleLogicalSchema, oraclePhysicalSchema); // Persist the Data Server , Physical and Logical Schema odiInstance.getTransactionalEntityManager().persist(oracleTechnology); System.out.println("Done"); } }); } finally { odiInstanceHandle.release(); } } }
17 Comments
Leave a reply →