Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2014-03-18 13:17:42 +0000
committerChristian W. Damus2014-03-25 19:41:38 +0000
commit40004d53e76cd05d38317e0a2d4cb5cad0afdb0f (patch)
treece5cec2d210d0bd703312b160c360e65a8ed2882 /plugins
parent1d249864518fee49dde9547e2e8f4499c9953f02 (diff)
downloadorg.eclipse.papyrus-40004d53e76cd05d38317e0a2d4cb5cad0afdb0f.tar.gz
org.eclipse.papyrus-40004d53e76cd05d38317e0a2d4cb5cad0afdb0f.tar.xz
org.eclipse.papyrus-40004d53e76cd05d38317e0a2d4cb5cad0afdb0f.zip
410909: [Performances - All diagrams] UMLDiagramUpdater uses too many CrossReferencers
https://bugs.eclipse.org/bugs/show_bug.cgi?id=426732 Replace on-demand cross-referencer sweeps with the cross-reference adapter that is known already to be attached in a UML/GMF context.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/utils/EMFHelper.java15
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.viewersearcher/src/org/eclipse/papyrus/infra/gmfdiag/viewersearcher/DiagramViewerSearcher.java26
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/OccurrenceSpecificationHelper.java8
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/META-INF/MANIFEST.MF3
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/EcoreUtils.java10
-rw-r--r--plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/GateUtils.java11
6 files changed, 56 insertions, 17 deletions
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/utils/EMFHelper.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/utils/EMFHelper.java
index d8d8a0790b0..9aced823069 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/utils/EMFHelper.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/utils/EMFHelper.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010, 2013 CEA LIST.
+ * Copyright (c) 2010, 2014 CEA LIST and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -10,6 +10,7 @@
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Christian W. Damus (CEA) - filter out EObjects that are Resources (CDO)
* Christian W. Damus (CEA) - Support read-only state at object level (CDO)
+ * Christian W. Damus (CEA) - bug 426732
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.utils;
@@ -19,6 +20,7 @@ import java.util.Collections;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
+import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
/**
@@ -45,14 +47,15 @@ public class EMFHelper {
if(crossReferencer == null) {
// try to register a cross referencer at the highest level
crossReferencer = new ECrossReferenceAdapter();
- if(source.eResource() != null) {
- if(source.eResource().getResourceSet() != null) {
- crossReferencer.setTarget(source.eResource().getResourceSet());
+ Resource resource = source.eResource();
+ if(resource != null) {
+ if(resource.getResourceSet() != null) {
+ resource.getResourceSet().eAdapters().add(crossReferencer);
} else {
- crossReferencer.setTarget(source.eResource());
+ resource.eAdapters().add(crossReferencer);
}
} else {
- crossReferencer.setTarget(source);
+ source.eAdapters().add(crossReferencer);
}
}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.viewersearcher/src/org/eclipse/papyrus/infra/gmfdiag/viewersearcher/DiagramViewerSearcher.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.viewersearcher/src/org/eclipse/papyrus/infra/gmfdiag/viewersearcher/DiagramViewerSearcher.java
index 892c839a9c4..87f5bf00445 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.viewersearcher/src/org/eclipse/papyrus/infra/gmfdiag/viewersearcher/DiagramViewerSearcher.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.viewersearcher/src/org/eclipse/papyrus/infra/gmfdiag/viewersearcher/DiagramViewerSearcher.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2013 CEA LIST.
+ * Copyright (c) 2013, 2014 CEA LIST and others.
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,6 +9,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus (CEA) - bug 426732
*
*****************************************************************************/
package org.eclipse.papyrus.infra.gmfdiag.viewersearcher;
@@ -19,6 +20,7 @@ import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
+import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
@@ -46,7 +48,7 @@ public class DiagramViewerSearcher extends AbstractViewerSearcher {
for(ModelSet modelSet : modelSets) {
- Map<EObject, Collection<Setting>> references = EcoreUtil.UsageCrossReferencer.findAll(modelElements, modelSet);
+ Map<EObject, Collection<Setting>> references = crossReference(modelElements, modelSet);
for(Object semanticElement : references.keySet()) {
for(Setting setting : references.get(semanticElement)) {
@@ -69,4 +71,24 @@ public class DiagramViewerSearcher extends AbstractViewerSearcher {
return results;
}
+
+ private Map<EObject, Collection<Setting>> crossReference(Collection<?> modelElements, ModelSet modelSet) {
+ Map<EObject, Collection<Setting>> result;
+
+ final ECrossReferenceAdapter xrefs = ECrossReferenceAdapter.getCrossReferenceAdapter(modelSet);
+ if (xrefs == null) {
+ // one-off usage cross referencer
+ result = EcoreUtil.UsageCrossReferencer.findAll(modelElements, modelSet);
+ } else {
+ result = new HashMap<EObject, Collection<Setting>>();
+ for(Object next : modelElements) {
+ if (next instanceof EObject) {
+ EObject eObject = (EObject)next;
+ result.put(eObject, xrefs.getInverseReferences(eObject));
+ }
+ }
+ }
+
+ return result;
+ }
}
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/OccurrenceSpecificationHelper.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/OccurrenceSpecificationHelper.java
index 6d13ba3f293..26f41eccbfe 100644
--- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/OccurrenceSpecificationHelper.java
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/util/OccurrenceSpecificationHelper.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2013 CEA
+ * Copyright (c) 2013, 2014 Soyatec, CEA, and others
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,6 +9,7 @@
*
* Contributors:
* Soyatec - Initial API and implementation
+ * Christian W. Damus (CEA) - bug 426732
*
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.sequence.util;
@@ -21,6 +22,7 @@ import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.ExecutionOccurrenceSpecification;
import org.eclipse.uml2.uml.ExecutionSpecification;
@@ -116,7 +118,7 @@ public class OccurrenceSpecificationHelper {
if(os == null || copy == null || os instanceof MessageOccurrenceSpecification) {
return false;
}
- Collection<Setting> usages = EcoreUtil.UsageCrossReferencer.find(os, os.eResource());
+ Collection<Setting> usages = EMFHelper.getUsages(os);
for(Setting setting : usages) {
Object osValue = setting.get(true);
if(osValue instanceof List<?> && ((List<?>)osValue).contains(copy)) {
@@ -139,7 +141,7 @@ public class OccurrenceSpecificationHelper {
if(end instanceof ExecutionOccurrenceSpecification) {
return ((ExecutionOccurrenceSpecification)end).getExecution();
}
- Collection<Setting> usages = EcoreUtil.UsageCrossReferencer.find(end, end.eResource());
+ Collection<Setting> usages = EMFHelper.getUsages(end);
for(Setting setting : usages) {
EObject eObject = setting.getEObject();
EStructuralFeature feature = setting.getEStructuralFeature();
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/META-INF/MANIFEST.MF b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/META-INF/MANIFEST.MF
index 90acd9dce7a..09267d45879 100644
--- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/META-INF/MANIFEST.MF
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/META-INF/MANIFEST.MF
@@ -69,7 +69,8 @@ Require-Bundle: org.eclipse.emf.ecore,
org.eclipse.papyrus.infra.gmfdiag.commands;bundle-version="1.0.0",
org.eclipse.papyrus.infra.widgets.toolbox;bundle-version="1.0.0",
org.eclipse.papyrus.infra.viewpoints.policy;bundle-version="1.0.0",
- org.eclipse.papyrus.infra.viewpoints.configuration;bundle-version="1.0.0"
+ org.eclipse.papyrus.infra.viewpoints.configuration;bundle-version="1.0.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="1.0.0"
Bundle-Vendor: %providerName
Eclipse-LazyStart: true
Bundle-Version: 1.0.0.qualifier
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/EcoreUtils.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/EcoreUtils.java
index 3641c868b28..9dff4979887 100644
--- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/EcoreUtils.java
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/EcoreUtils.java
@@ -1,10 +1,15 @@
/*******************************************************************************
- * Copyright (c) 2012 CEA LIST.
+ * Copyright (c) 2012, 2014 CEA LIST and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA LIST - Initial API and implementation
+ * Christian W. Damus (CEA) - bug 426732
+ *
*******************************************************************************/
package org.eclipse.papyrus.uml.diagram.timing.custom.utils;
@@ -20,6 +25,7 @@ import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
public final class EcoreUtils {
@@ -37,7 +43,7 @@ public final class EcoreUtils {
* the replacement object
*/
public static void replaceEObjectInstance(final EObject original, final EObject replacement) {
- final Collection<Setting> settings = EcoreUtil.UsageCrossReferencer.find(original, original.eResource().getResourceSet());
+ final Collection<Setting> settings = EMFHelper.getUsages(original);
final Set<EStructuralFeature> referencingFeatures = new HashSet<EStructuralFeature>();
for(final Setting setting : settings) {
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/GateUtils.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/GateUtils.java
index b33808d68c5..76ba14650e9 100644
--- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/GateUtils.java
+++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.timing/custom-src/org/eclipse/papyrus/uml/diagram/timing/custom/utils/GateUtils.java
@@ -1,10 +1,15 @@
/*****************************************************************************
- * Copyright (c) 2012 CEA LIST.
+ * Copyright (c) 2012, 2014 CEA LIST and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA LIST - Initial API and implementation
+ * Christian W. Damus (CEA) - bug 426732
+ *
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.timing.custom.utils;
@@ -14,7 +19,7 @@ import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
-import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
import org.eclipse.uml2.uml.Gate;
import org.eclipse.uml2.uml.UMLPackage;
@@ -33,7 +38,7 @@ public final class GateUtils {
*/
public static Collection<EObject> getElementsToDelete(final Gate gate) {
final Set<EObject> elementsToDestroy = new HashSet<EObject>();
- final Collection<Setting> settings = EcoreUtil.UsageCrossReferencer.find(gate, gate.eResource().getResourceSet());
+ final Collection<Setting> settings = EMFHelper.getUsages(gate);
for(final Setting setting : settings) {
// delete messages originating from or going to that gate
if(setting.getEStructuralFeature() == UMLPackage.eINSTANCE.getMessage_SendEvent() || setting.getEStructuralFeature() == UMLPackage.eINSTANCE.getMessage_ReceiveEvent()) {

Back to the top