- }
-
-
- /**
- * Filters changes:
- * 1. Changes that are not essential for model update (changes that can be found when the models are axcatly the same)
- * 2. Runs custom filters for value changes.
- *
- * @param g
- * @param changes
- * @return
- * @throws DatabaseException
- */
- protected GraphChanges filterChanges(ReadGraph g, GraphChanges changes) throws DatabaseException
- {
-
- List<Pair<Statement,Statement>> modifications = new ArrayList<Pair<Statement,Statement>>();
-
- for (Pair<Statement, Statement> mod : changes.getModifications()) {
-
- boolean accept = true;
- for (ChangeFilter filter : filters) {
- if (!filter.accept(g, mod)) {
- accept = false;
- break;
- }
- }
- if (accept)
- modifications.add(mod);
- }
- GraphChanges newChanges = new GraphChanges(changes.getResource1(),changes.getResource2(),changes.getDeletions(), changes.getAdditions(), modifications, changes.getComparable());
- return newChanges;
- }
-
- public interface ChangeFilter {
- public boolean accept(ReadGraph g, Pair<Statement, Statement> change) throws DatabaseException;
- }
-
-
- protected void createDefaultSelections() {
- for (Entry<Resource, UpdateOp> op : updateTree.getUpdateOps().getResourceMap().entrySet()) {
- UpdateOp op2 = updateTree2.getUpdateOps().getUpdateOp(op.getKey());
- if (op2 == null) {
- op.getValue().select(true);
- }
- }
-
- for (Entry<Statement, UpdateOp> op : updateTree.getUpdateOps().getStatementMap().entrySet()) {
- UpdateOp op2 = updateTree2.getUpdateOps().getUpdateOp(op.getKey());
- if (op2 == null) {
- op.getValue().select(true);
- }
- }
-
- for (Pair<Statement, Statement> pair : updateList.getChanges()) {
- if (pair.first != null) {
- boolean found = false;
- for (Pair<Statement, Statement> pair2 : updateList2.getChanges()) {
- if (pair.first.equals(pair2.first)) {
- found = true;
- break;
- }
- }
- if (!found) {
- updateList.addSelected(pair);
- }
- } else {
- updateList.addSelected(pair);
- }
- }
- }
-
-
-
- /**
- *
- * Filters floating point value changes (default filter is set filter when the change is less than 1%)
- *
- */
- protected class FPValueFilter implements ChangeFilter {
-
- private double percentage = 0.01;
-
- public FPValueFilter() {
-
- }
-
- public FPValueFilter(double percentage) {
- if (percentage < 0.0 || percentage > 1.0)
- throw new IllegalArgumentException("Percentage must be between 0.0 and 1.0.");
- this.percentage = percentage;
- }
-
- @Override
- public boolean accept(ReadGraph g, Pair<Statement, Statement> change) throws DatabaseException {
- //filter floating point values that have less than 1% difference.
- if (!g.hasValue(change.first.getObject()) || !g.hasValue(change.second.getObject()))
- return true;
- Object v1 = g.getValue(change.first.getObject());
- Object v2 = g.getValue(change.second.getObject());
-
- if (v1 instanceof Double && v2 instanceof Double) {
- double d1 = (Double)v1;
- double d2 = (Double)v2;
- if (Math.abs(d1-d2) / Math.max(Math.abs(d1), Math.abs(d2)) < percentage)
- return false;
- } else if (v1 instanceof Float && v2 instanceof Float) {
- float d1 = (Float)v1;
- float d2 = (Float)v2;
- if (Math.abs(d1-d2) / Math.max(Math.abs(d1), Math.abs(d2)) < percentage)
- return false;
- }
-
- return true;
- }
- }
-
-
- private class FilterChangesRead implements Read<GraphChanges> {
- private GraphChanges changes;
- public FilterChangesRead(GraphChanges changes) {
- this.changes = changes;
- }
-
- @Override
- public GraphChanges perform(ReadGraph graph) throws DatabaseException {
- return filterChanges(graph, changes);
- }
- }
-