package org.hadatac.console.controllers.triplestore; import java.io.*; import java.util.*; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.util.Iterator; import java.util.HashSet; import java.util.Collection; import java.util.Map; import java.lang.Object; /* import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.hadatac.console.controllers.AuthApplication; import org.hadatac.console.views.html.dataacquisitionmanagement.dataAcquisitionManagement; import org.hadatac.console.views.html.triplestore.*; import org.hadatac.entity.pojo.DataAcquisition; import org.hadatac.console.models.LabKeyLoginForm; import org.hadatac.console.models.SysUser; import org.hadatac.metadata.loader.MetadataContext; import org.hadatac.metadata.loader.SpreadsheetProcessing; import org.hadatac.metadata.loader.TripleProcessing; import org.hadatac.utils.Feedback; import org.hadatac.utils.NameSpaces; import org.hadatac.utils.State; */ import org.hadatac.entity.pojo.DataAcquisition; import org.hadatac.metadata.loader.TripleProcessing; import org.hadatac.utils.NameSpaces; import org.hadatac.utils.State; import org.hadatac.console.controllers.AuthApplication; import org.hadatac.console.controllers.metadataacquisition.ViewStudy; import org.hadatac.console.models.LabKeyLoginForm; import org.hadatac.console.models.SysUser; import org.hadatac.console.views.html.triplestore.*; import org.labkey.remoteapi.query.*; import org.labkey.remoteapi.CommandException; import org.labkey.remoteapi.Connection; import org.labkey.remoteapi.query.SelectRowsCommand; import org.labkey.remoteapi.query.SelectRowsResponse; import org.json.simple.JSONObject; import org.hadatac.utils.ConfigProp; import play.Play; import play.data.Form; import play.mvc.Controller; import play.mvc.Result; import play.mvc.Http.MultipartFormData; import play.mvc.Http.MultipartFormData.FilePart; public class DiffTool extends Controller { /*public void StoreFunc(ArrayList<ArrayList<String>> a){ ArrayList<ArrayList<String>> table1List_Resultt = new ArrayList<ArrayList<String>>(); return; }*/ public static List<String> diffLoadLists() { System.out.println("Loading List Info for Diff Tool\n"); List<String> final_names = new LinkedList<String>(); Map<String, String[]> name_map = request().body().asFormUrlEncoded(); final_names.addAll(name_map.keySet()); System.out.println("number of lists: " + final_names.size()); for(String name : final_names){ System.out.println(name); //String[] testsi = name_map.get(name); //System.out.println(testsi); } MultipartFormData body = request().body().asMultipartFormData(); return final_names; /*System.out.println("Loading List Info for Diff Tool\n"); List<String> final_names = new LinkedList<String>(); if (list_names.size() == 2){ for(String name : list_names){ final_names.add(name); } } else { System.out.println("Please Select Exactly 2 Folders\n"); } return final_names;*/ } //Used to pull the name and description from the lists private static ArrayList<String> Convert_str(String s, String type){ ArrayList<String>dataArray = new ArrayList<String>() ; if(type.equals("Name") || type.equals("Description")){ StringTokenizer st = new StringTokenizer(s,"\""); int i = 0; while(st.hasMoreElements()){ if(i == 3) { dataArray.add(st.nextElement().toString()); } else { st.nextElement(); } i++; } } return dataArray; } //used to pull just the name of each list private static String Get_Name(String s, String type){ String item = ""; if(type.equals("Name")){ StringTokenizer st = new StringTokenizer(s,"\""); int i = 0; while(st.hasMoreElements()){ if(i == 3) { item = st.nextElement().toString(); } else { st.nextElement(); } i++; } } return item; } //Retrieves both the name and description of each list private static Collection<ArrayList<String>> ConnectToLabkey_List_Manager(String url_name, Connection cn) throws Exception{ SelectRowsCommand cmd = new SelectRowsCommand("ListManager", "ListManager"); cmd.setRequiredVersion(9.1); cmd.setColumns(Arrays.asList("Name", "Description")); cmd.setSorts(Collections.singletonList(new Sort("Name"))); SelectRowsResponse response = cmd.execute(cn, url_name); ////System.out.println("Number of rows: " + response.getRowCount()); List<Map<String,Object>> rows = response.getRows(); int i = 0; Collection<ArrayList<String>> dataArrayM = new ArrayList<ArrayList<String>>() ; Collection <String> dataNameArray = new ArrayList<String>() ; for (Map<String, Object> row : rows) { ArrayList<String>dataArray1 = Convert_str(rows.get(i).get("Name").toString(), "Name"); ArrayList<String>dataArray2 = Convert_str(rows.get(i).get("Description").toString(), "Description"); if(!dataArray2.isEmpty()){ dataArray1.add(dataArray2.get(0)); } dataArrayM.add(dataArray1); dataNameArray.add(Get_Name(rows.get(i).get("Name").toString(), "Name")); i++; } ////System.out.println(dataArrayM); ////System.out.println("\n\n The collection names:"); ////System.out.println(dataNameArray); return dataArrayM; } //Built for getting the headers of the sub-list private static Collection<String> ConnectToLabkey_List(String url_name, String list_name, Connection cn, SelectRowsResponse response) throws Exception{ //SelectRowsCommand cmd = new SelectRowsCommand("lists", list_name); //cmd.setRequiredVersion(9.1); //SelectRowsResponse response = cmd.execute(cn, url_name); //get the header List<Map<String,Object>> rows = response.getColumnModel(); Collection<String> dataArrayH = new ArrayList<String>() ; for (Map<String, Object> row : rows) { dataArrayH.add(row.get("dataIndex").toString()); } return dataArrayH; } //------------------------------------------------------------------------------------------------------------------- private static ArrayList<String> SortAlpha_FromCollection(Collection<String> inputCol){ ArrayList<String> list = new ArrayList<String>(); for (Iterator<String> iter_name = inputCol.iterator(); iter_name.hasNext(); ) { list.add(iter_name.next()); } Collections.sort(list); return list; } /* private static void print_ArrayList(ArrayList<String> inputArr, PrintWriter writer){ //writer.print("\n"); for(int i = 0; i < inputArr.size(); i++){ if(i==0){ writer.print(inputArr.get(i)); } else{ writer.print(", " + inputArr.get(i)); } } writer.print("\n"); return; }*/ //function creates a collection of the lists that appear in both projects private static ArrayList<ArrayList<String>> CombineHeaders(Collection<String> H1, Collection<String> H2, String Schema1, String Schema2){ Collection<String> similar = new HashSet<String>( H1 ); Collection<String> different = new HashSet<String>(); different.addAll( H1 ); different.addAll( H2 ); similar.retainAll( H2 ); different.removeAll( similar ); //sort the array ArrayList<String> similar_list = SortAlpha_FromCollection(similar); /* writer.println("<br"); writer.print("<h3>Similar list names (does not account difference in description):</h3>\n"); if(similar_list.isEmpty()){ System.out.printf("<p>There are no Similarities between the two files</p>\n"); } else{ print_ArrayList(similar_list, writer); } writer.print("\n"); //CompareHeaders(H1, H2, writer, Schema1, Schema2); writer.println("<br>"); */ Collection<String> similar_ = new HashSet<String>( H1 ); Collection<String> different_ = new HashSet<String>(); Collection<String> inMainNotSecond_ = new HashSet<String>(); Collection<String> inSecondNotMain_ = new HashSet<String>(); different_.addAll( H1 ); different_.addAll( H2 ); similar_.retainAll( H2 ); different_.removeAll( similar_ ); inMainNotSecond_.addAll( H1 ); inMainNotSecond_.removeAll( H2); inSecondNotMain_.addAll( H2 ); inSecondNotMain_.removeAll( H1); ArrayList<String> diff_list = SortAlpha_FromCollection(different_); ArrayList<String> main_notSecond_list = SortAlpha_FromCollection(inMainNotSecond_); ArrayList<String> second_notMain_list = SortAlpha_FromCollection(inSecondNotMain_); ArrayList<ArrayList<String>> returnlisty = new ArrayList<ArrayList<String>>(); returnlisty.add(similar_list); returnlisty.add(diff_list); returnlisty.add(main_notSecond_list); returnlisty.add(second_notMain_list); return returnlisty; } //For comparing the list headers private static ArrayList<ArrayList<String>> CompareListCollections(Collection<ArrayList<String>> line1Array, Collection<ArrayList<String>> line2Array, String Schema1, String Schema2){ //Lists With similar names, but different descriptions ArrayList<ArrayList<String>> table1List = new ArrayList<ArrayList<String>>(); //writer.print("<h3>List of values that have the same name, but different descriptions:</h3>\n<table style=\"width:80%\">\n"); //writer.print("<tr><th>" + Schema1 + "</th><th></th><th>        </th><th>" + Schema2 + "</th><th></th></tr>\n"); //writer.print("<tr><th>Name</th><th>Description</th><th></th><th>Name</th><th>Description</th></tr>\n"); for (Iterator<ArrayList<String>> iter1 = line1Array.iterator(); iter1.hasNext(); ) { ArrayList<String> arr_iter1 = iter1.next(); for (Iterator<ArrayList<String>> iter2 = line2Array.iterator(); iter2.hasNext(); ) { ArrayList<String> arr_iter2 = iter2.next(); ArrayList<String> dataArrayTemp = new ArrayList<String>(); if(arr_iter1.size() == 1 || arr_iter2.size() == 1 ){ if(arr_iter1.size() == 1){ if(arr_iter1.get(0).equals(arr_iter2.get(0)) && arr_iter1.size() != arr_iter2.size()) { //writer.println("<tr><td>"+ arr_iter1.get(0) + "</td><td> </td><td></td><td>" + arr_iter2.get(0) + "</td><td>" + arr_iter2.get(1) + "</td></tr>\n"); dataArrayTemp.addAll(Arrays.asList(arr_iter1.get(0), "", arr_iter2.get(1))); table1List.add(dataArrayTemp); } } else if(arr_iter2.size() == 1) { if(arr_iter1.get(0).equals(arr_iter2.get(0)) && arr_iter1.size() != arr_iter2.size()) { //writer.println("<tr><td>"+ arr_iter1.get(0) + "</td><td>" + arr_iter1.get(1) + "</td><td></td><td>" + arr_iter2.get(0) + "</td><td> </td></tr>\n"); dataArrayTemp.addAll(Arrays.asList(arr_iter1.get(0), arr_iter1.get(1), "")); table1List.add(dataArrayTemp); } } } else if( (arr_iter1.get(0).equals(arr_iter2.get(0))) && (!arr_iter1.get(1).equals(arr_iter2.get(1))) ) { //writer.println("<tr><td>"+ arr_iter1.get(0) + "</td><td>"+ arr_iter1.get(1) + "</td><td></td><td>" + arr_iter2.get(0) + "</td><td>" + arr_iter2.get(1) + "</td></tr>\n"); dataArrayTemp.addAll(Arrays.asList(arr_iter1.get(0), arr_iter1.get(1), arr_iter2.get(1))); table1List.add(dataArrayTemp); } } } //writer.print("</table>"); return table1List; } private static ArrayList<ArrayList<String>> CompareHeadersResult(Collection<String> line1Array, Collection<String> line2Array, String Schema1, String Schema2){ Collection<String> similar_ = new HashSet<String>( line1Array ); Collection<String> different_ = new HashSet<String>(); Collection<String> inMainNotSecond_ = new HashSet<String>(); Collection<String> inSecondNotMain_ = new HashSet<String>(); different_.addAll( line1Array ); different_.addAll( line2Array ); similar_.retainAll( line2Array ); different_.removeAll( similar_ ); inMainNotSecond_.addAll( line1Array ); inMainNotSecond_.removeAll( line2Array); inSecondNotMain_.addAll( line2Array ); inSecondNotMain_.removeAll( line1Array); //sort the array ArrayList<String> diff_list = SortAlpha_FromCollection(different_); ArrayList<String> main_notSecond_list = SortAlpha_FromCollection(inMainNotSecond_); ArrayList<String> second_notMain_list = SortAlpha_FromCollection(inSecondNotMain_); ArrayList<ArrayList<String>> returnlisty = new ArrayList<ArrayList<String>>(); returnlisty.add(diff_list); returnlisty.add(main_notSecond_list); returnlisty.add(second_notMain_list); return returnlisty; } //The main function public static Result runDiffTool(List<String> list) throws Exception { /*if(args.length != 4){ System.out.println("ERROR: Incorrect number of arguments"); System.out.println(args[0]); System.out.println("Usage: Schema1, Schema2, Username, Password"); return; } */ String site = ConfigProp.getPropertyValue("labkey.config", "site"); String Schema1 = ""; String Schema2 = ""; if (list.size()==2) { Schema1 = list.get(0); Schema2 = list.get(1); } else { //Schema1 = "CHEAR Development"; //Schema2 = "CHEAR Production"; } String username = session().get("LabKeyUserName"); String password = session().get("LabKeyPassword"); if (username == null || password == null) { redirect(routes.LoadKB.loadLabkeyKB("init", "diff_tool")); } Connection cn = new Connection(site, username, password); //PrintWriter writer = new PrintWriter("./app/org/hadatac/console/views/triplestore/diff_results.scala.html", "UTF-8"); /*PrintWriter writer = new PrintWriter("./app/org/hadatac/console/views/triplestore/diff_results_sample.txt", "UTF-8"); writer.print("@()\n@import helper._\n@import org.hadatac.console.views.html._\n@import org.hadatac.console.controllers.triplestore._\n@import org.hadatac.data.loader._\n@import org.hadatac.metadata.loader._\n@import org.hadatac.utils._\n@import java.net._\n@import play._\n\n@main(\"Diff Tool Results\") {\n"); writer.print("<div class=\"container-fluid\">\n<h1>Diff Tool Results</h1>\n"); writer.println("<style>table, th, td { border: 1px solid black;}th, td {padding: 7px;}</style>");*/ //Map<String, Object> chear_dev_map = connect_chear_dev(); ////PrintWriter data_writer = new PrintWriter("TableDataResults.txt", "UTF-8"); Collection<ArrayList<String>> dataArrayMain = ConnectToLabkey_List_Manager(Schema1, cn); Collection<ArrayList<String>> dataArraySecond = ConnectToLabkey_List_Manager(Schema2, cn); ArrayList<ArrayList<String>> table1List_Result = CompareListCollections(dataArrayMain, dataArraySecond, Schema1, Schema2); // Collection<String> dataArrayH1 = ConnectToLabkey_Retrieve_List_Names(Schema1, cn); // Collection<String> dataArrayH2 = ConnectToLabkey_Retrieve_List_Names(Schema2, cn); Collection<String> dataArrayH1 = new ArrayList<String>(); Collection<String> dataArrayH2 = new ArrayList<String>(); for (Iterator<ArrayList<String>> iter1 = dataArrayMain.iterator(); iter1.hasNext(); ) { ArrayList<String> arr_iter1 = iter1.next(); dataArrayH1.add(arr_iter1.get(0)); } for (Iterator<ArrayList<String>> iter2 = dataArraySecond.iterator(); iter2.hasNext(); ) { ArrayList<String> arr_iter2 = iter2.next(); dataArrayH2.add(arr_iter2.get(0)); } //Collection<String> dataArrayCombined = CombineHeaders(dataArrayH1, dataArrayH2, writer, Schema1, Schema2); ArrayList<ArrayList<String>> fullHeaderResultsLists = CombineHeaders(dataArrayH1, dataArrayH2, Schema1, Schema2); Collection<String> dataArrayCombined = fullHeaderResultsLists.get(0); Map <String, ArrayList<ArrayList<String>>> headerIndividualResults = new HashMap<String, ArrayList<ArrayList<String>>>(); for (Iterator<String> iter = dataArrayCombined.iterator(); iter.hasNext(); ) { String sub_list_name = iter.next(); //writer.print("<h2>List Name: " + sub_list_name + "</h2>\n\n"); SelectRowsCommand cmd = new SelectRowsCommand("lists", sub_list_name); cmd.setRequiredVersion(9.1); //cmd.setSorts(Collections.singletonList(new Sort("Name"))); SelectRowsResponse response1 = cmd.execute(cn, Schema1); SelectRowsResponse response2 = cmd.execute(cn, Schema2); //Header Comparison Collection<String> dataArrayH11 = ConnectToLabkey_List(Schema1,sub_list_name, cn, response1); Collection<String> dataArrayH22 = ConnectToLabkey_List(Schema2,sub_list_name, cn, response2); ArrayList<ArrayList<String>> projectListHeadResult = CompareHeadersResult(dataArrayH11, dataArrayH22, Schema1, Schema2); headerIndividualResults.put(sub_list_name, projectListHeadResult); System.out.println(sub_list_name); //All data comparison /* //List<Map<String,Object>> DataArray_File1Data = dataRetrieve_All(Schema1,sub_list_name, cn, dataArrayH11); List<Map<String,Object>> DataArray_File1Data = response1.getRows(); //List<Map<String,Object>> DataArray_File2Data = dataRetrieve_All(Schema2,sub_list_name, cn, dataArrayH22); List<Map<String,Object>> DataArray_File2Data = response2.getRows(); int [][] table1 = compareData_All(DataArray_File1Data, DataArray_File2Data, dataArrayH11, dataArrayH22); int [][] table2 = compareData_All(DataArray_File2Data, DataArray_File1Data, dataArrayH22, dataArrayH11); data_writer.printf("Schema Name: " + Schema1 + "\t\tList Name: " + sub_list_name + "\n\n"); printDataTable(DataArray_File1Data, dataArrayH11, data_writer, table1); data_writer.println("\n\n\n"); data_writer.printf("Schema Name: " + Schema2 + "\t\tList Name: " + sub_list_name + "\n\n"); printDataTable(DataArray_File2Data, dataArrayH22, data_writer, table2); data_writer.println("\n\n##############################################################################\n\n");*/ } //Iterator< Map.Entry<String, ArrayList<ArrayList<String>>> > headerIndivIter = headerIndividualResults.entrySet().iterator(); //Map <String, ArrayList<ArrayList<String>>> sortedMapIndivResults = new TreeMap<String, ArrayList<ArrayList<String>>>(headerIndividualResults); /*ArrayList<String> list = new ArrayList<String>(); for (Iterator<String> iter_name = inputCol.iterator(); iter_name.hasNext(); ) { list.add(iter_name.next()); } Collections.sort(list);*/ //writer.close(); //data_writer.close() return ok(diff_results.render(list, table1List_Result, fullHeaderResultsLists,headerIndividualResults)); } //public static void updateForm(String alias, List<String> selectedTerms) { public static void updateForm(String alias) { System.out.println("Alias: " + alias); } public static Result index() throws Exception { List<String> lists = diffLoadLists(); if(lists.size() == 2){ //String a; /*runDiffTool(lists); System.out.println("THE PROGRAM HAS STOPPED RUNNING"); return ok(diff_results.render(lists));*/ return runDiffTool(lists); //ArrayList<ArrayList<String>> table1List_Result = runDiffTool(lists).table1List_Result; } else{ return ok("Incorrect number of items checked, please only check two"); } } public static Result postIndex() throws Exception { return index(); } } //TO DO: /* - Set-up the html file to display without the print writer - re-format the java file */