package com.flickr4java.flickr.groups.discuss; 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.HashMap; import java.util.Map; public class GroupDiscussInterface { /** * Group.Discuss Interface. * * @author Jonathan Willis */ public static final String METHOD_TOPICS_GET_LIST = "flickr.groups.discuss.topics.getList"; public static final String METHOD_TOPICS_GET_INFO = "flickr.groups.discuss.topics.getInfo"; public static final String METHOD_REPLIES_GET_LIST = "flickr.groups.discuss.replies.getList"; public static final String METHOD_REPLIES_GET_INFO = "flickr.groups.discuss.replies.getInfo"; private final String apiKey; private final String sharedSecret; private final Transport transportAPI; public GroupDiscussInterface(String apiKey, String sharedSecret, Transport transportAPI) { this.apiKey = apiKey; this.sharedSecret = sharedSecret; this.transportAPI = transportAPI; } /** * Get a list of topics from a group. * * @param groupId * Unique identifier of a group returns a list of topics for a given group {@link Group}. * @param perPage * Number of records per page. * @param page * Result-section. * @return A group topic list * @throws FlickrException * @see <a href="http://www.flickr.com/services/api/flickr.groups.discuss.topics.getList.html">API Documentation</a> */ public TopicList<Topic> getTopicsList(String groupId, int perPage, int page) throws FlickrException { TopicList<Topic> topicList = new TopicList<Topic>(); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_TOPICS_GET_LIST); parameters.put("group_id", groupId); 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 topicElements = response.getPayload(); topicList.setPage(topicElements.getAttribute("page")); topicList.setPages(topicElements.getAttribute("pages")); topicList.setPerPage(topicElements.getAttribute("perpage")); topicList.setTotal(topicElements.getAttribute("total")); topicList.setGroupId(topicElements.getAttribute("group_id")); topicList.setIconServer(Integer.parseInt(topicElements.getAttribute("iconserver"))); topicList.setIconFarm(Integer.parseInt(topicElements.getAttribute("iconfarm"))); topicList.setName(topicElements.getAttribute("name")); topicList.setMembers(Integer.parseInt(topicElements.getAttribute("members"))); topicList.setPrivacy(Integer.parseInt(topicElements.getAttribute("privacy"))); topicList.setLanguage(topicElements.getAttribute("lang")); topicList.setIsPoolModerated("1".equals(topicElements.getAttribute("ispoolmoderated"))); NodeList topicNodes = topicElements.getElementsByTagName("topic"); for (int i = 0; i < topicNodes.getLength(); i++) { Element element = (Element) topicNodes.item(i); topicList.add(parseTopic(element)); } return topicList; } /** * Get info for a given topic * * @param topicId * Unique identifier of a topic for a given group {@link Topic}. * @return A group topic * @throws FlickrException * @see <a href="http://www.flickr.com/services/api/flickr.groups.discuss.topics.getInfo.html">API Documentation</a> */ public Topic getTopicInfo(String topicId) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_TOPICS_GET_INFO); parameters.put("topic_id", topicId); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element topicElement = response.getPayload(); return parseTopic(topicElement); } /** * Get list of replies * * @param topicId * Unique identifier of a topic for a given group {@link Topic}. * @return A reply object * @throws FlickrException * @see <a href="http://www.flickr.com/services/api/flickr.groups.discuss.replies.getList.html">API Documentation</a> */ public ReplyObject getReplyList(String topicId, int perPage, int page) throws FlickrException { ReplyList<Reply> reply = new ReplyList<Reply>(); TopicList<Topic> topic = new TopicList<Topic>(); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_REPLIES_GET_LIST); parameters.put("topic_id", topicId); 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 replyElements = response.getPayload(); ReplyObject ro = new ReplyObject(); NodeList replyNodes = replyElements.getElementsByTagName("reply"); for (int i = 0; i < replyNodes.getLength(); i++) { Element replyNodeElement = (Element) replyNodes.item(i); // Element replyElement = XMLUtilities.getChild(replyNodeElement, "reply"); reply.add(parseReply(replyNodeElement)); ro.setReplyList(reply); } NodeList topicNodes = replyElements.getElementsByTagName("topic"); for (int i = 0; i < topicNodes.getLength(); i++) { Element replyNodeElement = (Element) replyNodes.item(i); // Element topicElement = XMLUtilities.getChild(replyNodeElement, "topic"); topic.add(parseTopic(replyNodeElement)); ro.setTopicList(topic); } return ro; } /** * Get info for a given topic reply * * @param topicId * Unique identifier of a topic for a given group {@link Topic}. * @param replyId * Unique identifier of a reply for a given topic {@link Reply}. * @return A group topic * @throws FlickrException * @see <a href="http://www.flickr.com/services/api/flickr.groups.discuss.replies.getInfo.html">API Documentation</a> */ public Reply getReplyInfo(String topicId, String replyId) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_REPLIES_GET_INFO); parameters.put("topic_id", topicId); parameters.put("reply_id", replyId); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element replyElement = response.getPayload(); return parseReply(replyElement); } private Topic parseTopic(Element tElement) { Topic topic = new Topic(); topic.setAuthorId(tElement.getAttribute("author")); topic.setAuthorname(tElement.getAttribute("authorname")); topic.setIsCanDelete("1".equals(tElement.getAttribute("can_delete"))); topic.setIsCanEdit("1".equals(tElement.getAttribute("can_edit"))); topic.setIsCanReply("1".equals(tElement.getAttribute("can_reply"))); if (!tElement.getAttribute("count_replies").equals("")) { topic.setCountReplies(Integer.parseInt(tElement.getAttribute("count_replies"))); } topic.setDatecreate(tElement.getAttribute("datecreate")); topic.setDatelastpost(tElement.getAttribute("datelastpost")); topic.setIconfarm(Integer.parseInt(tElement.getAttribute("iconfarm"))); topic.setIconserver(Integer.parseInt(tElement.getAttribute("iconserver"))); topic.setIsLocked("1".equals(tElement.getAttribute("is_locked"))); topic.setMessage(XMLUtilities.getChildValue(tElement, "message")); topic.setRole(tElement.getAttribute("role")); topic.setIsSticky("1".equals(tElement.getAttribute("is_sticky"))); topic.setSubject(tElement.getAttribute("subject")); topic.setTopicId(tElement.getAttribute("id")); topic.setIsPro("1".equals(tElement.getAttribute("is_pro"))); topic.setLastReply(tElement.getAttribute("last_reply")); return topic; } private Reply parseReply(Element rElement) { Reply reply = new Reply(); reply.setAuthorId(rElement.getAttribute("author")); reply.setAuthorname(rElement.getAttribute("authorname")); reply.setIsCanDelete("1".equals(rElement.getAttribute("can_delete"))); reply.setIsCanEdit("1".equals(rElement.getAttribute("can_edit"))); reply.setDatecreate(rElement.getAttribute("datecreate")); reply.setLastEdit(rElement.getAttribute("lastedit")); reply.setIconfarm(Integer.parseInt(rElement.getAttribute("iconfarm"))); reply.setIconserver(Integer.parseInt(rElement.getAttribute("iconserver"))); reply.setMessage(XMLUtilities.getChildValue(rElement, "message")); reply.setRole(rElement.getAttribute("role")); reply.setReplyId(rElement.getAttribute("id")); reply.setIsPro("1".equals(rElement.getAttribute("is_pro"))); return reply; } }