/** * 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.hadoop.util; import java.io.IOException; import java.util.Arrays; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Path; /** * This class allows generic access to variable length type-safe parameter * lists. */ public class Options { public static abstract class StringOption { private final String value; protected StringOption(String value) { this.value = value; } public String getValue() { return value; } } public static abstract class ClassOption { private final Class<?> value; protected ClassOption(Class<?> value) { this.value = value; } public Class<?> getValue() { return value; } } public static abstract class BooleanOption { private final boolean value; protected BooleanOption(boolean value) { this.value = value; } public boolean getValue() { return value; } } public static abstract class IntegerOption { private final int value; protected IntegerOption(int value) { this.value = value; } public int getValue() { return value; } } public static abstract class LongOption { private final long value; protected LongOption(long value) { this.value = value; } public long getValue() { return value; } } public static abstract class PathOption { private final Path value; protected PathOption(Path value) { this.value = value; } public Path getValue() { return value; } } public static abstract class FSDataInputStreamOption { private final FSDataInputStream value; protected FSDataInputStreamOption(FSDataInputStream value) { this.value = value; } public FSDataInputStream getValue() { return value; } } public static abstract class FSDataOutputStreamOption { private final FSDataOutputStream value; protected FSDataOutputStreamOption(FSDataOutputStream value) { this.value = value; } public FSDataOutputStream getValue() { return value; } } public static abstract class ProgressableOption { private final Progressable value; protected ProgressableOption(Progressable value) { this.value = value; } public Progressable getValue() { return value; } } /** * Find the first option of the required class. * @param <T> the static class to find * @param <base> the parent class of the array * @param cls the dynamic class to find * @param opts the list of options to look through * @return the first option that matches * @throws IOException */ @SuppressWarnings("unchecked") public static <base, T extends base> T getOption(Class<T> cls, base [] opts ) throws IOException { for(base o: opts) { if (o.getClass() == cls) { return (T) o; } } return null; } /** * Prepend some new options to the old options * @param <T> the type of options * @param oldOpts the old options * @param newOpts the new options * @return a new array of options */ public static <T> T[] prependOptions(T[] oldOpts, T... newOpts) { // copy the new options to the front of the array T[] result = Arrays.copyOf(newOpts, newOpts.length+oldOpts.length); // now copy the old options System.arraycopy(oldOpts, 0, result, newOpts.length, oldOpts.length); return result; } }