diff options
author | Christian W. Damus | 2013-08-27 21:02:34 +0000 |
---|---|---|
committer | Christian W. Damus | 2013-09-16 20:02:45 +0000 |
commit | d428560b06d22dd088928f7549562072b8eb4613 (patch) | |
tree | 50a26a66f7156cea9c23476aab6040064a970a19 | |
parent | ee7752c06ac58a4cf1bba5053b2e6212c05a92c1 (diff) | |
download | org.eclipse.papyrus-d428560b06d22dd088928f7549562072b8eb4613.tar.gz org.eclipse.papyrus-d428560b06d22dd088928f7549562072b8eb4613.tar.xz org.eclipse.papyrus-d428560b06d22dd088928f7549562072b8eb4613.zip |
415369: [CDO] Support controlled resources and lazy loading
https://bugs.eclipse.org/bugs/show_bug.cgi?id=415369
Require import/export of all super- and sub-units of model units being imported/exported. That is, import/export requires the entire logical model.
4 files changed, 165 insertions, 23 deletions
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/core/importer/IModelTransferNode.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/core/importer/IModelTransferNode.java index 1415292d4fd..5a497f3b4df 100644 --- a/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/core/importer/IModelTransferNode.java +++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/core/importer/IModelTransferNode.java @@ -21,7 +21,7 @@ import org.eclipse.emf.common.util.URI; public interface IModelTransferNode { String getName(); - + URI getPrimaryResourceURI(); Collection<URI> getResourceURIs(); @@ -29,4 +29,24 @@ public interface IModelTransferNode { Collection<IModelTransferNode> getDependencies(); Collection<IModelTransferNode> getDependents(); + + /** + * Queries whether an{@code other} node represents a model sub-unit of me. + * + * @param other + * another model unit + * + * @return whether the {@code other} it is a logical model sub-unit of me + */ + boolean isModelSubUnit(IModelTransferNode other); + + /** + * Queries whether an{@code other} node represents my model super-unit. + * + * @param other + * another model unit + * + * @return whether the {@code other} it is the logical model super-unit of me + */ + boolean isModelParentUnit(IModelTransferNode other); } diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/internal/core/importer/ModelTransferConfiguration.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/internal/core/importer/ModelTransferConfiguration.java index 8b362991b55..1f3fb30c582 100644 --- a/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/internal/core/importer/ModelTransferConfiguration.java +++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/internal/core/importer/ModelTransferConfiguration.java @@ -157,6 +157,8 @@ public class ModelTransferConfiguration implements IModelTransferConfiguration { // first, if it's a DI resource, ensure that it gets its components if(DependencyAdapter.isDIResource(resource)) { DependencyAdapter adapter = DependencyAdapter.getInstance(resource); + final int oldCount = adapter.getDependencies().size(); + for(URI uri : next.getComponents(resource, monitor)) { // this is an implicit dependency, even if there are no references // to it (which occurs, e.g., in model sub-units that have no diagrams) @@ -166,8 +168,11 @@ public class ModelTransferConfiguration implements IModelTransferConfiguration { } } - // scan for components again - newNode.scanForComponents(); + if(adapter.getDependencies().size() > oldCount) { + // scan for components and dependencies again + newNode.scanForComponents(); + newNode.scanForDependencies(); + } } for(URI uri : next.getDependents(newNode.getPrimaryResource(), monitor)) { @@ -222,8 +227,13 @@ public class ModelTransferConfiguration implements IModelTransferConfiguration { Set<IModelTransferNode> dependents = ImmutableSet.copyOf(node.getDependents()); Set<IModelTransferNode> leftOut = Sets.difference(dependents, toImport); if(!leftOut.isEmpty()) { - int severity = direction.isImport() ? Diagnostic.WARNING : Diagnostic.INFO; - diagnostics.add(new BasicDiagnostic(severity, Activator.PLUGIN_ID, 0, NLS.bind(Messages.ModelTransferConfiguration_1, node.getName(), direction), new Object[]{ node, leftOut })); + IModelTransferNode parentUnit = findParentUnit(node, leftOut); + if(parentUnit != null) { + diagnostics.add(new BasicDiagnostic(Diagnostic.ERROR, Activator.PLUGIN_ID, 0, NLS.bind("Parent unit {2} of controlled unit {0} must be selected for {1}.", new Object[]{ node.getName(), direction, parentUnit.getName() }), new Object[]{ node, parentUnit })); + } else { + int severity = direction.isImport() ? Diagnostic.WARNING : Diagnostic.INFO; + diagnostics.add(new BasicDiagnostic(severity, Activator.PLUGIN_ID, 0, NLS.bind(Messages.ModelTransferConfiguration_1, node.getName(), direction), new Object[]{ node, leftOut })); + } } } @@ -231,9 +241,39 @@ public class ModelTransferConfiguration implements IModelTransferConfiguration { Set<IModelTransferNode> dependencies = ImmutableSet.copyOf(node.getDependencies()); Set<IModelTransferNode> leftOut = Sets.difference(dependencies, toImport); if(!leftOut.isEmpty()) { - int severity = direction.isImport() ? Diagnostic.INFO : Diagnostic.WARNING; - diagnostics.add(new BasicDiagnostic(severity, Activator.PLUGIN_ID, 0, NLS.bind(Messages.ModelTransferConfiguration_2, node.getName(), direction), new Object[]{ node, leftOut })); + Set<IModelTransferNode> subUnits = findSubUnits(node, leftOut); + if(!subUnits.isEmpty()) { + diagnostics.add(new BasicDiagnostic(Diagnostic.ERROR, Activator.PLUGIN_ID, 0, NLS.bind("All controlled sub-units of {0} must be selected for {1}.", new Object[]{ node.getName(), direction }), new Object[]{ node, subUnits })); + } else { + int severity = direction.isImport() ? Diagnostic.INFO : Diagnostic.WARNING; + diagnostics.add(new BasicDiagnostic(severity, Activator.PLUGIN_ID, 0, NLS.bind(Messages.ModelTransferConfiguration_2, node.getName(), direction), new Object[]{ node, leftOut })); + } + } + } + + private IModelTransferNode findParentUnit(IModelTransferNode node, Collection<? extends IModelTransferNode> possibleParents) { + IModelTransferNode result = null; + + for(IModelTransferNode next : possibleParents) { + if(node.isModelParentUnit(next)) { + result = next; + break; + } + } + + return result; + } + + private Set<IModelTransferNode> findSubUnits(IModelTransferNode node, Collection<? extends IModelTransferNode> possibleChildren) { + ImmutableSet.Builder<IModelTransferNode> result = ImmutableSet.builder(); + + for(IModelTransferNode next : possibleChildren) { + if(node.isModelSubUnit(next)) { + result.add(next); + } } + + return result.build(); } public void addModelTransferListener(IModelTransferListener listener) { diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/internal/core/importer/ModelTransferNode.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/internal/core/importer/ModelTransferNode.java index ee88f6fbd50..cb6e5692a36 100644 --- a/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/internal/core/importer/ModelTransferNode.java +++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.core/src/org/eclipse/papyrus/cdo/internal/core/importer/ModelTransferNode.java @@ -19,8 +19,10 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.URIConverter; +import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.papyrus.cdo.core.importer.IModelTransferNode; import org.eclipse.papyrus.cdo.core.importer.IModelTransferOperation; import org.eclipse.papyrus.cdo.internal.core.l10n.Messages; @@ -144,7 +146,7 @@ public class ModelTransferNode implements IModelTransferNode { } } - private void scanForDependencies() { + void scanForDependencies() { // for each component resource, find the external resources that it // references and, for any that seems to have a primary resource, get // its node @@ -174,4 +176,50 @@ public class ModelTransferNode implements IModelTransferNode { return result; } + + public boolean isModelParentUnit(IModelTransferNode other) { + boolean result = false; + + out: for(URI childURI : getResourceURIs()) { + Resource child = config.getResourceSet().getResource(childURI, false); + if(child != null) { + for(EObject root : child.getContents()) { + EObject container = root.eContainer(); + if(container != null) { + URI uri = EcoreUtil.getURI(container).trimFragment(); + if(other.getResourceURIs().contains(uri)) { + // found the parent unit + result = true; + break out; + } + } + } + } + } + + return result; + } + + public boolean isModelSubUnit(IModelTransferNode other) { + boolean result = false; + + out: for(URI uri : other.getResourceURIs()) { + Resource possibleChild = config.getResourceSet().getResource(uri, false); + if(possibleChild != null) { + for(EObject root : possibleChild.getContents()) { + EObject container = root.eContainer(); + if(container != null) { + URI parentURI = EcoreUtil.getURI(container).trimFragment(); + if(getResourceURIs().contains(parentURI)) { + // found a child unit + result = true; + break out; + } + } + } + } + } + + return result; + } } diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/wizards/ModelReferencesPage.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/wizards/ModelReferencesPage.java index 1a2937c0019..125b628957f 100644 --- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/wizards/ModelReferencesPage.java +++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/wizards/ModelReferencesPage.java @@ -11,8 +11,11 @@ *****************************************************************************/ package org.eclipse.papyrus.cdo.internal.ui.wizards; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Queue; +import java.util.Set; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.jface.layout.GridDataFactory; @@ -47,6 +50,7 @@ import org.eclipse.swt.widgets.Text; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; @@ -142,20 +146,7 @@ public class ModelReferencesPage extends ModelImportWizardPage { if(configuration != null) { // initialize the checkboxes - Collection<IModelTransferNode> initialSet = configuration.getModelsToTransfer(); - ITreeContentProvider contents = (ITreeContentProvider)modelsTree.getContentProvider(); - ICheckable checkable = (ICheckable)modelsTree; - for(Object next : contents.getElements(configuration)) { - checkable.setChecked(next, true); - - for(Object child : contents.getChildren(next)) { - ITreeNode treeNode = (ITreeNode)child; - if((isImport ? treeNode.isDependent() : treeNode.isDependency()) || initialSet.contains(treeNode.getElement())) { - checkable.setChecked(child, true); - configuration.addModelToTransfer(treeNode.getElement().getPrimaryResourceURI()); - } - } - } + initializeCheckedNodes(); } validatePage(); @@ -169,6 +160,50 @@ public class ModelReferencesPage extends ModelImportWizardPage { super.dispose(); } + private void initializeCheckedNodes() { + final Collection<IModelTransferNode> initialSet = importConfig.getModelsToTransfer(); + final ITreeContentProvider contents = (ITreeContentProvider)modelsTree.getContentProvider(); + final ICheckable checkable = (ICheckable)modelsTree; + + final Set<IModelTransferNode> visited = Sets.newHashSet(); + final Queue<Object> queue = new java.util.ArrayDeque<Object>(Arrays.asList(contents.getElements(importConfig))); + + for(Object next = queue.poll(); next != null; next = queue.poll()) { + ITreeNode parent = (ITreeNode)next; + + // we must check a parent if the user initially selected it on opening the wizard + // or we are importing and it is a dependent of a checked node, + // or we are exporting and it is a dependency of a checked node, + // or it is a model sub-unit (required dependency) of a checked node + boolean mustCheck = initialSet.contains(parent.getElement()); + if(mustCheck) { + checkable.setChecked(next, true); + } + + if(visited.add(parent.getElement())) { + // recurse into the children + for(Object child : contents.getChildren(next)) { + ITreeNode treeNode = (ITreeNode)child; + queue.add(treeNode); + + // we must check a node if either the user initially selected it on opening the wizard, + // or we are importing and it is a dependent of a checked node, + // or we are exporting and it is a dependency of a checked node, + // or it is a model sub-unit (required dependency) of a checked node + mustCheck = initialSet.contains(treeNode.getElement()) // + || (isImport ? treeNode.isDependent() : treeNode.isDependency()) // + || (checkable.getChecked(parent) && parent.getElement().isModelSubUnit(treeNode.getElement())); + + if(mustCheck) { + checkable.setChecked(child, true); + importConfig.addModelToTransfer(treeNode.getElement().getPrimaryResourceURI()); + } + } + } + } + + } + void selected(Object treeNode) { if(treeNode == null) { pathText.setText(""); //$NON-NLS-1$ @@ -303,7 +338,6 @@ public class ModelReferencesPage extends ModelImportWizardPage { } TreeNode(TreeNode parent, IModelTransferNode element, boolean dependent) { - this.parent = parent; this.element = element; this.dependent = dependent; |