[488551] Add hook for initializing the ElementTypeSetConfigurationReg.

The class ElementTypeSetConfigurationRegistry is not available on Luna,
so we have to use reflection to be backwards compatible with Luna.

This also fixes implementations of
o.e.papyrus.infra.core.resource.AbstractBaseModel, which now forces its
subclasses to implement canPersist(EObject) and persist(EObject). In
order to be compatible with earlier versions, we omit the @Override
annotation.

Bug: 488551
Change-Id: If5b90c3d1a27af25e4d88460686e4ef5a00194d5
Signed-off-by: Philip Langer <planger@eclipsesource.com>
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/plugin.xml b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/plugin.xml
index a24b9d0..e57d27f 100644
--- a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/plugin.xml
+++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/plugin.xml
@@ -28,6 +28,9 @@
       <resourceSetHook
             class="org.eclipse.emf.compare.diagram.ide.ui.papyrus.internal.SaveParameterHook">
       </resourceSetHook>
+      <resourceSetHook
+            class="org.eclipse.emf.compare.diagram.ide.ui.papyrus.internal.ElementTypeSetConfigurationRegistryInitializingHook">
+      </resourceSetHook>
    </extension>
    <extension
          point="org.eclipse.emf.compare.ide.ui.logicalModelViewHandlers">
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/AbstractPapyrusResourceSetHook.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/AbstractPapyrusResourceSetHook.java
new file mode 100644
index 0000000..c99ef60
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/AbstractPapyrusResourceSetHook.java
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * Copyright (c) 2016 EclipseSource Services 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Philip Langer (EclipseSource) - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.emf.compare.diagram.ide.ui.papyrus.internal;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.compare.diagram.ide.ui.papyrus.util.ModelExtensionUtil;
+import org.eclipse.emf.compare.ide.hook.AbstractResourceSetHooks;
+
+/**
+ * Abstract resource set hook that is activated for Papyrus files.
+ * 
+ * @author Philip Langer <planger@eclipsesource.com>
+ * @since 2.5
+ */
+public abstract class AbstractPapyrusResourceSetHook extends AbstractResourceSetHooks {
+
+	/**
+	 * File extensions registered in Papyrus.
+	 */
+	protected final Set<String> fileExtensions;
+
+	public AbstractPapyrusResourceSetHook() {
+		super();
+		fileExtensions = ImmutableSet.copyOf(ModelExtensionUtil.getRegisteredFileExtensions());
+	}
+
+	/**
+	 * Hooks in when any of the file extensions registered in Papyrus are loaded. {@inheritDoc}
+	 */
+	@Override
+	public boolean isHookFor(final Collection<? extends URI> uris) {
+		for (final URI uri : uris) {
+			if (fileExtensions.contains(uri.fileExtension())) {
+				return true;
+			}
+		}
+		return false;
+	}
+}
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/ElementTypeSetConfigurationRegistryInitializingHook.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/ElementTypeSetConfigurationRegistryInitializingHook.java
new file mode 100644
index 0000000..324053e
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/ElementTypeSetConfigurationRegistryInitializingHook.java
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ * Copyright (c) 2016 EclipseSource Services 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Philip Langer (EclipseSource) - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.emf.compare.diagram.ide.ui.papyrus.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.swt.widgets.Display;
+import org.osgi.framework.Bundle;
+
+/**
+ * This hook initializes the ElementTypeSetConfigurationRegistry before a Papyrus resource is loaded.
+ * <p>
+ * The class
+ * {@link org.eclipse.papyrus.infra.elementtypesconfigurations.registries.ElementTypeSetConfigurationRegistry.ElementTypeSetConfigurationRegistry
+ * ElementTypeSetConfigurationRegistry} is not available on Luna, so we have to use reflection to be backwards
+ * compatible with Luna.
+ * </p>
+ * 
+ * @author Philip Langer <planger@eclipsesource.com>
+ * @since 2.5
+ */
+public class ElementTypeSetConfigurationRegistryInitializingHook extends AbstractPapyrusResourceSetHook {
+
+	private static final String BUNDLE_ID = "org.eclipse.papyrus.infra.elementtypesconfigurations"; //$NON-NLS-1$
+
+	private static final String GET_INSTANCE = "getInstance"; //$NON-NLS-1$
+
+	private static final String ELEMENTTYPESETCONFIGREG_CLASS_NAME = "org.eclipse.papyrus.infra.elementtypesconfigurations.registries.ElementTypeSetConfigurationRegistry"; //$NON-NLS-1$
+
+	@Override
+	public void preLoadingHook(ResourceSet resourceSet, Collection<? extends URI> uris) {
+		Display.getDefault().syncExec(new Runnable() {
+			public void run() {
+				try {
+					// ElementTypeSetConfigurationRegistry is not available on Luna, so we have to use
+					// reflection to be backwards compatible with Luna
+					Bundle bundle = Platform.getBundle(BUNDLE_ID);
+					Class<?> registryClass = bundle.loadClass(ELEMENTTYPESETCONFIGREG_CLASS_NAME);
+					Method getInstanceMethod = registryClass.getDeclaredMethod(GET_INSTANCE);
+					getInstanceMethod.invoke(null);
+				} catch (ClassNotFoundException e) {
+					logException(e);
+				} catch (NoSuchMethodException e) {
+					logException(e);
+				} catch (SecurityException e) {
+					logException(e);
+				} catch (IllegalAccessException e) {
+					logException(e);
+				} catch (IllegalArgumentException e) {
+					logException(e);
+				} catch (InvocationTargetException e) {
+					logException(e);
+				} catch (NullPointerException e) {
+					logException(new RuntimeException(
+							"Papyrus Element TypeSet Configuration Registry could not be found in bundle " //$NON-NLS-1$
+									+ BUNDLE_ID + ", class " + ELEMENTTYPESETCONFIGREG_CLASS_NAME //$NON-NLS-1$
+									+ ", method " + GET_INSTANCE, e)); //$NON-NLS-1$
+				}
+			}
+		});
+	}
+
+	private void logException(Exception e) {
+		CompareDiagramIDEUIPapyrusPlugin.getDefault().getLog().log(
+				new Status(IStatus.WARNING, CompareDiagramIDEUIPapyrusPlugin.PLUGIN_ID,
+						"Could not initialize ElementTypeSetConfigurationRegistry before comparison", e)); //$NON-NLS-1$
+	}
+}
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/SaveParameterHook.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/SaveParameterHook.java
index de87dfa..647c763 100644
--- a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/SaveParameterHook.java
+++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/SaveParameterHook.java
@@ -11,13 +11,10 @@
 package org.eclipse.emf.compare.diagram.ide.ui.papyrus.internal;
 
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.compare.diagram.ide.ui.papyrus.util.ModelExtensionUtil;
-import org.eclipse.emf.compare.ide.hook.AbstractResourceSetHooks;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.xmi.XMLResource;
@@ -31,33 +28,7 @@
  * @author Stefan Dirix <sdirix@eclipsesource.com>
  * @since 2.4
  */
