blob: 6cfe315f7b5c7898a10badf767b9a06df5424847 [file] [log] [blame]
/*
* 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.rya.accumulo.mr.merge.util;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.log4j.Logger;
/**
* Utility methods for the merge tool and copy tool configuration files.
*/
public final class ToolConfigUtils {
private static final Logger log = Logger.getLogger(ToolConfigUtils.class);
/**
* Private constructor to prevent instantiation.
*/
private ToolConfigUtils() {
}
/**
* Gets the set of user arguments from the user's config and/or their extra supplied
* command line arguments. This weeds out all the automatically generated parameters created
* from initializing a {@link Configuration} object and should only give back a set of arguments
* provided directly by the user.
* @param conf the {@link Configuration} provided.
* @param args the extra arguments from the command line.
* @return a {@link Set} of argument strings.
* @throws IOException
*/
public static Set<String> getUserArguments(final Configuration conf, final String[] args) throws IOException {
String[] filteredArgs = new String[] {};
if (Arrays.asList(args).contains("-conf")) {
// parse args
new GenericOptionsParser(conf, args);
final List<String> commandLineArgs = new ArrayList<>();
for (final String arg : args) {
if (arg.startsWith("-D")) {
commandLineArgs.add(arg);
}
}
filteredArgs = commandLineArgs.toArray(new String[0]);
} else {
filteredArgs = args;
}
// Get the supplied config name from the resource string.
// No real easy way of getting the name.
// So, pulling it off the list of resource names in the Configuration's toString() method
// where it should be the last one.
final String confString = conf.toString();
final String resourceString = StringUtils.removeStart(confString, "Configuration: ");
final List<String> resourceNames = Arrays.asList(StringUtils.split(resourceString, ", "));
final String configFilename = resourceNames.get(resourceNames.size() - 1);
final Set<String> toolArgsSet = new HashSet<>();
final File file = new File(configFilename);
// Check that the last resource name is the actual user's config by seeing if it's a file
// on the system, the other resources seem to be contained in jars and so should fail here which
// should happen if no config is supplied.
if (file.exists()) {
XMLConfiguration configuration = null;
try {
configuration = new XMLConfiguration(configFilename);
toolArgsSet.addAll(getConfigArguments(configuration));
} catch (final ConfigurationException e) {
log.error("Unable to load configuration file.", e);
}
}
toolArgsSet.addAll(Arrays.asList(filteredArgs));
return Collections.unmodifiableSet(toolArgsSet);
}
/**
* Reads in the configuration file properties and values and converts them
* into a set of argument strings.
* @param configuration the {@link XMLConfiguration}.
* @return the set of argument strings.
*/
public static Set<String> getConfigArguments(final XMLConfiguration configuration) {
final int size = configuration.getList("property.name").size();
final TreeSet<String> configArgs = new TreeSet<>();
for (int i = 0; i < size; i++) {
final String propertyName = configuration.getString("property(" + i + ").name");
final String propertyValue = configuration.getString("property(" + i + ").value");
final String argument = makeArgument(propertyName, propertyValue);
configArgs.add(argument);
}
return configArgs;
}
/**
* Creates an argument string from the specified property name and value.
* If the property name is "config.file" and value is "config.xml" then this will
* create an argument string of "-Dconfig.file=config.xml"
* @param propertyName the property name.
* @param value the value.
* @return the argument string.
*/
public static String makeArgument(final String propertyName, final String value) {
return "-D" + propertyName + "=" + value;
}
}