package mil.nga.giat.geowave.core.ingest.operations.options; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.beust.jcommander.ParameterException; import com.beust.jcommander.ParametersDelegate; import mil.nga.giat.geowave.core.cli.api.DefaultPluginOptions; import mil.nga.giat.geowave.core.cli.api.PluginOptions; import mil.nga.giat.geowave.core.ingest.avro.AvroFormatPlugin; import mil.nga.giat.geowave.core.ingest.hdfs.mapreduce.IngestFromHdfsPlugin; import mil.nga.giat.geowave.core.ingest.local.LocalFileIngestDriver; import mil.nga.giat.geowave.core.ingest.local.LocalFileIngestPlugin; import mil.nga.giat.geowave.core.ingest.spi.IngestFormatOptionProvider; import mil.nga.giat.geowave.core.ingest.spi.IngestFormatPluginProviderSpi; import mil.nga.giat.geowave.core.ingest.spi.IngestFormatPluginRegistry; /** * This convenience class has methods for loading a list of plugins based on * command line options set by the user. */ public class IngestFormatPluginOptions extends DefaultPluginOptions implements PluginOptions { private final static Logger LOGGER = LoggerFactory.getLogger(LocalFileIngestDriver.class); private String formats; private Map<String, IngestFormatPluginProviderSpi<?, ?>> plugins = new HashMap<String, IngestFormatPluginProviderSpi<?, ?>>(); @ParametersDelegate private Map<String, IngestFormatOptionProvider> options = new HashMap<String, IngestFormatOptionProvider>(); @Override public void selectPlugin( String qualifier ) { // This is specified as so: format1,format2,... formats = qualifier; if (qualifier != null && qualifier.length() > 0) { for (String name : qualifier.split(",")) { addFormat(name.trim()); } } else { // Add all for (String formatName : IngestFormatPluginRegistry.getPluginProviderRegistry().keySet()) { addFormat(formatName); } } } private void addFormat( String formatName ) { IngestFormatPluginProviderSpi<?, ?> formatPlugin = IngestFormatPluginRegistry.getPluginProviderRegistry().get( formatName); if (formatPlugin == null) { throw new ParameterException( "Unknown format type specified: " + formatName); } plugins.put( formatName, formatPlugin); IngestFormatOptionProvider optionObject = formatPlugin.createOptionsInstances(); if (optionObject == null) { optionObject = new IngestFormatOptionProvider() {}; } options.put( formatName, optionObject); } @Override public String getType() { return formats; } public Map<String, LocalFileIngestPlugin<?>> createLocalIngestPlugins() { Map<String, LocalFileIngestPlugin<?>> ingestPlugins = new HashMap<String, LocalFileIngestPlugin<?>>(); for (Entry<String, IngestFormatPluginProviderSpi<?, ?>> entry : plugins.entrySet()) { IngestFormatPluginProviderSpi<?, ?> formatPlugin = entry.getValue(); IngestFormatOptionProvider formatOptions = options.get(entry.getKey()); LocalFileIngestPlugin<?> plugin = null; try { plugin = formatPlugin.createLocalFileIngestPlugin(formatOptions); if (plugin == null) { throw new UnsupportedOperationException(); } } catch (final UnsupportedOperationException e) { LOGGER.warn( "Plugin provider for ingest type '" + formatPlugin.getIngestFormatName() + "' does not support local file ingest", e); continue; } ingestPlugins.put( formatPlugin.getIngestFormatName(), plugin); } return ingestPlugins; } public Map<String, IngestFromHdfsPlugin<?, ?>> createHdfsIngestPlugins() { Map<String, IngestFromHdfsPlugin<?, ?>> ingestPlugins = new HashMap<String, IngestFromHdfsPlugin<?, ?>>(); for (Entry<String, IngestFormatPluginProviderSpi<?, ?>> entry : plugins.entrySet()) { IngestFormatPluginProviderSpi<?, ?> formatPlugin = entry.getValue(); IngestFormatOptionProvider formatOptions = options.get(entry.getKey()); IngestFromHdfsPlugin<?, ?> plugin = null; try { plugin = formatPlugin.createIngestFromHdfsPlugin(formatOptions); if (plugin == null) { throw new UnsupportedOperationException(); } } catch (final UnsupportedOperationException e) { LOGGER.warn( "Plugin provider for ingest type '" + formatPlugin.getIngestFormatName() + "' does not support hdfs ingest", e); continue; } ingestPlugins.put( formatPlugin.getIngestFormatName(), plugin); } return ingestPlugins; } public Map<String, AvroFormatPlugin<?, ?>> createAvroPlugins() { Map<String, AvroFormatPlugin<?, ?>> ingestPlugins = new HashMap<String, AvroFormatPlugin<?, ?>>(); for (Entry<String, IngestFormatPluginProviderSpi<?, ?>> entry : plugins.entrySet()) { IngestFormatPluginProviderSpi<?, ?> formatPlugin = entry.getValue(); IngestFormatOptionProvider formatOptions = options.get(entry.getKey()); AvroFormatPlugin<?, ?> plugin = null; try { plugin = formatPlugin.createAvroFormatPlugin(formatOptions); if (plugin == null) { throw new UnsupportedOperationException(); } } catch (final UnsupportedOperationException e) { LOGGER.warn( "Plugin provider for ingest type '" + formatPlugin.getIngestFormatName() + "' does not support avro ingest", e); continue; } ingestPlugins.put( formatPlugin.getIngestFormatName(), plugin); } return ingestPlugins; } public Map<String, IngestFormatPluginProviderSpi<?, ?>> getPlugins() { return plugins; } public void setPlugins( Map<String, IngestFormatPluginProviderSpi<?, ?>> plugins ) { this.plugins = plugins; } public Map<String, IngestFormatOptionProvider> getOptions() { return options; } public void setOptions( Map<String, IngestFormatOptionProvider> options ) { this.options = options; } }