/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.api.editor.filetype; import org.eclipse.che.ide.api.resources.VirtualFile; import org.eclipse.che.ide.util.loging.Log; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class ExtensionFileTypeIdentifier implements FileTypeIdentifier { /** The known extensions registry. */ Map<String, List<String>> mappings = new HashMap<>(); public ExtensionFileTypeIdentifier() { init(); } @Override public List<String> identifyType(final VirtualFile file) { final String filename = file.getName(); if (filename != null) { final int dotPos = filename.lastIndexOf('.'); if (dotPos < 1) { // either -1 (not found) or 0 (first position, for example .project or .che etc. Log.debug(ExtensionFileTypeIdentifier.class, "File name has no suffix "); return null; } final String suffix = filename.substring(dotPos + 1); Log.debug(ExtensionFileTypeIdentifier.class, "Looking for a type for suffix " + suffix); List<String> result = mappings.get(suffix); Log.debug(ExtensionFileTypeIdentifier.class, "Found mime-types: " + printList(result)); return result; } return null; } public void registerNewExtension(String extension, List<String> contentTypes) { if (mappings.containsKey(extension)) { Log.warn(ExtensionFileTypeIdentifier.class, "Replacing content types for extension '" + extension +"'."); } mappings.put(extension, contentTypes); } /** Prepares the know extension registry. */ public void init() { this.mappings.put("c", makeList("text/x-csrc")); this.mappings.put("C", makeList("text/x-c++src")); this.mappings.put("cc", makeList("text/x-c++src")); this.mappings.put("cpp", makeList("text/x-c++src")); this.mappings.put("ino", makeList("text/x-c++src")); this.mappings.put("h", makeList("text/x-chdr")); this.mappings.put("hh", makeList("text/x-c++hdr")); this.mappings.put("c++", Collections.singletonList("text/x-c++src")); this.mappings.put("cs", Collections.singletonList("text/x-csharp")); this.mappings.put("m", Collections.singletonList("text/x-objective-c")); // conflict with octave/matlab this.mappings.put("java", Collections.singletonList("text/x-java")); this.mappings.put("class", Collections.singletonList("text/x-java")); this.mappings.put("scala", Collections.singletonList("text/x-scala")); this.mappings.put("sbt", Collections.singletonList("text/x-scala"));// scala build definition this.mappings.put("clj", Collections.singletonList("text/x-clojure")); this.mappings.put("groovy", Collections.singletonList("text/x-groovy")); this.mappings.put("gvy", Collections.singletonList("text/x-groovy")); this.mappings.put("gy", Collections.singletonList("text/x-groovy")); this.mappings.put("gradle", Collections.singletonList("text/x-groovy"));// gradle conf are groovy files this.mappings.put("kt", Collections.singletonList("text/x-kotlin")); this.mappings.put("js", makeList("application/javascript", "text/javascript")); this.mappings.put("coffee", makeList("text/x-coffeescript")); this.mappings.put("json", makeList("application/json")); this.mappings.put("ts", makeList("application/javascript", "application/typescript")); this.mappings.put("es6", makeList("application/javascript", "text/javascript")); this.mappings.put("jsx", makeList("application/javascript", "text/javascript")); this.mappings.put("css", makeList("text/css")); this.mappings.put("scss", makeList("text/x-scss")); this.mappings.put("less", makeList("text/x-less")); this.mappings.put("sass", makeList("text/x-sass")); this.mappings.put("xml", makeList("application/xml")); this.mappings.put("xml", makeList("application/xml")); this.mappings.put("html", makeList("text/html")); this.mappings.put("xhtml", makeList("application/xml+xhtml", "text/html")); this.mappings.put("htm", makeList("text/html")); this.mappings.put("dtd", makeList("application/xml-dtd")); this.mappings.put("yaml", makeList("text/x-yaml")); this.mappings.put("yml", makeList("text/x-yaml")); this.mappings.put("markdown", makeList("text/x-markdown")); this.mappings.put("mdown", makeList("text/x-markdown")); this.mappings.put("mkdn", makeList("text/x-markdown")); this.mappings.put("mkd", makeList("text/x-markdown")); this.mappings.put("md", makeList("text/x-markdown")); this.mappings.put("mdwn", makeList("text/x-markdown")); this.mappings.put("rest", makeList("text/x-rst"));// although most are suffixed with .txt this.mappings.put("rst", makeList("text/x-rst")); this.mappings.put("tex", makeList("text/x-latex")); this.mappings.put("cls", makeList("text/x-latex")); this.mappings.put("sty", makeList("text/x-latex")); this.mappings.put("py", makeList("text/x-python")); this.mappings.put("pyx", makeList("text/x-cython")); this.mappings.put("rb", makeList("text/x-ruby")); this.mappings.put("erb", makeList("text/html"));//templates with embedded ruby this.mappings.put("gemspec", makeList("text/x-ruby")); this.mappings.put("go", makeList("text/x-go")); this.mappings.put("rs", makeList("text/x-rustsrc")); this.mappings.put("erl", makeList("text/x-erlang")); this.mappings.put("lua", makeList("text/x-lua")); this.mappings.put("tcl", makeList("text/x-tcl")); this.mappings.put("pl", makeList("text/x-perl")); this.mappings.put("pm", makeList("text/x-perl"));// perl module this.mappings.put("php", makeList("text/x-php")); this.mappings.put("phtml", makeList("text/x-php")); this.mappings.put("ejs", makeList("application/x-ejs")); this.mappings.put("jsp", makeList("application/x-jsp")); this.mappings.put("asp", makeList("application/x-aspx")); this.mappings.put("aspx", makeList("application/x-aspx")); this.mappings.put("slim", makeList("text/x-slim")); this.mappings.put("ml", makeList("text/x-ocaml")); this.mappings.put("fs", makeList("text/x-fsharp")); this.mappings.put("lisp", makeList("text/x-commonlisp")); this.mappings.put("cl", makeList("text/x-commonlisp")); this.mappings.put("hs", makeList("text/x-haskell")); this.mappings.put("scm", makeList("text/x-scheme")); this.mappings.put("sql", makeList("text/x-sql")); this.mappings.put("properties", makeList("text/x-properties")); this.mappings.put("diff", makeList("text/x-diff")); this.mappings.put("r", makeList("text/x-rsrc")); this.mappings.put("R", makeList("text/x-rsrc")); this.mappings.put("csv", makeList("text/csv")); this.mappings.put("sh", makeList("text/x-sh"));// many are not suffixed at all ! this.mappings.put("pas", makeList("text/x-pascal")); this.mappings.put("p", makeList("text/x-pascal")); this.mappings.put("fpm", makeList("text/x-pascal"));// turbo pascal modules this.mappings.put("st", makeList("text/x-stsrc"));// smalltalk this.mappings.put("cob", makeList("text/x-cobol")); this.mappings.put("cbl", makeList("text/x-cobol")); this.mappings.put("cpy", makeList("text/x-cobol")); this.mappings.put("f", makeList("text/x-fortran")); this.mappings.put("for", makeList("text/x-fortran")); this.mappings.put("f90", makeList("text/x-fortran")); this.mappings.put("f95", makeList("text/x-fortran")); this.mappings.put("f03", makeList("text/x-fortran")); this.mappings.put("vb", makeList("text/x-vb")); this.mappings.put("vbs", makeList("text/vbscript")); this.mappings.put("pp", makeList("text/x-puppet")); this.mappings.put("docker", makeList("text/x-dockerfile")); this.mappings.put("jag", makeList("text/jaggery")); } /** * Builds a list from the parameters. * * @param strings * the elements of the list * @return the list */ private List<String> makeList(final String... strings) { final List<String> result = new ArrayList<>(); for (String string : strings) { result.add(string); } return result; } /** * Format a list of String for logging. * * @param strings * le list to display * @return a representation of the list */ private String printList(final List<String> strings) { final StringBuilder sb = new StringBuilder("["); if (strings != null && !strings.isEmpty()) { sb.append(strings.get(0)); for (String string : strings.subList(1, strings.size())) { sb.append(", "); sb.append(string); } } sb.append("]"); return sb.toString(); } }