package mil.nga.giat.geowave.core.store.operations.remote;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException;
import com.beust.jcommander.Parameters;
import mil.nga.giat.geowave.core.cli.annotations.GeowaveOperation;
import mil.nga.giat.geowave.core.cli.api.Command;
import mil.nga.giat.geowave.core.cli.api.OperationParams;
import mil.nga.giat.geowave.core.store.CloseableIterator;
import mil.nga.giat.geowave.core.store.adapter.DataAdapter;
import mil.nga.giat.geowave.core.store.adapter.statistics.DataStatistics;
import mil.nga.giat.geowave.core.store.adapter.statistics.DataStatisticsStore;
import mil.nga.giat.geowave.core.store.operations.remote.options.DataStorePluginOptions;
import mil.nga.giat.geowave.core.store.operations.remote.options.StatsCommandLineOptions;
@GeowaveOperation(name = "liststats", parentOperation = RemoteSection.class)
@Parameters(commandDescription = "Print statistics of an existing GeoWave dataset to standard output. ")
public class ListStatsCommand extends
AbstractStatsCommand implements
Command
{
private static final Logger LOGGER = LoggerFactory.getLogger(ListStatsCommand.class);
@Parameter(description = "<store name> [<adapter name>]")
private List<String> parameters = new ArrayList<String>();
@Override
public void execute(
OperationParams params )
throws ParameterException {
// Ensure we have all the required arguments
if (parameters.size() < 1) {
throw new ParameterException(
"Requires arguments: <store name> [<adapterId>]");
}
super.run(
params,
parameters);
}
@Override
protected boolean performStatsCommand(
final DataStorePluginOptions storeOptions,
final DataAdapter<?> adapter,
final StatsCommandLineOptions statsOptions )
throws IOException {
if (adapter == null) {
throw new IOException(
"Provided adapter is null");
}
DataStatisticsStore statsStore = storeOptions.createDataStatisticsStore();
final String[] authorizations = getAuthorizations(statsOptions.getAuthorizations());
StringBuilder builder = new StringBuilder();
try (CloseableIterator<DataStatistics<?>> statsIt = statsStore.getAllDataStatistics(authorizations)) {
if (statsOptions.getJsonFormatFlag()) {
JSONArray resultsArray = new JSONArray();
JSONObject outputObject = new JSONObject();
try {
// Output as JSON formatted strings
outputObject.put(
"adapter",
adapter.getAdapterId().getString());
while (statsIt.hasNext()) {
final DataStatistics<?> stats = statsIt.next();
if (!stats.getDataAdapterId().equals(
adapter.getAdapterId())) {
continue;
}
resultsArray.add(stats.toJSONObject());
}
outputObject.put(
"stats",
resultsArray);
builder.append(outputObject.toString());
}
catch (final JSONException ex) {
LOGGER.error(
"Unable to output statistic as JSON. ",
ex);
}
}
// Output as strings
else {
while (statsIt.hasNext()) {
final DataStatistics<?> stats = statsIt.next();
if (!stats.getDataAdapterId().equals(
adapter.getAdapterId())) {
continue;
}
builder.append("[");
builder.append(String.format(
"%1$-20s",
stats.getStatisticsId().getString()));
builder.append("] ");
builder.append(stats.toString());
builder.append("\n");
}
}
JCommander.getConsole().println(
builder.toString().trim());
}
return true;
}
public List<String> getParameters() {
return parameters;
}
public void setParameters(
String storeName,
String adapterName ) {
this.parameters = new ArrayList<String>();
this.parameters.add(storeName);
if (adapterName != null) {
this.parameters.add(adapterName);
}
}
}