package ai.d.ai18; import drjava.util.Log; import drjava.util.StringUtil; import net.luaos.tb.tb15.CentralDatabase; import net.luaos.tb.tb20.Database; import net.luaos.tb.tb20.DatabaseAPI; import net.luaos.tb.tb20.FloraUtil; import net.luaos.tb.tb20.ListEntry; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class GetDiskStats2 { public static void main(String[] args) { DatabaseAPI db = CentralDatabase.copyToMemory("df", "GetDiskStats2"); String dfOutputID1 = "#t1-kokjwjhpwuas-qbtsjoyahagl"; ListEntry dfOutput1 = db.get(dfOutputID1); ListEntry rowMarking = db.oneOfType_flex("RowMarking"); List colMarkings = db.allOfType("ColMarking"); DatabaseAPI db2 = CentralDatabase.copyToMemory("df2", "GetDiskStats2"); ListEntry dfOutput2 = db2.oneOfType_flex("DFOutput"); /* (adapts to differing widths in a table. assumes spaces are used as field separator. looks only at one row.) function adaptColMarkings(text1, text2, rowMarking, colMarkings) row1 = text1.getRow(rowMarking) row2 = text2.getRow(rowMarking) cols1 = findColumns(row1) cols2 = findColumns(row2) newColMarkings = [] for colMarking in colMarkings: idx = cols1.indexOf(colMarking) col2 = cols2.get(idx) add col2 to newColMarkings with label of colMarking end return newColMarkings end */ String row1 = StringUtil.toLines(dfOutput1.desc).get(rowMarking.getInt("textRow")-1); String row2 = StringUtil.toLines(dfOutput2.desc).get(rowMarking.getInt("textRow")-1); List cols1 = findColumns(row1); List cols2 = findColumns(row2); Database dbOut = new Database(); for (ListEntry colMarking : colMarkings) { int idx = findColumn(cols1, colMarking.getPointer("textCol")); if (idx < 0) Log.surprise("Column not found: " + colMarking.desc); else dbOut.emit("ColMarking", colMarking.desc, "onText", dfOutput2.id, "textCol", cols2.get(idx)); } FloraUtil.copyNoRewriting(db2, dbOut); System.out.println("\nResult DB:"); FloraUtil.copyNoRewriting(db, dbOut, rowMarking.id); FloraUtil.printDatabase(dbOut); GetDiskStats.doIt(dbOut, dfOutput2.id); } private static int findColumn(List cols, String textCol) { System.out.println("findColumn " + cols + " " + textCol); String start = textCol.split("\\-")[0]; for (int i = 0; i < cols.size(); i++) { String[] fromTo = cols.get(i).split("\\-"); if (rangeContains(fromTo, start)) return i; } return -1; } private static boolean rangeContains(String[] fromTo, String start) { if (Integer.parseInt(start) < Integer.parseInt(fromTo[0])) return false; if (fromTo[1].equals("end")) return true; else if (fromTo[1].endsWith(" (inc)")) return Integer.parseInt(start) <= Integer.parseInt(fromTo[1].substring(0, fromTo[1].length() - " (inc)".length())); else throw new RuntimeException("Unparsable range end: " + fromTo[1]); } private static List findColumns(String row) { int i = 0; System.out.println("findColumns: " + row); Matcher matcher = Pattern.compile("[^ ]+").matcher(row); List list = new ArrayList(); while (matcher.find()) { int start = matcher.start(), end = matcher.end(); list.add((start+1) + "-" + end + " (inc)"); } return list; } }