package ref.migration; /*Generated by MPS */ import jetbrains.mps.lang.migration.runtime.base.MigrationScriptBase; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.module.SModule; import java.util.Map; import jetbrains.mps.lang.migration.runtime.base.MigrationScriptReference; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModuleOperations; import jetbrains.mps.internal.collections.runtime.ITranslator2; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; import jetbrains.mps.internal.collections.runtime.IVisitor; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.internal.collections.runtime.MapSequence; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import java.util.ArrayList; import jetbrains.mps.smodel.SModelUtil_new; public class SampleRefMigration extends MigrationScriptBase { public String getCaption() { return "migrate the references using smodel API"; } @Override public boolean isRerunnable() { return false; } public SNode execute(final SModule m) { doExecute(m); return null; } public void doExecute(final SModule m) { final Map<SModule, SNode> declData = getDataCollector().collectData(m, new MigrationScriptReference(MetaAdapterFactory.getLanguage(0x9de7c5ceea6f4fb4L, 0xa7ba45e62b53cbadL, "decl"), 1)); // the received data are of a map type - mapping modules to their respective migration information final Map<SModule, SNode> requiredData = declData; // get all models in the current module Iterable<SModel> models = Sequence.fromIterable(((Iterable<SModel>) m.getModels())).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return !(SModuleOperations.isAspect(it, "migration")); } }); // get all old references in all models of this module Iterable<SNode> references = Sequence.fromIterable(models).translate(new ITranslator2<SModel, SNode>() { public Iterable<SNode> translate(SModel it) { return SModelOperations.nodes(it, MetaAdapterFactory.getConcept(0xd3d2b6e3a4b343d5L, 0xbb29420d39fa86abL, 0x6aff2c104931574dL, "ref.structure.OldComponentRef")); } }); // for each found old reference Sequence.fromIterable(references).visitAll(new IVisitor<SNode>() { public void visit(SNode oldNode) { // create a new one, leave the reference target empty SNode newNode = _quotation_createNode_u457zm_a0b0a0a01a5(); // find the target of the old reference and its containing model final SReference oldRef = oldNode.getReference(MetaAdapterFactory.getReferenceLink(0xd3d2b6e3a4b343d5L, 0xbb29420d39fa86abL, 0x6aff2c104931574dL, 0x6aff2c104932a69aL, "target")); SModel oldModel = oldRef.getTargetSModelReference().resolve(m.getRepository()); // get the id of the component that the old component has been migrated into SNode newNodeId = ListSequence.fromList(SLinkOperations.getChildren(MapSequence.fromMap(requiredData).get(oldModel.getModule()), MetaAdapterFactory.getContainmentLink(0x9de7c5ceea6f4fb4L, 0xa7ba45e62b53cbadL, 0x1b931c975a732f8bL, 0x1b931c975a732f9aL, "entry"))).findFirst(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return SPropertyOperations.getString(it, MetaAdapterFactory.getProperty(0x9de7c5ceea6f4fb4L, 0xa7ba45e62b53cbadL, 0x1b931c975a732860L, 0x1b931c975a732f6dL, "oldId")).equals(oldRef.getTargetNodeId().toString()); } }); // get the new component instance SNode newTarget = oldModel.getNode(PersistenceFacade.getInstance().createNodeId(SPropertyOperations.getString(newNodeId, MetaAdapterFactory.getProperty(0x9de7c5ceea6f4fb4L, 0xa7ba45e62b53cbadL, 0x1b931c975a732860L, 0x1b931c975a732f7bL, "newId")))); // set the reference to point to it SLinkOperations.setTarget(newNode, MetaAdapterFactory.getReferenceLink(0xd3d2b6e3a4b343d5L, 0xbb29420d39fa86abL, 0x6aff2c104932a6c9L, 0x6aff2c104932a6caL, "target"), (SNode) newTarget); // replace the old reference in the model with the newly created one SNodeOperations.replaceWithAnother(oldNode, newNode); } }); } public Iterable<MigrationScriptReference> requiresData() { return ListSequence.fromListAndArray(new ArrayList<MigrationScriptReference>(), new MigrationScriptReference(MetaAdapterFactory.getLanguage(0x9de7c5ceea6f4fb4L, 0xa7ba45e62b53cbadL, "decl"), 1)); } public MigrationScriptReference getDescriptor() { return new MigrationScriptReference(MetaAdapterFactory.getLanguage(0xd3d2b6e3a4b343d5L, 0xbb29420d39fa86abL, "ref"), 1); } private static SNode _quotation_createNode_u457zm_a0b0a0a01a5() { PersistenceFacade facade = PersistenceFacade.getInstance(); SNode quotedNode_1 = null; quotedNode_1 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xd3d2b6e3a4b343d5L, 0xbb29420d39fa86abL, "ref"), 0x6aff2c104932a6c9L, "NewComponentRef"), null, null, false); return quotedNode_1; } }