/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.slider.core.launch;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.yarn.api.ApplicationConstants;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.slider.common.tools.SliderUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * build a classpath -allows for entries to be injected in front of
 * YARN classpath as well as behind, adds appropriate separators, 
 * extraction of local classpath, etc.
 */
public class ClasspathConstructor {

    public static final String CLASS_PATH_SEPARATOR = ApplicationConstants.CLASS_PATH_SEPARATOR;
//  public static final String CLASS_PATH_SEPARATOR = File.pathSeparator;
  private final List<String> pathElements = new ArrayList<String>();

  public ClasspathConstructor() {
  }


  /**
   * Get the list of JARs from the YARN settings
   * @param config configuration
   */
  public List<String> yarnApplicationClasspath(Configuration config) {
    String[] cp = config.getTrimmedStrings(
      YarnConfiguration.YARN_APPLICATION_CLASSPATH,
      YarnConfiguration.DEFAULT_YARN_CROSS_PLATFORM_APPLICATION_CLASSPATH);
    return cp != null ? Arrays.asList(cp) : new ArrayList<String>(0);

  }


  @Override
  public String toString() {
    return buildClasspath();
  }

  public String buildClasspath() {
    return SliderUtils.join(pathElements,
        CLASS_PATH_SEPARATOR,
        false);
  }

  /**
   * Get a copy of the path list
   * @return the JARs
   */
  public List<String> getPathElements() {
    return Collections.unmodifiableList(pathElements);
  }

  /**
   * Append an entry
   * @param path path
   */
  public void append(String path) {
    pathElements.add(path);
  }

  /**
   * Insert a path at the front of the list. This places it ahead of
   * the standard YARN artifacts
   * @param path path to the JAR. Absolute or relative -on the target
   * system
   */
  public void insert(String path) {
    pathElements.add(0, path);
  }

  public void appendAll(Collection<String> paths) {
    pathElements.addAll(paths);
  }

  public void insertAll(Collection<String> paths) {
    pathElements.addAll(0, paths);
  }


  public void addLibDir(String pathToLibDir) {
    append(buildLibDir(pathToLibDir));
  }

  public void insertLibDir(String pathToLibDir) {
    insert(buildLibDir(pathToLibDir));
  }

  public void addClassDirectory(String pathToDir) {
    append(buildLibDir(appendDirectoryTerminator(pathToDir)));
  }

  public void insertClassDirectory(String pathToDir) {
    insert(buildLibDir(appendDirectoryTerminator(pathToDir)));
  }


  public void addRemoteClasspathEnvVar() {
    append(ApplicationConstants.Environment.CLASSPATH.$$());
  }


  public void insertRemoteClasspathEnvVar() {
    append(ApplicationConstants.Environment.CLASSPATH.$$());
  }


  /**
   * Build a lib dir path
   * @param pathToLibDir path to the directory; may or may not end with a
   * trailing space
   * @return a path to a lib dir that is compatible with the java classpath
   */
  public String buildLibDir(String pathToLibDir) {
    String dir = appendDirectoryTerminator(pathToLibDir);
    dir += "*";
    return dir;
  }

  private String appendDirectoryTerminator(String pathToLibDir) {
    String dir = pathToLibDir.trim();
    if (!dir.endsWith("/")) {
      dir += "/";
    }
    return dir;
  }

  /**
   * Split a classpath. This uses the local path separator so MUST NOT
   * be used to work with remote classpaths
   * @param localpath local path
   * @return a splite
   */
  public Collection<String> splitClasspath(String localpath) {
    String separator = System.getProperty("path.separator");
    return StringUtils.getStringCollection(localpath, separator);
  }

  /**
   * Get the local JVM classpath split up
   * @return the list of entries on the JVM classpath env var
   */
  public Collection<String> localJVMClasspath() {
    return splitClasspath(System.getProperty("java.class.path"));
  }

}
