package mil.nga.giat.geowave.core.store.operations.remote; import java.io.IOException; import java.util.List; 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.DefaultOperation; import mil.nga.giat.geowave.core.cli.api.OperationParams; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.store.CloseableIterator; import mil.nga.giat.geowave.core.store.adapter.AdapterStore; import mil.nga.giat.geowave.core.store.adapter.DataAdapter; import mil.nga.giat.geowave.core.store.operations.remote.options.DataStorePluginOptions; import mil.nga.giat.geowave.core.store.operations.remote.options.StatsCommandLineOptions; import mil.nga.giat.geowave.core.store.operations.remote.options.StoreLoader; /** * Common methods for dumping, manipulating and calculating stats. */ public abstract class AbstractStatsCommand extends DefaultOperation { private static final Logger LOGGER = LoggerFactory.getLogger(RecalculateStatsCommand.class); @ParametersDelegate private StatsCommandLineOptions statsOptions = new StatsCommandLineOptions(); private DataStorePluginOptions inputStoreOptions = null; public void run( OperationParams params, List<String> parameters ) { String storeName = parameters.get(0); String adapterIdName = null; if (parameters.size() > 1) { adapterIdName = parameters.get(1); } // Attempt to load input store if not already provided (test purposes). if (inputStoreOptions == null) { StoreLoader inputStoreLoader = new StoreLoader( storeName); if (!inputStoreLoader.loadFromConfig(getGeoWaveConfigFile(params))) { throw new ParameterException( "Cannot find store name: " + inputStoreLoader.getStoreName()); } inputStoreOptions = inputStoreLoader.getDataStorePlugin(); } try { // Various stores needed AdapterStore adapterStore = inputStoreOptions.createAdapterStore(); if (adapterIdName != null) { final ByteArrayId adapterId = new ByteArrayId( adapterIdName); DataAdapter<?> adapter = adapterStore.getAdapter(adapterId); if (adapter != null) { performStatsCommand( inputStoreOptions, adapter, statsOptions); } else { // If this adapter is not known, provide list of available // adapters LOGGER.error("Unknown adapter " + adapterId); final CloseableIterator<DataAdapter<?>> it = adapterStore.getAdapters(); final StringBuffer buffer = new StringBuffer(); while (it.hasNext()) { adapter = it.next(); buffer.append( adapter.getAdapterId().getString()).append( ' '); } it.close(); LOGGER.info("Available adapters: " + buffer.toString()); } } else { // Repeat the Command for every adapter found try (CloseableIterator<DataAdapter<?>> adapterIt = adapterStore.getAdapters()) { while (adapterIt.hasNext()) { final DataAdapter<?> adapter = adapterIt.next(); if (!performStatsCommand( inputStoreOptions, adapter, statsOptions)) { LOGGER.info("Unable to calculate statistics for adapter: " + adapter.getAdapterId().getString()); } } } } } catch (final IOException e) { throw new RuntimeException( "Unable to parse stats tool arguments", e); } } /** * Abstracted command method to be called when command selected */ abstract protected boolean performStatsCommand( final DataStorePluginOptions options, final DataAdapter<?> adapter, final StatsCommandLineOptions statsOptions ) throws IOException; /** * Helper method to extract a list of authorizations from a string passed in * from the command line * * @param auths * - String to be parsed */ protected static String[] getAuthorizations( final String auths ) { if ((auths == null) || (auths.length() == 0)) { return new String[0]; } final String[] authsArray = auths.split(","); for (int i = 0; i < authsArray.length; i++) { authsArray[i] = authsArray[i].trim(); } return authsArray; } public void setInputStoreOptions( DataStorePluginOptions inputStoreOptions ) { this.inputStoreOptions = inputStoreOptions; } }