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 452a6c8
Show file tree
Hide file tree
Showing 13 changed files with 782 additions and 3 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
@@ -0,0 +1,31 @@
/*******************************************************************************
* 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;

/**
* POJO for MigrationData.
*
* @author mcharfadi
*/
public record MigrationData(String lastMigrationPerformed, String migrationVersion) {

public static final String JSON_OBJECT_ROOT = "migration";

@Override
public String toString() {
return "MigrationData{" +
"lastMigrationPerformed='" + lastMigrationPerformed + '\'' +
", migrationVersion='" + migrationVersion + '\'' +
'}';
}
}
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 Down Expand Up @@ -33,6 +33,8 @@
public class ResourceMetadataAdapter implements Adapter {
private String name;

private MigrationData migrationData;

private Notifier notifier;

public ResourceMetadataAdapter(String name) {
Expand All @@ -47,6 +49,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,128 @@
/*******************************************************************************
* 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 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 JsonResources (at loading time). If a feature value has changed since a previous
* version, use this method to return the correct expected value or null if it did not change.
*
* @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 eStructuralFeatureName
* 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 getEStructuralFeature(EClass eClass, String eStructuralFeatureName) {
return eClass.getEStructuralFeature(eStructuralFeatureName);
}

/**
* 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 getEClassifier(EPackage ePackage, String typeName) {
return ePackage.getEClassifier(typeName);
}

/**
* Return the EPackage to use for the given namespace.
*
* @param nsURI
* the nsURI of the package we are looking for.
* @return an EPackage if some new mapping exists, null otherwise.
*/
default EPackage getPackage(String nsURI) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/*******************************************************************************
* 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.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.migrationVersion()) > 0;
}

@Override
public EStructuralFeature getElement(EClass eClass, String namespace, String eStructuralFeatureName) {
EStructuralFeature structuralFeature = eClass.getEStructuralFeature(eStructuralFeatureName);
var migrationParticipantsCandidate = migrationParticipants.stream()
.filter(this::isCandidateVersion)
.sorted(Comparator.comparing(IMigrationParticipant::getVersion))
.toList();
for (IMigrationParticipant migrationParticipant : migrationParticipantsCandidate) {
EStructuralFeature newStructuralFeature = migrationParticipant.getEStructuralFeature(eClass, eStructuralFeatureName);
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.getEClassifier(ePackage, typeName);
if (newEClassifier != null) {
eClassifier = newEClassifier;
}
}
return eClassifier;
}

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

0 comments on commit 452a6c8

Please sign in to comment.