Caching - Don't minimize the logical model eagerly

We use a cache to make sure the EMFModelProvider can always return the
logical model of files as fast as possible while reducing I/O operations
to the bare minimum.
Before,we used to minimize the logical model _before_ we cached it,
which prevented minimized resources from being cached.
This change makes sure that all the resources of the logical model are
cached before the logical model is minimized.
The expected performance impact is important, our test cases show a gain
of ~10 seconds for a merge operation that took roughly 18 seconds
and takes 8 with this fix.

Change-Id: I65612d9a53b454a288926a3533d57910b13a7e32
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/EMFModelProvider.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/EMFModelProvider.java
index ba7da3a..9fed1d8 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/EMFModelProvider.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/EMFModelProvider.java
@@ -44,7 +44,6 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
-import org.eclipse.emf.compare.ide.ui.logical.IModelMinimizer;
 import org.eclipse.emf.compare.ide.ui.logical.IModelResolver;
 import org.eclipse.emf.compare.ide.ui.logical.IStorageProvider;
 import org.eclipse.emf.compare.ide.ui.logical.IStorageProviderAccessor;
@@ -254,6 +253,10 @@
 						resourceMappingCache.put(res, syncModel);
 					}
 				}
+				if (LOGGER.isDebugEnabled()) {
+					LOGGER.debug("EMFModelProvider - Minimizing model"); //$NON-NLS-1$
+				}
+				new IdenticalResourceMinimizer().minimize(syncModel, monitor);
 			} else if (LOGGER.isDebugEnabled()) {
 				LOGGER.debug("Cache FOUND entry for " + file); //$NON-NLS-1$
 			}
@@ -272,6 +275,9 @@
 	 * <code>file1</code> if called with a {@link ResourceMappingContext#LOCAL_CONTEXT local context}, but it
 	 * will contain both files if called with a {@link RemoteResourceMappingContext remote context}.
 	 * </p>
+	 * <p>
+	 * <b>Note</b> that this will return an unminimized synchronization model.
+	 * </p>
 	 * 
 	 * @param file
 	 *            The file which logical model is to be resolved.
@@ -326,9 +332,8 @@
 
 			final IModelResolver remoteResolver = EMFCompareIDEUIPlugin.getDefault()
 					.getModelResolverRegistry().getBestResolverFor(leftStorage);
-			final IModelMinimizer minimizer = new IdenticalResourceMinimizer();
-			final ComparisonScopeBuilder builder = new ComparisonScopeBuilder(remoteResolver, minimizer,
-					accessor);
+			final ComparisonScopeBuilder builder = new ComparisonScopeBuilder(remoteResolver,
+					new NullModelMinimizer(), accessor);
 			syncModel = builder.buildSynchronizationModel(left, right, origin, actualMonitor);
 		} else {
 			// TODO wouldn't it be better to use Collections.singleton(file) for the right and origin?
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/NullModelMinimizer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/NullModelMinimizer.java
new file mode 100644
index 0000000..0f09eb0
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/NullModelMinimizer.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Obeo.
+ * 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:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.ide.ui.internal.logical;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.compare.ide.ui.logical.IModelMinimizer;
+import org.eclipse.emf.compare.ide.ui.logical.SynchronizationModel;
+
+/**
+ * An empty implementation of an {@link IModelMinimizer}.
+ * 
+ * @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a>
+ */
+public class NullModelMinimizer implements IModelMinimizer {
+	/** {@inheritDoc} */
+	public void minimize(SynchronizationModel syncModel, IProgressMonitor monitor) {
+		// Do nothing
+	}
+}