package com.flickr4java.flickr.photos.comments;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.photos.Photo;
import com.flickr4java.flickr.photos.PhotoList;
import com.flickr4java.flickr.photos.PhotoUtils;
import com.flickr4java.flickr.photos.PhotosInterface;
import com.flickr4java.flickr.util.StringUtilities;
import com.flickr4java.flickr.util.XMLUtilities;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Work on Comments.
*
* @author till (Till Krech) flickr:extranoise
* @version $Id: CommentsInterface.java,v 1.4 2009/07/11 20:30:27 x-mago Exp $
*/
public class CommentsInterface {
public static final String METHOD_ADD_COMMENT = "flickr.photos.comments.addComment";
public static final String METHOD_DELETE_COMMENT = "flickr.photos.comments.deleteComment";
public static final String METHOD_EDIT_COMMENT = "flickr.photos.comments.editComment";
public static final String METHOD_GET_LIST = "flickr.photos.comments.getList";
public static final String METHOD_GET_RECENT = "flickr.photos.comments.getRecentForContacts";
private final String apiKey;
private final String sharedSecret;
private final Transport transportAPI;
public CommentsInterface(String apiKey, String sharedSecret, Transport transport) {
this.apiKey = apiKey;
this.sharedSecret = sharedSecret;
this.transportAPI = transport;
}
/**
* Add comment to a photo as the currently authenticated user.
*
* This method requires authentication with 'write' permission.
*
* @param photoId
* The id of the photo to add a comment to.
* @param commentText
* Text of the comment.
* @return a unique comment id.
* @throws FlickrException
*/
public String addComment(String photoId, String commentText) throws FlickrException {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_ADD_COMMENT);
parameters.put("photo_id", photoId);
parameters.put("comment_text", commentText);
// Note: This method requires an HTTP POST request.
Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
Element commentElement = response.getPayload();
return commentElement.getAttribute("id");
}
/**
* Delete a comment as the currently authenticated user.
*
* This method requires authentication with 'write' permission.
*
* @param commentId
* The id of the comment to delete.
* @throws FlickrException
*/
public void deleteComment(String commentId) throws FlickrException {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_DELETE_COMMENT);
parameters.put("comment_id", commentId);
// Note: This method requires an HTTP POST request.
Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
// This method has no specific response - It returns an empty
// sucess response if it completes without error.
}
/**
* Edit the text of a comment as the currently authenticated user.
*
* This method requires authentication with 'write' permission.
*
* @param commentId
* The id of the comment to edit.
* @param commentText
* Update the comment to this text.
* @throws FlickrException
*/
public void editComment(String commentId, String commentText) throws FlickrException {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_EDIT_COMMENT);
parameters.put("comment_id", commentId);
parameters.put("comment_text", commentText);
// Note: This method requires an HTTP POST request.
Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
// This method has no specific response - It returns an empty
// sucess response if it completes without error.
}
/**
* Returns the comments for a photo.
*
* This method does not require authentication.
*
* @param photoId
* The id of the photo to fetch comments for.
* @return a List of {@link Comment} objects.
* @throws FlickrException
*/
public List<Comment> getList(String photoId) throws FlickrException {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_GET_LIST);
parameters.put("photo_id", photoId);
Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
List<Comment> comments = new ArrayList<Comment>();
Element commentsElement = response.getPayload();
NodeList commentNodes = commentsElement.getElementsByTagName("comment");
int n = commentNodes.getLength();
for (int i = 0; i < n; i++) {
Comment comment = new Comment();
Element commentElement = (Element) commentNodes.item(i);
comment.setId(commentElement.getAttribute("id"));
comment.setAuthor(commentElement.getAttribute("author"));
comment.setAuthorName(commentElement.getAttribute("authorname"));
comment.setPermaLink(commentElement.getAttribute("permalink"));
long unixTime = 0;
try {
unixTime = Long.parseLong(commentElement.getAttribute("datecreate"));
} catch (NumberFormatException e) {
// what shall we do?
e.printStackTrace();
}
comment.setDateCreate(new Date(unixTime * 1000L));
comment.setPermaLink(commentElement.getAttribute("permalink"));
comment.setText(XMLUtilities.getValue(commentElement));
comments.add(comment);
}
return comments;
}
/**
* <p>
* Returns the list of photos belonging to your contacts that have been commented on recently.
* </p>
*
* <p>
* There is an emphasis on the recent part with this method, which is fancy-talk for "in the last hour".
* </p>
*
* <p>
* It is not meant to be a general purpose, get all the comments ever, but rather a quick and easy way to bubble up photos that people are talking about
* ("about") now.
* </p>
*
* <p>
* It has the added bonus / side-effect of bubbling up photos a person may have missed because they were uploaded before the photo owner was made a contact
* or the business of life got in the way.
* </p>
*
* This method requires authentication with 'read' permission.
*
* @param lastComment
* Limits the resultset to photos that have been commented on since this date. The default, and maximum, offset is (1) hour. Optional, can be
* null.
* @param contactsFilter
* A list of contact NSIDs to limit the scope of the query to. Optional, can be null.
* @param extras
* A list of extra information to fetch for each returned record. Optional, can be null.
* @param perPage
* The number of photos per page.
* @param page
* The page offset.
* @return List of photos
* @throws FlickrException
*/
public PhotoList<Photo> getRecentForContacts(Date lastComment, ArrayList<String> contactsFilter, 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", PhotosInterface.METHOD_GET_NOT_IN_SET);
if (lastComment != null) {
parameters.put("last_comment", String.valueOf(lastComment.getTime() / 1000L));
}
if (extras != null && !extras.isEmpty()) {
parameters.put("extras", StringUtilities.join(extras, ","));
}
if (contactsFilter != null && !contactsFilter.isEmpty()) {
parameters.put("contacts_filter", StringUtilities.join(contactsFilter, ","));
}
if (perPage > 0) {
parameters.put("per_page", Integer.toString(perPage));
}
if (page > 0) {
parameters.put("page", Integer.toString(page));
}
Response response = transportAPI.get(transportAPI.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 photoElements = photosElement.getElementsByTagName("photo");
for (int i = 0; i < photoElements.getLength(); i++) {
Element photoElement = (Element) photoElements.item(i);
photos.add(PhotoUtils.createPhoto(photoElement));
}
return photos;
}
}