diff --git a/bundles/org.eclipse.sirius.emfjson/src/main/java/org/eclipse/sirius/emfjson/utils/GsonEObjectDeserializer.java b/bundles/org.eclipse.sirius.emfjson/src/main/java/org/eclipse/sirius/emfjson/utils/GsonEObjectDeserializer.java index 15eb3d7..8c89047 100644 --- a/bundles/org.eclipse.sirius.emfjson/src/main/java/org/eclipse/sirius/emfjson/utils/GsonEObjectDeserializer.java +++ b/bundles/org.eclipse.sirius.emfjson/src/main/java/org/eclipse/sirius/emfjson/utils/GsonEObjectDeserializer.java @@ -447,7 +447,9 @@ private void deserializeData(JsonObject properties, EClass eClass, EObject eObje Set> entrySet = properties.entrySet(); for (Entry entry : entrySet) { EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(entry.getKey()); - + if (this.extendedMetaData != null) { + eStructuralFeature = this.extendedMetaData.getElement(eClass, eClass.getEPackage().getNsURI(), entry.getKey()); + } if (eStructuralFeature instanceof EAttribute) { this.deserializeEAttribute((EAttribute) eStructuralFeature, entry.getValue(), eObject); } else if (eStructuralFeature instanceof EReference) { diff --git a/tests/org.eclipse.sirius.emfjson.tests/src/main/java/org/eclipse/sirius/emfjson/tests/internal/unit/load/ExtendedMetaDataLoadTests.java b/tests/org.eclipse.sirius.emfjson.tests/src/main/java/org/eclipse/sirius/emfjson/tests/internal/unit/load/ExtendedMetaDataLoadTests.java new file mode 100644 index 0000000..720730d --- /dev/null +++ b/tests/org.eclipse.sirius.emfjson.tests/src/main/java/org/eclipse/sirius/emfjson/tests/internal/unit/load/ExtendedMetaDataLoadTests.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2023 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.sirius.emfjson.tests.internal.unit.load; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.util.BasicExtendedMetaData; +import org.eclipse.emf.ecore.util.ExtendedMetaData; +import org.eclipse.sirius.emfjson.resource.JsonResource; +import org.eclipse.sirius.emfjson.tests.internal.AbstractEMFJsonTests; +import org.junit.Test; + +/** + * Tests loading with ExtendedMetaData. + */ +public class ExtendedMetaDataLoadTests extends AbstractEMFJsonTests { + + /** + * {@inheritDoc} + * + * @see org.eclipse.sirius.emfjson.tests.internal.AbstractEMFJsonTests#getRootPath() + */ + @Override + protected String getRootPath() { + return "/unit/attributes/extendedmetadata/"; //$NON-NLS-1$ + } + + /** + * Change the name of a monovalued EAttribute. + */ + @Test + public void testChangeAttributeNameMono() { + ExtendedMetaData metaData = new BasicExtendedMetaData() { + @Override + public EStructuralFeature getElement(EClass eClass, String namespace, String name) { + if ("NodeSingleValueAttribute".equals(eClass.getName()) && "singleStringAttributeOld".equals(name)) { //$NON-NLS-1$ //$NON-NLS-2$ + return eClass.getEStructuralFeature("singleStringAttribute"); //$NON-NLS-1$ + } + return super.getElement(eClass, namespace, name); + } + + }; + this.options.put(JsonResource.OPTION_EXTENDED_META_DATA, metaData); + this.testLoad("TestChangeAttributeNameMono.xmi"); //$NON-NLS-1$ + } + + /** + * Change the name of a multivalued EAttribute. + */ + @Test + public void testChangeAttributeNameMulti() { + // CHECKSTYLE:OFF + ExtendedMetaData metaData = new BasicExtendedMetaData() { + + /** + * {@inheritDoc} + * + * @see org.eclipse.emf.ecore.util.BasicExtendedMetaData#getElement(org.eclipse.emf.ecore.EClass, + * java.lang.String, java.lang.String) + */ + @Override + public EStructuralFeature getElement(EClass eClass, String namespace, String name) { + if ("NodeMultiValuedAttribute".equals(eClass.getName()) && "multiStringAttributeOld".equals(name)) { //$NON-NLS-1$ //$NON-NLS-2$ + return eClass.getEStructuralFeature("multiStringAttribute"); //$NON-NLS-1$ + } + return super.getElement(eClass, namespace, name); + } + + }; + // CHECKSTYLE:ON + this.options.put(JsonResource.OPTION_EXTENDED_META_DATA, metaData); + this.testLoad("TestChangeAttributeNameMulti.xmi"); //$NON-NLS-1$ + } + +} diff --git a/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMono.json b/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMono.json new file mode 100644 index 0000000..fc4c951 --- /dev/null +++ b/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMono.json @@ -0,0 +1,21 @@ +{ + "json": { + "version": "1.0", + "encoding": "utf-8" + }, + "ns": { + "emfjson": "http://obeo.fr/emfjson", + "nodes": "http://www.obeo.fr/EMFJson" + }, + "schemaLocation": { + "http://www.obeo.fr/EMFJson": "../../../nodes.ecore" + }, + "content": [ + { + "eClass": "nodes:NodeSingleValueAttribute", + "data": { + "singleStringAttributeOld": "singleStringAttribute value" + } + } + ] +} \ No newline at end of file diff --git a/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMono.xmi b/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMono.xmi new file mode 100644 index 0000000..a89f2d3 --- /dev/null +++ b/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMono.xmi @@ -0,0 +1,8 @@ + + diff --git a/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMulti.json b/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMulti.json new file mode 100644 index 0000000..f5b5520 --- /dev/null +++ b/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMulti.json @@ -0,0 +1,25 @@ +{ + "json": { + "version": "1.0", + "encoding": "utf-8" + }, + "ns": { + "emfjson": "http://obeo.fr/emfjson", + "nodes": "http://www.obeo.fr/EMFJson" + }, + "schemaLocation": { + "http://www.obeo.fr/EMFJson": "../../../nodes.ecore" + }, + "content": [ + { + "eClass": "nodes:NodeMultiValuedAttribute", + "data": { + "multiStringAttributeOld": [ + "multiStringAttribute value 1", + "multiStringAttribute value 2", + "multiStringAttribute value 3" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMulti.xmi b/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMulti.xmi new file mode 100644 index 0000000..8de839a --- /dev/null +++ b/tests/org.eclipse.sirius.emfjson.tests/src/main/resources/unit/attributes/extendedmetadata/TestChangeAttributeNameMulti.xmi @@ -0,0 +1,11 @@ + + + multiStringAttribute value 1 + multiStringAttribute value 2 + multiStringAttribute value 3 +