/******************************************************************************* * 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.applet; import java.applet.Applet; import java.util.ArrayList; import java.util.Arrays; import java.util.concurrent.atomic.AtomicReference; import net.measurementlab.ndt.NdtTests; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import at.alladin.rmbt.client.QualityOfServiceTest; import at.alladin.rmbt.client.RMBTClient; import at.alladin.rmbt.client.TestResult; import at.alladin.rmbt.client.helper.Config; import at.alladin.rmbt.client.helper.ControlServerConnection; import at.alladin.rmbt.client.helper.IntermediateResult; import at.alladin.rmbt.client.helper.NdtStatus; import at.alladin.rmbt.client.helper.RevisionHelper; import at.alladin.rmbt.client.helper.TestStatus; import at.alladin.rmbt.client.ndt.NDTRunner; import at.alladin.rmbt.client.v2.task.QoSTestEnum; import at.alladin.rmbt.client.v2.task.result.QoSResultCollector; import at.alladin.rmbt.client.v2.task.service.TestSettings; public class RMBTApplet extends Applet { public final static String PARAM_UUID = "uuid"; public final static String PARAM_RUN_QOS = "runQos"; public final static String PARAM_RUN_NDT = "runNdt"; public final static String PARAM_QOS_SSL = "qosSsl"; private static final long serialVersionUID = 1L; private RMBTClient client; private volatile boolean start = false; private volatile boolean runRMBT = false; private volatile boolean ndtActivated = false; private volatile String uuid; private volatile ArrayList<String> geoInfo = null; private final AtomicReference<NDTRunner> ndtRunnerHolder = new AtomicReference<NDTRunner>(); private volatile Integer zip; private volatile String product; @Override public void init() { System.out.println(String.format("initializing applet %s", RevisionHelper.getVerboseRevision())); System.out.println("supported HTML named parameters: "); System.out.println("runNdt \n\toptions: true, false \t default: false \t functionality: run NDT test"); System.out.println("runQos \n\toptions: true, false \t default: false \t functionality: run QoS test"); System.out.println("qosSsl \n\toptions: true, false \t default: true \t functionality: run QoS test with SSL"); String param = getParameter(PARAM_RUN_QOS); final boolean runQoS= Boolean.parseBoolean(param == null ? "false" : param.trim()); param = getParameter(PARAM_QOS_SSL); final boolean useSslForQoS = Boolean.parseBoolean(param == null ? "true" : param.trim()); param = getParameter(PARAM_RUN_NDT); final boolean runNdt = Boolean.parseBoolean(param == null ? "false" : param.trim()); param = getParameter(PARAM_UUID); if (param != null) { uuid = param; runRMBT = true; start = true; } final Runnable runnable = new Runnable() { public void run() { try { synchronized (RMBTApplet.this) { while (!start) RMBTApplet.this.wait(); // wait for start signal } System.out.println("got start signal"); final int port = 443; final boolean encryption = true; // Leere GeoInfoS // ArrayList<String> geoInfo = null; // uuid fuer tests if (runRMBT) { final JSONObject additionalValues = new JSONObject(); try { additionalValues.put("ndt", ndtActivated); additionalValues.put("plattform", "Applet"); } catch (JSONException e) { e.printStackTrace(); } client = RMBTClient.getInstance(getParameter("host"), getParameter("path"), port, encryption, geoInfo, uuid, "DESKTOP", Config.RMBT_CLIENT_NAME, Config.RMBT_VERSION_NUMBER, null, additionalValues); final TestResult result = client.runTest(); if (result != null) { final JSONObject jsonResult = new JSONObject(); try { if (geoInfo != null) { final JSONArray itemList = new JSONArray(); final JSONObject jsonItem = new JSONObject(); jsonItem.put("tstamp", geoInfo.get(0)); jsonItem.put("geo_lat", geoInfo.get(1)); jsonItem.put("geo_long", geoInfo.get(2)); jsonItem.put("accuracy", geoInfo.get(3)); jsonItem.put("altitude", geoInfo.get(4)); jsonItem.put("bearing", geoInfo.get(5)); jsonItem.put("speed", geoInfo.get(6)); jsonItem.put("provider", geoInfo.get(7)); itemList.put(jsonItem); jsonResult.put("geoLocations", itemList); } if (zip != null) jsonResult.put("zip_code", zip); if (product != null) { jsonResult.put("model", product); jsonResult.put("product", product); } jsonResult.put("plattform", "Applet"); jsonResult.put("ndt", ndtActivated); jsonResult.put("network_type", 98); } catch (final JSONException e) { e.printStackTrace(); } client.sendResult(jsonResult); } System.out.println("Status: " + client.getStatus()); System.out.println("Checking QoS..."); if (runQoS && client.getStatus() == TestStatus.SPEEDTEST_END) { System.out.println("On. Starting QoS..."); try { client.setStatus(TestStatus.QOS_TEST_RUNNING); final TestSettings qosTestSettings = new TestSettings(client.getControlConnection().getStartTimeNs()); System.out.println(qosTestSettings); qosTestSettings.setUseSsl(useSslForQoS); final QualityOfServiceTest qosTest = new QualityOfServiceTest(client, qosTestSettings); QoSResultCollector qosResult = qosTest.call(); if (qosResult != null && qosTest.getStatus().equals(QoSTestEnum.QOS_FINISHED)) { System.out.println("Sending QoS results..."); client.sendQoSResult(qosResult); } System.out.println("QoS finished."); } catch (Exception e) { e.printStackTrace(); } finally { client.setStatus(TestStatus.QOS_END); } } else { System.out.println("Off. Not running QoS."); client.setStatus(TestStatus.QOS_END); } client.shutdown(); } System.out.println("Status: " + client.getStatus()); System.out.println("Checking NDT..."); if (runNdt && (client.getStatus() == TestStatus.QOS_END || client.getStatus() == TestStatus.SPEEDTEST_END)) { System.out.println("On. Starting NDT..."); final NDTRunner ndtRunner = new NDTRunner(); ndtRunnerHolder.set(ndtRunner); ndtRunner.runNDT(NdtTests.NETWORK_WIRED, ndtRunner.new UiServices() { @Override public void sendResults() { System.out.println("Sending NDT results..."); final ControlServerConnection csc = new ControlServerConnection(); csc.sendNDTResult(getParameter("host"), getParameter("path"), port, encryption, uuid, this, client.getTestUuid()); System.out.println("NDT finished."); } }); } else { System.out.println("Off. Not running NDT."); } //set status to end: if (client.getStatus() != TestStatus.ERROR ) { client.setStatus(TestStatus.END); System.out.println("TEST FINISHED. Status: " + client.getStatus()); } else { System.out.println("ERROR: " + client.getErrorMsg()); } } catch (final InterruptedException e) { Thread.currentThread().interrupt(); } } }; new Thread(runnable).start(); } synchronized public void startTest(final String uuid) { System.out.println(String.format("starting test. uuid: %s", uuid)); this.uuid = uuid; start = true; runRMBT = true; notify(); } public IntermediateResult getIntermediateResult() { if (client == null) return null; return client.getIntermediateResult(null); } public NdtStatus getNdtStatus() { final NDTRunner ndtRunner = ndtRunnerHolder.get(); if (ndtRunner == null) return null; return ndtRunner.getNdtStatus(); } public float getNdtProgress() { final NDTRunner ndtRunner = ndtRunnerHolder.get(); if (ndtRunner == null) return 0; return ndtRunner.getNdtProgress(); } public String getPublicIP() { if (client == null) return null; return client.getPublicIP(); } public String getServerName() { if (client == null) return null; return client.getServerName(); } public String getProvider() { if (client == null) return null; return client.getProvider(); } public String getTestUuid() { if (client == null) return null; return client.getTestUuid(); } public void setLocation(final Number posTimestamp, final Number posLat, final Number posLong, final Number posAccuracy, final Number posAltitude, final Number posHeading, final Number posSpeed) { try { geoInfo = new ArrayList<String>(Arrays.asList(String.valueOf(posTimestamp), String.valueOf(posLat), String.valueOf(posLong), String.valueOf(posAccuracy), String.valueOf(posAltitude), String.valueOf(posHeading), String.valueOf(posSpeed), "Browser")); } catch (final Exception e) { e.printStackTrace(); } } public void setZip(final Integer zip) { this.zip = zip; } public void setBrowserInfo(final String product) { if (product != null && product.length() > 0) this.product = product; } public void setNDTActivated(final boolean ndtActivated) { this.ndtActivated = ndtActivated; } }