|
@@ -0,0 +1,156 @@
|
|
|
+/**
|
|
|
+ * 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;
|
|
|
+ }
|
|
|
+}
|