package com.flickr4java.flickr.photos; import com.flickr4java.flickr.people.User; import com.flickr4java.flickr.places.Place; import com.flickr4java.flickr.tags.Tag; import com.flickr4java.flickr.util.XMLUtilities; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import java.util.ArrayList; import java.util.List; /** * 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 { private PhotoUtils() { } /** * Try to get an attribute value from two elements. * * @param firstElement * @param secondElement * @return attribute value */ private static String getAttribute(String name, Element firstElement, Element secondElement) { String val = firstElement.getAttribute(name); if (val.length() == 0 && secondElement != null) { val = secondElement.getAttribute(name); } return val; } /** * Transfer the Information of a photo from a DOM-object to a Photo-object. * * @param photoElement * @return Photo */ public static final Photo createPhoto(Element photoElement) { return createPhoto(photoElement, null); } /** * Transfer the Information of a photo from a DOM-object to a Photo-object. * * @param photoElement * @param defaultElement * @return Photo */ public static final Photo createPhoto(Element photoElement, Element defaultElement) { Photo photo = new Photo(); photo.setId(photoElement.getAttribute("id")); photo.setPlaceId(photoElement.getAttribute("place_id")); photo.setSecret(photoElement.getAttribute("secret")); photo.setServer(photoElement.getAttribute("server")); photo.setFarm(photoElement.getAttribute("farm")); photo.setRotation(photoElement.getAttribute("rotation")); photo.setFavorite("1".equals(photoElement.getAttribute("isfavorite"))); photo.setLicense(photoElement.getAttribute("license")); photo.setOriginalFormat(photoElement.getAttribute("originalformat")); photo.setOriginalSecret(photoElement.getAttribute("originalsecret")); photo.setIconServer(photoElement.getAttribute("iconserver")); photo.setIconFarm(photoElement.getAttribute("iconfarm")); photo.setDateTaken(photoElement.getAttribute("datetaken")); photo.setDatePosted(photoElement.getAttribute("dateupload")); photo.setLastUpdate(photoElement.getAttribute("lastupdate")); // flickr.groups.pools.getPhotos provides this value! photo.setDateAdded(photoElement.getAttribute("dateadded")); photo.setOriginalWidth(photoElement.getAttribute("width_o")); photo.setOriginalHeight(photoElement.getAttribute("height_o")); photo.setMedia(photoElement.getAttribute("media")); photo.setMediaStatus(photoElement.getAttribute("media_status")); photo.setPathAlias(photoElement.getAttribute("pathalias")); photo.setViews(photoElement.getAttribute("views")); Element peopleElement = (Element) photoElement.getElementsByTagName("people").item(0); if (peopleElement != null) { photo.setIsHasPeople("1".equals(peopleElement.getAttribute("haspeople"))); } else { photo.setIsHasPeople(false); } // 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.getAttribute("url_t"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.THUMB); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_t")); sizeT.setHeight(photoElement.getAttribute("height_t")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_s"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.SMALL); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_s")); sizeT.setHeight(photoElement.getAttribute("height_s")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_sq"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.SQUARE); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_sq")); sizeT.setHeight(photoElement.getAttribute("height_sq")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_m"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.MEDIUM); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_m")); sizeT.setHeight(photoElement.getAttribute("height_m")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_l"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.LARGE); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_l")); sizeT.setHeight(photoElement.getAttribute("height_l")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_o"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.ORIGINAL); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_o")); sizeT.setHeight(photoElement.getAttribute("height_o")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_q"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.SQUARE_LARGE); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_q")); sizeT.setHeight(photoElement.getAttribute("height_q")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_n"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.SMALL_320); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_n")); sizeT.setHeight(photoElement.getAttribute("height_n")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_z"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.MEDIUM_640); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_z")); sizeT.setHeight(photoElement.getAttribute("height_z")); sizes.add(sizeT); } urlTmp = photoElement.getAttribute("url_c"); if (urlTmp != null && urlTmp.startsWith("http")) { Size sizeT = new Size(); sizeT.setLabel(Size.MEDIUM_800); sizeT.setSource(urlTmp); sizeT.setWidth(photoElement.getAttribute("width_c")); sizeT.setHeight(photoElement.getAttribute("height_c")); sizes.add(sizeT); } if (sizes.size() > 0) { photo.setSizes(sizes); } // Searches, or other list may contain orginal_format. // If not choosen via extras, set jpg as default. try { if (photo.getOriginalFormat() == null || photo.getOriginalFormat().equals("")) { String media = photo.getMedia(); if (media != null && media.equals("video")) photo.setOriginalFormat("mov"); // Currently flickr incorrectly returns original_format as jpg for movies. else photo.setOriginalFormat("jpg"); } } catch (NullPointerException e) { photo.setOriginalFormat("jpg"); } try { Element ownerElement = (Element) photoElement.getElementsByTagName("owner").item(0); if (ownerElement == null) { User owner = new User(); owner.setId(getAttribute("owner", photoElement, defaultElement)); owner.setUsername(getAttribute("ownername", photoElement, defaultElement)); photo.setOwner(owner); photo.setUrl("https://flickr.com/photos/" + owner.getId() + "/" + photo.getId()); } else { User owner = new User(); owner.setId(ownerElement.getAttribute("nsid")); String username = ownerElement.getAttribute("username"); String ownername = ownerElement.getAttribute("ownername"); // try to get the username either from the "username" attribute or // from the "ownername" attribute if (username != null && !"".equals(username)) { owner.setUsername(username); } else if (ownername != null && !"".equals(ownername)) { owner.setUsername(ownername); } owner.setUsername(ownerElement.getAttribute("username")); owner.setRealName(ownerElement.getAttribute("realname")); owner.setLocation(ownerElement.getAttribute("location")); photo.setOwner(owner); photo.setUrl("https://flickr.com/photos/" + owner.getId() + "/" + photo.getId()); } } catch (IndexOutOfBoundsException e) { User owner = new User(); owner.setId(photoElement.getAttribute("owner")); owner.setUsername(photoElement.getAttribute("ownername")); photo.setOwner(owner); photo.setUrl("https://flickr.com/photos/" + owner.getId() + "/" + photo.getId()); } try { photo.setTitle(XMLUtilities.getChildValue(photoElement, "title")); if (photo.getTitle() == null) { photo.setTitle(photoElement.getAttribute("title")); } } catch (IndexOutOfBoundsException e) { photo.setTitle(photoElement.getAttribute("title")); } try { photo.setDescription(XMLUtilities.getChildValue(photoElement, "description")); } catch (IndexOutOfBoundsException e) { } try { // here the flags are set, if the photo is read by getInfo(). Element visibilityElement = (Element) photoElement.getElementsByTagName("visibility").item(0); photo.setPublicFlag("1".equals(visibilityElement.getAttribute("ispublic"))); photo.setFriendFlag("1".equals(visibilityElement.getAttribute("isfriend"))); photo.setFamilyFlag("1".equals(visibilityElement.getAttribute("isfamily"))); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { // these flags are set here, if photos read from a list. photo.setPublicFlag("1".equals(photoElement.getAttribute("ispublic"))); photo.setFriendFlag("1".equals(photoElement.getAttribute("isfriend"))); photo.setFamilyFlag("1".equals(photoElement.getAttribute("isfamily"))); } // Parse either photo by getInfo, or from list try { Element datesElement = XMLUtilities.getChild(photoElement, "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")); } try { Element permissionsElement = (Element) photoElement.getElementsByTagName("permissions").item(0); Permissions permissions = new Permissions(); permissions.setComment(permissionsElement.getAttribute("permcomment")); permissions.setAddmeta(permissionsElement.getAttribute("permaddmeta")); photo.setPermissions(permissions); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { // nop } 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 } try { Element publicEditabilityElement = (Element) photoElement.getElementsByTagName("publiceditability").item(0); Editability publicEditability = new Editability(); publicEditability.setComment("1".equals(publicEditabilityElement.getAttribute("cancomment"))); publicEditability.setAddmeta("1".equals(publicEditabilityElement.getAttribute("canaddmeta"))); photo.setPublicEditability(publicEditability); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { // nop } try { Element usageElement = (Element) photoElement.getElementsByTagName("usage").item(0); Usage usage = new Usage(); usage.setIsCanBlog("1".equals(usageElement.getAttribute("canblog"))); usage.setIsCanDownload("1".equals(usageElement.getAttribute("candownload"))); usage.setIsCanShare("1".equals(usageElement.getAttribute("canshare"))); usage.setIsCanPrint("1".equals(usageElement.getAttribute("canprint"))); photo.setUsage(usage); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { // nop } try { Element commentsElement = (Element) photoElement.getElementsByTagName("comments").item(0); photo.setComments(((Text) commentsElement.getFirstChild()).getData()); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { // nop } try { Element notesElement = (Element) photoElement.getElementsByTagName("notes").item(0); List<Note> notes = new ArrayList<Note>(); NodeList noteNodes = notesElement.getElementsByTagName("note"); for (int i = 0; i < noteNodes.getLength(); i++) { Element noteElement = (Element) noteNodes.item(i); Note note = new Note(); note.setId(noteElement.getAttribute("id")); note.setAuthor(noteElement.getAttribute("author")); note.setAuthorName(noteElement.getAttribute("authorname")); note.setBounds(noteElement.getAttribute("x"), noteElement.getAttribute("y"), noteElement.getAttribute("w"), noteElement.getAttribute("h")); note.setText(noteElement.getTextContent()); notes.add(note); } photo.setNotes(notes); } catch (IndexOutOfBoundsException e) { photo.setNotes(new ArrayList<Note>()); } catch (NullPointerException e) { photo.setNotes(new ArrayList<Note>()); } // 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>(); String tagsAttr = photoElement.getAttribute("tags"); if (!tagsAttr.equals("")) { String[] values = tagsAttr.split("\\s+"); for (int i = 0; i < values.length; i++) { Tag tag = new Tag(); tag.setValue(values[i]); tags.add(tag); } } else { try { Element tagsElement = (Element) photoElement.getElementsByTagName("tags").item(0); NodeList tagNodes = tagsElement.getElementsByTagName("tag"); for (int i = 0; i < tagNodes.getLength(); i++) { Element tagElement = (Element) tagNodes.item(i); Tag tag = new Tag(); tag.setId(tagElement.getAttribute("id")); tag.setAuthor(tagElement.getAttribute("author")); tag.setRaw(tagElement.getAttribute("raw")); tag.setValue(((Text) tagElement.getFirstChild()).getData()); tags.add(tag); } } catch (IndexOutOfBoundsException e) { } } photo.setTags(tags); } catch (NullPointerException e) { photo.setTags(new ArrayList<Tag>()); } try { Element urlsElement = (Element) photoElement.getElementsByTagName("urls").item(0); List<String> urls = new ArrayList<String>(); NodeList urlNodes = urlsElement.getElementsByTagName("url"); for (int i = 0; i < urlNodes.getLength(); i++) { Element urlElement = (Element) urlNodes.item(i); PhotoUrl photoUrl = new PhotoUrl(); photo.setPhotoUrl(photoUrl); photoUrl.setType(urlElement.getAttribute("type")); photoUrl.setUrl(XMLUtilities.getValue(urlElement)); if (photoUrl.getType().equals("photopage")) { photo.setUrl(photoUrl.getUrl()); urls.add(photoUrl.getUrl()); } } photo.setUrls(urls); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { photo.setUrls(new ArrayList<String>()); } String longitude = null; String latitude = null; String accuracy = null; try { Element geoElement = (Element) photoElement.getElementsByTagName("location").item(0); longitude = geoElement.getAttribute("longitude"); latitude = geoElement.getAttribute("latitude"); accuracy = geoElement.getAttribute("accuracy"); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { // Geodata may be available as attributes in the photo-tag itself! try { longitude = photoElement.getAttribute("longitude"); latitude = photoElement.getAttribute("latitude"); accuracy = photoElement.getAttribute("accuracy"); } catch (NullPointerException e2) { // no geodata at all } } 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)); } } try { Place place = null; Element element = (Element) photoElement.getElementsByTagName("locality").item(0); place = new Place(element.getAttribute("place_id"), element.getTextContent(), element.getAttribute("woeid")); photo.setLocality(place); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { } try { Place place = null; Element element = (Element) photoElement.getElementsByTagName("county").item(0); place = new Place(element.getAttribute("place_id"), element.getTextContent(), element.getAttribute("woeid")); photo.setCounty(place); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { } try { Place place = null; Element element = (Element) photoElement.getElementsByTagName("region").item(0); place = new Place(element.getAttribute("place_id"), element.getTextContent(), element.getAttribute("woeid")); photo.setRegion(place); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { } try { Place place = null; Element element = (Element) photoElement.getElementsByTagName("country").item(0); place = new Place(element.getAttribute("place_id"), element.getTextContent(), element.getAttribute("woeid")); photo.setCountry(place); } catch (IndexOutOfBoundsException e) { } catch (NullPointerException e) { } return photo; } /** * Parse a list of Photos from given Element. * * @param photosElement * @return PhotoList */ public static final PhotoList<Photo> createPhotoList(Element photosElement) { PhotoList<Photo> photos = new PhotoList<Photo>(); photos.setPage(photosElement.getAttribute("page")); photos.setPages(photosElement.getAttribute("pages")); photos.setPerPage(photosElement.getAttribute("perpage")); photos.setTotal(photosElement.getAttribute("total")); NodeList photoNodes = photosElement.getElementsByTagName("photo"); for (int i = 0; i < photoNodes.getLength(); i++) { Element photoElement = (Element) photoNodes.item(i); photos.add(PhotoUtils.createPhoto(photoElement)); } return photos; } }