Export.java package com.zeroinllc.xellerate.utils; import java.util.*; import java.io.*; import Thor.API.Exceptions.tcAPIException; import Thor.API.Operations.tcExportOperationsIntf; import Thor.API.tcUtilityFactory; import com.thortech.xl.util.config.ConfigurationClient; /** * Exports Xellerate objects to file. Each object will be exported to its own * XML file. * * Usage: [username] [password] [inputfile] * * Works with Oracle Xellerate IDM 9.0 * * The objects to be exported are listed in an input file in this format: * [category1]=[object-names1] * [category2]=[object-names2] * * Categories are: EntityAdapter, Process, Organization, DataObjectDef, * TaskAdapter, Resource Form, ITResource, UserGroup, Resource, ITResourceDef, * Rule, Process Form, ErrorCode, UserDefinedFields, Lookup, EmailDef, * ScheduleTask, PrepopAdapter * * Example input file: * # Exports the AD task adapters * TaskAdapter = adpAD* * #Exports the AD prepop adapters * PrepopAdapter = adpAD* * * Wild cards ('*') in object names are accepted. * * Exporting each object to its own file allows versioning and diff tools to * function properly. * * (Actually diff tools will not work correctly because the XML is not indented. * Run an xml indenting tool to indent the files. Example tidy usage: tidy -xml * -indent -modify *.xml) * * @author Vinh-An Trinh (vinhant@zerointech.com) */ public class Export { public static void showHelp(tcExportOperationsIntf intf) throws tcAPIException { System.out.println("xelsysadm xelsysadm inputfile"); java.util.Collection cat = intf.retrieveCategories(); System.out.println("Categories: " + cat); } /* * arg[0] : username arg[1] : password (eg xelsysadm) arg[2] : input file */ public static void main(String args[]) { try { Properties jndi = ConfigurationClient.getComplexSettingByPath( "Discovery.CoreServer").getAllSettings(); tcUtilityFactory tcutilityfactory = new tcUtilityFactory(jndi, args[0], args[1]); tcExportOperationsIntf intf = (tcExportOperationsIntf) tcutilityfactory .getUtility("Thor.API.Operations.tcExportOperationsIntf"); if (args.length < 3) { showHelp(intf); return; } String filenameIn = args[2]; boolean verbose = true; BufferedReader in = new BufferedReader(new FileReader(filenameIn)); String line = null; while (null != (line = in.readLine())) { if (line.startsWith("#") || line.trim().length() == 0) continue; int idx = line.indexOf('='); if (idx < 0) { System.out.println("Skipped line : " + line); } String cat = line.substring(0, idx).trim(); String name = line.substring(idx + 1).trim(); if (verbose) System.out.println("Searching for " + cat + " " + name); java.util.Collection coll = intf.findObjects(cat, name); if (verbose) System.out.println("Found: " + coll); // Export one file per object found int i = 0; Iterator it = coll.iterator(); while (it.hasNext()) { Object item = it.next(); // Parse category and object name int idxBegin = item.toString().indexOf("["); int idxEnd = item.toString().indexOf("]", idxBegin); String itemName = removeNonAlphaNum(item.toString() .substring(0, idxBegin - 1)); String itemCategory = removeNonAlphaNum(item.toString() .substring(idxBegin + 1, idxEnd)); String filename = itemCategory + "-" + itemName; Vector tmpVector = new Vector(); tmpVector.add(item); String xml = intf.getExportXML(tmpVector, filename); if (verbose) System.out.println(filename); writeFile(filename + ".xml", xml.getBytes()); i++; } } } catch (Exception ex) { ex.printStackTrace(); } finally { System.exit(0); } } /** * Store the contents of a String in a file. */ static public void writeFile(String name, byte[] contents) { String path = getFilePath(name); FileOutputStream fos = null; try { fos = new FileOutputStream(path); fos.write(contents); } catch (java.io.FileNotFoundException ex) { ex.printStackTrace(); } catch (java.io.IOException ex) { ex.printStackTrace(); } finally { try { if (fos != null) fos.close(); } catch (java.io.IOException e) { } } } /** * Build an absolute path name for a file. Typically used when you want to * write an output file to the "current working directory". * * If the name is already an absolute path we use it, otherwise we use the * system property "user.dir" as the root directory and add the name. */ public static String getFilePath(String name) { String path = null; if (name.charAt(0) == '/' || name.indexOf(":") != -1) { // its an absolute path, just return it path = name; } else { // try relative to user.dir String root = System.getProperty("user.dir"); if (root != null) { path = root + "/" + name; } else { // no obvious way to position it, have to leave // it in the process' current working directory path = name; } } return path; } public static String removeNonAlphaNum(String username) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < username.length(); i++) { char c = username.charAt(i); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { sb.append(c); } } return sb.toString(); } }