package jetbrains.mps.vcspersistence; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.persistence.ModelFactory; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import jetbrains.mps.persistence.ByteArrayInputSource; import java.util.Collections; import java.io.IOException; import jetbrains.mps.vfs.IFile; import java.io.InputStream; import jetbrains.mps.util.ReadUtil; import jetbrains.mps.smodel.SModelHeader; import org.xml.sax.InputSource; import java.io.ByteArrayInputStream; import jetbrains.mps.smodel.loading.ModelLoadResult; import jetbrains.mps.smodel.loading.ModelLoadingState; import jetbrains.mps.smodel.InvalidSModel; import jetbrains.mps.smodel.persistence.def.ModelReadException; import jetbrains.mps.smodel.TrivialModelDescriptor; import jetbrains.mps.persistence.PersistenceVersionAware; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SModelReference; import jetbrains.mps.util.Pair; import org.jetbrains.mps.openapi.module.SModuleId; import org.jetbrains.mps.openapi.model.SModelId; import org.jetbrains.mps.openapi.module.SModuleReference; import jetbrains.mps.project.structure.modules.ModuleReference; public class VCSPersistenceUtil { public static SModel loadModel(final byte[] content, String extension) { // returns null if an error occured, as its predcessor in PersistenceUtil. // [MM] not sure this is correct, just left it unchanged SModel oldModel = loadFromOldMPSPersistence(content); if (oldModel != null) { return oldModel; } ModelFactory factory = PersistenceFacade.getInstance().getModelFactory(extension); if (factory == null) { return null; } try { SModel model = factory.load(new ByteArrayInputSource(content), Collections.singletonMap(ModelFactory.OPTION_CONTENT_ONLY, Boolean.TRUE.toString())); model.load(); return model; } catch (IOException ex) { return null; } } public static SModel loadModel(IFile file) { InputStream input = null; try { input = file.openInputStream(); byte[] bytes = ReadUtil.read(input); return loadModel(bytes, file.getName().substring(file.getName().lastIndexOf("."))); } catch (IOException e) { return null; } finally { if (input != null) { try { input.close(); } catch (IOException e) { // do nothing } } } } private static SModel loadFromOldMPSPersistence(final byte[] content) { SModelHeader header; try { header = VCSPersistenceSupport.loadDescriptor(new InputSource(new ByteArrayInputStream(content))); } catch (IOException e) { return null; } try { final ModelLoadResult readModel = VCSPersistenceSupport.readModel(header, new ByteArrayInputSource(content), ModelLoadingState.FULLY_LOADED); jetbrains.mps.smodel.SModel model = readModel.getModel(); if (model instanceof InvalidSModel) { return null; } return new VCSPersistenceUtil.MyModel(model, header); } catch (ModelReadException e) { return null; } } private static class MyModel extends TrivialModelDescriptor implements PersistenceVersionAware { private final SModelHeader myHeader; public void setPersistenceVersion(int pv) { myHeader.setPersistenceVersion(pv); } public int getPersistenceVersion() { return myHeader.getPersistenceVersion(); } @Nullable public ModelFactory getModelFactory() { return null; } public MyModel(jetbrains.mps.smodel.SModel readModel, SModelHeader header) { super(readModel); myHeader = header; } } public static SModelReference createModelReference(String modelUID) { Pair<Pair<SModuleId, String>, Pair<SModelId, String>> parseResult = jetbrains.mps.smodel.SModelReference.parseReference_internal(modelUID); SModuleId moduleId = parseResult.o1.o1; String moduleName = parseResult.o1.o2; SModelId modelId = parseResult.o2.o1; String modelName = parseResult.o2.o2; SModuleReference moduleRef = (moduleId != null || moduleName != null ? new ModuleReference(moduleName, moduleId) : null); if (moduleRef == null && !((modelId.isGloballyUnique()))) { // make globally unique anyway to avoid exception for old models without modules modelId = new VCSPersistenceUtil.SModelIdProxy(modelId); } return new jetbrains.mps.smodel.SModelReference(moduleRef, modelId, modelName); } private static class SModelIdProxy implements SModelId { private final SModelId myOldModelId; public SModelIdProxy(SModelId modelId) { myOldModelId = modelId; } public String getType() { return myOldModelId.getType(); } public boolean isGloballyUnique() { return true; } public String getModelName() { return myOldModelId.getModelName(); } @Override public int hashCode() { return myOldModelId.hashCode(); } @Override public boolean equals(Object object) { return object instanceof VCSPersistenceUtil.SModelIdProxy && myOldModelId.equals(((VCSPersistenceUtil.SModelIdProxy) object).myOldModelId); } @Override public String toString() { return myOldModelId.toString(); } } }