Java tutorial
/* * Copyright 2012 NGDATA nv * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.lilyproject.tools.scanner.cli; import java.io.File; import java.util.HashSet; import java.util.List; import java.util.Set; import com.google.common.base.Splitter; import com.ngdata.lily.security.hbase.client.AuthorizationContext; import org.lilyproject.repository.spi.AuthorizationContextHolder; import org.lilyproject.util.hbase.RepoAndTableUtil; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionBuilder; import org.lilyproject.cli.BaseZkCliTool; import org.lilyproject.cli.OptionUtil; import org.lilyproject.client.LilyClient; import org.lilyproject.repository.api.LRepository; import org.lilyproject.repository.api.LTable; import org.lilyproject.util.Version; import org.lilyproject.util.hbase.LilyHBaseSchema.Table; import org.lilyproject.util.io.Closer; public class ScannerCli extends BaseZkCliTool { private LilyClient lilyClient; private Option limitOption; private Option countOption; private Option printOption; private Option configOption; private Option startOption; private Option stopOption; private Option recordTypeOption; private Option tableOption; private Option repositoryOption; private Option rolesOption; public static void main(String[] args) { new ScannerCli().start(args); } @Override protected String getCmdName() { return "lily-scan-records"; } @Override protected String getVersion() { return Version.readVersion("org.lilyproject", "lily-scan-records"); } @Override @SuppressWarnings("static-access") public List<Option> getOptions() { List<Option> options = super.getOptions(); limitOption = OptionBuilder.withArgName("number").hasArg() .withDescription("Limit printing to a number of records").withLongOpt("limit").create("l"); options.add(limitOption); countOption = OptionBuilder.withDescription("Count the number of records").withLongOpt("count").create("c"); options.add(countOption); printOption = OptionBuilder.withDescription("Print records to the command line").withLongOpt("print") .create("p"); options.add(printOption); configOption = OptionBuilder.hasArg().withArgName("file") .withDescription("Configure the record scanner using a json file").withLongOpt("config").create(); options.add(configOption); startOption = OptionBuilder.hasArg().withArgName("id") .withDescription("Scan records starting at the record with the given ID").withLongOpt("start") .create(); options.add(startOption); stopOption = OptionBuilder.hasArg().withArgName("id") .withDescription("Scan records stopping at the record with the given ID").withLongOpt("stop") .create(); options.add(stopOption); recordTypeOption = OptionBuilder.hasArg().withArgName("{namespace}recordTypeName") .withDescription("Filter records by record type name").withLongOpt("record-type").create("r"); options.add(recordTypeOption); tableOption = OptionBuilder.hasArg().withArgName("table") .withDescription("Repository table to scan (defaults to record)").withLongOpt("table").create(); options.add(tableOption); repositoryOption = OptionBuilder.hasArg().withArgName("repository") .withDescription("Repository name (defaults to 'default')").withLongOpt("repository").create(); options.add(repositoryOption); rolesOption = OptionBuilder.withArgName("roles").hasArg() .withDescription("Comma-separated list of active user roles (excluding tenant part). Only has " + "effect when the NGDATA hbase-authz coprocessor is installed.") .withLongOpt("roles").create(); options.add(rolesOption); return options; } @Override public int run(CommandLine cmd) throws Exception { int result = super.run(cmd); if (result != 0) { return result; } if (!cmd.hasOption(printOption.getOpt()) && !cmd.hasOption(countOption.getOpt())) { printHelp(); return 0; } String startId = cmd.hasOption(startOption.getLongOpt()) ? cmd.getOptionValue(startOption.getLongOpt()) : null; String stopId = cmd.hasOption(stopOption.getLongOpt()) ? cmd.getOptionValue(stopOption.getLongOpt()) : null; String recordTypeFilter = cmd.hasOption(recordTypeOption.getOpt()) ? cmd.getOptionValue(recordTypeOption.getOpt()) : null; File configFile = cmd.hasOption(configOption.getLongOpt()) ? new File(cmd.getOptionValue(configOption.getLongOpt())) : null; long limit = cmd.hasOption(limitOption.getLongOpt()) ? Long.parseLong(cmd.getOptionValue(limitOption.getLongOpt())) : -1; String repositoryName = OptionUtil.getStringOption(cmd, repositoryOption, RepoAndTableUtil.DEFAULT_REPOSITORY); String tableName = OptionUtil.getStringOption(cmd, tableOption, Table.RECORD.name); if (cmd.hasOption(rolesOption.getLongOpt())) { Set<String> roles = new HashSet<String>(); Splitter splitter = Splitter.on(",").trimResults().omitEmptyStrings(); for (String role : splitter.split(cmd.getOptionValue(rolesOption.getLongOpt()))) { roles.add(role); } AuthorizationContextHolder .setCurrentContext(new AuthorizationContext("lily-scan-records", repositoryName, roles)); } lilyClient = new LilyClient(zkConnectionString, zkSessionTimeout); LRepository repository = lilyClient.getRepository(repositoryName); LTable table = repository.getTable(tableName); if (cmd.hasOption(countOption.getOpt())) { RecordScanTool.count(repository, table, startId, stopId, recordTypeFilter, configFile); } else if (cmd.hasOption(printOption.getOpt())) { RecordScanTool.print(repository, table, startId, stopId, limit, recordTypeFilter, configFile); } return 0; } @Override protected void cleanup() { Closer.close(lilyClient); super.cleanup(); } }