in pig/src/main/java/com/twitter/elephantbird/pig/util/SequenceFileConfig.java [173:227]
private static <T extends Writable> WritableConverter<T> getWritableConverter(
CommandLine arguments) {
// get remaining non-empty argument strings from commandline
String[] converterArgs = removeEmptyArgs(arguments.getArgs());
try {
// get converter classname
String converterClassName =
arguments.getOptionValue(CONVERTER_PARAM, TextConverter.class.getName());
// get converter class
Class<WritableConverter<T>> converterClass =
PigContext.resolveClassName(converterClassName);
// construct converter instance
if (converterArgs == null || converterArgs.length == 0) {
// use default ctor
return converterClass.newInstance();
} else {
try {
// look up ctor having explicit number of String arguments
Class<?>[] parameterTypes = new Class<?>[converterArgs.length];
Arrays.fill(parameterTypes, String.class);
Constructor<WritableConverter<T>> ctor = converterClass.getConstructor(parameterTypes);
return ctor.newInstance((Object[]) converterArgs);
} catch (NoSuchMethodException e) {
try {
// look up ctor having single String[] (or String... varargs) argument
Constructor<WritableConverter<T>> ctor =
converterClass.getConstructor(new Class<?>[] { String[].class });
return ctor.newInstance((Object) converterArgs);
} catch (NoSuchMethodException e2) {
// look up ctor having single String argument and join args together
Constructor<WritableConverter<T>> ctor =
converterClass.getConstructor(new Class<?>[] { String.class });
StringBuilder sb = new StringBuilder(converterArgs[0]);
for (int i = 1; i < converterArgs.length; ++i) {
sb.append(" ").append(converterArgs[i]);
}
return ctor.newInstance(sb.toString());
}
}
}
} catch (Exception e) {
throw new RuntimeException("Failed to create WritableConverter instance", e);
}
}