org.apache.slider.core.launch.ClasspathConstructor.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.slider.core.launch.ClasspathConstructor.java

Source

/*
 * 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(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"));
    }

}