Skip to content

Commit

Permalink
[3333] Add IMigrationParticipant
Browse files Browse the repository at this point in the history
Bug: #3333
Signed-off-by: Michaël Charfadi <michael.charfadi@obeosoft.com>
  • Loading branch information
mcharfadi committed Apr 10, 2024
1 parent 38612f5 commit e4fe4e2
Show file tree
Hide file tree
Showing 10 changed files with 729 additions and 4 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ image:doc/screenshots/inside_outside_labels.png[Isinde outside label example, 70
- https://github.com/eclipse-sirius/sirius-web/issues/3237[#3237] [diagram] Add a `DiagramServices` class containing services to expand and collapse nodes from AQL expressions (via the new `diagramServices` variable) and Java services.
- https://github.com/eclipse-sirius/sirius-web/issues/3282[#3282] [diagram] Add diagram assertions and navigators to ease the definition of diagram tests.
- https://github.com/eclipse-sirius/sirius-web/issues/3277[#3277] [gantt] Add support for dependency creation
- https://github.com/eclipse-sirius/sirius-web/issues/3333[#3333] [sirius-web] Added IMigrationParticipant interface, contribute implemention to migrate models


=== Improvements
Expand All @@ -89,6 +90,7 @@ They still support returning an `java.time.Instant` object directly.
- https://github.com/eclipse-sirius/sirius-web/issues/3312[#3312] [form] Make the details view more compact
- https://github.com/eclipse-sirius/sirius-web/issues/3349[#3349] [diagram] Add a default label when creating a NodeDescription
- https://github.com/eclipse-sirius/sirius-web/issues/3342[#3342] [deck] Update deck and gantt view metamodel and deck view examples
- https://github.com/eclipse-sirius/sirius-web/issues/3333[#3333] [sirius-web] Store the last migration performed in a document


== v2024.3.0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2019, 2023 Obeo.
* Copyright (c) 2019, 2024 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
Expand All @@ -17,6 +17,7 @@
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.sirius.components.emf.utils.MigrationData;

/**
* An EMF adapter used to store some metadata related to EMF Resources.
Expand All @@ -33,12 +34,16 @@
public class ResourceMetadataAdapter implements Adapter {
private String name;

private MigrationData migrationData;

private String migrationVersion = "";

private Notifier notifier;

public ResourceMetadataAdapter(String name) {
this.name = Objects.requireNonNull(name);
}

public String getName() {
return this.name;
}
Expand All @@ -47,6 +52,14 @@ public void setName(String name) {
this.name = name;
}

public MigrationData getMigrationData() {
return migrationData;
}

public void setMigrationData(MigrationData migrationData) {
this.migrationData = migrationData;
}

@Override
public void notifyChanged(Notification notification) {
// do nothing
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*******************************************************************************
* Copyright (c) 2024 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.sirius.components.emf.utils;

/**
* POJO for MigrationData.
*
* @author mcharfadi
*/
public class MigrationData {

public static final String JSON_OBJECT_ROOT = "migration";
private String lastMigrationPerformed;

private String migrationVersion;

public MigrationData() {
this.lastMigrationPerformed = "none";
this.migrationVersion = "0";
}

public MigrationData(String lastMigrationPerformed, String migrationVersion) {
this.lastMigrationPerformed = lastMigrationPerformed;
this.migrationVersion = migrationVersion;
}

public String getLastMigrationPerformed() {
return lastMigrationPerformed;
}

public void setLastMigrationPerformed(String lastMigrationPerformed) {
this.lastMigrationPerformed = lastMigrationPerformed;
}

public String getMigrationVersion() {
return migrationVersion;
}

public void setMigrationVersion(String migrationVersion) {
this.migrationVersion = migrationVersion;
}

@Override
public String toString() {
return "MigrationData{" +
"lastMigrationPerformed='" + lastMigrationPerformed + '\'' +
", migrationVersion='" + migrationVersion + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
/*******************************************************************************
* Copyright (c) 2024 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.sirius.web.application.editingcontext.migration;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.sirius.emfjson.resource.JsonResource;

import com.google.gson.JsonObject;

/**
* Interface of MigrationParticipant.
*
* @author mcharfadi
*/
public interface IMigrationParticipant {
String getVersion();

/**
* Called during the parsing of JSonResources (at loading time). It allows to
* retrieve a renamed EStructuralFeature from its old name. For example, if a
* EStructuralFeature 'aaa' has been renamed to 'bbb', then your MigrationParticipant
* should return the 'bbb' EStructuralFeature when given the 'aaa' name.
*
* @param eClass
* the given eClass.
* @param oldFeatureName
* the feature name before migration.
* @return the new structural feature or null if not found. The attribute
* corresponding to given old name into given eClass.
*/
default EStructuralFeature getStructuralFeature(EClass eClass, String oldFeatureName) {
return eClass.getEStructuralFeature(oldFeatureName);
}

/**
* Called before a JsonResource is serialized.
*
* @param resource
* The JsonResource that is serialized
* @param jsonObject
* The root jsonObject
*/
default void preDeserialization(JsonResource resource, JsonObject jsonObject) {

}

/**
* Called after a JsonResource is serialized.
*
* @param resource
* The JsonResource that is serialized
* @param jsonObject
* The root jsonObject
*/
default void postSerialization(JsonResource resource, JsonObject jsonObject) {

}

/**
* Called during the parsing of JSonResources (at loading time). It allows to
* retrieve and modify an eobject just before it's loaded into the resource,
* after every feature were set.
*
* @param eobject
* the given eobject.
* @param jsonObject
* the jsonObject used to set the features of the eobject.
*/
default void getJSonObjectBeforeLoading(EObject eobject, JsonObject jsonObject) {

}

/**
* Called during the parsing of XMIResources (at loading time). If a feature value has changed since a previous
* version, use this method to return the correct expected value. The feature value do not have to be set here,
* that will be done by JsonHelper.setValue().
*
* @param object
* the object containing the feature.
* @param feature
* the feature to set value.
* @param value
* the initial serialized value.
* @return the new value, or null otherwise.
*/
default Object getValue(EObject object, EStructuralFeature feature, Object value) {
return null;
}

/**
* Called during the parsing of JSonResources (at loading time). It allows to
* retrieve a renamed EStructuralFeature from its old name. For example, if a
* feature 'aaa' has been renamed to 'bbb', then your MigrationParticipant
* should return the 'bbb' feature when given the 'aaa' name.
*
* @param eClass
* the given eClass.
* @param oldAttributeName
* the feature name before migration.
* @return the new structural feature or null if not found. The attribute
* corresponding to given old name into given eClass.
*/
default EStructuralFeature getElement(EClass eClass, String oldAttributeName) {
return eClass.getEStructuralFeature(oldAttributeName);
}

/**
* Called during the parsing of JSonResources (at loading time). If an
* EClassifier name has changed, then you should return the correct one.
*
* @param ePackage
* the package where looking for classifier.
* @param typeName
* the old classifier name before migration.
* @return the new classifier corresponding to the old given name into given
* ePackage or null if not found.
*/
default EClassifier getType(EPackage ePackage, String typeName) {
return ePackage.getEClassifier(typeName);
}

/**
* Return the EPackage to use for the given namespace.
*
* @param namespace
* the nsURI of the package we are looking for.
* @return an EPackage if some new mapping exists, null otherwise.
*/
default EPackage getPackage(String namespace) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*******************************************************************************
* Copyright (c) 2024 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.sirius.web.application.editingcontext.migration;

import java.util.Comparator;
import java.util.List;
import java.util.Objects;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
import org.eclipse.sirius.components.emf.utils.MigrationData;

/**
* Specialized BasicExtendedMetaData.
*
* @author mcharfadi
*/
public class MigrationExtendedMetaData extends BasicExtendedMetaData {
private final MigrationData documentMigrationData;
private final List<IMigrationParticipant> migrationParticipants;
public MigrationExtendedMetaData(List<IMigrationParticipant> migrationParticipants, MigrationData documentMigrationData) {
this.migrationParticipants = Objects.requireNonNull(migrationParticipants);
this.documentMigrationData = Objects.requireNonNull(documentMigrationData);
}
private boolean isCandidateVersion(IMigrationParticipant migrationParticipant) {
return migrationParticipant.getVersion().compareTo(this.documentMigrationData.getMigrationVersion()) > 0;
}

@Override
public EStructuralFeature getElement(EClass eClass, String namespace, String name) {
EStructuralFeature structuralFeature = eClass.getEStructuralFeature(name);
var migrationParticipantsCandidate = migrationParticipants.stream()
.filter(this::isCandidateVersion)
.sorted(Comparator.comparing(IMigrationParticipant::getVersion))
.toList();
for (IMigrationParticipant migrationParticipant : migrationParticipantsCandidate) {
EStructuralFeature newStructuralFeature = migrationParticipant.getElement(eClass, name);
if (newStructuralFeature != null) {
structuralFeature = newStructuralFeature;
}
}
return structuralFeature;
}
@Override
public EClassifier getType(EPackage ePackage, String typeName) {
EClassifier eClassifier = ePackage.getEClassifier(typeName);
var migrationParticipantsCandidate = migrationParticipants.stream()
.filter(this::isCandidateVersion)
.sorted(Comparator.comparing(IMigrationParticipant::getVersion))
.toList();
for (IMigrationParticipant migrationParticipant : migrationParticipantsCandidate) {
EClassifier newEClassifier = migrationParticipant.getType(ePackage, typeName);
if (newEClassifier != null) {
eClassifier = newEClassifier;
}
}
return eClassifier;
}

@Override
public EPackage getPackage(String namespace) {
EPackage ePackage = super.getPackage(namespace);
var migrationParticipantsCandidate = migrationParticipants.stream()
.filter(this::isCandidateVersion)
.sorted(Comparator.comparing(IMigrationParticipant::getVersion))
.toList();
for (IMigrationParticipant migrationParticipant : migrationParticipantsCandidate) {
EPackage newEPackage = migrationParticipant.getPackage(namespace);
if (newEPackage != null) {
ePackage = newEPackage;
}
}
return ePackage;
}
}

0 comments on commit e4fe4e2

Please sign in to comment.