/*
* Copyright 2010-2011 Roger Heim
*
* 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 com.aremaitch.codestock2010.datadownloader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.TimeZone;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import com.aremaitch.codestock2010.repository.ExperienceLevel;
import com.aremaitch.codestock2010.repository.Session;
import com.aremaitch.codestock2010.repository.Speaker;
import com.aremaitch.codestock2010.repository.Track;
import com.aremaitch.utils.ACLogger;
/**
* Class for downloading data from CodeStock Version 2 API
* @author Roger Heim, Aremaitch Consulting
*
*/
public class DownloaderV2 {
Context context = null;
String roomsUrl = "";
String speakersUrl = "";
String sessionsUrl = "";
List<Speaker> parsedSpeakers = new ArrayList<Speaker>();
List<Track> parsedTracks = new ArrayList<Track>();
List<Session> parsedSessions = new ArrayList<Session>();
List<ExperienceLevel> parsedLevels = new ArrayList<ExperienceLevel>();
public List<Speaker> getParsedSpeakers() {
return parsedSpeakers;
}
public List<Track> getParsedTracks() {
return parsedTracks;
}
public List<Session> getParsedSessions() {
return parsedSessions;
}
public List<ExperienceLevel> getParsedLevels() {
return parsedLevels;
}
public DownloaderV2(Context currentContext, String roomsUrl, String speakersUrl, String sessionsUrl) {
this.context = currentContext;
this.roomsUrl = roomsUrl;
this.speakersUrl = speakersUrl;
this.sessionsUrl = sessionsUrl;
}
public boolean getCodeStockData() {
boolean result = true;
// not actually using room data
try {
getSpeakerData(this.speakersUrl);
getSessionData(this.sessionsUrl);
} catch (Exception ex) {
result = false;
}
return result;
}
private void getSpeakerData(String speakersUrl) throws ClientProtocolException, IOException, JSONException {
ACLogger.info("CodeStock Downloader", "getSpeakerData from " + speakersUrl);
DefaultHttpClient hc = new DefaultHttpClient();
HttpGet hg = new HttpGet(speakersUrl);
HttpResponse response = hc.execute(hg);
String queryResult = EntityUtils.toString(response.getEntity());
JSONObject jObj;
jObj = new JSONObject(queryResult);
JSONArray dArray = jObj.getJSONArray("d");
ACLogger.info("CodeStock Downloader", "Iterating over speaker array");
for (int i = 0; i <= dArray.length() - 1; i++) {
Speaker newSpeaker = new Speaker();
JSONObject speakerJSON = dArray.getJSONObject(i);
newSpeaker.setSpeakerBio(speakerJSON.getString("Bio"));
newSpeaker.setCompany(speakerJSON.getString("Company"));
newSpeaker.setSpeakerName(speakerJSON.getString("Name"));
newSpeaker.setSpeakerPhotoUrl(speakerJSON.getString("PhotoUrl"));
newSpeaker.setId(speakerJSON.getLong("SpeakerID"));
newSpeaker.setTwitterHandle(speakerJSON.getString("TwitterID"));
String temp = speakerJSON.getString("Website");
if (temp.equalsIgnoreCase("http://"))
newSpeaker.setWebSite("");
else
newSpeaker.setWebSite(speakerJSON.getString("Website"));
parsedSpeakers.add(newSpeaker);
}
ACLogger.info("CodeStock Downloader", "Finished iterating over speaker array");
}
private void getSessionData(String sessionsUrl) throws ClientProtocolException, IOException, JSONException {
ACLogger.info("CodeStock Downloader", "getSessionData from " + sessionsUrl);
DefaultHttpClient hc = new DefaultHttpClient();
HttpGet hg = new HttpGet(sessionsUrl);
HttpResponse response = hc.execute(hg);
String queryResult = EntityUtils.toString(response.getEntity());
JSONObject jObj;
jObj = new JSONObject(queryResult);
JSONArray dArray = jObj.getJSONArray("d");
ACLogger.info("CodeStock Downloader", "Iterating over session array");
for (int i = 0; i <= dArray.length() - 1; i++) {
Session newSession = new Session();
String savedArea = "";
JSONObject sessionJSON = dArray.getJSONObject(i);
newSession.setSynopsis(sessionJSON.getString("Abstract"));
JSONArray additionalSpeakers = sessionJSON.getJSONArray("AdditionalSpeakerIDs");
if (additionalSpeakers != null && additionalSpeakers.length() > 0) {
for (int j = 0; j <= additionalSpeakers.length() - 1; j++) {
long speakerID = additionalSpeakers.getLong(j);
Speaker addSpeaker = findParsedSpeaker(speakerID);
newSession.addAdditionalSpeaker(addSpeaker);
}
}
savedArea = sessionJSON.getString("Area");
newSession.setEndDate(convertToCalendar(sessionJSON.getString("EndTime")));
newSession.setGeneralExperienceLevel(findOrCreateExperienceLevel(sessionJSON.getString("LevelGeneral")));
newSession.setSpecificExperienceLevel(findOrCreateExperienceLevel(sessionJSON.getString("LevelSpecific")));
newSession.setRoom(sessionJSON.getString("Room"));
newSession.setId(sessionJSON.getLong("SessionID"));
newSession.setSpeaker(findParsedSpeaker(sessionJSON.getLong("SpeakerID")));
newSession.setStartDate(convertToCalendar(sessionJSON.getString("StartTime")));
newSession.setTechnologies(sessionJSON.getString("Technology"));
newSession.setSessionTitle(sessionJSON.getString("Title"));
newSession.setTrack(findOrCreateTrack(sessionJSON.getString("Track") + savedArea));
newSession.setVoteRank(sessionJSON.getString("VoteRank"));
parsedSessions.add(newSession);
}
ACLogger.info("CodeStock Downloader", "Finished iterating over session array");
}
private Track findOrCreateTrack(String trackName) {
Track theTrack = null;
for (Track t : parsedTracks) {
if (t.getTrackTitle().equalsIgnoreCase(trackName)) {
theTrack = t;
break;
}
}
if (theTrack == null) {
theTrack = new Track();
theTrack.setTrackTitle(trackName);
parsedTracks.add(theTrack);
}
return theTrack;
}
private ExperienceLevel findOrCreateExperienceLevel(String levelString) {
ExperienceLevel theLevel = null;
for (ExperienceLevel l : parsedLevels) {
if (l.getLevelName().equalsIgnoreCase(levelString)) {
theLevel = l;
break;
}
}
if (theLevel == null) {
theLevel = new ExperienceLevel();
theLevel.setLevelName(levelString);
parsedLevels.add(theLevel);
}
return theLevel;
}
private Calendar convertToCalendar(String dateString) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(Long.parseLong(dateString.substring(6, 19)));
cal.setTimeZone(TimeZone.getTimeZone("GMT" + dateString.substring(19, 24)));
return cal;
}
private Speaker findParsedSpeaker(long speakerid) {
for (Speaker s : parsedSpeakers) {
if (s.getId() == speakerid) {
return s;
}
}
return null;
}
}
|