@Override public void doRows(Parse rows) { try { bindColumnHeadersToMethodsAndFields(rows.parts); results = query(); match(list(rows.more), list(results), 0); Parse last = rows.last(); last.more = buildRows(surplus.toArray()); mark(last.more, "surplus"); mark(missing.iterator(), "missing"); } catch (Exception e) { exception(rows.leaf(), e); } }
protected void match(List<?> expected, List<?> computed, int col) { if (col >= columnBindings.length) { check(expected, computed); } else if (columnBindings[col] == null) { match(expected, computed, col + 1); } else { Map<Object, Object> eMap = eSort(expected, col); Map<Object, Object> cMap = cSort(computed, col); Set<Object> keys = union(eMap.keySet(), cMap.keySet()); for (Object key : keys) { List<?> eList = (List<?>) eMap.get(key); List<?> cList = (List<?>) cMap.get(key); if (eList == null) { surplus.addAll(cList); } else if (cList == null) { missing.addAll(eList); } else if (eList.size() == 1 && cList.size() == 1) { check(eList, cList); } else { match(eList, cList, col + 1); } } } }
public void doRows(Parse rows) { try { bind(rows.parts); results = query(); match(list(rows.more), list(results), 0); Parse last = rows.last(); last.more = buildRows(surplus.toArray()); mark(last.more, "surplus"); mark(missing.iterator(), "missing"); } catch (Exception e) { exception (rows.leaf(), e); } }
protected Map eSort(List<Parse> list, int col) { TypeAdapter a = columnBindings[col]; Map result = new HashMap(list.size()); for (Iterator<Parse> i=list.iterator(); i.hasNext(); ) { Parse row = i.next(); Parse cell = row.parts.at(col); try { Object key = a.parse(cell.text()); bin(result, key, row); } catch (Exception e) { exception(cell, e); for (Parse rest=cell.more; rest!=null; rest=rest.more) { ignore(rest); } } } return result; }
protected Parse buildCells(Object row) { if (row == null) { Parse nil = new Parse("td", "null", null, null); nil.addToTag(" colspan=" + columnBindings.length); return nil; } Parse root = new Parse(null, null, null, null); Parse next = root; for (Binding columnBinding : columnBindings) { next = next.more = new Parse("td", " ", null, null); TypeAdapter a = columnBinding.adapter; if (a == null) { ignore(next); } else { try { a.target = row; next.body = gray(escape(a.toString(a.get()))); } catch (Exception e) { exception(next, e); } } } return root.more; } }
protected Parse buildCells(Object row) { if (row == null) { Parse nil = new Parse("td", "null", null, null); nil.addToTag(" colspan="+columnBindings.length); return nil; } Parse root = new Parse(null, null, null, null); Parse next = root; for (int i=0; i<columnBindings.length; i++) { next = next.more = new Parse("td", " ", null, null); TypeAdapter a = columnBindings[i]; if (a == null) { ignore (next); } else { try { a.target = row; info(next, a.toString(a.get())); } catch (Exception e) { exception(next, e); } } } return root.more; } }
protected Parse buildRows(Object[] rows) { Parse root = new Parse(null, null, null, null); Parse next = root; for (Object row : rows) { next = next.more = new Parse("tr", null, buildCells(row), null); } return root.more; }
protected Map cSort(List list, int col) { TypeAdapter a = columnBindings[col]; Map result = new HashMap(list.size()); for (Iterator<?> i=list.iterator(); i.hasNext(); ) { Object row = i.next(); try { a.target = row; Object key = a.get(); bin(result, key, row); } catch (Exception e) { // surplus anything with bad keys, including null surplus.add(row); } } return result; }
protected void check(List<?> eList, List<?> cList) { if (eList.isEmpty()) { surplus.addAll(cList); return; } if (cList.isEmpty()) { missing.addAll(eList); return; } Parse row = (Parse) eList.remove(0); Parse cell = row.parts; Object obj = cList.remove(0); for (int i = 0; i < columnBindings.length && cell != null; i++) { TypeAdapter a = columnBindings[i].adapter; if (a != null) { a.target = obj; } check(cell, a); cell = cell.more; } check(eList, cList); }
protected Map<Object, Object> eSort(List<?> list, int col) { TypeAdapter a = columnBindings[col].adapter; Map<Object, Object> result = new HashMap<>(list.size()); for (Object o : list) { Parse row = (Parse) o; Parse cell = row.parts.at(col); try { Object key = a.parse(cell.text()); bin(result, key, row); } catch (Exception e) { exception(cell, e); for (Parse rest = cell.more; rest != null; rest = rest.more) { ignore(rest); } } } return result; }
protected Parse buildCells(Object row) { if (row == null) { Parse nil = new Parse("td", "null", null, null); nil.addToTag(" colspan=" + columnBindings.length); return nil; } Parse root = new Parse(null, null, null, null); Parse next = root; for (Binding columnBinding : columnBindings) { next = next.more = new Parse("td", " ", null, null); TypeAdapter a = columnBinding.adapter; if (a == null) { ignore(next); } else { try { a.target = row; next.body = gray(escape(a.toString(a.get()))); } catch (Exception e) { exception(next, e); } } } return root.more; } }
protected Parse buildRows(Object[] rows) { Parse root = new Parse(null ,null, null, null); Parse next = root; for (int i=0; i<rows.length; i++) { next = next.more = new Parse("tr", null, buildCells(rows[i]), null); } return root.more; }
protected Map<Object, Object> cSort(List<?> list, int col) { TypeAdapter a = columnBindings[col].adapter; Map<Object, Object> result = new HashMap<>(list.size()); for (Object row : list) { try { a.target = row; Object key = a.get(); bin(result, key, row); } catch (Exception e) { // surplus anything with bad keys, including null surplus.add(row); } } return result; }
protected void check (List<Parse> eList, List<Parse> cList) { if (eList.size()==0) { surplus.addAll(cList); return; } if (cList.size()==0) { missing.addAll(eList); return; } Parse row = eList.remove(0); Parse cell = row.parts; Object obj = cList.remove(0); for (int i=0; i<columnBindings.length && cell!=null; i++) { TypeAdapter a = columnBindings[i]; if (a != null) { a.target = obj; } check(cell, a); cell = cell.more; } check (eList, cList); }
@Override public void doRows(Parse rows) { try { bindColumnHeadersToMethodsAndFields(rows.parts); results = query(); match(list(rows.more), list(results), 0); Parse last = rows.last(); last.more = buildRows(surplus.toArray()); mark(last.more, "surplus"); mark(missing.iterator(), "missing"); } catch (Exception e) { exception(rows.leaf(), e); } }
protected void match(List<?> expected, List<?> computed, int col) { if (col >= columnBindings.length) { check(expected, computed); } else if (columnBindings[col] == null) { match(expected, computed, col + 1); } else { Map<Object, Object> eMap = eSort(expected, col); Map<Object, Object> cMap = cSort(computed, col); Set<Object> keys = union(eMap.keySet(), cMap.keySet()); for (Object key : keys) { List<?> eList = (List<?>) eMap.get(key); List<?> cList = (List<?>) cMap.get(key); if (eList == null) { surplus.addAll(cList); } else if (cList == null) { missing.addAll(eList); } else if (eList.size() == 1 && cList.size() == 1) { check(eList, cList); } else { match(eList, cList, col + 1); } } } }
protected Map<Object, Object> eSort(List<?> list, int col) { TypeAdapter a = columnBindings[col].adapter; Map<Object, Object> result = new ConcurrentHashMap<>(list.size()); for (Object o : list) { Parse row = (Parse) o; Parse cell = row.parts.at(col); try { Object key = a.parse(cell.text()); bin(result, key, row); } catch (Exception e) { exception(cell, e); for (Parse rest = cell.more; rest != null; rest = rest.more) { ignore(rest); } } } return result; }
protected Parse buildRows(Object[] rows) { Parse root = new Parse(null, null, null, null); Parse next = root; for (Object row : rows) { next = next.more = new Parse("tr", null, buildCells(row), null); } return root.more; }