Java tutorial
/* * 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; } }