[516500] Cache preference value whether to process proxies

2% of the overall time to do a compare-with-head on a large logical
model is spent looking up the resolution scope in the preferences in
LocalMonitoredProxyCreationListener and
RemoteMonitoredProxyCreationListener.

We should determine and cache this value once.

Bug: 516500
Change-Id: Iaf2032627456236c8330b2261c608848d85f7a12
Signed-off-by: Philip Langer <planger@eclipsesource.com>
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/AbstractMonitoredProxyCreationListenerTest.java b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/AbstractMonitoredProxyCreationListenerTest.java
index ed50d2a..6e444c3 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/AbstractMonitoredProxyCreationListenerTest.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/AbstractMonitoredProxyCreationListenerTest.java
@@ -28,6 +28,7 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.junit.Before;
 
 @SuppressWarnings({"restriction", "nls" })
 public class AbstractMonitoredProxyCreationListenerTest {
@@ -54,7 +55,8 @@
 
 	InternalEObject proxy;
 
-	public void preSetUp() {
+	@Before
+	public void setUp() {
 		monitor = mock(ThreadSafeProgressMonitor.class);
 		eventBus = mock(EventBus.class);
 		localResolver = mock(IResourceDependencyLocalResolver.class);
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/LocalMonitoredProxyCreationListenerTest.java b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/LocalMonitoredProxyCreationListenerTest.java
index e5c0695..1487e4e 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/LocalMonitoredProxyCreationListenerTest.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/LocalMonitoredProxyCreationListenerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2015 EclipseSource Muenchen GmbH.
+ * Copyright (c) 2015, 2017 EclipseSource Muenchen GmbH 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
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     Michael Borkowski - initial test implementation
+ *     Philip Langer - bug 516500
  *******************************************************************************/
 package org.eclipse.emf.compare.ide.ui.tests.logical.resolver;
 
@@ -16,7 +17,6 @@
 import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.CrossReferenceResolutionScope;
 import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.LocalMonitoredProxyCreationListener;
 import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.ResourceDependencyFoundEvent;
-import org.junit.Before;
 import org.junit.Test;
 
 @SuppressWarnings("nls")
@@ -24,15 +24,10 @@
 
 	LocalMonitoredProxyCreationListener sut;
 
-	@Before
-	public void setUp() {
-		preSetUp();
-		sut = new LocalMonitoredProxyCreationListener(monitor, eventBus, localResolver, diagnostic);
-	}
-
 	@Test
 	public void testCorrectProxy() {
 		prepareTest("platform:/resource/to", CrossReferenceResolutionScope.WORKSPACE);
+		sut = new LocalMonitoredProxyCreationListener(monitor, eventBus, localResolver, diagnostic);
 		sut.proxyCreated(source, eObject, feature, proxy, 3);
 
 		verify(eventBus).post(new ResourceDependencyFoundEvent(from, to, eObject, feature));
@@ -42,6 +37,7 @@
 	@Test
 	public void testNonPlatformResource() {
 		prepareTest("nonplatform:/resource/to", CrossReferenceResolutionScope.WORKSPACE);
+		sut = new LocalMonitoredProxyCreationListener(monitor, eventBus, localResolver, diagnostic);
 		sut.proxyCreated(source, eObject, feature, proxy, 3);
 
 		verifyZeroInteractions(eventBus, localResolver);
@@ -50,6 +46,7 @@
 	@Test
 	public void testNonAbsolutePlatformResource() {
 		prepareTest("platform:relative/file", CrossReferenceResolutionScope.WORKSPACE);
+		sut = new LocalMonitoredProxyCreationListener(monitor, eventBus, localResolver, diagnostic);
 		sut.proxyCreated(source, eObject, feature, proxy, 3);
 
 		verifyZeroInteractions(eventBus, localResolver);
@@ -58,6 +55,7 @@
 	@Test
 	public void testWrongResolutionScope() {
 		prepareTest("platform:/resource/to", CrossReferenceResolutionScope.SELF);
+		sut = new LocalMonitoredProxyCreationListener(monitor, eventBus, localResolver, diagnostic);
 		sut.proxyCreated(source, eObject, feature, proxy, 3);
 
 		verifyZeroInteractions(eventBus, localResolver);
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/RemoteMonitoredProxyCreationListenerTest.java b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/RemoteMonitoredProxyCreationListenerTest.java
index 95e3a15..12baf56 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/RemoteMonitoredProxyCreationListenerTest.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/RemoteMonitoredProxyCreationListenerTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2015 EclipseSource Muenchen GmbH.
+ * Copyright (c) 2015, 2017 EclipseSource Muenchen GmbH 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
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     Michael Borkowski - initial test implementation
+ *     Philip Langer - bug 516500
  *******************************************************************************/
 package org.eclipse.emf.compare.ide.ui.tests.logical.resolver;
 
@@ -15,7 +16,6 @@
 
 import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.CrossReferenceResolutionScope;
 import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.RemoteMonitoredProxyCreationListener;
-import org.junit.Before;
 import org.junit.Test;
 
 @SuppressWarnings("nls")
@@ -23,15 +23,10 @@
 
 	RemoteMonitoredProxyCreationListener sut;
 
-	@Before
-	public void setUp() {
-		preSetUp();
-		sut = new RemoteMonitoredProxyCreationListener(monitor, remoteResolver, diagnostic);
-	}
-
 	@Test
 	public void testCorrectProxy() {
 		prepareTest("platform:/resource/to", CrossReferenceResolutionScope.WORKSPACE);
+		sut = new RemoteMonitoredProxyCreationListener(monitor, remoteResolver, diagnostic);
 		sut.proxyCreated(source, eObject, feature, proxy, 3);
 
 		verify(remoteResolver).demandRemoteResolve(synchronizedResourceSet, to, diagnostic, monitor);
@@ -40,6 +35,7 @@
 	@Test
 	public void testNonPlatformResource() {
 		prepareTest("nonplatform:/resource/to", CrossReferenceResolutionScope.WORKSPACE);
+		sut = new RemoteMonitoredProxyCreationListener(monitor, remoteResolver, diagnostic);
 		sut.proxyCreated(source, eObject, feature, proxy, 3);
 
 		verifyZeroInteractions(localResolver);
@@ -48,6 +44,7 @@
 	@Test
 	public void testNonAbsolutePlatformResource() {
 		prepareTest("platform:relative/file", CrossReferenceResolutionScope.WORKSPACE);
+		sut = new RemoteMonitoredProxyCreationListener(monitor, remoteResolver, diagnostic);
 		sut.proxyCreated(source, eObject, feature, proxy, 3);
 
 		verifyZeroInteractions(localResolver);
@@ -56,6 +53,7 @@
 	@Test
 	public void testWrongResolutionScope() {
 		prepareTest("platform:/resource/to", CrossReferenceResolutionScope.SELF);
+		sut = new RemoteMonitoredProxyCreationListener(monitor, remoteResolver, diagnostic);
 		sut.proxyCreated(source, eObject, feature, proxy, 3);
 
 		verifyZeroInteractions(localResolver);
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/LocalMonitoredProxyCreationListener.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/LocalMonitoredProxyCreationListener.java
index aae6fc9..abab08d 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/LocalMonitoredProxyCreationListener.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/LocalMonitoredProxyCreationListener.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2015 Obeo and others.
+ * Copyright (c) 2015, 2017 Obeo 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
@@ -8,12 +8,14 @@
  * Contributors:
  *     Obeo - initial API and implementation
  *     Michael Borkowski - public visibility
+ *     Philip Langer - bug 516500
  *******************************************************************************/
 package org.eclipse.emf.compare.ide.ui.internal.logical.resolver;
 
 import com.google.common.eventbus.EventBus;
 
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.compare.ide.internal.utils.IProxyCreationListener;
 import org.eclipse.emf.compare.ide.ui.internal.util.ThreadSafeProgressMonitor;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
@@ -34,6 +36,10 @@
 	/** The local resolver. */
 	protected final IResourceDependencyLocalResolver localResolver;
 
+	/** Whether this listener should process proxies. */
+	protected final boolean processProxies = ResolutionUtil
+			.getResolutionScope() != CrossReferenceResolutionScope.SELF;
+
 	/**
 	 * Constructor.
 	 * 
@@ -58,14 +64,15 @@
 	 */
 	public void proxyCreated(Resource source, EObject eObject, EStructuralFeature feature, EObject proxy,
 			int position) {
-		final URI from = source.getURI();
-		final URI to = ((InternalEObject)proxy).eProxyURI().trimFragment();
-		// TODO Does this work with relative URIs? (isPlatformResource())
-		if (ResolutionUtil.getResolutionScope() != CrossReferenceResolutionScope.SELF
-				&& to.isPlatformResource()) {
-			SynchronizedResourceSet resourceSet = (SynchronizedResourceSet)source.getResourceSet();
-			eventBus.post(new ResourceDependencyFoundEvent(from, to, eObject, feature));
-			localResolver.demandResolve(resourceSet, to, diagnostic, tspm);
+		if (processProxies) {
+			final URI to = ((InternalEObject)proxy).eProxyURI().trimFragment();
+			// TODO Does this work with relative URIs? (isPlatformResource())
+			if (to.isPlatformResource()) {
+				final URI from = source.getURI();
+				SynchronizedResourceSet resourceSet = (SynchronizedResourceSet)source.getResourceSet();
+				eventBus.post(new ResourceDependencyFoundEvent(from, to, eObject, feature));
+				localResolver.demandResolve(resourceSet, to, diagnostic, tspm);
+			}
 		}
 	}
 }
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/RemoteMonitoredProxyCreationListener.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/RemoteMonitoredProxyCreationListener.java
index 4cd054f..61a3120 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/RemoteMonitoredProxyCreationListener.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/RemoteMonitoredProxyCreationListener.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2015 Obeo and others.
+ * Copyright (c) 2015, 2017 Obeo 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
@@ -8,6 +8,7 @@
  * Contributors:
  *     Obeo - initial API and implementation
  *     Michael Borkowski - public visibility
+ *     Philip Langer - bug 516500
  *******************************************************************************/
 package org.eclipse.emf.compare.ide.ui.internal.logical.resolver;
 
@@ -30,6 +31,10 @@
 	/** The remote resolver. */
 	protected final IResourceDependencyRemoteResolver remoteResolver;
 
+	/** Whether this listener should process proxies. */
+	protected final boolean processProxies = ResolutionUtil
+			.getResolutionScope() != CrossReferenceResolutionScope.SELF;
+
 	/**
 	 * Constructor.
 	 * 
@@ -51,12 +56,13 @@
 	 */
 	public void proxyCreated(Resource source, EObject eObject, EStructuralFeature feature, EObject proxy,
 			int position) {
-		final URI to = ((InternalEObject)proxy).eProxyURI().trimFragment();
-		// TODO Does this work with relative URIs? (isPlatformResource())
-		if (ResolutionUtil.getResolutionScope() != CrossReferenceResolutionScope.SELF
-				&& to.isPlatformResource()) {
-			SynchronizedResourceSet resourceSet = (SynchronizedResourceSet)source.getResourceSet();
-			remoteResolver.demandRemoteResolve(resourceSet, to, diagnostic, tspm);
+		if (processProxies) {
+			final URI to = ((InternalEObject)proxy).eProxyURI().trimFragment();
+			// TODO Does this work with relative URIs? (isPlatformResource())
+			if (to.isPlatformResource()) {
+				SynchronizedResourceSet resourceSet = (SynchronizedResourceSet)source.getResourceSet();
+				remoteResolver.demandRemoteResolve(resourceSet, to, diagnostic, tspm);
+			}
 		}
 	}
 }