import java.util.Collection;
import java.util.HashSet;
import java.util.List;
+import java.util.Map.Entry;
import java.util.Stack;
import org.eclipse.jface.resource.ImageDescriptor;
import org.simantics.db.WriteGraph;
import org.simantics.db.common.request.WriteRequest;
import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.exception.DoesNotContainValueException;
-import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;
-import org.simantics.db.exception.ServiceException;
import org.simantics.db.layer0.util.Layer0Utils;
import org.simantics.db.request.Read;
import org.simantics.interop.test.GraphChanges;
import org.simantics.interop.test.GraphComparator;
import org.simantics.interop.update.Activator;
+import org.simantics.interop.update.model.UpdateList;
import org.simantics.interop.update.model.UpdateNode;
import org.simantics.interop.update.model.UpdateNode.Status;
import org.simantics.interop.update.model.UpdateOp;
private GraphChanges changes;
private UpdateTree updateTree;
+ private UpdateList updateList;
+
+ private GraphChanges changes2;
+ private GraphChanges changes3;
+ private UpdateTree updateTree2;
+ private UpdateList updateList2;
private Button updateAllButton;
private Button updateSelectedButton;
private Color containsColor;
private Color deletedColor;
private Color addedColor;
-
- private HashSet<Pair<Statement, Statement>> selected = new HashSet<Pair<Statement,Statement>>();
+
private HashSet<UpdateNode> selectedStructure = new HashSet<UpdateNode>();
oldValue.setLabelProvider(getLabelProvider(4));
newValue.setLabelProvider(getLabelProvider(5));
- selection.setLabelProvider(new SelectionLabelProvider(selected));
+ selection.setLabelProvider(new SelectionLabelProvider());
selection.getColumn().addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
- if (changes.getModifications().size() > 0) {
- if (selected.contains(changes.getModifications().get(0))) {
- for (Pair<Statement, Statement> nr : changes.getModifications())
- selected.remove(nr);
+ if (updateList.getChanges().size() > 0) {
+ if (updateList.getSelected().size() > 0) {
+ updateList.clearSelected();
} else {
- for (Pair<Statement, Statement> nr : changes.getModifications())
- selected.add(nr);
+ for (Pair<Statement, Statement> nr : updateList.getChanges())
+ updateList.addSelected(nr);
}
changeViewer.refresh();
}
}
});
- selection.setEditingSupport(new SelectionEditingSupport(changeViewer, selected));
+ selection.setEditingSupport(new SelectionEditingSupport(changeViewer));
}
Composite buttonComposite = new Composite(this, SWT.NONE);
}
protected abstract ColumnLabelProvider getLabelProvider(int i);
- protected abstract Pair<GraphComparator,Boolean> getChanges(Resource r1, Resource r2) throws DatabaseException;
+ protected abstract Pair<GraphComparator,String> getChanges(Resource r1, Resource r2) throws DatabaseException;
protected abstract UpdateTree getUpdateTree(GraphChanges changes) throws DatabaseException;
+ protected UpdateList getUpdateList(GraphChanges changes) throws DatabaseException {
+ return new UpdateList(changes.getModifications());
+ }
protected void addFilters(List<ChangeFilter> filters) {
return updateTree;
}
+ public UpdateList getUpdateList() {
+ return updateList;
+ }
+
public CheckboxTreeViewer getChangeBrowser() {
return changeBrowser;
}
for (ICheckStateListener l : checkStateListeners) {
l.checkStateChanged(new CheckStateChangedEvent(changeBrowser, null, false));
}
+ changeViewer.refresh();
}
addFilters(filters);
- Resource r1 = uei.getR1();
- Resource r2 = uei.getR2();
-
+ Resource oldModel = uei.getR1(); // old model that is being updated, contains user made changes
+ Resource newModel = uei.getR2(); // new model,
+ Resource originalModel = uei.getR3(); // original old model without user made changes
try {
- Pair<GraphComparator,Boolean> result = getChanges(r1,r2);
+ if (originalModel != null) {
+ // tree way comparison
+ // compare the original and the old model
+ Pair<GraphComparator,String> result2 = getChanges(originalModel, oldModel);
+ GraphComparator comparator2 = result2.first;
+ if (result2.second != null)
+ showWarning(result2.second);
+ comparator2.test(getSession());
+ changes2 = comparator2.getChanges();
+ changes2 = getSession().syncRequest(new FilterChangesRead(changes2));
+ updateTree2 = getUpdateTree(changes2);
+ updateList2 = getUpdateList(changes2);
+
+ // compare the original and the new model
+ Pair<GraphComparator,String> result3 = getChanges(originalModel,newModel);
+ GraphComparator comparator3 = result3.first;
+ if (result3.second != null)
+ showWarning(result3.second);
+ comparator3.test(getSession());
+ changes3 = comparator3.getChanges();
+ changes3 = getSession().syncRequest(new FilterChangesRead(changes3));
+ }
+
+ Pair<GraphComparator,String> result = getChanges(oldModel,newModel);
GraphComparator comparator = result.first;
- if (result.second)
- showWarning("Structural symbols have been changed. Model update is not able to update these, please create a new model.");
+ if (result.second != null)
+ showWarning(result.second);
+ if (originalModel != null) {
+ // three-way comparison: use change information to configure
+ // the comparison between the old and the new model.
+
+ // 1. map comparable resources
+ for (Entry<Resource, Resource> origToOld : changes2.getComparable().getEntries()) {
+ Resource oldR = origToOld.getValue();
+ Resource newR = changes3.getComparable().getRight(origToOld.getKey());
+ if (newR != null) {
+ comparator.addComparableResources(oldR, newR);
+ }
+ }
+ // 2. mark removed resources as distinct, so that comparison does not pair them
+ for (Statement s : changes2.getDeletions()) {
+ if (changes3.getComparable().containsLeft(s.getObject()))
+ comparator.addNonMatchedRight(changes3.getComparable().getRight(s.getObject()));
+ }
+
+ for (Statement s : changes3.getDeletions()) {
+ if (changes2.getComparable().containsLeft(s.getObject()))
+ comparator.addNonMatchedLeft(changes2.getComparable().getRight(s.getObject()));
+ }
+ if (uei.isNewDistinct()) {
+ // 3. mark added resources as distinct, so that comparison does not pair them
+ for (Statement s : changes2.getAdditions()) {
+ comparator.addNonMatchedLeft(s.getObject());
+ }
+
+ for (Statement s : changes3.getAdditions()) {
+ comparator.addNonMatchedRight(s.getObject());
+ }
+ }
+ }
comparator.test(getSession());
changes = comparator.getChanges();
changes = getSession().syncRequest(new FilterChangesRead(changes));
updateTree = getUpdateTree(changes);
+ updateList = getUpdateList(changes);
+
+ if (originalModel != null) {
+ createDefaultSelections();
+ }
+
} catch (DatabaseException e) {
Text text = new Text(this, SWT.MULTI);
text.setText(e.getMessage());
return;
}
-
-
- changeViewer.setInput(changes.getModifications());
- changeBrowser.setInput(updateTree);
+ setInputs();
+
refreshChecked();
}
-
+ protected void setInputs() {
+ changeViewer.setInput(updateList.getChanges());
+ changeBrowser.setInput(updateTree);
+ }
private void applyAll() {
updateAllButton.setEnabled(false);
public void perform(WriteGraph graph) throws DatabaseException {
Layer0Utils.addCommentMetadata(graph, "Apply all model updates");
graph.markUndoPoint();
- for (Pair<Statement, Statement> mod : changes.getModifications()) {
+ for (Pair<Statement, Statement> mod : updateList.getChanges()) {
applyLiteralChange(graph, mod);
}
- selected.clear();
- changes.getModifications().clear();
+ updateList.clear();
updateTree.getUpdateOps().applyAll(graph);
});
}
- private void applyLiteralChange(WriteGraph graph, Pair<Statement, Statement> mod) throws DoesNotContainValueException, ServiceException, ManyObjectsForFunctionalRelationException {
-
+ protected void applyLiteralChange(WriteGraph graph, Pair<Statement, Statement> mod) throws DatabaseException {
+ if (mod.second == null) {
+ graph.deny(mod.first);
+ return;
+ }
Resource s = changes.getComparable().getLeft(mod.second.getSubject());
- Resource pred = mod.first.getPredicate();
+ Resource pred = mod.second.getPredicate();
if (graph.hasValue(mod.second.getObject())) {
Object value = graph.getValue(mod.second.getObject());
graph.claimLiteral(s, pred, value);
public void perform(WriteGraph graph) throws DatabaseException {
Layer0Utils.addCommentMetadata(graph, "Apply selected model updates");
graph.markUndoPoint();
- for (Pair<Statement, Statement> mod : selected) {
- changes.getModifications().remove(mod);
+ for (Pair<Statement, Statement> mod : updateList.getSelected()) {
+ updateList.removeChange(mod);
applyLiteralChange(graph, mod);
}
- selected.clear();
updateTree.getUpdateOps().applySelected(graph);
}
});
}
+
+ protected void createDefaultSelections() {
+ // select all changes
+ for (Entry<Resource, UpdateOp> op : updateTree.getUpdateOps().getResourceMap().entrySet()) {
+ op.getValue().select(true);
+ }
+
+
+ for (Pair<Statement, Statement> pair : updateList.getChanges()) {
+ updateList.addSelected(pair);
+ }
+
+ // preserve user-made changes (by removing selections)
+ for (Entry<Resource, UpdateOp> op : updateTree.getUpdateOps().getResourceMap().entrySet()) {
+ UpdateOp op2 = updateTree2.getUpdateOps().getUpdateOp(op.getKey());
+ if (op2 == null) {
+ if (changes3.getComparable().containsRight(op.getKey())){
+ op2 = updateTree2.getUpdateOps().getUpdateOp(changes3.getComparable().getLeft(op.getKey()));
+ }
+ }
+ if (op2 != null && op.getValue().getClass() == op2.getClass()) {
+ op.getValue().select(false);
+ }
+ }
+
+ 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.removeSelected(pair);
+ }
+ }
+ }
+
+ }
/**
public interface ChangeFilter {
public boolean accept(ReadGraph g, Pair<Statement, Statement> change) throws DatabaseException;
}
-
-
-
+
/**
*
private class SelectionLabelProvider extends ColumnLabelProvider {
- Collection<?> selected;
- public SelectionLabelProvider(Collection<?> selected) {
- this.selected = selected;
+ public SelectionLabelProvider() {
+
}
@Override
public String getText(Object element) {
@Override
public Image getImage(Object element) {
- if (selected.contains(element))
+ if (updateList == null)
+ return null;
+ if (updateList.isSelected((Pair<Statement, Statement>) element))
return checked;
else
return unchecked;
private class SelectionEditingSupport extends EditingSupport {
- @SuppressWarnings("rawtypes")
- Collection selected;
-
@SuppressWarnings("rawtypes")
- public SelectionEditingSupport(ColumnViewer viewer, Collection selected) {
+ public SelectionEditingSupport(ColumnViewer viewer) {
super(viewer);
- this.selected = selected;
}
@Override
protected Object getValue(Object element) {
- return selected.contains(element);
+ if (updateList == null)
+ return false;
+ return updateList.isSelected((Pair<Statement, Statement>) element);
}
@SuppressWarnings("unchecked")
@Override
protected void setValue(Object element, Object value) {
+ if (updateList == null)
+ return;
if (Boolean.TRUE.equals(value))
- selected.add(element);
+ updateList.addSelected((Pair<Statement, Statement>) element);
else
- selected.remove(element);
+ updateList.removeSelected((Pair<Statement, Statement>) element);
getViewer().refresh(element);
}