/* * Copyright (c) 2005 Aetrion LLC. */ package com.flickr4java.flickr.groups.pools; import com.flickr4java.flickr.FlickrException; import com.flickr4java.flickr.Response; import com.flickr4java.flickr.Transport; import com.flickr4java.flickr.groups.Group; import com.flickr4java.flickr.groups.GroupList; import com.flickr4java.flickr.photos.Extras; import com.flickr4java.flickr.photos.Photo; import com.flickr4java.flickr.photos.PhotoContext; import com.flickr4java.flickr.photos.PhotoList; import com.flickr4java.flickr.photos.PhotoUtils; import com.flickr4java.flickr.util.StringUtilities; import org.apache.log4j.Logger; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * @author Anthony Eden * @version $Id: PoolsInterface.java,v 1.16 2011/07/02 19:00:59 x-mago Exp $ */ public class PoolsInterface { private static Logger _log = Logger.getLogger(PoolsInterface.class); public static final String METHOD_ADD = "flickr.groups.pools.add"; public static final String METHOD_GET_CONTEXT = "flickr.groups.pools.getContext"; public static final String METHOD_GET_GROUPS = "flickr.groups.pools.getGroups"; public static final String METHOD_GET_PHOTOS = "flickr.groups.pools.getPhotos"; public static final String METHOD_REMOVE = "flickr.groups.pools.remove"; private final String apiKey; private final String sharedSecret; private final Transport transport; public PoolsInterface(String apiKey, String sharedSecret, Transport transport) { this.apiKey = apiKey; this.sharedSecret = sharedSecret; this.transport = transport; } /** * Add a photo to a group's pool. * * @param photoId * The photo ID * @param groupId * The group ID */ public void add(String photoId, String groupId) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_ADD); parameters.put("photo_id", photoId); parameters.put("group_id", groupId); Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Get the context for a photo in the group pool. * * This method does not require authentication. * * @param photoId * The photo ID * @param groupId * The group ID * @return The PhotoContext * @throws FlickrException */ public PhotoContext getContext(String photoId, String groupId) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_CONTEXT); parameters.put("photo_id", photoId); parameters.put("group_id", groupId); Response response = transport.get(transport.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Collection<Element> payload = response.getPayloadCollection(); PhotoContext photoContext = new PhotoContext(); for (Element element : payload) { String elementName = element.getTagName(); if (elementName.equals("prevphoto")) { Photo photo = new Photo(); photo.setId(element.getAttribute("id")); photoContext.setPreviousPhoto(photo); } else if (elementName.equals("nextphoto")) { Photo photo = new Photo(); photo.setId(element.getAttribute("id")); photoContext.setNextPhoto(photo); } else if (!elementName.equals("count")) { _log.warn("unsupported element name: " + elementName); } } return photoContext; } /** * Get a collection of all of the user's groups. * * @return A Collection of Group objects * @throws FlickrException */ public Collection<Group> getGroups() throws FlickrException { GroupList<Group> groups = new GroupList<Group>(); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_GROUPS); Response response = transport.get(transport.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element groupsElement = response.getPayload(); groups.setPage(groupsElement.getAttribute("page")); groups.setPages(groupsElement.getAttribute("pages")); groups.setPerPage(groupsElement.getAttribute("perpage")); groups.setTotal(groupsElement.getAttribute("total")); NodeList groupNodes = groupsElement.getElementsByTagName("group"); for (int i = 0; i < groupNodes.getLength(); i++) { Element groupElement = (Element) groupNodes.item(i); Group group = new Group(); group.setId(groupElement.getAttribute("id")); group.setName(groupElement.getAttribute("name")); group.setAdmin("1".equals(groupElement.getAttribute("admin"))); group.setPrivacy(groupElement.getAttribute("privacy")); group.setIconServer(groupElement.getAttribute("iconserver")); group.setIconFarm(groupElement.getAttribute("iconfarm")); group.setPhotoCount(groupElement.getAttribute("photos")); groups.add(group); } return groups; } /** * Get the photos for the specified group pool, optionally filtering by taf. * * This method does not require authentication. * * @see com.flickr4java.flickr.photos.Extras * @param groupId * The group ID * @param userId * The user ID (may be null) * @param tags * The optional tags (may be null) * @param extras * Set of extra-attributes to include (may be null) * @param perPage * The number of photos per page (0 to ignore) * @param page * The page offset (0 to ignore) * @return A Collection of Photo objects * @throws FlickrException */ public PhotoList<Photo> getPhotos(String groupId, String userId, String[] tags, Set<String> extras, int perPage, int page) throws FlickrException { PhotoList<Photo> photos = new PhotoList<Photo>(); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_PHOTOS); parameters.put("group_id", groupId); if (userId != null) { parameters.put("user_id", userId); } if (tags != null) { parameters.put("tags", StringUtilities.join(tags, " ")); } if (perPage > 0) { parameters.put("per_page", String.valueOf(perPage)); } if (page > 0) { parameters.put("page", String.valueOf(page)); } if (extras != null) { StringBuffer sb = new StringBuffer(); Iterator<String> it = extras.iterator(); for (int i = 0; it.hasNext(); i++) { if (i > 0) { sb.append(","); } sb.append(it.next()); } parameters.put(Extras.KEY_EXTRAS, sb.toString()); } Response response = transport.get(transport.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element photosElement = response.getPayload(); 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; } /** * Convenience/Compatibility method. * * This method does not require authentication. * * @see com.flickr4java.flickr.photos.Extras * @param groupId * The group ID * @param tags * The optional tags (may be null) * @param extras * Set of extra-attributes to include (may be null) * @param perPage * The number of photos per page (0 to ignore) * @param page * The page offset (0 to ignore) * @return A Collection of Photo objects * @throws FlickrException */ public PhotoList<Photo> getPhotos(String groupId, String[] tags, Set<String> extras, int perPage, int page) throws FlickrException { return getPhotos(groupId, null, tags, extras, perPage, page); } /** * Convenience/Compatibility method. * * This method does not require authentication. * * @see com.flickr4java.flickr.photos.Extras * @param groupId * The group ID * @param tags * The optional tags (may be null) * @param perPage * The number of photos per page (0 to ignore) * @param page * The page offset (0 to ignore) * @return A Collection of Photo objects */ public PhotoList<Photo> getPhotos(String groupId, String[] tags, int perPage, int page) throws FlickrException { return getPhotos(groupId, tags, Extras.MIN_EXTRAS, perPage, page); } /** * Remove the specified photo from the group. * * @param photoId * The photo ID * @param groupId * The group ID * @throws FlickrException */ public void remove(String photoId, String groupId) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_REMOVE); parameters.put("photo_id", photoId); parameters.put("group_id", groupId); Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } }