/* * 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.hive.ptest.execution.conf; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.apache.hive.ptest.execution.Dirs; import org.apache.hive.ptest.execution.context.ExecutionContextProvider; import org.apache.hive.ptest.execution.context.FixedExecutionContextProvider; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; import com.google.common.collect.Maps; public class ExecutionContextConfiguration { public static final String WORKING_DIRECTORY = "workingDirectory"; public static final String PROFILE_DIRECTORY = "profileDirectory"; public static final String MAX_LOG_DIRS_PER_PROFILE = "maxLogDirectoriesPerProfile"; private static final String MAX_RSYNC_THREADS = "maxRsyncThreads"; private static final int MAX_RSYNC_THREADS_DEFAULT = 10; private final ExecutionContextProvider mExecutionContextProvider; private final String mWorkingDirectory; private final String mGlobalLogDirectory; private final String mProfileDirectory; private final int mMaxLogDirectoriesPerProfile; private final int mMaxRsyncThreads; @VisibleForTesting public ExecutionContextConfiguration(Context context) throws IOException { mWorkingDirectory = context.getString(WORKING_DIRECTORY, "").trim(); Preconditions.checkArgument(!mWorkingDirectory.isEmpty(), WORKING_DIRECTORY + " is required"); mProfileDirectory = context.getString(PROFILE_DIRECTORY, "").trim(); Preconditions.checkArgument(!mProfileDirectory.isEmpty(), PROFILE_DIRECTORY + " is required"); mGlobalLogDirectory = Dirs.create(new File(mWorkingDirectory, "logs")).getAbsolutePath(); mMaxLogDirectoriesPerProfile = context.getInteger(MAX_LOG_DIRS_PER_PROFILE, 10); mMaxRsyncThreads = context.getInteger(MAX_RSYNC_THREADS, MAX_RSYNC_THREADS_DEFAULT); String executionContextProviderBuilder = context.getString("executionContextProvider", FixedExecutionContextProvider.Builder.class.getName()).trim(); try { Object builder = Class.forName(executionContextProviderBuilder).newInstance(); if(!(builder instanceof ExecutionContextProvider.Builder)) { throw new IllegalArgumentException("executionContextProvider must be of type " + ExecutionContextProvider.Builder.class.getName()); } mExecutionContextProvider = ((ExecutionContextProvider.Builder)builder) .build(context, mWorkingDirectory); } catch (Exception e) { throw Throwables.propagate(e); } } public int getMaxRsyncThreads() { return mMaxRsyncThreads; } public int getMaxLogDirectoriesPerProfile() { return mMaxLogDirectoriesPerProfile; } public String getWorkingDirectory() { return mWorkingDirectory; } public String getGlobalLogDirectory() { return mGlobalLogDirectory; } public String getProfileDirectory() { return mProfileDirectory; } public ExecutionContextProvider getExecutionContextProvider() { return mExecutionContextProvider; } public static ExecutionContextConfiguration fromInputStream(InputStream inputStream) throws IOException { Properties properties = new Properties(); properties.load(inputStream); Context context = new Context(Maps.fromProperties(properties)); return new ExecutionContextConfiguration(context); } public static ExecutionContextConfiguration fromFile(String file) throws IOException { InputStream in = new FileInputStream(file); try { return fromInputStream(in); } finally { in.close(); } } @Override public String toString() { return "ExecutionContextConfiguration{" + "mExecutionContextProvider=" + mExecutionContextProvider + ", mWorkingDirectory='" + mWorkingDirectory + '\'' + ", mGlobalLogDirectory='" + mGlobalLogDirectory + '\'' + ", mProfileDirectory='" + mProfileDirectory + '\'' + ", mMaxLogDirectoriesPerProfile=" + mMaxLogDirectoriesPerProfile + ", mMaxRsyncThreads=" + mMaxRsyncThreads + '}'; } }