-public class SaveParameterHook extends AbstractResourceSetHooks {
-
-	/**
-	 * File extensions registered in Papyrus.
-	 */
-	private final Set<String> fileExtensions;
-
-	/**
-	 * Constructs and initializes the SaveParameterHook by checking the platform registry for registered file
-	 * extensions in Papyrus.
-	 */
-	public SaveParameterHook() {
-		fileExtensions = new HashSet<String>(ModelExtensionUtil.getRegisteredFileExtensions());
-	}
-
-	/**
-	 * Hooks in when any of the file extensions registered in Papyrus are loaded. {@inheritDoc}
-	 */
-	@Override
-	public boolean isHookFor(final Collection<? extends URI> uris) {
-		for (final URI uri : uris) {
-			if (fileExtensions.contains(uri.fileExtension())) {
-				return true;
-			}
-		}
-		return false;
-	}
+public class SaveParameterHook extends AbstractPapyrusResourceSetHook {
 
 	/**
 	 * Adjust the default save parameters of Papyrus resources. The {@link ResourceSet} is checked if it
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/util/ModelExtensionUtil.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/util/ModelExtensionUtil.java
index f74a73f..617a8b5 100644
--- a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/util/ModelExtensionUtil.java
+++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/util/ModelExtensionUtil.java
@@ -176,6 +176,11 @@
 	 * before version 1.1.0.
 	 */
 	private static class DefaultSaveOptionsClass extends AbstractBaseModel {
+
+		public Map<?, ?> getMyDefaultSaveOptions() {
+			return getSaveOptions();
+		}
+
 		@Override
 		protected String getModelFileExtension() {
 			return null;
@@ -186,46 +191,18 @@
 			return null;
 		}
 
-		public Map<?, ?> getMyDefaultSaveOptions() {
-			return getSaveOptions();
-		}
-
-		/**
-		 * {@inheritedDoc}.
-		 *
-		 * @see org.eclipse.papyrus.infra.core.resource.IModel#getAdapter(java.lang.Class)
-		 * @param <T>
-		 *            type.
-		 * @param adapter
-		 *            adapter.
-		 * @return the adapter.
-		 */
-		public <T> T getAdapter(Class<T> adapter) {
-			return null;
-		}
-
-		/**
-		 * {@inheritedDoc}.
-		 *
-		 * @see org.eclipse.papyrus.infra.core.resource.IEMFModel#canPersist(org.eclipse.emf.ecore.EObject)
-		 * @param arg0
-		 *            the object.
-		 * @return true if the object can persist.
-		 */
-		public boolean canPersist(EObject arg0) {
+		// since Papyrus 2.0 we have to implement canPersist
+		// we omit @Override on purpose to be backward compatible
+		@SuppressWarnings("all")
+		public boolean canPersist(EObject eObject) {
 			return false;
 		}
 
-		/**
-		 * {@inheritedDoc}.
-		 *
-		 * @see org.eclipse.papyrus.infra.core.resource.IEMFModel#persist(org.eclipse.emf.ecore.EObject)
-		 * @param arg0
-		 *            the object.
-		 */
-		public void persist(EObject arg0) {
-
+		// since Papyrus 2.0 we have to implement persist
+		// we omit @Override on purpose to be backward compatible
+		@SuppressWarnings("all")
+		public void persist(EObject object) {
+			// no implementation
 		}
 	}
-
 }
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/customparametermodel/CustomParameterModel.java b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/customparametermodel/CustomParameterModel.java
index c50f9a1..39785a1 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/customparametermodel/CustomParameterModel.java
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/customparametermodel/CustomParameterModel.java
@@ -59,15 +59,17 @@
 		return options;
 	}
 
-	public <T> T getAdapter(Class<T> adapter) {
-		return null;
-	}
-
-	public boolean canPersist(EObject arg0) {
+	// since Papyrus 2.0 we have to implement canPersist
+	// we omit @Override on purpose to be backward compatible
+	@SuppressWarnings("all")
+	public boolean canPersist(EObject eObject) {
 		return false;
 	}
 
-	public void persist(EObject arg0) {
-
+	// since Papyrus 2.0 we have to implement persist
+	// we omit @Override on purpose to be backward compatible
+	@SuppressWarnings("all")
+	public void persist(EObject object) {
+		// no implementation
 	}
 }
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/nullparametermodel/NullParameterModel.java b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/nullparametermodel/NullParameterModel.java
index 44f469a..81f5d8a 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/nullparametermodel/NullParameterModel.java
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/nullparametermodel/NullParameterModel.java
@@ -39,16 +39,17 @@
 		return null;
 	}
 
-	public <T> T getAdapter(Class<T> adapter) {
-		return null;
-	}
-
-	public boolean canPersist(EObject arg0) {
+	// since Papyrus 2.0 we have to implement canPersist
+	// we omit @Override on purpose to be backward compatible
+	@SuppressWarnings("all")
+	public boolean canPersist(EObject eObject) {
 		return false;
 	}
 
-	public void persist(EObject arg0) {
-
+	// since Papyrus 2.0 we have to implement persist
+	// we omit @Override on purpose to be backward compatible
+	@SuppressWarnings("all")
+	public void persist(EObject object) {
+		// no implementation
 	}
-
 }
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/runtimeexceptionmodel/RuntimeExceptionModel.java b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/runtimeexceptionmodel/RuntimeExceptionModel.java
index 6b9d281..96aa3e2 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/runtimeexceptionmodel/RuntimeExceptionModel.java
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/modelextension/data/runtimeexceptionmodel/RuntimeExceptionModel.java
@@ -39,16 +39,17 @@
 		throw new NullPointerException();
 	}
 
-	public <T> T getAdapter(Class<T> adapter) {
-		return null;
-	}
-
-	public boolean canPersist(EObject arg0) {
+	// since Papyrus 2.0 we have to implement canPersist
+	// we omit @Override on purpose to be backward compatible
+	@SuppressWarnings("all")
+	public boolean canPersist(EObject eObject) {
 		return false;
 	}
 
-	public void persist(EObject arg0) {
-
+	// since Papyrus 2.0 we have to implement persist
+	// we omit @Override on purpose to be backward compatible
+	@SuppressWarnings("all")
+	public void persist(EObject object) {
+		// no implementation
 	}
-
 }
diff --git a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/util/PapyrusSaveParameterUtil.java b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/util/PapyrusSaveParameterUtil.java
index 8f7b9a2..cb19f95 100644
--- a/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/util/PapyrusSaveParameterUtil.java
+++ b/plugins/org.eclipse.emf.compare.diagram.papyrus.tests/src/org/eclipse/emf/compare/diagram/papyrus/tests/util/PapyrusSaveParameterUtil.java
@@ -119,15 +119,18 @@
 			return super.getSaveOptions();
 		}
 
-		public <T> T getAdapter(Class<T> adapter) {
-			return null;
-		}
-
-		public boolean canPersist(EObject arg0) {
+		// since Papyrus 2.0 we have to implement canPersist
+		// we omit @Override on purpose to be backward compatible
+		@SuppressWarnings("all")
+		public boolean canPersist(EObject eObject) {
 			return false;
 		}
 
-		public void persist(EObject arg0) {
+		// since Papyrus 2.0 we have to implement persist
+		// we omit @Override on purpose to be backward compatible
+		@SuppressWarnings("all")
+		public void persist(EObject object) {
+			// no implementation
 		}
 	}