package edu.isi.karma.rep; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.codec.digest.DigestUtils; import edu.isi.karma.controller.command.selection.SuperSelectionManager; public class HashValueManager { private static Map<String, Map<String, String>> hashTable = new ConcurrentHashMap<>(); private HashValueManager() { } private static void computeHashValue(Row row, List<String> HNodeIds) { for (String HNodeid : HNodeIds) { Node n = row.getNode(HNodeid); if (n.hasNestedTable()) { Table nestedTable = n.getNestedTable(); for (Row nestedRow : nestedTable.getRows(0, nestedTable.getNumRows(), SuperSelectionManager.DEFAULT_SELECTION)) { List<String> ids = new ArrayList<>(); for (Node node : nestedRow.getNodes()) { ids.add(node.getHNodeId()); } computeHashValue(nestedRow, ids); } } else { Map<String, String> tmp = hashTable.get(row.getId()); if (tmp == null) tmp = new ConcurrentHashMap<>(); String value = n.getValue().asString(); value = DigestUtils.shaHex(value); tmp.put(n.getId(), value); hashTable.put(row.getId(), tmp); } } } public static String getHashValue(Row row, List<String> HNodeIds) { computeHashValue(row, HNodeIds); return getHashValueRecurse(row, HNodeIds); } private static String getHashValueRecurse(Row row, List<String> HNodeIds) { List<String> hashString = new ArrayList<>(); for (String HNodeid : HNodeIds) { Node n = row.getNode(HNodeid); if (n.hasNestedTable()) { Table nestedTable = n.getNestedTable(); for (Row nestedRow : nestedTable.getRows(0, nestedTable.getNumRows(), SuperSelectionManager.DEFAULT_SELECTION)) { List<String> ids = new ArrayList<>(); for (Node node : nestedRow.getNodes()) { ids.add(node.getHNodeId()); } hashString.add(getHashValue(nestedRow, ids)); } } else { Map<String, String> tmp = hashTable.get(row.getId()); hashString.add(tmp.get(n.getId())); } } Collections.sort(hashString); String hash = ""; for (String t : hashString) { hash += t; } return hash; } public static void purgeHashTable() { hashTable.clear(); } public static String getHashValue(Worksheet worksheet, String NodeId, RepFactory factory) { Node node = factory.getNode(NodeId); if (node != null) { return DigestUtils.shaHex(node.getValue().asString()); } return null; } }