19f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li/* 2f04335f899f2cce69f843692a3cb9cec229683c2tturney * Copyright (C) 2017 The Android Open Source Project 39f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * 4f04335f899f2cce69f843692a3cb9cec229683c2tturney * Licensed under the Apache License, Version 2.0 (the "License"); 5f04335f899f2cce69f843692a3cb9cec229683c2tturney * you may not use this file except in compliance with the License. 6f04335f899f2cce69f843692a3cb9cec229683c2tturney * You may obtain a copy of the License at 79f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * 8f04335f899f2cce69f843692a3cb9cec229683c2tturney * http://www.apache.org/licenses/LICENSE-2.0 99f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * 109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * Unless required by applicable law or agreed to in writing, software 11f04335f899f2cce69f843692a3cb9cec229683c2tturney * distributed under the License is distributed on an "AS IS" BASIS, 12f04335f899f2cce69f843692a3cb9cec229683c2tturney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f04335f899f2cce69f843692a3cb9cec229683c2tturney * See the License for the specific language governing permissions and 14f04335f899f2cce69f843692a3cb9cec229683c2tturney * limitations under the License. 159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li */ 169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipackage com.googlecode.android_scripting.language; 189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.Log; 209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.util.HashMap; 229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.util.Map; 239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipublic class SupportedLanguages { 259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private static enum KnownLanguage { 279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li // SHELL(".sh", ShellLanguage.class), // We don't really support Shell language 289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li HTML(".html", HtmlLanguage.class), BEANSHELL(".bsh", BeanShellLanguage.class), JAVASCRIPT( 299f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li ".js", JavaScriptLanguage.class), LUA(".lua", LuaLanguage.class), PERL(".pl", 309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li PerlLanguage.class), PYTHON(".py", PythonLanguage.class), RUBY(".rb", RubyLanguage.class), 319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li TCL(".tcl", TclLanguage.class), PHP(".php", PhpLanguage.class), SLEEP(".sl", 329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li SleepLanguage.class), SQUIRREL(".nut", SquirrelLanguage.class); 339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private final String mmExtension; 359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private final Class<? extends Language> mmClass; 369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private KnownLanguage(String ext, Class<? extends Language> clazz) { 389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li mmExtension = ext; 399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li mmClass = clazz; 409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private String getExtension() { 439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li return mmExtension; 449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 469f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private Class<? extends Language> getLanguageClass() { 479f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li return mmClass; 489f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 499f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 509f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 519f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private static Map<String, Class<? extends Language>> sSupportedLanguages; 529f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 539f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li static { 549f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li sSupportedLanguages = new HashMap<String, Class<? extends Language>>(); 559f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li for (KnownLanguage language : KnownLanguage.values()) { 569f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li sSupportedLanguages.put(language.getExtension(), language.getLanguageClass()); 579f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 589f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 599f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 609f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li public static Language getLanguageByExtension(String extension) { 619f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li extension = extension.toLowerCase(); 629f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li if (!extension.startsWith(".")) { 639f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li throw new RuntimeException("Extension does not start with a dot: " + extension); 649f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 659f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Language lang = null; 669f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 679f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Class<? extends Language> clazz = sSupportedLanguages.get(extension); 689f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li if (clazz == null) { 699f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li clazz = Language.class; // revert to default language. 709f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 719f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li if (clazz != null) { 729f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li try { 739f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li lang = clazz.newInstance(); 749f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } catch (IllegalAccessException e) { 759f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Log.e(e); 769f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } catch (InstantiationException e) { 779f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Log.e(e); 789f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 799f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 809f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li return lang; 819f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 829f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 839f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li public static boolean checkLanguageSupported(String name) { 849f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li String extension = name.toLowerCase(); 859f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li int index = extension.lastIndexOf('.'); 869f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li if (index < 0) { 879f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li extension = "." + extension; 889f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } else if (index > 0) { 899f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li extension = extension.substring(index); 909f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 919f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li return sSupportedLanguages.containsKey(extension); 929f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 939f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li} 94