Java程序  |  182行  |  5.16 KB

/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.googlecode.android_scripting.interpreter;

import com.googlecode.android_scripting.language.Language;
import com.googlecode.android_scripting.language.SupportedLanguages;
import com.googlecode.android_scripting.rpc.MethodDescriptor;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Combines all the execution-related specs of a particular interpreter installed in the system.
 * This class is instantiated through a map received from a concrete InterpreterProfider.
 *
 */
public class Interpreter implements InterpreterPropertyNames {

  private String mExtension;
  private String mName;
  private String mNiceName;
  private String mInteractiveCommand;
  private String mScriptExecutionCommand;
  private File mBinary;
  private boolean mHasInteractiveMode;
  private final List<String> mArguments;
  private final Map<String, String> mEnvironment;
  private Language mLanguage;

  public Interpreter() {
    mArguments = new ArrayList<String>();
    mEnvironment = new HashMap<String, String>();
  }

  public static Interpreter buildFromMaps(Map<String, String> data,
      Map<String, String> environment_variables, Map<String, String> arguments) {
    String extension = data.get(EXTENSION);
    String name = data.get(NAME);
    String niceName = data.get(NICE_NAME);
    String binary = data.get(BINARY);
    String interactiveCommand = data.get(INTERACTIVE_COMMAND);
    String scriptCommand = data.get(SCRIPT_COMMAND);
    Boolean hasInteractiveMode;
    if (data.containsKey(HAS_INTERACTIVE_MODE)) {
      hasInteractiveMode = Boolean.parseBoolean(data.get(HAS_INTERACTIVE_MODE));
    } else {
      // Default to true so that older interpreter APKs that don't have this value define still
      // work.
      hasInteractiveMode = true;
    }
    Interpreter interpreter = new Interpreter();
    interpreter.setName(name);
    interpreter.setNiceName(niceName);
    interpreter.setExtension(extension);
    interpreter.setBinary(new File(binary));
    interpreter.setInteractiveCommand(interactiveCommand);
    interpreter.setScriptCommand(scriptCommand);
    interpreter.setHasInteractiveMode(hasInteractiveMode);
    interpreter.setLanguage(SupportedLanguages.getLanguageByExtension(extension));
    interpreter.putAllEnvironmentVariables(environment_variables);
    interpreter.addAllArguments(arguments.values());
    return interpreter;
  }

  // TODO(damonkohler): This should take a List<String> since order is important.
  private void addAllArguments(Collection<String> arguments) {
    mArguments.addAll(arguments);
  }

  List<String> getArguments() {
    return mArguments;
  }

  private void putAllEnvironmentVariables(Map<String, String> environmentVariables) {
    mEnvironment.putAll(environmentVariables);
  }

  public Map<String, String> getEnvironmentVariables() {
    return mEnvironment;
  }

  protected void setScriptCommand(String executeParameters) {
    mScriptExecutionCommand = executeParameters;
  }

  public String getScriptCommand() {
    return mScriptExecutionCommand;
  }

  protected void setInteractiveCommand(String interactiveCommand) {
    mInteractiveCommand = interactiveCommand;
  }

  public String getInteractiveCommand() {
    return mInteractiveCommand;
  }

  protected void setBinary(File binary) {
    if (!binary.exists()) {
      throw new RuntimeException("Binary " + binary + " does not exist!");
    }
    mBinary = binary;
  }

  public File getBinary() {
    return mBinary;
  }

  protected void setExtension(String extension) {
    mExtension = extension;
  }

  protected void setHasInteractiveMode(boolean hasInteractiveMode) {
    mHasInteractiveMode = hasInteractiveMode;
  }

  public boolean hasInteractiveMode() {
    return mHasInteractiveMode;
  }

  public String getExtension() {
    return mExtension;
  }

  protected void setName(String name) {
    mName = name;
  }

  public String getName() {
    return mName;
  }

  protected void setNiceName(String niceName) {
    mNiceName = niceName;
  }

  public String getNiceName() {
    return mNiceName;
  }

  public String getContentTemplate() {
    return mLanguage.getContentTemplate();
  }

  protected void setLanguage(Language language) {
    mLanguage = language;
  }

  public Language getLanguage() {
    return mLanguage;
  }

  public String getRpcText(String content, MethodDescriptor rpc, String[] values) {
    return mLanguage.getRpcText(content, rpc, values);
  }

  public boolean isInstalled() {
    return mBinary.exists();
  }

  public boolean isUninstallable() {
    return true;
  }
}