|
|
@ -23,6 +23,7 @@ import java.util.zip.ZipOutputStream; |
|
|
|
|
|
|
|
import javax.net.ssl.HttpsURLConnection; |
|
|
|
|
|
|
|
import org.json.simple.JSONArray; |
|
|
|
import org.json.simple.JSONObject; |
|
|
|
import org.json.simple.parser.JSONParser; |
|
|
|
import org.json.simple.parser.ParseException; |
|
|
@ -33,18 +34,160 @@ public class Main |
|
|
|
private static int athleteId = 0; |
|
|
|
private static JSONParser parser = new JSONParser(); |
|
|
|
|
|
|
|
private static void oneAthlete(String token) |
|
|
|
/** |
|
|
|
* |
|
|
|
* @param token |
|
|
|
*/ |
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
static void oneAthlete(String token) |
|
|
|
{ |
|
|
|
HashMap<String, File> athletesTempFiles = new HashMap<String, File>(); |
|
|
|
Map<String, File> athletesTempFiles = new HashMap<String, File>(); |
|
|
|
// get general information |
|
|
|
athletesTempFiles.put("general_information.json", saveGeneralInformation(token)); |
|
|
|
|
|
|
|
int activityId=0; |
|
|
|
|
|
|
|
// get Activities |
|
|
|
Map<String, JSONObject> activities = getActivities(token); |
|
|
|
|
|
|
|
// for each activity: save streams |
|
|
|
int simpleActivityId=0; |
|
|
|
for (String id: activities.keySet()) |
|
|
|
{ |
|
|
|
JSONObject data = addStreams(id, activities.get(id), token); |
|
|
|
data.put("activity_id", simpleActivityId); |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
File temp = File.createTempFile("activity_" +simpleActivityId , ".json"); |
|
|
|
temp.deleteOnExit(); |
|
|
|
BufferedWriter bw = new BufferedWriter(new FileWriter(temp)); |
|
|
|
bw.write(data.toString()); |
|
|
|
bw.close(); |
|
|
|
athletesTempFiles.put(""+simpleActivityId, temp); |
|
|
|
} |
|
|
|
catch (IOException e) |
|
|
|
{ |
|
|
|
//Temp File coldnt be created |
|
|
|
// TODO Auto-generated catch block |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
|
|
|
|
simpleActivityId++; |
|
|
|
} |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
zipAllFiles(athletesTempFiles); |
|
|
|
} |
|
|
|
catch (IOException e) |
|
|
|
{ |
|
|
|
//Problem zipping |
|
|
|
// TODO Auto-generated catch block |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Adds the streams to the given activity |
|
|
|
* @param id Strava id of the activity |
|
|
|
* @param data general information of the activity |
|
|
|
* @param token Identifier / authorization token of the athlete |
|
|
|
* @return The data with the added streams |
|
|
|
*/ |
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
static JSONObject addStreams(String id, JSONObject data, String token) |
|
|
|
{ |
|
|
|
//TODO: das könnte mit dem Array Probleme geben.... |
|
|
|
String requestUrlExtension = "activities/"+id+"/streams?keys=[time, distance, latlng, altitude, " |
|
|
|
+ "velocity_smooth, heartrate, cadence, watts, temp, moving, grade_smooth]&key_by_type="; |
|
|
|
String json = makeOneRequest(requestUrlExtension, token); |
|
|
|
String type = "type"; |
|
|
|
|
|
|
|
Object obj; |
|
|
|
try |
|
|
|
{ |
|
|
|
obj = parser.parse(json); |
|
|
|
JSONArray listOfStreams = (JSONArray) obj; |
|
|
|
for (int i=0; i<listOfStreams.size(); i++) |
|
|
|
{ |
|
|
|
JSONObject oneStream = (JSONObject) listOfStreams.get(i); |
|
|
|
//TODO: hier null etc. abfangen |
|
|
|
data.put("stream_"+oneStream.get(type).toString(), oneStream); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (ParseException e) |
|
|
|
{ |
|
|
|
//Problem parsing json |
|
|
|
// TODO Auto-generated catch block |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
|
|
|
|
// call by reference / value pruefen |
|
|
|
return data; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Gathers all activities of a user, extracts the general information and the ids. |
|
|
|
* @param token Identifier / authorization token of the athlete |
|
|
|
* @return A Map with key = Strava Id of an activity and value = JSONObject with the general information of the activity |
|
|
|
*/ |
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
static Map<String, JSONObject> getActivities(String token) |
|
|
|
{ |
|
|
|
Map<String, JSONObject> result = new HashMap<>(); |
|
|
|
/* |
|
|
|
* Possible values = AlpineSki, BackcountrySki, Canoeing, Crossfit, EBikeRide, Elliptical, Golf, |
|
|
|
* Handcycle, Hike, IceSkate, InlineSkate, Kayaking, Kitesurf, NordicSki, Ride, RockClimbing, |
|
|
|
* RollerSki, Rowing, Run, Sail, Skateboard, Snowboard, Snowshoe, Soccer, StairStepper, |
|
|
|
* StandUpPaddling, Surfing, Swim, Velomobile, VirtualRide, VirtualRun, Walk, WeightTraining, |
|
|
|
* Wheelchair, Windsurf, Workout, Yoga |
|
|
|
*/ |
|
|
|
String type = "type"; |
|
|
|
String timezone = "timezone"; |
|
|
|
String start = "start_date_local"; //Start date measured in users time zone |
|
|
|
String id = "id"; |
|
|
|
|
|
|
|
int pageIndex = 1; |
|
|
|
while(true) |
|
|
|
{ |
|
|
|
String requestExtension = "athlete/activities?before=&after=&page="+pageIndex+"&per_page="; |
|
|
|
String json = makeOneRequest(requestExtension, token); |
|
|
|
if (json.isEmpty()||json.isBlank()||json.equals("")) //don't know where the last page is... |
|
|
|
{ |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
Object obj; |
|
|
|
try |
|
|
|
{ |
|
|
|
obj = parser.parse(json); |
|
|
|
JSONArray listOfActivites = (JSONArray) obj; |
|
|
|
for (int i=0; i<listOfActivites.size(); i++) |
|
|
|
{ |
|
|
|
JSONObject oneActivity = (JSONObject) listOfActivites.get(i); |
|
|
|
|
|
|
|
JSONObject toSave = new JSONObject(); |
|
|
|
toSave.put(type, oneActivity.get(type)); |
|
|
|
toSave.put(timezone, oneActivity.get(timezone)); |
|
|
|
toSave.put(start, oneActivity.get(start)); |
|
|
|
toSave.put("athlete_id", athleteId); |
|
|
|
|
|
|
|
|
|
|
|
//TODO: hier null etc. abfangen |
|
|
|
result.put(oneActivity.get(id).toString(), toSave); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (ParseException e) |
|
|
|
{ |
|
|
|
//Problem parsing json |
|
|
|
// TODO Auto-generated catch block |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
|
|
|
|
pageIndex++; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -53,13 +196,14 @@ public class Main |
|
|
|
* @return Created temp file or {@code null} if there was an error. |
|
|
|
*/ |
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
private static File saveGeneralInformation(String token) |
|
|
|
static File saveGeneralInformation(String token) |
|
|
|
{ |
|
|
|
//TODO: auf fehlende WErte vorbereiten |
|
|
|
String sex = "sex"; |
|
|
|
|
|
|
|
String sex = "sex"; //Possible values = M, F |
|
|
|
String country = "country"; |
|
|
|
String date_pref = "date_preference"; |
|
|
|
String meas_pref = "measurement_preference"; |
|
|
|
String meas_pref = "measurement_preference"; //Possible values = feet, meters |
|
|
|
String weight = "weight"; |
|
|
|
|
|
|
|
String json = makeOneRequest("athlete", token); |
|
|
@ -105,7 +249,7 @@ public class Main |
|
|
|
* @param files HasMap of <intended Filename, File> which should be zipped |
|
|
|
* @throws IOException If there was an error zipping |
|
|
|
*/ |
|
|
|
private static void zipAllFiles(Map<String,File> files) throws IOException |
|
|
|
static void zipAllFiles(Map<String,File> files) throws IOException |
|
|
|
{ |
|
|
|
//TODO: checken, ob hier an den richtigen Ort gespeichert wird. |
|
|
|
//TODO: evtl. alles nochmal zippen |
|
|
@ -135,7 +279,7 @@ public class Main |
|
|
|
* @param token Identification / authorization token of the athlete |
|
|
|
* @return The response as a String, an empty String in case of error. |
|
|
|
*/ |
|
|
|
private static String makeOneRequest(String requestUrlExtension, String token) |
|
|
|
static String makeOneRequest(String requestUrlExtension, String token) |
|
|
|
{ |
|
|
|
HttpURLConnection connection = null; |
|
|
|
StringBuilder result = new StringBuilder(); |
|
|
@ -187,7 +331,7 @@ public class Main |
|
|
|
oneAthlete(token); |
|
|
|
athleteId++; |
|
|
|
} |
|
|
|
|
|
|
|
//TODO: alles nochmal zippen |
|
|
|
} |
|
|
|
|
|
|
|
} |