package jetbrains.mps.vcs.diff.ui.common; /*Generated by MPS */ import java.util.Map; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.smodel.tempmodel.TempModuleOptions; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; import jetbrains.mps.extapi.module.SModuleBase; import jetbrains.mps.extapi.model.SModelBase; import jetbrains.mps.kernel.model.MissingDependenciesFixer; import org.jetbrains.mps.openapi.model.SModelReference; import jetbrains.mps.smodel.SModelId; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.internal.collections.runtime.IVisitor; import jetbrains.mps.smodel.SReferenceBase; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; public class DiffModelUtil { private static Map<SModel, TempModuleOptions> myRegisteredModels = MapSequence.fromMap(new HashMap<SModel, TempModuleOptions>()); public static void renameModelAndRegister(SModel model, String version) { if (version != null) { renameModel(model, version); } TempModuleOptions mo = TempModuleOptions.forDefaultModule(); MapSequence.fromMap(myRegisteredModels).put(model, mo); SModuleBase module = (SModuleBase) mo.createModule(); module.registerModel((SModelBase) model); new MissingDependenciesFixer(model).fixModuleDependencies(); } public static void unregisterModel(SModel model) { TempModuleOptions mo = MapSequence.fromMap(myRegisteredModels).removeKey(model); SModuleBase modelModule = (SModuleBase) model.getModule(); if (modelModule != null) { modelModule.unregisterModel((SModelBase) model); } mo.disposeModule(); } public static void renameModel(SModel model, String version) { SModelReference modelRef = model.getReference(); as_5x16vn_a0a1a4(model, SModelBase.class).changeModelReference(genDiffSModelRef(modelRef, version)); } public static void restoreModelName(SModel model) { SModelReference modelRef = model.getReference(); assert modelRef.getModelId() instanceof SModelId.ForeignSModelId; as_5x16vn_a0a2a5(model, SModelBase.class).changeModelReference(getOriginalSModelRef(modelRef)); } public static void fixModelReferences(SModel model, final SModelReference modelRef) { // modelRef - generated references, will be replaced with original one through the model assert modelRef.getModelId() instanceof SModelId.ForeignSModelId; final SModelReference oldModelRef = getOriginalSModelRef(modelRef); for (SNode node : ListSequence.fromList(SModelOperations.nodes(model, null))) { ListSequence.fromList(SNodeOperations.getReferences(node)).where(new IWhereFilter<SReference>() { public boolean accept(SReference it) { return modelRef.equals(it.getTargetSModelReference()); } }).visitAll(new IVisitor<SReference>() { public void visit(SReference it) { as_5x16vn_a0a0a0a0a0a0a3a6(it, SReferenceBase.class).setTargetSModelReference(oldModelRef); } }); } } private static SModelReference genDiffSModelRef(SModelReference ref, String version) { SModelId newId = SModelId.foreign("diff_" + version + "#" + ref.getModelId().toString()); String newName = ref.getModelName() + "@" + version; return PersistenceFacade.getInstance().createModelReference(ref.getModuleReference(), newId, newName); } private static SModelReference getOriginalSModelRef(SModelReference ref) { String id = as_5x16vn_a0a0a0j(ref.getModelId(), SModelId.ForeignSModelId.class).getId(); String name = ref.getModelName(); org.jetbrains.mps.openapi.model.SModelId oldId = SModelId.fromString(id.substring(id.indexOf("#") + 1)); String oldName = name.substring(0, name.lastIndexOf("@")); return PersistenceFacade.getInstance().createModelReference(ref.getModuleReference(), oldId, oldName); } private static <T> T as_5x16vn_a0a1a4(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } private static <T> T as_5x16vn_a0a2a5(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } private static <T> T as_5x16vn_a0a0a0a0a0a0a3a6(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } private static <T> T as_5x16vn_a0a0a0j(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } }