/*
* Copyright (c) 2005 Aetrion LLC.
*/
package com.flickr4java.flickr.contacts;
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.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Interface for working with Flickr contacts.
*
* @author Anthony Eden
* @version $Id: ContactsInterface.java,v 1.18 2009/07/11 20:30:27 x-mago Exp $
*/
public class ContactsInterface {
private static final String METHOD_GET_LIST = "flickr.contacts.getList";
private static final String METHOD_GET_LIST_RECENTLY_UPLOADED = "flickr.contacts.getListRecentlyUploaded";
private static final String METHOD_GET_PUBLIC_LIST = "flickr.contacts.getPublicList";
private final String apiKey;
private final String sharedSecret;
private final Transport transportAPI;
public ContactsInterface(String apiKey, String sharedSecret, Transport transportAPI) {
this.apiKey = apiKey;
this.sharedSecret = sharedSecret;
this.transportAPI = transportAPI;
}
/**
* Get the collection of contacts for the calling user.
*
* @return The Collection of Contact objects
*/
public Collection<Contact> getList() throws FlickrException {
ContactList<Contact> contacts = new ContactList<Contact>();
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_GET_LIST);
Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
Element contactsElement = response.getPayload();
contacts.setPage(contactsElement.getAttribute("page"));
contacts.setPages(contactsElement.getAttribute("pages"));
contacts.setPerPage(contactsElement.getAttribute("perpage"));
contacts.setTotal(contactsElement.getAttribute("total"));
NodeList contactNodes = contactsElement.getElementsByTagName("contact");
for (int i = 0; i < contactNodes.getLength(); i++) {
Element contactElement = (Element) contactNodes.item(i);
Contact contact = new Contact();
contact.setId(contactElement.getAttribute("nsid"));
contact.setUsername(contactElement.getAttribute("username"));
contact.setRealName(contactElement.getAttribute("realname"));
contact.setFriend("1".equals(contactElement.getAttribute("friend")));
contact.setFamily("1".equals(contactElement.getAttribute("family")));
contact.setIgnored("1".equals(contactElement.getAttribute("ignored")));
String lPathAlias = contactElement.getAttribute("path_alias");
contact.setPathAlias(lPathAlias == null || "".equals(lPathAlias) ? null : lPathAlias);
contact.setOnline(OnlineStatus.fromType(contactElement.getAttribute("online")));
contact.setIconFarm(contactElement.getAttribute("iconfarm"));
contact.setIconServer(contactElement.getAttribute("iconserver"));
if (contact.getOnline() == OnlineStatus.AWAY) {
contactElement.normalize();
contact.setAwayMessage(XMLUtilities.getValue(contactElement));
}
contacts.add(contact);
}
return contacts;
}
/**
* Return a list of contacts for a user who have recently uploaded photos along with the total count of photos uploaded.
*
* @param lastUpload
* Limits the resultset to contacts that have uploaded photos since this date. The date should be in the form of a Unix timestamp. The default,
* and maximum, offset is (1) hour. (Optional, can be null)
* @param filter
* Limit the result set to all contacts or only those who are friends or family.<br/>
* Valid options are: <b>ff</b> -> friends and family, <b>all</b> -> all your contacts. (Optional, can be null)
*
* @return List of Contacts
* @throws FlickrException
*/
public Collection<Contact> getListRecentlyUploaded(Date lastUpload, String filter) throws FlickrException {
List<Contact> contacts = new ArrayList<Contact>();
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_GET_LIST_RECENTLY_UPLOADED);
if (lastUpload != null) {
parameters.put("date_lastupload", String.valueOf(lastUpload.getTime() / 1000L));
}
if (filter != null) {
parameters.put("filter", filter);
}
Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
Element contactsElement = response.getPayload();
NodeList contactNodes = contactsElement.getElementsByTagName("contact");
for (int i = 0; i < contactNodes.getLength(); i++) {
Element contactElement = (Element) contactNodes.item(i);
Contact contact = new Contact();
contact.setId(contactElement.getAttribute("nsid"));
contact.setUsername(contactElement.getAttribute("username"));
contact.setRealName(contactElement.getAttribute("realname"));
contact.setFriend("1".equals(contactElement.getAttribute("friend")));
contact.setFamily("1".equals(contactElement.getAttribute("family")));
contact.setIgnored("1".equals(contactElement.getAttribute("ignored")));
contact.setOnline(OnlineStatus.fromType(contactElement.getAttribute("online")));
contact.setIconFarm(contactElement.getAttribute("iconfarm"));
contact.setIconServer(contactElement.getAttribute("iconserver"));
if (contact.getOnline() == OnlineStatus.AWAY) {
contactElement.normalize();
contact.setAwayMessage(XMLUtilities.getValue(contactElement));
}
contacts.add(contact);
}
return contacts;
}
/**
* Get the collection of public contacts for the specified user ID.
*
* This method does not require authentication.
*
* @param userId
* The user ID
* @return The Collection of Contact objects
* @throws FlickrException
*/
public Collection<Contact> getPublicList(String userId) throws FlickrException {
List<Contact> contacts = new ArrayList<Contact>();
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("method", METHOD_GET_PUBLIC_LIST);
parameters.put("user_id", userId);
Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
Element contactsElement = response.getPayload();
NodeList contactNodes = contactsElement.getElementsByTagName("contact");
for (int i = 0; i < contactNodes.getLength(); i++) {
Element contactElement = (Element) contactNodes.item(i);
Contact contact = new Contact();
contact.setId(contactElement.getAttribute("nsid"));
contact.setUsername(contactElement.getAttribute("username"));
contact.setIgnored("1".equals(contactElement.getAttribute("ignored")));
contact.setOnline(OnlineStatus.fromType(contactElement.getAttribute("online")));
contact.setIconFarm(contactElement.getAttribute("iconfarm"));
contact.setIconServer(contactElement.getAttribute("iconserver"));
if (contact.getOnline() == OnlineStatus.AWAY) {
contactElement.normalize();
contact.setAwayMessage(XMLUtilities.getValue(contactElement));
}
contacts.add(contact);
}
return contacts;
}
}