/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.hpccsystems.eclguifeatures; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.pentaho.di.core.xml.XMLHandler; //import org.pentaho.di.job.entry.StepMeta; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.util.regex.*; import org.pentaho.di.trans.step.StepMeta; /** * * @author ChambeJX */ public class AutoPopulateSteps { private String[] dataSets; private String[] recordSets; public static Map<String, List<String>> getDefFields(List<StepMeta> jobs){ //each tree parent will be a job node //each tree child will be a field as defined with isdef=true Map<String, List<String>> mapFunctions = new TreeMap<String, List<String>>(); List<String> arlListMath = new ArrayList<String>(); arlListMath.add("child 1"); arlListMath.add("child 2"); arlListMath.add("child 3"); arlListMath.add("child 4"); arlListMath.add("child 5"); arlListMath.add("child 6"); mapFunctions.put("Root Item 0a", arlListMath); List<String> arlListLogical = new ArrayList<String>(); arlListLogical.add("child 1"); arlListLogical.add("child 2"); mapFunctions.put("Root Item 1a", arlListLogical); List<String> arlListString = new ArrayList<String>(); arlListString.add("c1"); arlListString.add("c2"); mapFunctions.put("Root Item 2a", arlListString); return mapFunctions; } public String[] parseDatasetsRecordsets(List<StepMeta> jobs) throws Exception{ System.out.println(" ------------ parseDatasetsRecordsets ------------- "); String datasets[] = null; ArrayList<String> adDS = new ArrayList<String>(); Object[] jec = jobs.toArray(); int k = 0; for(int j = 0; j<jec.length; j++){ //System.out.println("Node(i): " + j + " | " +((StepMeta)jec[j]).getName()); if(!((StepMeta)jec[j]).getName().equalsIgnoreCase("START") && !((StepMeta)jec[j]).getName().equalsIgnoreCase("OUTPUT") && !((StepMeta)jec[j]).getName().equalsIgnoreCase("SUCCESS")){ //System.out.println("Node(k): " + k); //adDS.add((String)((StepMeta)jec[j]).getName()); String xml = ((StepMeta)jec[j]).getXML(); //System.out.println(xml); NodeList nl = (XMLHandler.loadXMLString(xml)).getChildNodes(); for (int temp = 0; temp < nl.getLength(); temp++){ Node nNode = nl.item(temp); String name = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "name") ); String dataset = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "dataset_name") ); String type = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "type") ); String record = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "record_name") ); /* recordsetName recordName datasetName */ String recordsetName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "recordsetName") ); String recordName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "recordName") ); String datasetName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "datasetName") ); //outDS String outDS = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "outDS") ); System.out.println("XMLParse Type: " + type); if(!type.equals("ECLMergePaths") && !type.equals("SPECIAL") && !type.equals("SUCCESS")){ // System.out.println("XML Parse Value: " + name); // System.out.println("XML Parse Value: " + dataset); // System.out.println("XML Parse Value: " + record); // System.out.println("XML Parse Value: " + type); // System.out.println("--"); //if(dataset != null) //adDS.add((String)name); if(dataset != null){ adDS.add((String)dataset); k++; } if(record != null){ adDS.add((String)record); k++; } /* recordsetName recordName datasetName */ if(recordsetName != null){ adDS.add((String)recordsetName); k++; } if(recordName != null){ adDS.add((String)recordName); k++; } if(datasetName != null){ adDS.add((String)datasetName); k++; } //outDS if(outDS != null){ adDS.add((String)outDS); k++; } } //dataset_name //name //type //record_name } //XMLHandler.getNodeValue( // XMLHandler.getSubNode(xml, "attribute_name") // ); } //System.out.println(((StepMeta)jec[j]).getXML()); } //saving the loop code using arraylists datasets = adDS.toArray(new String[k]); return datasets; } public String[] parseDatasets(List<StepMeta> jobs) throws Exception{ //System.out.println(" ------------ parseDataSet ------------- "); String datasets[] = null; ArrayList<String> adDS = new ArrayList<String>(); Object[] jec = jobs.toArray(); int k = 0; for(int j = 0; j<jec.length; j++){ //System.out.println("Node(i): " + j + " | " +((StepMeta)jec[j]).getName()); if(!((StepMeta)jec[j]).getName().equalsIgnoreCase("START") && !((StepMeta)jec[j]).getName().equalsIgnoreCase("OUTPUT") && !((StepMeta)jec[j]).getName().equalsIgnoreCase("SUCCESS")){ //System.out.println("Node(k): " + k); //adDS.add((String)((StepMeta)jec[j]).getName()); String xml = ((StepMeta)jec[j]).getXML(); //System.out.println(xml); NodeList nl = (XMLHandler.loadXMLString(xml)).getChildNodes(); for (int temp = 0; temp < nl.getLength(); temp++){ Node nNode = nl.item(temp); String name = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "name") ); String dataset = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "dataset_name") ); String type = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "type") ); String record = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "record_name") ); String recordset = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "recordset_name") ); /* recordsetName recordName datasetName */ String recordsetName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "recordsetName") ); String recordName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "recordName") ); String datasetName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "datasetName") ); //outDS String outDS = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "outDS") ); System.out.println("XMLParse Type: " + type); if(!type.equals("ECLMergePaths") && !type.equals("SPECIAL") && !type.equals("SUCCESS")){ if(dataset != null && !dataset.equals("")){ adDS.add((String)dataset); k++; } if(record != null && !record.equals("")){ adDS.add((String)record); k++; } if(recordset != null && !recordset.equals("")){ adDS.add((String)recordset); k++; } /* recordsetName recordName datasetName */ if(datasetName != null && !datasetName.equals("")){ adDS.add((String)datasetName); k++; } if(recordName != null && !recordName.equals("")){ adDS.add((String)recordName); k++; } if(recordsetName != null && !recordsetName.equals("")){ adDS.add((String)recordsetName); k++; } //outDS if(outDS != null && !outDS.equals("")){ adDS.add((String)outDS); k++; } } } } //System.out.println(((StepMeta)jec[j]).getXML()); } //saving the loop code using arraylists datasets = adDS.toArray(new String[k]); return datasets; } public String[] parseRecordsets(List<StepMeta> jobs) throws Exception{ System.out.println(" ------------ parseRecordSets ------------- "); String datasets[] = null; ArrayList<String> adDS = new ArrayList<String>(); Object[] jec = jobs.toArray(); int k = 0; if(jec != null){ for(int j = 0; j<jec.length; j++){ //System.out.println("Node(i): " + j + " | " +((StepMeta)jec[j]).getName()); if(!((StepMeta)jec[j]).getName().equalsIgnoreCase("START") && !((StepMeta)jec[j]).getName().equalsIgnoreCase("OUTPUT") && !((StepMeta)jec[j]).getName().equalsIgnoreCase("SUCCESS")){ //System.out.println("Node(k): " + k); //adDS.add((String)((StepMeta)jec[j]).getName()); String xml = ((StepMeta)jec[j]).getXML(); //System.out.println(xml); NodeList nl = (XMLHandler.loadXMLString(xml)).getChildNodes(); for (int temp = 0; temp < nl.getLength(); temp++){ Node nNode = nl.item(temp); String name = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "name") ); String dataset = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "dataset_name") ); String type = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "type") ); String record = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "record_name") ); /* recordsetName recordName datasetName */ String recordsetName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "recordsetName") ); String recordName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "recordName") ); String datasetName = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "datasetName") ); //outDS String outDS = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "outDS") ); System.out.println("XMLParse Type: " + type); if(!type.equals("ECLMergePaths") && !type.equals("SPECIAL") && !type.equals("SUCCESS")){ //if(dataset != null){ // adDS.add((String)dataset); // k++; //} if(record != null && !record.equals("")){ adDS.add((String)record); k++; } } } } } //saving the loop code using arraylists datasets = adDS.toArray(new String[k]); } return datasets; } /* * Gets the Dataset fields from all existing nodes * this function uses fieldsByDatasetList to build a List<String> * then it converts that to a String[] for use in the dialog classes * */ public String[] fieldsByDataset(String datasetName,List<StepMeta> jobs)throws Exception{ System.out.println("***fieldsByDataset***"); String datasets[] = new String[1]; ArrayList<String> adDS = new ArrayList<String>(); this.fieldsByDatasetList(adDS, datasetName,jobs); datasets = adDS.toArray(new String[adDS.size()]); return datasets; } /* * Gets the Dataset fields from all existing nodes * This uses recursion to travel up from joins etc to the * def of the datasets */ public void fieldsByDatasetList(ArrayList<String> adDS, String datasetName,List<StepMeta> jobs)throws Exception{ System.out.println(" ------------ fieldsByDatasetList ------------ "); Object[] jec = jobs.toArray(); int k = 0; if(jec != null){ for(int j = 0; j<jec.length; j++){ //System.out.println("Node(i): " + j + " | " +((StepMeta)jec[j]).getName()); if(!((StepMeta)jec[j]).getName().equalsIgnoreCase("START") && !((StepMeta)jec[j]).getName().equalsIgnoreCase("OUTPUT") && !((StepMeta)jec[j]).getName().equalsIgnoreCase("SUCCESS")){ //System.out.println("Node(k): " + k); //adDS.add((String)((StepMeta)jec[j]).getName()); String xml = ((StepMeta)jec[j]).getXML(); //System.out.println(xml); NodeList nl = (XMLHandler.loadXMLString(xml)).getChildNodes(); for (int temp = 0; temp < nl.getLength(); temp++){ Node nNode = nl.item(temp); String name = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "name") ); String dataset = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "dataset_name") ); String type = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "type") ); String record = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "record_name") ); String recordset = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "recordset_name") ); /* System.out.println("XMLParse Compare Val: "+ datasetName + "~~~~~~~~~"); System.out.println("XMLParse Type: " + type); System.out.println("XMLParse Recordset: " + recordset); System.out.println("XMLParse record: " + record); System.out.println("XMLParse Dataset: " + dataset); System.out.println("XMLParse name: " + name);*/ if(type.equals("ECLDataset") && ((dataset!=null && dataset.equals(datasetName)) || (recordset != null && recordset.equals(datasetName)) || (record != null && record.equals(datasetName)))){ //System.out.println("---------------------ECLDataset----"); String def = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "record_def") ); if(def != null && !def.equals("")){ this.chunkFormat(def,adDS); } }else if(type.equals("ECLJoin") && ( (dataset != null && dataset.equals(datasetName)) || (recordset != null && recordset.equals(datasetName)) || (record != null && record.equals(datasetName)) ) ){ //if it is a sort //well we need to look at the parents so we call this funtion recursivelly //leftRecordSet //System.out.println("------------------------ECLJoin----"); String leftRS = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "left_recordset") ); String rightRS = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "right_recordset") ); this.fieldsByDatasetList(adDS, leftRS, jobs); this.fieldsByDatasetList(adDS, rightRS, jobs); }else if(type.equals("ECLProject") && ((dataset!=null && dataset.equals(datasetName)) || (recordset != null && recordset.equals(datasetName)) || (record != null && record.equals(datasetName)))){ // System.out.println("---------------------ECLProject----"); String def = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "outRecordFormat") ); if(def != null && !def.equals("")){ this.chunkFormat(def,adDS); } //outRecordFormat } //will need to add logic for each type //dataset_name //name //type //record_name } } //System.out.println(((StepMeta)jec[j]).getXML()); } } System.out.println("finished parsing"); } private void chunkFormat(String def, List<String> adDS){ if(def != null && !def.equals("")){ // System.out.println("has def"); String[] pieces = def.split("\n"); for (int p = pieces.length - 1; p >= 0; p--) { // System.out.println("" + (String)pieces[p].trim()); Pattern pattern = Pattern.compile("[ ;]+",Pattern.CASE_INSENSITIVE); String peice = (String)pieces[p].trim(); String[] chunks = pattern.split(peice); // System.out.println("Chunks lenght " + chunks.length); if(chunks.length >= 2 && chunks[1]!=null){ adDS.add(chunks[1]); } } } } private String[] mergeArray(String[] a1, String[] a2){ System.out.println(" ------------ mergeArray ------------- "); String[] out = new String[a1.length+a2.length]; System.arraycopy(a1, 0, out, 0, a1.length); System.arraycopy(a1, 0, out, a1.length, a2.length); return out; } public String getGlobalVariable(List<StepMeta> steps, String ofType) throws Exception{ System.out.println(" ------------ getGlobalVariable ------------- "); String datasets[] = null; ArrayList<String> adDS = new ArrayList<String>(); String out = ""; Object[] jec = steps.toArray(); int k = 0; if(jec != null){ for(int j = 0; j<jec.length; j++){ //System.out.println("Node(i): " + j + " | " +((StepMeta)jec[j]).getName()); //if( ((StepMeta)jec[j]).getName().equalsIgnoreCase("ECLGlobalVariables") ){ //System.out.println("Node(k): " + k); //adDS.add((String)((StepMeta)jec[j]).getName()); String xml = ((StepMeta)jec[j]).getXML(); // System.out.println(xml); NodeList nl = (XMLHandler.loadXMLString(xml)).getChildNodes(); for (int temp = 0; temp < nl.getLength(); temp++){ Node nNode = nl.item(temp); String type = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "type") ); // System.out.println("Type: " + type); if(type.equalsIgnoreCase("ECLGlobalVariablesStep")){ // System.out.println("match"); if(ofType.equalsIgnoreCase("server_ip")){ out = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "server_ip") ); } if(ofType.equalsIgnoreCase("server_port")){ out = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "server_port") ); } if(ofType.equalsIgnoreCase("landing_zone")){ out = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "landing_zone") ); } if(ofType.equalsIgnoreCase("cluster")){ out = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "cluster") ); } if(ofType.equalsIgnoreCase("jobName")){ out = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "jobName") ); } if(ofType.equalsIgnoreCase("eclccInstallDir")){ out = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "eclccInstallDir") ); } if(ofType.equalsIgnoreCase("mlPath")){ out = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "mlPath") ); } if(ofType.equalsIgnoreCase("includeML")){ out = XMLHandler.getNodeValue( XMLHandler.getSubNode(nNode, "includeML") ); } } } // } } //saving the loop code using arraylists datasets = adDS.toArray(new String[k]); } return out; } }