use of org.embulk.plugin.jar.InvalidJarPluginException 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);
}
}
Aggregations