use of org.embulk.spi.FileOutputPlugin in project embulk by embulk.
the class MavenPluginSource method newPlugin.
@Override
public <T> T newPlugin(Class<T> pluginInterface, PluginType pluginType) throws PluginSourceNotMatchException {
final String category;
if (InputPlugin.class.isAssignableFrom(pluginInterface)) {
category = "input";
} else if (OutputPlugin.class.isAssignableFrom(pluginInterface)) {
category = "output";
} else if (ParserPlugin.class.isAssignableFrom(pluginInterface)) {
category = "parser";
} else if (FormatterPlugin.class.isAssignableFrom(pluginInterface)) {
category = "formatter";
} else if (DecoderPlugin.class.isAssignableFrom(pluginInterface)) {
category = "decoder";
} else if (EncoderPlugin.class.isAssignableFrom(pluginInterface)) {
category = "encoder";
} else if (FilterPlugin.class.isAssignableFrom(pluginInterface)) {
category = "filter";
} else if (GuessPlugin.class.isAssignableFrom(pluginInterface)) {
category = "guess";
} else if (ExecutorPlugin.class.isAssignableFrom(pluginInterface)) {
category = "executor";
} else {
// unsupported plugin category
throw new PluginSourceNotMatchException("Plugin interface " + pluginInterface + " is not supported.");
}
if (pluginType.getSourceType() != PluginSource.Type.MAVEN) {
throw new PluginSourceNotMatchException();
}
final MavenPluginType mavenPluginType = (MavenPluginType) pluginType;
final PluginClassLoaderFactory pluginClassLoaderFactory = this.injector.getInstance(PluginClassLoaderFactory.class);
final MavenArtifactFinder mavenArtifactFinder;
try {
mavenArtifactFinder = MavenArtifactFinder.create(getLocalMavenRepository());
} catch (MavenRepositoryNotFoundException ex) {
throw new PluginSourceNotMatchException(ex);
}
final Path jarPath;
try {
jarPath = mavenArtifactFinder.findMavenArtifactJar(mavenPluginType.getGroup(), "embulk-" + category + "-" + mavenPluginType.getName(), mavenPluginType.getClassifier(), mavenPluginType.getVersion());
} catch (MavenArtifactNotFoundException ex) {
throw new PluginSourceNotMatchException(ex);
}
final Class<?> pluginMainClass;
try (JarPluginLoader loader = JarPluginLoader.load(jarPath, pluginClassLoaderFactory)) {
pluginMainClass = loader.getPluginMainClass();
} catch (InvalidJarPluginException ex) {
throw new PluginSourceNotMatchException(ex);
}
final Object pluginMainObject;
try {
// FileInputPlugin and FileOutputPlugin are wrapped with FileInputRunner and FileOutputRunner here.
if (FileInputPlugin.class.isAssignableFrom(pluginMainClass)) {
final FileInputPlugin fileInputPluginMainObject;
try {
fileInputPluginMainObject = (FileInputPlugin) this.injector.getInstance(pluginMainClass);
} catch (ClassCastException ex) {
throw new PluginSourceNotMatchException("[FATAL/INTERNAL] Plugin class \"" + pluginMainClass.getName() + "\" is not file-input.", ex);
}
pluginMainObject = new FileInputRunner(fileInputPluginMainObject);
} else if (FileOutputPlugin.class.isAssignableFrom(pluginMainClass)) {
final FileOutputPlugin fileOutputPluginMainObject;
try {
fileOutputPluginMainObject = (FileOutputPlugin) this.injector.getInstance(pluginMainClass);
} catch (ClassCastException ex) {
throw new PluginSourceNotMatchException("[FATAL/INTERNAL] Plugin class \"" + pluginMainClass.getName() + "\" is not file-output.", ex);
}
pluginMainObject = new FileOutputRunner(fileOutputPluginMainObject);
} else {
if (!pluginInterface.isAssignableFrom(pluginMainClass)) {
throw new PluginSourceNotMatchException("Plugin class \"" + pluginMainClass.getName() + "\" is not a valid " + category + " plugin.");
}
pluginMainObject = this.injector.getInstance(pluginMainClass);
}
} catch (ExceptionInInitializerError ex) {
throw new PluginSourceNotMatchException("Plugin class \"" + pluginMainClass.getName() + "\" is not instantiatable due to exception in initialization.", ex);
} catch (SecurityException ex) {
throw new PluginSourceNotMatchException("Plugin class \"" + pluginMainClass.getName() + "\" is not instantiatable due to security manager.", ex);
}
try {
return pluginInterface.cast(pluginMainObject);
} catch (ClassCastException ex) {
throw new PluginSourceNotMatchException("[FATAL/INTERNAL] Plugin class \"" + pluginMainClass.getName() + "\" is not " + category + " actually.", ex);
}
}
use of org.embulk.spi.FileOutputPlugin in project embulk by embulk.
the class InjectedPluginSource method registerPluginTo.
public static <T> void registerPluginTo(Binder binder, Class<T> iface, String name, final Class<?> impl) {
PluginFactory<T> factory;
if (FileInputPlugin.class.isAssignableFrom(impl)) {
Preconditions.checkArgument(InputPlugin.class.equals(iface));
factory = new PluginFactory<T>() {
@SuppressWarnings("unchecked")
public T newPlugin(Injector injector) {
return (T) new FileInputRunner((FileInputPlugin) injector.getInstance(impl));
}
};
} else if (FileOutputPlugin.class.isAssignableFrom(impl)) {
Preconditions.checkArgument(OutputPlugin.class.equals(iface));
factory = new PluginFactory<T>() {
@SuppressWarnings("unchecked")
public T newPlugin(Injector injector) {
return (T) new FileOutputRunner((FileOutputPlugin) injector.getInstance(impl));
}
};
} else {
Preconditions.checkArgument(iface.isAssignableFrom(impl));
factory = new PluginFactory<T>() {
@SuppressWarnings("unchecked")
public T newPlugin(Injector injector) {
return (T) injector.getInstance(impl);
}
};
}
binder.bind(PluginFactory.class).annotatedWith(pluginFactoryName(iface, name)).toInstance(factory);
}
Aggregations