--- /dev/null
+package org.simantics.migration.ui;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+\r
+import org.eclipse.jface.viewers.IStructuredContentProvider;\r
+import org.eclipse.jface.viewers.LabelProvider;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.ui.dialogs.ListDialog;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.ActionFactory;\r
+import org.simantics.layer0.SoftwareConfigurationResources;\r
+import org.simantics.migration.ui.MigrationAnalysis.Update;\r
+\r
+public class MigrateActionFactory implements ActionFactory {\r
+\r
+ @Override\r
+ public Runnable create(Object target) {\r
+ final Resource resource = (Resource)target;\r
+ return new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ analyze(resource);\r
+ } \r
+ };\r
+ }\r
+ \r
+ private void analyze(final Resource resource) {\r
+ Simantics.getSession().asyncRequest(new ReadRequest() { \r
+ @Override\r
+ public void run(ReadGraph graph) throws DatabaseException {\r
+ SoftwareConfigurationResources SC = SoftwareConfigurationResources.getInstance(graph);\r
+ final ArrayList<Update> updates = new ArrayList<Update>();\r
+ for(Resource version : graph.getObjects(resource, SC.IsCompatibleWith)) {\r
+ MigrationAnalysis analysis = new MigrationAnalysis(graph, version);\r
+ updates.addAll(analysis.getUpdates());\r
+ }\r
+ Collections.sort(updates);\r
+ Display.getDefault().asyncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ select(resource, updates); \r
+ } \r
+ }); \r
+ }\r
+ });\r
+ }\r
+ \r
+ private void select(final Resource resource, final ArrayList<Update> updates) {\r
+ ListDialog listDialog = new ListDialog(Display.getCurrent().getActiveShell());\r
+ listDialog.setTitle("Migrate");\r
+ listDialog.setMessage("Choose the version to migrate to");\r
+ listDialog.setContentProvider(new IStructuredContentProvider() { \r
+ @Override\r
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { \r
+ }\r
+ \r
+ @Override\r
+ public void dispose() {\r
+ }\r
+ \r
+ @Override\r
+ public Object[] getElements(Object inputElement) {\r
+ return updates.toArray();\r
+ }\r
+ });\r
+ listDialog.setLabelProvider(new LabelProvider() {\r
+ @Override\r
+ public String getText(Object element) {\r
+ return ((Update)element).versionName;\r
+ }\r
+ });\r
+ listDialog.setInput(updates);\r
+ if(listDialog.open() == ListDialog.OK) {\r
+ Object[] result = listDialog.getResult();\r
+ if(result.length == 1) {\r
+ Update update = (Update)result[0];\r
+ try {\r
+ update.execute(resource);\r
+ update.updateTargetVersion(resource); \r
+ } catch(DatabaseException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+}\r