package com.flickr4java.flickr.collections; import com.flickr4java.flickr.FlickrException; import com.flickr4java.flickr.Response; import com.flickr4java.flickr.Transport; import com.flickr4java.flickr.photos.PhotoUtils; import com.flickr4java.flickr.photosets.Photoset; import com.flickr4java.flickr.util.XMLUtilities; import org.apache.log4j.Logger; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Interface for flickr.collections.* methods. * * @author Darren Greaves * @version $Id$ Copyright (c) 2012 Darren Greaves. */ public class CollectionsInterface { private static final String METHOD_GET_INFO = "flickr.collections.getInfo"; private static final String METHOD_GET_TREE = "flickr.collections.getTree"; /** * Logger for log4j. */ @SuppressWarnings("unused") private static Logger _log = Logger.getLogger(CollectionsInterface.class); private final String apiKey; private final String sharedSecret; private final Transport transportAPI; public CollectionsInterface(String apiKey, String sharedSecret, Transport transportAPI) { this.apiKey = apiKey; this.sharedSecret = sharedSecret; this.transportAPI = transportAPI; } /** * Retrieves info on the given Flickr {@link Collection} (of {@link Photoset}s). * * This method requires authentication. * * @param collectionId * the id of the collection (from the getTree call, not from the collection URL). * * @return the given Collection * @throws FlickrException */ public Collection getInfo(String collectionId) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_INFO); parameters.put("collection_id", collectionId); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Collection collection = parseCollection(response.getPayload()); return collection; } /** * Retrieves a list of the current Commons institutions. * * This method does not require authentication. * * @param collectionId * the id of the collection (optional - returns all if not specified). * @param userId * the user id of the collection owner (optional - defaults to calling user). * * @return List of Institution * @throws FlickrException */ public List<Collection> getTree(String collectionId, String userId) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_TREE); if (collectionId != null) { parameters.put("collection_id", collectionId); } if (userId != null) { parameters.put("user_id", userId); } Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } List<Collection> collections = new ArrayList<Collection>(); Element mElement = response.getPayload(); NodeList collectionElements = mElement.getElementsByTagName("collection"); for (int i = 0; i < collectionElements.getLength(); i++) { Element element = (Element) collectionElements.item(i); collections.add(parseTreeCollection(element)); } return collections; } /** * Parse the XML for a collection as returned by getInfo call. * * @param collectionElement * @return */ private Collection parseCollection(Element collectionElement) { Collection collection = new Collection(); collection.setId(collectionElement.getAttribute("id")); collection.setServer(collectionElement.getAttribute("server")); collection.setSecret(collectionElement.getAttribute("secret")); collection.setChildCount(collectionElement.getAttribute("child_count")); collection.setIconLarge(collectionElement.getAttribute("iconlarge")); collection.setIconSmall(collectionElement.getAttribute("iconsmall")); collection.setDateCreated(collectionElement.getAttribute("datecreate")); collection.setTitle(XMLUtilities.getChildValue(collectionElement, "title")); collection.setDescription(XMLUtilities.getChildValue(collectionElement, "description")); Element iconPhotos = XMLUtilities.getChild(collectionElement, "iconphotos"); if (iconPhotos != null) { NodeList photoElements = iconPhotos.getElementsByTagName("photo"); for (int i = 0; i < photoElements.getLength(); i++) { Element photoElement = (Element) photoElements.item(i); collection.addPhoto(PhotoUtils.createPhoto(photoElement)); } } return collection; } /** * Parse the XML for a collection as returned by getTree call. * * @param collectionElement * @return */ private Collection parseTreeCollection(Element collectionElement) { Collection collection = new Collection(); parseCommonFields(collectionElement, collection); collection.setTitle(collectionElement.getAttribute("title")); collection.setDescription(collectionElement.getAttribute("description")); // Collections can contain either sets or collections (but not both) NodeList childCollectionElements = collectionElement.getElementsByTagName("collection"); for (int i = 0; i < childCollectionElements.getLength(); i++) { Element childCollectionElement = (Element) childCollectionElements.item(i); collection.addCollection(parseTreeCollection(childCollectionElement)); } NodeList childPhotosetElements = collectionElement.getElementsByTagName("set"); for (int i = 0; i < childPhotosetElements.getLength(); i++) { Element childPhotosetElement = (Element) childPhotosetElements.item(i); collection.addPhotoset(createPhotoset(childPhotosetElement)); } return collection; } /** * * @param childPhotosetElement * @return */ private Photoset createPhotoset(Element childPhotosetElement) { Photoset photoset = new Photoset(); photoset.setId(childPhotosetElement.getAttribute("id")); photoset.setTitle(childPhotosetElement.getAttribute("title")); photoset.setDescription(childPhotosetElement.getAttribute("description")); return photoset; } /** * * @param collectionElement * @param collection */ private void parseCommonFields(Element collectionElement, Collection collection) { collection.setId(collectionElement.getAttribute("id")); collection.setIconLarge(collectionElement.getAttribute("iconlarge")); collection.setIconSmall(collectionElement.getAttribute("iconsmall")); } }