/* * Copyright (c) 2013-2015 Chris Newland. * Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD * Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki */ package org.adoptopenjdk.jitwatch.jvmlang; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_DOT; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_EMPTY; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.VM_LANGUAGE_CLOJURE; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.VM_LANGUAGE_GROOVY; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.VM_LANGUAGE_JAVA; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.VM_LANGUAGE_JAVASCRIPT; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.VM_LANGUAGE_JRUBY; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.VM_LANGUAGE_KOTLIN; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.VM_LANGUAGE_SCALA; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import org.adoptopenjdk.jitwatch.core.JITWatchConfig; import org.adoptopenjdk.jitwatch.logger.ILogListener; import org.adoptopenjdk.jitwatch.process.compiler.CompilerGroovy; import org.adoptopenjdk.jitwatch.process.compiler.CompilerJRuby; import org.adoptopenjdk.jitwatch.process.compiler.CompilerJava; import org.adoptopenjdk.jitwatch.process.compiler.CompilerJavaScript; import org.adoptopenjdk.jitwatch.process.compiler.CompilerKotlin; import org.adoptopenjdk.jitwatch.process.compiler.CompilerScala; import org.adoptopenjdk.jitwatch.process.compiler.ICompiler; import org.adoptopenjdk.jitwatch.process.runtime.IRuntime; import org.adoptopenjdk.jitwatch.process.runtime.RuntimeGroovy; import org.adoptopenjdk.jitwatch.process.runtime.RuntimeJRuby; import org.adoptopenjdk.jitwatch.process.runtime.RuntimeJava; import org.adoptopenjdk.jitwatch.process.runtime.RuntimeJavaScript; import org.adoptopenjdk.jitwatch.process.runtime.RuntimeKotlin; import org.adoptopenjdk.jitwatch.process.runtime.RuntimeScala; public class LanguageManager { private JITWatchConfig config; private ILogListener logListener; public LanguageManager(JITWatchConfig config, ILogListener logListener) { this.config = config; this.logListener = logListener; } public ICompiler getCompiler(String vmLanguage) { ICompiler result = null; String languageHomeDir = config.getVMLanguagePath(vmLanguage); if (languageHomeDir != null) { try { switch (vmLanguage) { case VM_LANGUAGE_CLOJURE: break; case VM_LANGUAGE_GROOVY: result = new CompilerGroovy(languageHomeDir); break; case VM_LANGUAGE_JAVA: result = new CompilerJava(languageHomeDir); break; case VM_LANGUAGE_JAVASCRIPT: result = new CompilerJavaScript(languageHomeDir); break; case VM_LANGUAGE_JRUBY: result = new CompilerJRuby(languageHomeDir); break; case VM_LANGUAGE_KOTLIN: result = new CompilerKotlin(languageHomeDir); break; case VM_LANGUAGE_SCALA: result = new CompilerScala(languageHomeDir); break; } } catch (FileNotFoundException fnfe) { logListener.handleErrorEntry("Could not find " + vmLanguage + " compiler in '" + languageHomeDir + "'"); } } return result; } public IRuntime getRuntime(String vmLanguage) { IRuntime result = null; String languageHomeDir = config.getVMLanguagePath(vmLanguage); if (languageHomeDir != null && !S_EMPTY.equals(languageHomeDir)) { try { switch (vmLanguage) { case VM_LANGUAGE_CLOJURE: break; case VM_LANGUAGE_GROOVY: result = new RuntimeGroovy(languageHomeDir); break; case VM_LANGUAGE_JAVA: result = new RuntimeJava(languageHomeDir); break; case VM_LANGUAGE_JAVASCRIPT: result = new RuntimeJavaScript(languageHomeDir); break; case VM_LANGUAGE_JRUBY: result = new RuntimeJRuby(languageHomeDir); break; case VM_LANGUAGE_KOTLIN: result = new RuntimeKotlin(languageHomeDir); break; case VM_LANGUAGE_SCALA: result = new RuntimeScala(languageHomeDir); break; } } catch (FileNotFoundException fnfe) { logListener.handleErrorEntry("Could not find " + vmLanguage + " runtime in '" + languageHomeDir + "'"); } } return result; } public static boolean isCompilable(String language, File sourceFile) { return language.equals(getLanguageFromFile(sourceFile)); } public static String getFileExtension(File file) { String result = null; if (file != null) { String filename = file.getName(); int lastDotPos = filename.lastIndexOf(C_DOT); if (lastDotPos != -1) { result = filename.substring(lastDotPos + 1); } } return result; } public static String getLanguageFromFile(File sourceFile) { String result = null; String fileExtension = getFileExtension(sourceFile); if (fileExtension != null) { fileExtension = fileExtension.toLowerCase(); switch (fileExtension) { case "java": result = VM_LANGUAGE_JAVA; break; case "scala": result = VM_LANGUAGE_SCALA; break; case "rb": result = VM_LANGUAGE_JRUBY; break; case "js": result = VM_LANGUAGE_JAVASCRIPT; break; case "kt": result = VM_LANGUAGE_KOTLIN; break; case "groovy": case "gvy": case "gy": result = VM_LANGUAGE_GROOVY; break; case "clj": result = VM_LANGUAGE_CLOJURE; break; } } return result; } public static List<String> getKnownFilenameExtensions() { List<String> result = new ArrayList<>(); result.add("java"); result.add("scala"); result.add("rb"); result.add("js"); result.add("kt"); result.add("groovy"); result.add("gvy"); result.add("gy"); result.add("clj"); return result; } public static boolean isLanguageEnabled(String vmLanguage) { switch (vmLanguage) { case VM_LANGUAGE_CLOJURE: return false; case VM_LANGUAGE_GROOVY: return true; case VM_LANGUAGE_JAVA: return true; case VM_LANGUAGE_JAVASCRIPT: return true; case VM_LANGUAGE_JRUBY: return false; case VM_LANGUAGE_KOTLIN: return true; case VM_LANGUAGE_SCALA: return true; default: return false; } } }