/******************************************************************************* * Copyright 2013-2015 alladin-IT GmbH * * 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 at.alladin.rmbt.client.v2.task; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.json.JSONArray; import org.json.JSONObject; import at.alladin.rmbt.client.QualityOfServiceTest; import at.alladin.rmbt.client.RMBTClient; import at.alladin.rmbt.client.v2.task.result.QoSTestResult; import at.alladin.rmbt.client.v2.task.result.QoSTestResultEnum; import at.alladin.rmbt.util.tools.TracerouteService; import at.alladin.rmbt.util.tools.TracerouteService.HopDetail; /** * * @author lb * */ public class TracerouteTask extends AbstractQoSTask { public final static long DEFAULT_TIMEOUT = 10000000000L; public final static int DEFAULT_MAX_HOPS = 30; private final String host; private final long timeout; private final int maxHops; public final static String PARAM_HOST = "host"; public final static String PARAM_TIMEOUT = "timeout"; public final static String PARAM_MAX_HOPS = "max_hops"; public final static String RESULT_HOST = "traceroute_objective_host"; public final static String RESULT_DETAILS = "traceroute_result_details"; public final static String RESULT_TIMEOUT = "traceroute_objective_timeout"; public final static String RESULT_STATUS = "traceroute_result_status"; public final static String RESULT_MAX_HOPS = "traceroute_objective_max_hops"; public final static String RESULT_HOPS = "traceroute_result_hops"; /** * * @param taskDesc */ public TracerouteTask(QualityOfServiceTest nnTest, TaskDesc taskDesc, int threadId) { super(nnTest, taskDesc, threadId, threadId); this.host = (String)taskDesc.getParams().get(PARAM_HOST); String value = (String) taskDesc.getParams().get(PARAM_TIMEOUT); this.timeout = value != null ? Long.valueOf(value) : DEFAULT_TIMEOUT; value = (String) taskDesc.getParams().get(PARAM_MAX_HOPS); this.maxHops = value != null ? Integer.valueOf(value) : DEFAULT_MAX_HOPS; } /** * */ public QoSTestResult call() throws Exception { final QoSTestResult testResult = initQoSTestResult(QoSTestResultEnum.TRACEROUTE); testResult.getResultMap().put(RESULT_HOST, host); testResult.getResultMap().put(RESULT_TIMEOUT, timeout); testResult.getResultMap().put(RESULT_MAX_HOPS, maxHops); try { onStart(testResult); final TracerouteService pingTool = getQoSTest().getTestSettings().getTracerouteServiceClazz().newInstance(); pingTool.setHost(host); pingTool.setMaxHops(maxHops); final List<HopDetail> pingDetailList = new ArrayList<TracerouteService.HopDetail>(); pingTool.setResultListObject(pingDetailList); final Future<List<HopDetail>> traceFuture = RMBTClient.getCommonThreadPool().submit(pingTool); try { traceFuture.get(timeout, TimeUnit.NANOSECONDS); if (!pingTool.hasMaxHopsExceeded()) { testResult.getResultMap().put(RESULT_STATUS, "OK"); testResult.getResultMap().put(RESULT_HOPS, pingDetailList.size()); } else { testResult.getResultMap().put(RESULT_STATUS, "MAX_HOPS_EXCEEDED"); testResult.getResultMap().put(RESULT_HOPS, maxHops); } } catch (TimeoutException e) { testResult.getResultMap().put(RESULT_STATUS, "TIMEOUT"); } finally { if (pingDetailList != null) { JSONArray resultArray = new JSONArray(); for (final HopDetail p : pingDetailList) { JSONObject json = p.toJson(); if (json != null) { resultArray.put(json); } } testResult.getResultMap().put(RESULT_DETAILS, resultArray); } } } catch (Exception e) { e.printStackTrace(); testResult.getResultMap().put(RESULT_STATUS, "ERROR"); } finally { onEnd(testResult); } return testResult; } /* * (non-Javadoc) * @see at.alladin.rmbt.client.v2.task.AbstractRmbtTask#initTask() */ @Override public void initTask() { } /* * (non-Javadoc) * @see at.alladin.rmbt.client.v2.task.QoSTask#getTestType() */ public QoSTestResultEnum getTestType() { return QoSTestResultEnum.TRACEROUTE; } /* * (non-Javadoc) * @see at.alladin.rmbt.client.v2.task.QoSTask#needsQoSControlConnection() */ public boolean needsQoSControlConnection() { return false; } }