co.cask.cdap.internal.app.runtime.ProgramRunners.java Source code

Java tutorial

Introduction

Here is the source code for co.cask.cdap.internal.app.runtime.ProgramRunners.java

Source

/*
 * Copyright  2016 Cask Data, Inc.
 *
 * 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 co.cask.cdap.internal.app.runtime;

import co.cask.cdap.app.runtime.ProgramRunner;
import com.google.common.base.Strings;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.Service;
import org.apache.hadoop.security.UserGroupInformation;

import java.io.IOException;
import java.security.PrivilegedExceptionAction;
import java.util.Map;
import java.util.concurrent.Callable;

/**
 * Utility class to provide common functionality that shares among different {@link ProgramRunner}.
 */
public final class ProgramRunners {

    /**
     * Impersonates as the given user to start a guava service
     *
     * @param user user to impersonate
     * @param service guava service start start
     */
    public static void startAsUser(String user, final Service service) throws IOException, InterruptedException {
        runAsUser(user, new Callable<ListenableFuture<Service.State>>() {
            @Override
            public ListenableFuture<Service.State> call() throws Exception {
                return service.start();
            }
        });
    }

    /**
     * Impersonates as the given user to perform an action.
     *
     * @param user user to impersonate
     * @param callable action to perform
     */
    public static <T> T runAsUser(String user, final Callable<T> callable)
            throws IOException, InterruptedException {
        return UserGroupInformation.createRemoteUser(user).doAs(new PrivilegedExceptionAction<T>() {
            @Override
            public T run() throws Exception {
                return callable.call();
            }
        });
    }

    /**
     * Updates the given arguments to always have the logical start time set.
     *
     * @param arguments the runtime arguments
     * @return the logical start time
     */
    public static long updateLogicalStartTime(Map<String, String> arguments) {
        String value = arguments.get(ProgramOptionConstants.LOGICAL_START_TIME);
        try {
            // value is only empty/null in in some unit tests
            long logicalStartTime = Strings.isNullOrEmpty(value) ? System.currentTimeMillis()
                    : Long.parseLong(value);
            arguments.put(ProgramOptionConstants.LOGICAL_START_TIME, Long.toString(logicalStartTime));
            return logicalStartTime;
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException(String.format(
                    "%s is set to an invalid value %s. Please ensure it is a timestamp in milliseconds.",
                    ProgramOptionConstants.LOGICAL_START_TIME, value));
        }
    }

    private ProgramRunners() {
        // no-op
    }
}