ditl.transfers.cli.AnalyzeTransfers.java Source code

Java tutorial

Introduction

Here is the source code for ditl.transfers.cli.AnalyzeTransfers.java

Source

/*******************************************************************************
 * This file is part of DITL.                                                  *
 *                                                                             *
 * Copyright (C) 2011-2012 John Whitbeck <john@whitbeck.fr>                    *
 *                                                                             *
 * DITL is free software: you can redistribute it and/or modify                *
 * it under the terms of the GNU General Public License as published by        *
 * the Free Software Foundation, either version 3 of the License, or           *
 * (at your option) any later version.                                         *
 *                                                                             *
 * DITL is distributed in the hope that it will be useful,                     *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of              *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               *
 * GNU General Public License for more details.                                *
 *                                                                             *
 * You should have received a copy of the GNU General Public License           *
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.       *
 *******************************************************************************/
package ditl.transfers.cli;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.ParseException;

import ditl.Reader;
import ditl.Report;
import ditl.ReportFactory;
import ditl.Runner;
import ditl.StatefulReader;
import ditl.cli.App;
import ditl.cli.ExportApp;
import ditl.transfers.BroadcastDeliveryReport;
import ditl.transfers.Buffer;
import ditl.transfers.BufferEvent;
import ditl.transfers.BufferTrace;
import ditl.transfers.Message;
import ditl.transfers.MessageEvent;
import ditl.transfers.MessageTrace;
import ditl.transfers.MessageTransferReport;
import ditl.transfers.Transfer;
import ditl.transfers.TransferEvent;
import ditl.transfers.TransferTrace;

@App.Cli(pkg = "transfers", cmd = "analyze", alias = "a")
public class AnalyzeTransfers extends ExportApp {

    final static String broadcastDeliveryOption = "broadcast-delivery", messageTransferOption = "message-transfers",
            messagesOption = "messages", buffersOption = "buffers", transfersOption = "transfers";

    private String messagesName;
    private String buffersName;
    private String transfersName;
    private Long maxTime;
    private Long minTime;

    private ReportFactory<?> factory;

    @Override
    protected void initOptions() {
        super.initOptions();
        options.addOption(null, messagesOption, true, "name of messages trace");
        options.addOption(null, buffersOption, true, "name of buffer trace");
        options.addOption(null, transfersOption, true, "name of transfers trace");
        options.addOption(null, minTimeOption, true, "time to begin analysis");
        options.addOption(null, maxTimeOption, true, "time to end analysis");
        final OptionGroup reportGroup = new OptionGroup();
        reportGroup.addOption(new Option(null, broadcastDeliveryOption, false, "broadcast delivery report"));
        reportGroup.addOption(new Option(null, messageTransferOption, false, "message transfers report"));
        reportGroup.setRequired(true);
        options.addOptionGroup(reportGroup);
    }

    @Override
    protected void parseArgs(CommandLine cli, String[] args)
            throws ParseException, ArrayIndexOutOfBoundsException, HelpException {
        super.parseArgs(cli, args);
        messagesName = cli.getOptionValue(messagesOption, getDefaultName(MessageTrace.class));
        transfersName = cli.getOptionValue(transfersOption, getDefaultName(TransferTrace.class));
        buffersName = cli.getOptionValue(buffersOption, getDefaultName(BufferTrace.class));
        if (cli.hasOption(minTimeOption))
            minTime = Long.parseLong(cli.getOptionValue(minTimeOption));
        if (cli.hasOption(maxTimeOption))
            maxTime = Long.parseLong(cli.getOptionValue(maxTimeOption));

        if (cli.hasOption(broadcastDeliveryOption))
            factory = new BroadcastDeliveryReport.Factory();
        else if (cli.hasOption(messageTransferOption))
            factory = new MessageTransferReport.Factory();
    }

    @Override
    protected void run() throws IOException {
        final Report report = factory.getNew(_out);

        Long min_time = null, max_time = null, incr_time = null;
        final List<Reader<?>> readers = new ArrayList<Reader<?>>();

        if (report instanceof MessageTrace.Handler) {
            final MessageTrace messages = _store.getTrace(messagesName);
            final StatefulReader<MessageEvent, Message> msgReader = messages.getReader();

            final MessageTrace.Handler mh = (MessageTrace.Handler) report;
            msgReader.stateBus().addListener(mh.messageListener());
            msgReader.bus().addListener(mh.messageEventListener());

            readers.add(msgReader);

            min_time = messages.minTime();
            max_time = messages.maxTime();
            incr_time = messages.maxUpdateInterval();
        }

        if (report instanceof BufferTrace.Handler) {
            final BufferTrace buffers = _store.getTrace(buffersName);
            final StatefulReader<BufferEvent, Buffer> bufferReader = buffers.getReader();

            final BufferTrace.Handler bh = (BufferTrace.Handler) report;
            bufferReader.stateBus().addListener(bh.bufferListener());
            bufferReader.bus().addListener(bh.bufferEventListener());

            readers.add(bufferReader);

            if (min_time == null)
                min_time = buffers.minTime();
            if (max_time == null)
                max_time = buffers.maxTime();
            incr_time = buffers.maxUpdateInterval();
        }

        if (report instanceof TransferTrace.Handler) {
            final TransferTrace transfers = _store.getTrace(transfersName);
            final StatefulReader<TransferEvent, Transfer> transferReader = transfers.getReader();

            final TransferTrace.Handler th = (TransferTrace.Handler) report;
            transferReader.stateBus().addListener(th.transferListener());
            transferReader.bus().addListener(th.transferEventListener());

            readers.add(transferReader);

            if (min_time == null)
                min_time = transfers.minTime();
            if (max_time == null)
                max_time = transfers.maxTime();
            incr_time = transfers.maxUpdateInterval();
        }

        if (minTime != null)
            min_time = minTime;
        if (maxTime != null)
            max_time = maxTime;

        final Runner runner = new Runner(incr_time, min_time, max_time);
        for (final Reader<?> reader : readers)
            runner.addGenerator(reader);
        runner.run();

        report.finish();
    }
}