package jetbrains.mps.vcs.core.mergedriver; /*Generated by MPS */ import jetbrains.mps.project.MPSExtentions; import org.jetbrains.annotations.Nullable; import java.io.File; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import jetbrains.mps.util.FileUtil; import java.io.InputStream; import java.io.FileInputStream; import jetbrains.mps.util.JDOMUtil; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import jetbrains.mps.util.xml.BreakParseSAXException; public enum FileType { MODEL(MPSExtentions.MODEL, "model"), MODEL_ROOT(MPSExtentions.MODEL_ROOT, "model"), MODEL_HEADER(MPSExtentions.MODEL_HEADER, "model"), LANGUAGE(MPSExtentions.LANGUAGE, "language"), SOLUTION(MPSExtentions.SOLUTION, "solution"), DEVKIT(MPSExtentions.DEVKIT, "dev-kit"), PROJECT(MPSExtentions.IDEA_PROJECT, "project"), TRACE_CACHE("trace.info", "debug-info"), GENERATOR_DEPENDENCIES("generated", "dependencies"), JAVA_DEPENDENCIES("dependencies", "dependenciesRoot"); public static final FileType[] BY_NAME = {FileType.TRACE_CACHE, FileType.GENERATOR_DEPENDENCIES, FileType.JAVA_DEPENDENCIES}; public static final FileType[] BY_EXT = {FileType.LANGUAGE, FileType.SOLUTION, FileType.DEVKIT, FileType.PROJECT, FileType.MODEL_ROOT, FileType.MODEL_HEADER, FileType.MODEL}; private static final String SVN_BASE = ".svn-base"; private String mySuffix; private String myXmlRoot; private FileType(String suffix, String xmlRoot) { mySuffix = suffix; myXmlRoot = xmlRoot; } public String getSuffix() { return mySuffix; } @Nullable public static FileType get(@Nullable final String filetype, File file) { // try to recognize by filetype if (filetype != null) { FileType type = Sequence.fromIterable(Sequence.fromArray(FileType.values())).findFirst(new IWhereFilter<FileType>() { public boolean accept(FileType t) { return filetype.equals(t.mySuffix); } }); if (type != null) { return type; } if (PersistenceFacade.getInstance().getModelFactoryExtensions().contains(filetype)) { return FileType.MODEL; } } // try to get file type from SVN filename final Wrappers._T<String> fileName = new Wrappers._T<String>(file.getName()); if (fileName.value.endsWith(SVN_BASE)) { fileName.value = fileName.value.substring(0, fileName.value.length() - FileType.SVN_BASE.length()); FileType type = Sequence.fromIterable(Sequence.fromArray(FileType.values())).findFirst(new IWhereFilter<FileType>() { public boolean accept(FileType t) { return fileName.value.endsWith(t.mySuffix); } }); if (type != null) { return type; } if (PersistenceFacade.getInstance().getModelFactoryExtensions().contains(FileUtil.getExtension(fileName.value))) { return FileType.MODEL; } } // try to get file type by file content return getTypeByXmlRoot(file); } @Nullable private static FileType getTypeByXmlRoot(File file) { final FileType.XMLRootHandler handler = new FileType.XMLRootHandler(); InputStream is = null; try { is = new FileInputStream(file); JDOMUtil.createSAXParser().parse(is, handler); } catch (Exception e) { } finally { FileUtil.closeFileSafe(is); } // return null if no XML root was found by parser if (handler.rootName == null) { return null; } FileType res = Sequence.fromIterable(Sequence.fromArray(FileType.values())).findFirst(new IWhereFilter<FileType>() { public boolean accept(FileType t) { return t.myXmlRoot.equals(handler.rootName); } }); // manually check per-root persistence if (res == FileType.MODEL) { if ("root".equals(handler.contentAttr)) { res = FileType.MODEL_ROOT; } if ("header".equals(handler.contentAttr)) { res = FileType.MODEL_HEADER; } } return res; } private static class XMLRootHandler extends DefaultHandler { public String rootName; public String contentAttr; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { rootName = qName; contentAttr = attributes.getValue("content"); throw new BreakParseSAXException(); } } }