org.lilyproject.tools.scanner.cli.ScannerCli.java Source code

Java tutorial

Introduction

Here is the source code for org.lilyproject.tools.scanner.cli.ScannerCli.java

Source

/*
 * 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();
    }

}