package mil.nga.giat.geowave.core.store.operations.remote.options; import java.util.Map; 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.store.DataStore; import mil.nga.giat.geowave.core.store.DataStoreOperations; import mil.nga.giat.geowave.core.store.GeoWaveStoreFinder; import mil.nga.giat.geowave.core.store.StoreFactoryFamilySpi; import mil.nga.giat.geowave.core.store.StoreFactoryOptions; import mil.nga.giat.geowave.core.store.adapter.AdapterIndexMappingStore; import mil.nga.giat.geowave.core.store.adapter.AdapterStore; import mil.nga.giat.geowave.core.store.adapter.statistics.DataStatisticsStore; import mil.nga.giat.geowave.core.store.config.ConfigUtils; import mil.nga.giat.geowave.core.store.index.IndexStore; import mil.nga.giat.geowave.core.store.index.SecondaryIndexDataStore; /** * Class is used to facilitate loading of a DataStore from options specified on * the command line. */ public class DataStorePluginOptions extends DefaultPluginOptions implements PluginOptions { public static final String DATASTORE_PROPERTY_NAMESPACE = "store"; public static final String DEFAULT_PROPERTY_NAMESPACE = "storedefault"; // This is the plugin loaded from SPI based on "datastore" private StoreFactoryFamilySpi factoryPlugin = null; // These are the options loaded from factoryPlugin based on "datastore" @ParametersDelegate private StoreFactoryOptions factoryOptions = null; public DataStorePluginOptions() {} /** * From the given options (like 'username', 'password') setup this plugin * options to be able to create data stores. * * @param options */ public DataStorePluginOptions( final Map<String, String> options ) throws IllegalArgumentException { factoryPlugin = GeoWaveStoreFinder.findStoreFamily(options); if (factoryPlugin == null) { throw new IllegalArgumentException( "Cannot find store plugin factory"); } factoryOptions = factoryPlugin.getDataStoreFactory().createOptionsInstance(); ConfigUtils.populateOptionsFromList( getFactoryOptions(), options); } public DataStorePluginOptions( final StoreFactoryOptions factoryOptions ) { this.factoryOptions = factoryOptions; factoryPlugin = factoryOptions.getStoreFactory(); } /** * This method will allow the user to specify the desired factory, such as * 'accumulo' or 'hbase'. */ @Override public void selectPlugin( final String qualifier ) { if (qualifier != null) { final Map<String, StoreFactoryFamilySpi> factories = GeoWaveStoreFinder.getRegisteredStoreFactoryFamilies(); factoryPlugin = factories.get(qualifier); if (factoryPlugin == null) { throw new ParameterException( "Unknown datastore type: " + qualifier); } factoryOptions = factoryPlugin.getDataStoreFactory().createOptionsInstance(); } else { factoryPlugin = null; factoryOptions = null; } } public Map<String, String> getOptionsAsMap() { final Map<String, String> configOptions = ConfigUtils.populateListFromOptions(factoryOptions); if (factoryPlugin != null) { configOptions.put( GeoWaveStoreFinder.STORE_HINT_OPTION.getName(), factoryPlugin.getType()); } return configOptions; } public void setFactoryOptions( final StoreFactoryOptions factoryOptions ) { this.factoryOptions = factoryOptions; } public StoreFactoryFamilySpi getFactoryFamily() { return factoryPlugin; } public StoreFactoryOptions getFactoryOptions() { return factoryOptions; } public DataStore createDataStore() { return getFactoryFamily().getDataStoreFactory().createStore( getFactoryOptions()); } public AdapterStore createAdapterStore() { return getFactoryFamily().getAdapterStoreFactory().createStore( getFactoryOptions()); } public IndexStore createIndexStore() { return getFactoryFamily().getIndexStoreFactory().createStore( getFactoryOptions()); } public DataStatisticsStore createDataStatisticsStore() { return getFactoryFamily().getDataStatisticsStoreFactory().createStore( getFactoryOptions()); } public SecondaryIndexDataStore createSecondaryIndexStore() { return getFactoryFamily().getSecondaryIndexDataStore().createStore( getFactoryOptions()); } public AdapterIndexMappingStore createAdapterIndexMappingStore() { return getFactoryFamily().getAdapterIndexMappingStoreFactory().createStore( getFactoryOptions()); } public DataStoreOperations createDataStoreOperations() { return getFactoryFamily().getDataStoreOperationsFactory().createStore( getFactoryOptions()); } @Override public String getType() { if (factoryPlugin == null) { return null; } return factoryPlugin.getType(); } public static String getStoreNamespace( final String name ) { return String.format( "%s.%s", DATASTORE_PROPERTY_NAMESPACE, name); } public String getGeowaveNamespace() { return getFactoryOptions().getGeowaveNamespace(); } }