]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java
Initial implementation of model updates with three-way comparison.
[simantics/interop.git] / org.simantics.interop.update / src / org / simantics / interop / update / editor / ModelUpdateEditor.java
index 8e315d8703b3311db00f4dd79513b3375be82295..860057d240f6d9763c6659f62fed9b9f876a05e8 100644 (file)
@@ -5,6 +5,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Stack;
+import java.util.Map.Entry;
 
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.resource.JFaceResources;
@@ -47,14 +48,12 @@ import org.simantics.db.Statement;
 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;
@@ -81,6 +80,11 @@ public abstract class ModelUpdateEditor extends Composite{
        
        private GraphChanges changes;
        private UpdateTree updateTree;
+       private UpdateList updateList;
+       
+       private GraphChanges changes2;
+       private UpdateTree updateTree2;
+       private UpdateList updateList2;
        
        private Button updateAllButton;
        private Button updateSelectedButton;
@@ -94,8 +98,7 @@ public abstract class ModelUpdateEditor extends Composite{
        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>();
        
@@ -214,23 +217,22 @@ public abstract class ModelUpdateEditor extends Composite{
                        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);
@@ -296,8 +298,11 @@ public abstract class ModelUpdateEditor extends Composite{
        }
        
        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) {
                
@@ -311,6 +316,10 @@ public abstract class ModelUpdateEditor extends Composite{
                return updateTree;
        }
        
+       public UpdateList getUpdateList() {
+               return updateList;
+       }
+       
        public CheckboxTreeViewer getChangeBrowser() {
                return changeBrowser;
        }
@@ -383,6 +392,7 @@ public abstract class ModelUpdateEditor extends Composite{
                for (ICheckStateListener l : checkStateListeners) {
                        l.checkStateChanged(new CheckStateChangedEvent(changeBrowser, null, false));
                }
+               changeViewer.refresh();
        }
        
        
@@ -393,18 +403,32 @@ public abstract class ModelUpdateEditor extends Composite{
 
                Resource r1 = uei.getR1();
                Resource r2 = uei.getR2();
-               
+               Resource r3 = uei.getR3();
 
                try {
                        
-                       Pair<GraphComparator,Boolean> result = getChanges(r1,r2);
+                       Pair<GraphComparator,String> result = getChanges(r1,r2);
                        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);
                        comparator.test(getSession());
                        changes = comparator.getChanges();
                        changes = getSession().syncRequest(new FilterChangesRead(changes));
                        updateTree = getUpdateTree(changes);
+                       updateList = getUpdateList(changes);
+                       if (r3 != null) {
+                               Pair<GraphComparator,String> result2 = getChanges(r1,r3);
+                               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);
+                               
+                               createDefaultSelections();
+                       }
                } catch (DatabaseException e) {
                        Text text = new Text(this, SWT.MULTI);
                        text.setText(e.getMessage());
@@ -412,14 +436,15 @@ public abstract class ModelUpdateEditor extends Composite{
                        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);
@@ -429,11 +454,10 @@ public abstract class ModelUpdateEditor extends Composite{
                        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);
                                
@@ -460,10 +484,13 @@ public abstract class ModelUpdateEditor extends Composite{
                });
        }
        
-       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);
@@ -482,11 +509,10 @@ public abstract class ModelUpdateEditor extends Composite{
                        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);
                                
@@ -541,6 +567,39 @@ public abstract class ModelUpdateEditor extends Composite{
        }
        
        
+       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);
+                       }
+               }
+       }
+       
        
        
        /**
@@ -664,9 +723,8 @@ public abstract class ModelUpdateEditor extends Composite{
        
        private class SelectionLabelProvider extends ColumnLabelProvider {
                
-               Collection<?>  selected;
-               public SelectionLabelProvider(Collection<?>  selected) {
-                       this.selected = selected;
+               public SelectionLabelProvider() {
+                       
                }
                @Override
                public String getText(Object element) {
@@ -675,7 +733,9 @@ public abstract class ModelUpdateEditor extends Composite{
                
                @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;
@@ -687,16 +747,7 @@ public abstract class ModelUpdateEditor extends Composite{
                @Override
                public String getText(Object element) {
                        final UpdateNode node = (UpdateNode)element;
-                       try  {
-                               return getSession().syncRequest(new Read<String>() {
-                                       @Override
-                                       public String perform(ReadGraph graph) throws DatabaseException {
-                                               return node.getLabel(graph);
-                                       }
-                               });
-                       } catch (Exception e) {
-                               return e.getMessage();
-                       }
+                       return node.getLabel();
                }
                
                @Override
@@ -751,14 +802,10 @@ public abstract class ModelUpdateEditor extends Composite{
        
        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;
                        
                }
 
@@ -774,16 +821,20 @@ public abstract class ModelUpdateEditor extends Composite{
                
                @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);
                }