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