package com.flickr4java.flickr.activity;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.util.XMLUtilities;
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;
import java.util.regex.Pattern;
/**
* Gather activity information belonging to the calling user.
*
* @author Martin Goebel
* @version $Id: ActivityInterface.java,v 1.4 2008/01/28 23:01:45 x-mago Exp $
*/
public class ActivityInterface {
public static final String METHOD_USER_COMMENTS = "flickr.activity.userComments";
public static final String METHOD_USER_PHOTOS = "flickr.activity.userPhotos";
private final String apiKey;
private final String sharedSecret;
private final Transport transportAPI;
public ActivityInterface(String apiKey, String sharedSecret, Transport transport) {
this.apiKey = apiKey;
this.sharedSecret = sharedSecret;
this.transportAPI = transport;
}
/**
* Returns a list of recent activity on photos commented on by the calling user.<br>
* Flickr says: Do not poll this method more than once an hour.
*
* @param perPage
* @param page
* @return ItemList
* @throws FlickrException
*/
public ItemList<Item> userComments(int perPage, int page) throws FlickrException {
ItemList<Item> items = new ItemList<Item>();
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_USER_COMMENTS);
if (perPage > 0) {
parameters.put("per_page", "" + perPage);
}
if (page > 0) {
parameters.put("page", "" + page);
}
Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
Element itemList = response.getPayload();
NodeList itemElements = itemList.getElementsByTagName("item");
items.setPage(itemList.getAttribute("page"));
items.setPages(itemList.getAttribute("pages"));
items.setPerPage(itemList.getAttribute("perpage"));
items.setTotal(itemList.getAttribute("total"));
for (int i = 0; i < itemElements.getLength(); i++) {
Element itemElement = (Element) itemElements.item(i);
items.add(createItem(itemElement));
}
return items;
}
/**
* Returns a list of recent activity on photos belonging to the calling user.<br>
* Flickr says: Do not poll this method more than once an hour.
*
* @param perPage
* @param page
* @param timeframe
* @return ItemList
* @throws FlickrException
*/
public ItemList<Item> userPhotos(int perPage, int page, String timeframe) throws FlickrException {
ItemList<Item> items = new ItemList<Item>();
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_USER_PHOTOS);
if (perPage > 0) {
parameters.put("per_page", "" + perPage);
}
if (page > 0) {
parameters.put("page", "" + page);
}
if (timeframe != null) {
if (checkTimeframeArg(timeframe)) {
parameters.put("timeframe", timeframe);
} else {
throw new FlickrException("0", "Timeframe-argument to getUserPhotos() not valid");
}
}
Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
Element itemList = response.getPayload();
NodeList itemElements = itemList.getElementsByTagName("item");
items.setPage(itemList.getAttribute("page"));
items.setPages(itemList.getAttribute("pages"));
items.setPerPage(itemList.getAttribute("perpage"));
items.setTotal(itemList.getAttribute("total"));
for (int i = 0; i < itemElements.getLength(); i++) {
Element itemElement = (Element) itemElements.item(i);
items.add(createItem(itemElement));
}
return items;
}
private Item createItem(Element itemElement) {
Item item = new Item();
item.setId(itemElement.getAttribute("id"));
item.setSecret(itemElement.getAttribute("secret"));
item.setType(itemElement.getAttribute("type"));
item.setTitle(XMLUtilities.getChildValue(itemElement, "title"));
item.setFarm(itemElement.getAttribute("farm"));
item.setServer(itemElement.getAttribute("server"));
// userComments
try {
item.setComments(XMLUtilities.getIntAttribute(itemElement, "comments"));
item.setNotes(XMLUtilities.getIntAttribute(itemElement, "notes"));
} catch (Exception e) {
}
// userPhotos
try {
item.setCommentsOld(XMLUtilities.getIntAttribute(itemElement, "commentsold"));
item.setCommentsNew(XMLUtilities.getIntAttribute(itemElement, "commentsnew"));
item.setNotesOld(XMLUtilities.getIntAttribute(itemElement, "notesold"));
item.setNotesNew(XMLUtilities.getIntAttribute(itemElement, "notesnew"));
} catch (Exception e) {
}
item.setViews(XMLUtilities.getIntAttribute(itemElement, "views"));
item.setFaves(XMLUtilities.getIntAttribute(itemElement, "faves"));
item.setMore(XMLUtilities.getIntAttribute(itemElement, "more"));
try {
Element activityElement = (Element) itemElement.getElementsByTagName("activity").item(0);
List<Event> events = new ArrayList<Event>();
NodeList eventNodes = activityElement.getElementsByTagName("event");
for (int i = 0; i < eventNodes.getLength(); i++) {
Element eventElement = (Element) eventNodes.item(i);
Event event = new Event();
event.setType(eventElement.getAttribute("type"));
if (event.getType().equals("comment")) {
event.setId(eventElement.getAttribute("commentid"));
} else if (event.getType().equals("note")) {
event.setId(eventElement.getAttribute("noteid"));
} else if (event.getType().equals("fave")) {
// has no id
}
event.setUser(eventElement.getAttribute("user"));
event.setUsername(eventElement.getAttribute("username"));
event.setDateadded(eventElement.getAttribute("dateadded"));
event.setValue(XMLUtilities.getValue(eventElement));
events.add(event);
}
item.setEvents(events);
} catch (NullPointerException e) {
// nop
}
return item;
}
/**
* Checks for a valid timeframe-argument.<br>
* Expects either days, or hours. Like: 2d or 4h.
*
* @param timeframe
* @return boolean
*/
public boolean checkTimeframeArg(String timeframe) {
if (Pattern.compile("\\d*(d|h)", Pattern.CASE_INSENSITIVE).matcher(timeframe).matches()) {
return true;
} else {
return false;
}
}
}