package com.googlecode.flickrjandroid.photos; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.googlecode.flickrjandroid.people.User; import com.googlecode.flickrjandroid.tags.Tag; import com.googlecode.flickrjandroid.util.JSONUtils; /** * Utilitiy-methods to transfer requested XML to Photo-objects. * * @author till, x-mago * @version $Id: PhotoUtils.java,v 1.20 2009/07/23 21:49:35 x-mago Exp $ */ public final class PhotoUtils { public static final long serialVersionUID = 12L; private PhotoUtils() { super(); } /** * Transfer the Information of a photo context from a JSONObject to a PhotoContext-object. * * @param data * @return * @throws JSONException */ public static final PhotoContext createPhotoContext(JSONObject data) throws JSONException { String count = JSONUtils.getChildValue(data, "count"); PhotoContext photoContext = new PhotoContext(); photoContext.setCount(Integer.parseInt(count)); JSONObject payload = data; Iterator<?> iter = payload.keys(); while (iter.hasNext()) { String tagName = String.valueOf(iter.next()); JSONObject payloadElement = payload.optJSONObject(tagName); if (payloadElement == null) continue; if (tagName.equals("prevphoto")) { Photo photo = new Photo(); photo.setId(payloadElement.getString("id")); photo.setSecret(payloadElement.getString("secret")); photo.setTitle(payloadElement.getString("title")); photo.setFarm(payloadElement.getString("farm")); photo.setUrl(payloadElement.getString("url")); photoContext.setPreviousPhoto(photo); } else if (tagName.equals("nextphoto")) { Photo photo = new Photo(); photo.setId(payloadElement.getString("id")); photo.setSecret(payloadElement.getString("secret")); photo.setTitle(payloadElement.getString("title")); photo.setFarm(payloadElement.getString("farm")); photo.setUrl(payloadElement.getString("url")); photoContext.setNextPhoto(photo); } } return photoContext; } /** * Transfer the Information of a photo from a JSONObject to a Photo-object. * * @param photoElement * @return Photo * @throws JSONException */ public static final Photo createPhoto(JSONObject photoElement) throws JSONException { Photo photo = new Photo(); photo.setId(photoElement.getString("id")); photo.setPlaceId(photoElement.optString("place_id", null)); photo.setSecret(photoElement.getString("secret")); photo.setServer(photoElement.getString("server")); photo.setFarm(photoElement.getString("farm")); photo.setRotation(photoElement.optString("rotation", null)); photo.setFavorite("1".equals(photoElement.optString("isfavorite"))); photo.setLicense(photoElement.optString("license")); photo.setOriginalFormat(photoElement.optString("originalformat")); photo.setOriginalSecret(photoElement.optString("originalsecret")); photo.setIconServer(photoElement.optString("iconserver", null)); photo.setIconFarm(photoElement.optString("iconfarm", null)); photo.setDateTaken(photoElement.optString("datetaken")); photo.setDatePosted(photoElement.optString("dateupload")); photo.setLastUpdate(photoElement.optString("lastupdate")); // flickr.groups.pools.getPhotos provides this value! photo.setDateAdded(photoElement.optString("dateadded")); photo.setOriginalWidth(photoElement.optString("o_width")); photo.setOriginalHeight(photoElement.optString("o_height")); photo.setMedia(photoElement.optString("media")); photo.setMediaStatus(photoElement.optString("media_status")); photo.setPathAlias(photoElement.optString("pathalias")); JSONObject dates = photoElement.optJSONObject("dates"); if (dates != null) { photo.setDateTaken(dates.optString("taken")); photo.setDatePosted(dates.optString("posted")); photo.setLastUpdate(dates.optString("lastupdate")); } // If the attributes active that contain the image-urls, // Size-objects created from them, which are used to override // the Url-generation. List<Size> sizes = new ArrayList<Size>(); String urlTmp = photoElement.optString("url_t"); if (urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.THUMB); sizeT.setSource(urlTmp); sizes.add(sizeT); } urlTmp = photoElement.optString("url_s"); if (urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.SMALL); sizeT.setSource(urlTmp); sizes.add(sizeT); } urlTmp = photoElement.optString("url_sq"); if (urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.SQUARE); sizeT.setSource(urlTmp); sizes.add(sizeT); } urlTmp = photoElement.optString("url_m"); if (urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.MEDIUM); sizeT.setSource(urlTmp); sizes.add(sizeT); } urlTmp = photoElement.optString("url_l"); if (urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.LARGE); sizeT.setSource(urlTmp); sizes.add(sizeT); } urlTmp = photoElement.optString("url_o"); if (urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.ORIGINAL); sizeT.setSource(urlTmp); sizes.add(sizeT); } urlTmp = photoElement.optString("url_q"); if (urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.LARGE_SQUARE); sizeT.setSource(urlTmp); sizes.add(sizeT); } if (sizes.size() > 0) { photo.setSizes(sizes); } if (photo.getOriginalFormat() == null || photo.getOriginalFormat().equals("")) { photo.setOriginalFormat("jpg"); } User owner = new User(); if (photoElement.has("owner")) { Object obj = photoElement.get("owner"); if (obj instanceof JSONObject) { JSONObject ownerObj = (JSONObject) obj; owner.setId(ownerObj.getString("nsid")); owner.setUsername(ownerObj.optString("username", null)); owner.setRealName(ownerObj.optString("realname", null)); owner.setLocation(ownerObj.optString("location", null)); photo.setOwner(owner); } else { owner.setId(photoElement.getString("owner")); owner.setUsername(photoElement.optString("ownername", null)); photo.setOwner(owner); } photo.setUrl("https://flickr.com/photos/" + owner.getId() + "/" + photo.getId()); } JSONObject titleObj = photoElement.optJSONObject("title"); if (titleObj != null) { photo.setTitle(titleObj.getString("_content")); } else { photo.setTitle(photoElement.getString("title")); } photo.setDescription(JSONUtils.getChildValue(photoElement, "description")); // here the flags are set, if the photo is read by getInfo(). JSONObject visibilityElement; if (photoElement.has("visibility")) { visibilityElement = photoElement.getJSONObject("visibility"); } else { visibilityElement = photoElement; } photo.setPublicFlag("1".equals(visibilityElement.optString("ispublic"))); photo.setFriendFlag("1".equals(visibilityElement.optString("isfriend"))); photo.setFamilyFlag("1".equals(visibilityElement.optString("isfamily"))); // Parse either photo by getInfo, or from list /* * try { JSONObject datesElement = photoElement.optJSONObject("dates"); photo.setDatePosted(datesElement.getAttribute("posted")); photo.setDateTaken(datesElement.getAttribute("taken")); * photo.setTakenGranularity (datesElement.getAttribute("takengranularity")); photo.setLastUpdate(datesElement.getAttribute("lastupdate")); } catch (IndexOutOfBoundsException e) { * photo.setDateTaken(photoElement.getAttribute("datetaken")); } catch (NullPointerException e) { photo.setDateTaken(photoElement.getAttribute("datetaken")); } */ /* * NodeList permissionsNodes = photoElement.getElementsByTagName("permissions"); if (permissionsNodes.getLength() > 0) { Element permissionsElement = (Element) permissionsNodes.item(0); * Permissions permissions = new Permissions(); permissions.setComment(permissionsElement.getAttribute( "permcomment")); permissions.setAddmeta(permissionsElement.getAttribute * ("permaddmeta")); } */ /* * try { Element editabilityElement = (Element) photoElement.getElementsByTagName("editability").item(0); Editability editability = new Editability(); * editability.setComment("1".equals(editabilityElement .getAttribute("cancomment"))); editability.setAddmeta("1".equals(editabilityElement .getAttribute("canaddmeta"))); * photo.setEditability(editability); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { // nop } */ if (photoElement.has("comments")) { photo.setComments(JSONUtils.getChildValue(photoElement, "comments")); } JSONObject notesElement = photoElement.optJSONObject("notes"); List<Note> notes = new ArrayList<Note>(); if (notesElement != null) { JSONArray noteNodes = notesElement.optJSONArray("note"); for (int i = 0; noteNodes != null && i < noteNodes.length(); i++) { JSONObject noteElement = noteNodes.getJSONObject(i); Note note = new Note(); note.setId(noteElement.getString("id")); note.setAuthor(noteElement.getString("author")); note.setAuthorName(noteElement.getString("authorname")); note.setBounds(noteElement.getString("x"), noteElement.getString("y"), noteElement.getString("w"), noteElement.getString("h")); note.setText(noteElement.getString("_content")); notes.add(note); } } photo.setNotes(notes); // Tags coming as space-seperated attribute calling // InterestingnessInterface#getList(). // Through PhotoInterface#getInfo() the Photo has a list of // Elements. try { List<Tag> tags = new ArrayList<Tag>(); Object obj = photoElement.opt("tags"); if (obj instanceof JSONObject) { JSONObject tagsObject = (JSONObject) obj; JSONArray tagNodes = tagsObject.optJSONArray("tag"); for (int i = 0; tagNodes != null && i < tagNodes.length(); i++) { JSONObject tagElement = tagNodes.getJSONObject(i); Tag tag = new Tag(); tag.setId(tagElement.getString("id")); tag.setAuthor(tagElement.getString("author")); tag.setRaw(tagElement.getString("raw")); tag.setValue(tagElement.optString("_content")); tags.add(tag); } } else if (obj instanceof String) { String tagsAttr = obj.toString(); String[] values = tagsAttr.split(" "); for (int i = 0; i < values.length; i++) { Tag tag = new Tag(); tag.setValue(values[i]); tags.add(tag); } } photo.setTags(tags); } catch (NullPointerException e) { photo.setTags(new ArrayList<Tag>()); } try { List<String> tags = new ArrayList<String>(); Object obj = photoElement.opt("machine_tags"); if (obj instanceof String) { String tagsAttr = obj.toString().trim(); String[] values = tagsAttr.split(" "); for (int i = 0; i < values.length; i++) { tags.add(values[i]); } } photo.setMachineTags(tags); } catch (NullPointerException e) { photo.setMachineTags(new ArrayList<String>()); } /* * try { Element urlsElement = (Element) photoElement.getElementsByTagName("urls").item(0); List<PhotoUrl> urls = new ArrayList<PhotoUrl>(); NodeList urlNodes = * urlsElement.getElementsByTagName("url"); for (int i = 0; i < urlNodes.getLength(); i++) { Element urlElement = (Element) urlNodes.item(i); PhotoUrl photoUrl = new PhotoUrl(); * photoUrl.setType(urlElement.getAttribute("type")); photoUrl.setUrl(XMLUtilities.getValue(urlElement)); if (photoUrl.getType().equals("photopage")) { photo.setUrl(photoUrl.getUrl()); } } * photo.setUrls(urls); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { photo.setUrls(new ArrayList<PhotoUrl>()); } */ String longitude = photoElement.optString("longitude", null); String latitude = photoElement.optString("latitude", null); String accuracy = photoElement.optString("accuracy", null); // String woeId = photoElement.optString("woeid", null); if (longitude != null && latitude != null) { if (longitude.length() > 0 && latitude.length() > 0 && !("0".equals(longitude) && "0".equals(latitude))) { photo.setGeoData(new GeoData(longitude, latitude, accuracy)); } } JSONObject statsElement = photoElement.optJSONObject("stats"); if (statsElement != null) { photo.setViews(statsElement.optInt("views", -1)); photo.setComments(statsElement.optInt("comments", -1)); photo.setFavorites(statsElement.optInt("favorites", -1)); } else { photo.setViews(photoElement.optInt("views", -1)); } return photo; } /** * Parse a list of Photos from given Element. * * @param responseData * @return PhotoList * @throws JSONException */ public static final PhotoList createPhotoList(JSONObject responseData) throws JSONException { JSONObject photosElement = responseData.getJSONObject("photos"); PhotoList photos = new PhotoList(); photos.setPage(photosElement.optInt("page")); photos.setPages(photosElement.optInt("pages")); photos.setPerPage(photosElement.optInt("perpage")); photos.setTotal(photosElement.optInt("total")); JSONArray photoNodes = photosElement.optJSONArray("photo"); for (int i = 0; photoNodes != null && i < photoNodes.length(); i++) { JSONObject photoElement = photoNodes.getJSONObject(i); photos.add(PhotoUtils.createPhoto(photoElement)); } return photos; } }