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);
}
}