package net.thesocialos.client.api; import java.util.Iterator; import java.util.Map; import net.thesocialos.client.CacheLayer; import net.thesocialos.client.desktop.window.FolderWindow; import net.thesocialos.client.oauth.OAuth; import net.thesocialos.shared.model.Account; import net.thesocialos.shared.model.FlickR; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.user.client.Window; import com.googlecode.objectify.Key; public class FlickrAPI { public class Album implements MediaAlbum { private String id; private String title; private String description; private String thumbnailURL; private int numPhotos; private boolean commentingEnabled; private int commentCount; /** * @return the commentCount */ public int getCommentCount() { return commentCount; } /** * @return the description */ @Override public String getDescription() { return description; } /** * @return the numPhotos */ @Override public int getElementCount() { return numPhotos; } /** * @return the id */ @Override public String getID() { return id; } /** * @return the title */ @Override public String getName() { return title; } /** * @return the thumbnailURL */ @Override public String getThumbnailURL() { return thumbnailURL; } /** * @return the commentingEnabled */ public boolean isCommentingEnabled() { return commentingEnabled; } } public class Picture implements MediaPicture { private String id; private String title; private String url; private String thumbnailURL; private boolean commentingEnabled; private int commentCount; @Override public String getDescription() { return ""; } @Override public String getID() { return id; } @Override public String getName() { return title; } @Override public String getThumbnailURL() { return thumbnailURL; } @Override public String getUrl() { return url; } } public FlickrAPI() { // TODO Auto-generated constructor stub } private FlickR getFlickrAccount() { Map<Key<Account>, Account> accounts = CacheLayer.UserCalls.getAccounts(); Iterator<Account> it = accounts.values().iterator(); while (it.hasNext()) { Account account = it.next(); if (account instanceof FlickR) { return (FlickR) account; } } return null; } private void loadAlbumInFolder(final Album album, String cover_photo_id, final FolderWindow folder, FlickR flickrAccount) { String url = "http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&nojsoncallback=1&per_page=9999"; url += "&photo_id=" + cover_photo_id; url = OAuth.signRequest(FlickR.CONSUMER_KEY, FlickR.CONSUMER_SECRET, flickrAccount.getToken(), flickrAccount.getTokenSecret(), url); send(url, new RequestCallback() { @Override public void onError(Request request, Throwable exception) { Window.alert(exception.getMessage()); } @Override public void onResponseReceived(Request request, Response response) { JSONObject object = JSONParser.parseStrict(response.getText()).isObject(); JSONArray array = object.get("sizes").isObject().get("size").isArray(); album.thumbnailURL = array.get(1).isObject().get("source").isString().stringValue(); folder.addMedia(album); } }); } public void loadAlbumsInFolder(final FolderWindow folder) { String url = "http://api.flickr.com/services/rest/?method=flickr.photosets.getList&nojsoncallback=1&per_page=9999"; final FlickR flickrAccount = getFlickrAccount(); if (null == flickrAccount) return; url = OAuth.signRequest(FlickR.CONSUMER_KEY, FlickR.CONSUMER_SECRET, flickrAccount.getToken(), flickrAccount.getTokenSecret(), url); send(url, new RequestCallback() { @Override public void onError(Request request, Throwable exception) { Window.alert(exception.getMessage()); } @Override public void onResponseReceived(Request request, Response response) { JSONObject object = JSONParser.parseStrict(response.getText()).isObject(); JSONArray array = object.get("photosets").isObject().get("photoset").isArray(); for (int i = 0; i < array.size(); i++) { Album album = new Album(); album.id = array.get(i).isObject().get("id").isString().stringValue(); album.title = array.get(i).isObject().get("title").isObject().get("_content").isString() .stringValue(); album.description = array.get(i).isObject().get("description").isObject().get("_content") .isString().stringValue(); album.numPhotos = Integer.parseInt(array.get(i).isObject().get("photos").isString().stringValue()); album.commentingEnabled = array.get(i).isObject().get("can_comment").isNumber().toString() .equals('1') ? true : false; album.commentCount = Integer.parseInt(array.get(i).isObject().get("count_comments").isString() .stringValue()); String cover_photo_id = array.get(i).isObject().get("primary").isString().stringValue(); loadAlbumInFolder(album, cover_photo_id, folder, flickrAccount); } } }); } private void loadPictureInFolder(final Picture picture, final FolderWindow folder, FlickR flickrAccount) { String url = "http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&nojsoncallback=1&per_page=9999"; url += "&photo_id=" + picture.getID(); url = OAuth.signRequest(FlickR.CONSUMER_KEY, FlickR.CONSUMER_SECRET, flickrAccount.getToken(), flickrAccount.getTokenSecret(), url); send(url, new RequestCallback() { @Override public void onError(Request request, Throwable exception) { Window.alert(exception.getMessage()); } @Override public void onResponseReceived(Request request, Response response) { JSONObject object = JSONParser.parseStrict(response.getText()).isObject(); // HashSet<Picture> pictures = new HashSet<Picture>(); JSONArray array = object.get("sizes").isObject().get("size").isArray(); picture.url = array.get(array.size() - 1).isObject().get("source").isString().stringValue(); picture.thumbnailURL = array.get(1).isObject().get("source").isString().stringValue(); folder.addMedia(picture); } }); } public void loadPicturesInFolder(Album album, final FolderWindow folder) { String url = "http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&nojsoncallback=1&per_page=9999"; url += "&photoset_id=" + album.getID(); final FlickR flickrAccount = getFlickrAccount(); if (null == flickrAccount) return; url = OAuth.signRequest(FlickR.CONSUMER_KEY, FlickR.CONSUMER_SECRET, flickrAccount.getToken(), flickrAccount.getTokenSecret(), url); send(url, new RequestCallback() { @Override public void onError(Request request, Throwable exception) { Window.alert(exception.getMessage()); } @Override public void onResponseReceived(Request request, Response response) { JSONObject object = JSONParser.parseStrict(response.getText()).isObject(); JSONArray array = object.get("photoset").isObject().get("photo").isArray(); for (int i = 0; i < array.size(); i++) { Picture picture = new Picture(); picture.id = array.get(i).isObject().get("id").isString().stringValue(); picture.title = array.get(i).isObject().get("title").isString().stringValue(); loadPictureInFolder(picture, folder, flickrAccount); } } }); } protected void send(String Url, RequestCallback cb) { /* * JsonpRequestBuilder jsonp = new JsonpRequestBuilder(); jsonp.setTimeout(10000); jsonp.requestObject(Url, cb); */ RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, Url); builder.setTimeoutMillis(10000); builder.setCallback(cb); Request req = null; try { req = builder.send(); } catch (RequestException e) { cb.onError(req, e); } } }