Merge remote-tracking branch 'origin/release_1.23.0' into develop

Change-Id: Id4d48c63e9653377ebbd3eabebdfcf42f2c445fd
diff --git a/bundles/org.eclipse.emf.ecp.ide.util/src/org/eclipse/emf/ecp/ide/spi/util/EcoreHelper.java b/bundles/org.eclipse.emf.ecp.ide.util/src/org/eclipse/emf/ecp/ide/spi/util/EcoreHelper.java
index 3ad4390..b1aab16 100644
--- a/bundles/org.eclipse.emf.ecp.ide.util/src/org/eclipse/emf/ecp/ide/spi/util/EcoreHelper.java
+++ b/bundles/org.eclipse.emf.ecp.ide.util/src/org/eclipse/emf/ecp/ide/spi/util/EcoreHelper.java
@@ -147,6 +147,9 @@
 	 */
 	private static final Map<String, String> ECOREPATH_TO_WORKSPACEURI = new HashMap<String, String>();
 
+	/** Keeps track of how many times an ecore path was registered in order to not unregister it prematurely. */
+	private static final Map<String, Integer> ECOREPATH_TO_REGISTRATIONCOUNT = new HashMap<String, Integer>();
+
 	/**
 	 * Contains mapping between an platform resource URI and the URIs which reference it.
 	 */
@@ -184,6 +187,7 @@
 		initResourceSet(physicalResourceSet, true);
 		final URI uri = URI.createPlatformResourceURI(ecorePath, false);
 		ECOREPATH_TO_WORKSPACEURI.put(ecorePath, uri.toString());
+		ECOREPATH_TO_REGISTRATIONCOUNT.put(ecorePath, ECOREPATH_TO_REGISTRATIONCOUNT.getOrDefault(ecorePath, 0) + 1);
 		final Resource r = physicalResourceSet.createResource(uri);
 
 		loadResource(ecorePath, r);
@@ -360,6 +364,14 @@
 		if (ecorePath == null || !ECOREPATH_TO_WORKSPACEURI.containsKey(ecorePath)) {
 			return;
 		}
+
+		ECOREPATH_TO_REGISTRATIONCOUNT.put(ecorePath, ECOREPATH_TO_REGISTRATIONCOUNT.getOrDefault(ecorePath, 1) - 1);
+		if (ECOREPATH_TO_REGISTRATIONCOUNT.get(ecorePath) == 0) {
+			ECOREPATH_TO_REGISTRATIONCOUNT.remove(ecorePath);
+		} else {
+			return;
+		}
+
 		final String uriToUnregister = ECOREPATH_TO_WORKSPACEURI.remove(ecorePath);
 
 		final Set<String> referencedBy = WORKSPACEURI_REFERENCEDBY.get(uriToUnregister);
diff --git a/releng/org.eclipse.emf.ecp.releng/api-baseline.target b/releng/org.eclipse.emf.ecp.releng/api-baseline.target
new file mode 100644
index 0000000..d427404
--- /dev/null
+++ b/releng/org.eclipse.emf.ecp.releng/api-baseline.target
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?>
+<target name="api-baseline">
+	<locations>
+		<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
+			<repository location="http://download.eclipse.org/ecp/releases/releases_target_122/"/>
+			<unit id="org.eclipse.emf.ecp.cdo.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.changebroker.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.demo.e3.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.demo.e4.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.diffmerge.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.e3.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.e4.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.ecore.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.emf2web.feature.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.emfforms.idetooling.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.emfforms.runtime.feature.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.emfforms.sdk.feature.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.emfstore.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.i18n.feature.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.ide.migration.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.makeithappen.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.rap.sdk.feature.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.rap.util.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.sdk.e4.feature.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.sdk.feature.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.validation.view.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.categorization.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.compoundcontrol.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.custom.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.di.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.edapt.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.group.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.group.swt.collapsible.pgroup.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.groupedgrid.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.horizontal.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.indexdmr.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.keyattributedmr.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.label.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.mappingdmr.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.model.controls.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.model.editor.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.rule.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.section.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.stack.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.table.celleditor.rcp.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.table.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.table.ui.nebula.grid.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.table.ui.rcp.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.table.ui.swt.persistedstate.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.table.validation" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.template.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.treemasterdetail.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.unset.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.validation.bean.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.validation.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.validation.initial.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.vertical.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.view.viewproxy.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.viewmodel.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.ecp.workspace.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emf.edapt.runtime.feature.feature.group" version="1.4.0.201902190757"/>
+			<unit id="org.eclipse.emf.edapt.runtime.feature.source.feature.group" version="1.4.0.201902190757"/>
+			<unit id="org.eclipse.emfforms.coffee.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.common.prevalidation.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.datatemplate.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.datatemplate.ide.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.editor.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.editor.genmodel.util.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.i18n.feature.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.rulerepository.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.spreadsheet.feature.source.feature.group" version="1.0.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.swt.control.multiattribute.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.swt.control.text.autocomplete.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.swt.control.text.richtext.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.swt.controlgrid.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+			<unit id="org.eclipse.emfforms.view.annotation.feature.source.feature.group" version="1.22.0.20190903-1057"/>
+		</location>
+	</locations>
+</target>
\ No newline at end of file
diff --git a/tests/org.eclipse.emf.ecp.ide.util.test/src/org/eclipse/emf/ecp/ide/util/test/EcoreHelperNoDependencies_PTest.java b/tests/org.eclipse.emf.ecp.ide.util.test/src/org/eclipse/emf/ecp/ide/util/test/EcoreHelperNoDependencies_PTest.java
index e8fcef7..1f6681a 100644
--- a/tests/org.eclipse.emf.ecp.ide.util.test/src/org/eclipse/emf/ecp/ide/util/test/EcoreHelperNoDependencies_PTest.java
+++ b/tests/org.eclipse.emf.ecp.ide.util.test/src/org/eclipse/emf/ecp/ide/util/test/EcoreHelperNoDependencies_PTest.java
@@ -119,4 +119,31 @@
 			packageRegistry.containsKey("a.nsuri"));
 	}
 
+	@Test
+	public void testMultipleRegistration() throws IOException {
+		// check initial setup
+		assertFalse("Package is already in the registry!",
+			packageRegistry.containsKey("a.nsuri"));
+
+		// register
+		EcoreHelper.registerEcore(aEcorePath);
+		assertTrue("Package not in the registry!",
+			packageRegistry.containsKey("a.nsuri"));
+
+		// register a second time
+		EcoreHelper.registerEcore(aEcorePath);
+		assertTrue("Package not in the registry!",
+			packageRegistry.containsKey("a.nsuri"));
+
+		// unregister
+		EcoreHelper.unregisterEcore(aEcorePath);
+		assertTrue("Package not in the registry!",
+			packageRegistry.containsKey("a.nsuri"));
+
+		// unregister a second time
+		EcoreHelper.unregisterEcore(aEcorePath);
+		assertFalse("Package is still in the registry!",
+			packageRegistry.containsKey("a.nsuri"));
+	}
+
 }