Search in sources :

Example 1 with FileOutputPlugin

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);
    }
}
Also used : Path(java.nio.file.Path) PluginSourceNotMatchException(org.embulk.plugin.PluginSourceNotMatchException) FileInputRunner(org.embulk.spi.FileInputRunner) JarPluginLoader(org.embulk.plugin.jar.JarPluginLoader) OutputPlugin(org.embulk.spi.OutputPlugin) FileOutputPlugin(org.embulk.spi.FileOutputPlugin) FileOutputPlugin(org.embulk.spi.FileOutputPlugin) FileOutputRunner(org.embulk.spi.FileOutputRunner) MavenPluginType(org.embulk.plugin.MavenPluginType) InvalidJarPluginException(org.embulk.plugin.jar.InvalidJarPluginException) FileInputPlugin(org.embulk.spi.FileInputPlugin) GuessPlugin(org.embulk.spi.GuessPlugin) PluginClassLoaderFactory(org.embulk.plugin.PluginClassLoaderFactory) EncoderPlugin(org.embulk.spi.EncoderPlugin) FormatterPlugin(org.embulk.spi.FormatterPlugin)

Example 2 with FileOutputPlugin

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);
}
Also used : InputPlugin(org.embulk.spi.InputPlugin) FileInputPlugin(org.embulk.spi.FileInputPlugin) Injector(com.google.inject.Injector) FileInputRunner(org.embulk.spi.FileInputRunner) FileOutputPlugin(org.embulk.spi.FileOutputPlugin) FileOutputRunner(org.embulk.spi.FileOutputRunner)

Aggregations

FileInputPlugin (org.embulk.spi.FileInputPlugin)2 FileInputRunner (org.embulk.spi.FileInputRunner)2 FileOutputPlugin (org.embulk.spi.FileOutputPlugin)2 FileOutputRunner (org.embulk.spi.FileOutputRunner)2 Injector (com.google.inject.Injector)1 Path (java.nio.file.Path)1 MavenPluginType (org.embulk.plugin.MavenPluginType)1 PluginClassLoaderFactory (org.embulk.plugin.PluginClassLoaderFactory)1 PluginSourceNotMatchException (org.embulk.plugin.PluginSourceNotMatchException)1 InvalidJarPluginException (org.embulk.plugin.jar.InvalidJarPluginException)1 JarPluginLoader (org.embulk.plugin.jar.JarPluginLoader)1 EncoderPlugin (org.embulk.spi.EncoderPlugin)1 FormatterPlugin (org.embulk.spi.FormatterPlugin)1 GuessPlugin (org.embulk.spi.GuessPlugin)1 InputPlugin (org.embulk.spi.InputPlugin)1 OutputPlugin (org.embulk.spi.OutputPlugin)1