acromusashi.stream.example.ml.client.LofDrpcClient.java Source code

Java tutorial

Introduction

Here is the source code for acromusashi.stream.example.ml.client.LofDrpcClient.java

Source

/**
* Copyright (c) Acroquest Technology Co, Ltd. All Rights Reserved.
* Please read the associated COPYRIGHTS file for more details.
*
* THE SOFTWARE IS PROVIDED BY Acroquest Technolog Co., Ltd.,
* WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDER BE LIABLE FOR ANY
* CLAIM, DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package acromusashi.stream.example.ml.client;

import java.io.IOException;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.thrift7.TException;

import acromusashi.stream.config.StormConfigGenerator;
import acromusashi.stream.config.StormConfigUtil;
import backtype.storm.Config;
import backtype.storm.generated.DRPCExecutionException;
import backtype.storm.utils.DRPCClient;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * LofTopology??????????DRPC
 * 
 * @author kimura
 */
public class LofDrpcClient {
    /** ? */
    public static final int DEFAULT_DRPCPORT = 3772;

    /**
     * ?????
     */
    public LofDrpcClient() {
    }

    /**
     * ?<br/>
     * <br/>
     * ?/?<br/>
     * <ul>
     * <li>-c LOFTopology(</li>
     * <li>-d LOF Data(?????)</li>
     * <li>-h </li>
     * </ul>
     * 
     * @param args 
     */
    public static void main(String... args) {
        LofDrpcClient client = new LofDrpcClient();
        client.startSendRequest(args);
    }

    /**
     * LofTopology??DRPC??
     * 
     * @param args 
     */
    protected void startSendRequest(String[] args) {
        Options cliOptions = createOptions();
        CommandLineParser parser = new PosixParser();
        CommandLine commandLine = null;
        HelpFormatter help = new HelpFormatter();

        try {
            commandLine = parser.parse(cliOptions, args);
        } catch (ParseException pex) {
            help.printHelp(LofDrpcClient.class.getName(), cliOptions, true);
            return;
        }

        if (commandLine.hasOption("h")) {
            // ??????????
            help.printHelp(LofDrpcClient.class.getName(), cliOptions, true);
            return;
        }

        // ??
        String confPath = commandLine.getOptionValue("c");
        String lofData = commandLine.getOptionValue("d");

        Config stormConfig = null;

        try {
            stormConfig = StormConfigGenerator.loadStormConfig(confPath);
        } catch (IOException ex) {
            // ???????
            ex.printStackTrace();
            return;
        }

        String drpcHost = StormConfigUtil.getStringListValue(stormConfig, "drpc.servers").get(0);
        int drpcPort = StormConfigUtil.getIntValue(stormConfig, "drpc.port", DEFAULT_DRPCPORT);
        String drpcFunction = StormConfigUtil.getStringValue(stormConfig, "lof.drpc.function", "lof");

        double lofScore = 0.0d;

        try {
            lofScore = sendRequest(drpcHost, drpcPort, drpcFunction, lofData);
        } catch (TException | DRPCExecutionException | IOException ex) {
            // ??????
            ex.printStackTrace();
            return;
        }

        System.out.println("LOF Data=" + lofData + ", LOFScore=" + lofScore);
    }

    /**
     * LOF??DRPC???LOF??
     * 
     * @param drpcHost DRPC
     * @param drpcPort DRPC?
     * @param drpcFunction ????
     * @param lofData LOF
     * @return LOF
     * @throws DRPCExecutionException DRPC
     * @throws TException DRPC
     * @throws IOException ?
     */
    public double sendRequest(String drpcHost, int drpcPort, String drpcFunction, String lofData)
            throws TException, DRPCExecutionException, IOException {
        DRPCClient client = new DRPCClient(drpcHost, drpcPort);
        String drpcResult = client.execute(drpcFunction, lofData);

        // ?????????
        // [["84.406 129.347 50.527","LofPoint[dataId=7b6f1200-7117-4231-bc95-32c448237f5b,
        // dataPoint={84.406,129.347,50.527},kDistance=0.0,kDistanceNeighbor=<null>,lrd=0.0,judgeDate=Tue Nov 26 18:56:00 JST 2013]",
        // "{\"lofScore\":1.924027244063857,\"lofPoint\":{\"dataId\":\"7b6f1200-7117-4231-bc95-32c448237f5b\",
        // \"dataPoint\":[84.406,129.347,50.527],\"kDistance\":0.0,\"kDistanceNeighbor\":null,\"lrd\":0.0,\"judgeDate\":1385459760464}}"]]

        ObjectMapper mapper = new ObjectMapper();
        JsonNode baseNode = mapper.readTree(drpcResult);
        String lofResultStr = baseNode.get(0).get(2).asText();
        JsonNode lofResultTree = mapper.readTree(lofResultStr);
        double lofScore = lofResultTree.get("lofScore").asDouble();
        return lofScore;
    }

    /**
     * ???
     * 
     * @return ??
     */
    public static Options createOptions() {
        Options cliOptions = new Options();

        // LofTopology
        OptionBuilder.hasArg(true);
        OptionBuilder.withArgName("LofTopology Conf Path");
        OptionBuilder.withDescription("LofTopology Conf Path");
        OptionBuilder.isRequired(true);
        Option confPathOption = OptionBuilder.create("c");

        // LOF
        OptionBuilder.hasArg(true);
        OptionBuilder.withArgName("LOF Data");
        OptionBuilder.withDescription("LOF Data");
        OptionBuilder.isRequired(true);
        Option dataOption = OptionBuilder.create("d");

        // 
        OptionBuilder.withDescription("show help");
        Option helpOption = OptionBuilder.create("h");

        cliOptions.addOption(confPathOption);
        cliOptions.addOption(dataOption);
        cliOptions.addOption(helpOption);
        return cliOptions;
    }
}