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