Java tutorial
/* * Copyright 2013 Liquid Labs Inc. * * 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 ca.liquidlabs.android.speedtestvisualizer.model; import com.google.android.gms.maps.model.LatLng; import org.apache.commons.csv.CSVRecord; import org.apache.commons.lang3.time.DateUtils; import java.text.ParseException; import java.util.Date; /** * POJO model which represents all the available attributes for SpeedTest(tm) * exported data. * * @since SpeedTest v2.0.9 */ public class SpeedTestRecord { // // Individual CSV keys index for each header elements // private static final int KEY_DATE = 0; private static final int KEY_CONNTYPE = 1; private static final int KEY_LAT = 2; private static final int KEY_LON = 3; private static final int KEY_DOWNL = 4; private static final int KEY_UPL = 5; private static final int KEY_LATENCY = 6; private static final int KEY_SERVER = 7; private static final int KEY_IPINT = 8; private static final int KEY_IPEXT = 9; // // Class Attributes // private String date; private ConnectionType connectionType; private float lat; private float lon; private float download; private float upload; private int latency; private String serverName; private String internalIp; private String externalIp; // // Other useful attributes of record // /** * Date format of speedtest date record. */ public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm"; // // Extra info added by this app // /** * Hue value store for each marker after calculation. Used by app * internally. */ private float markerColorHue; /** * Timestamp value for the record. * * @see #getUnixTimeStamp() */ private long recordTimestamp = 0; /** * Constructs speedtest model object from parsed csv record. <br/> * TODO: Handle the exceptions in future, and show user friendly error * message to user. * * @param csvRecord */ public SpeedTestRecord(CSVRecord csvRecord) { try { this.date = csvRecord.get(KEY_DATE); // data connection type - should be one of expected values this.connectionType = ConnectionType.fromString(csvRecord.get(KEY_CONNTYPE)); // Lat, Lon is in float this.lat = Float.parseFloat(csvRecord.get(KEY_LAT)); this.lon = Float.parseFloat(csvRecord.get(KEY_LON)); // download and upload values are always in kbps this.download = Float.parseFloat(csvRecord.get(KEY_DOWNL)); this.upload = Float.parseFloat(csvRecord.get(KEY_UPL)); // latency is numeric - in milliseconds this.latency = Integer.parseInt(csvRecord.get(KEY_LATENCY)); this.serverName = csvRecord.get(KEY_SERVER); this.internalIp = csvRecord.get(KEY_IPINT); this.externalIp = csvRecord.get(KEY_IPEXT); } catch (NumberFormatException e) { // if for some reason unexpected value is passed, stop parsing throw new IllegalArgumentException("Unable to parse record: " + csvRecord.toString()); } catch (ArrayIndexOutOfBoundsException e) { // this might happen for some leftover lines when copy and pasting // data. throw new IllegalArgumentException("Invalid record : " + csvRecord.toString()); } } /** * Constructor to create a copy of speedtest record object from another * object. * * @param speedTestRecord */ public SpeedTestRecord(SpeedTestRecord speedTestRecord) { this.date = speedTestRecord.getDate(); this.connectionType = speedTestRecord.getConnectionType(); this.lat = speedTestRecord.getLat(); this.lon = speedTestRecord.getLon(); this.download = speedTestRecord.getDownload(); this.upload = speedTestRecord.getUpload(); this.latency = speedTestRecord.getLatency(); this.serverName = speedTestRecord.getServerName(); this.internalIp = speedTestRecord.getInternalIp(); this.externalIp = speedTestRecord.getExternalIp(); } /** * @return the date */ public String getDate() { return date; } /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return SpeedTestRecord.class.getSimpleName() + " [date=" + date + ", connectionType=" + connectionType + ", download=" + download + ", upload=" + upload + "]"; } /** * @param date the date to set */ public void setDate(String date) { this.date = date; } /** * @return the connectionType */ public ConnectionType getConnectionType() { return connectionType; } /** * @param connectionType the connectionType to set */ public void setConnectionType(ConnectionType connectionType) { this.connectionType = connectionType; } /** * @return the lat */ public float getLat() { return lat; } /** * @param lat the lat to set */ public void setLat(float lat) { this.lat = lat; } /** * @return the lon */ public float getLon() { return lon; } /** * @param lon the lon to set */ public void setLon(float lon) { this.lon = lon; } /** * @return {@link LatLng} object */ public LatLng getLatLng() { return new LatLng(this.lat, this.lon); } /** * @return the download */ public float getDownload() { return download; } /** * @param download the download to set */ public void setDownload(int download) { this.download = download; } /** * @return the upload */ public float getUpload() { return upload; } /** * @param upload the upload to set */ public void setUpload(int upload) { this.upload = upload; } /** * @return the latency */ public int getLatency() { return latency; } /** * @param latency the latency to set */ public void setLatency(int latency) { this.latency = latency; } /** * @return the serverName */ public String getServerName() { return serverName; } /** * @param serverName the serverName to set */ public void setServerName(String serverName) { this.serverName = serverName; } /** * @return the internalIp */ public String getInternalIp() { return internalIp; } /** * @param internalIp the internalIp to set */ public void setInternalIp(String internalIp) { this.internalIp = internalIp; } /** * @return the externalIp */ public String getExternalIp() { return externalIp; } /** * @param externalIp the externalIp to set */ public void setExternalIp(String externalIp) { this.externalIp = externalIp; } // // Getter/Setter methods for Extra Infos // public float getMarkerColorHue() { return markerColorHue; } public void setMarkerColorHue(float markerColorHue) { this.markerColorHue = markerColorHue; } // // Helper methods // /** * Returns unix timestamp of speedtest record. If date parsing is failed, it * returns 0. * * @return Unix timestamp value. Or 0 when date parsing fails. * @see {@link #getDate()} * @see {@link Date#getTime()} */ public long getUnixTimeStamp() { if (recordTimestamp > 0) { // return cached value return recordTimestamp; } else { try { Date parsedDate = DateUtils.parseDate(getDate(), SpeedTestRecord.DATE_FORMAT); recordTimestamp = parsedDate.getTime(); return recordTimestamp; } catch (ParseException e) { android.util.Log.e("LOG", "Unable to parse date", e); return 0; } } } }