package com.dongxuexidu.douban4j.service; import com.dongxuexidu.douban4j.constants.RequestUrls; import com.dongxuexidu.douban4j.constants.StatusCode; import com.dongxuexidu.douban4j.model.UnTested; import com.dongxuexidu.douban4j.model.app.DoubanException; import com.dongxuexidu.douban4j.model.common.DoubanAttributeObj; import com.dongxuexidu.douban4j.model.common.DoubanCategoryObj; import com.dongxuexidu.douban4j.model.common.DoubanWhenObj; import com.dongxuexidu.douban4j.model.common.DoubanWhereObj; import com.dongxuexidu.douban4j.model.event.DoubanEventEntryObj; import com.dongxuexidu.douban4j.model.event.DoubanEventFeedObj; import com.dongxuexidu.douban4j.model.user.DoubanUserFeedObj; import com.dongxuexidu.douban4j.utils.Converters; import com.dongxuexidu.douban4j.utils.ErrorHandler; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.logging.Logger; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; /** * * @author Zhibo Wei <uglytroll@dongxuexidu.com> */ public class DoubanEventService extends DoubanService { final static Logger logger = Logger.getLogger(DoubanEventService.class.getName()); public static enum EventType { Commonweal { @Override public String getValue() { return "commonweal"; } }, Drama { @Override public String getValue() { return "drama"; } }, Exhibition { @Override public String getValue() { return "exhibition"; } }, Film { @Override public String getValue() { return "film"; } }, Music { @Override public String getValue() { return "music"; } }, Others { @Override public String getValue() { return "others"; } }, Party { @Override public String getValue() { return "party"; } }, Salon { @Override public String getValue() { return "salon"; } }, Sports { @Override public String getValue() { return "sports"; } }, Travel { @Override public String getValue() { return "travel"; } }; public abstract String getValue(); } public DoubanEventService() { super(); } public DoubanEventService(String accessToken) { super(accessToken); } public DoubanEventEntryObj getEventById(long eventId) throws DoubanException, IOException { String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId; DoubanEventEntryObj result = this.client.getResponse(url, null, DoubanEventEntryObj.class, false); return result; } public DoubanUserFeedObj getParticipantsByEventId(long eventId) throws DoubanException, IOException { String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId + "/participants"; DoubanUserFeedObj result = this.client.getResponse(url, null, DoubanUserFeedObj.class, false); return result; } public DoubanUserFeedObj getUsersWhoWantsToBeThereByEventId(long eventId) throws DoubanException, IOException { String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId + "/wishers"; DoubanUserFeedObj result = this.client.getResponse(url, null, DoubanUserFeedObj.class, false); return result; } public DoubanEventFeedObj getAllUsersEventsByUserId(String userId) throws DoubanException, IOException { return getAllUsersEventsByUserId(userId, null, null); } public DoubanEventFeedObj getAllUsersEventsByUserId(String userId, Integer startIndex, Integer maxResult) throws DoubanException, IOException { List<NameValuePair> params = new ArrayList<NameValuePair>(); if (startIndex != null) { params.add(new BasicNameValuePair("start-index", "" + startIndex)); } if (maxResult != null) { params.add(new BasicNameValuePair("max-results", "" + maxResult)); } String url = RequestUrls.DOUBAN_USER_PREFIX + "/" + userId + "/events"; DoubanEventFeedObj events = this.client.getResponse(url, params, DoubanEventFeedObj.class, false); return events; } public DoubanEventFeedObj getAllUserInitiateEventsByUserId(String userId) throws DoubanException, IOException { return getAllUserInitiateEventsByUserId(userId, null, null); } public DoubanEventFeedObj getAllUserInitiateEventsByUserId(String userId, Integer startIndex, Integer maxResult) throws DoubanException, IOException { List<NameValuePair> params = new ArrayList<NameValuePair>(); if (startIndex != null) { params.add(new BasicNameValuePair("start-index", "" + startIndex)); } if (maxResult != null) { params.add(new BasicNameValuePair("max-results", "" + maxResult)); } String url = RequestUrls.DOUBAN_USER_PREFIX + "/" + userId + "/events/initiate"; DoubanEventFeedObj events = this.client.getResponse(url, params, DoubanEventFeedObj.class, false); return events; } public DoubanEventFeedObj getAllUserParticipateEventsByUserId(String userId) throws DoubanException, IOException { return getAllUserParticipateEventsByUserId(userId, null, null); } public DoubanEventFeedObj getAllUserParticipateEventsByUserId(String userId, Integer startIndex, Integer maxResult) throws DoubanException, IOException { List<NameValuePair> params = new ArrayList<NameValuePair>(); if (startIndex != null) { params.add(new BasicNameValuePair("start-index", "" + startIndex)); } if (maxResult != null) { params.add(new BasicNameValuePair("max-results", "" + maxResult)); } String url = RequestUrls.DOUBAN_USER_PREFIX + "/" + userId + "/events/participate"; DoubanEventFeedObj events = this.client.getResponse(url, params, DoubanEventFeedObj.class, false); return events; } public DoubanEventFeedObj getAllUserWishEventsByUserId(String userId) throws DoubanException, IOException { return getAllUserWishEventsByUserId(userId, null, null); } public DoubanEventFeedObj getAllUserWishEventsByUserId(String userId, Integer startIndex, Integer maxResult) throws DoubanException, IOException { List<NameValuePair> params = new ArrayList<NameValuePair>(); if (startIndex != null) { params.add(new BasicNameValuePair("start-index", "" + startIndex)); } if (maxResult != null) { params.add(new BasicNameValuePair("max-results", "" + maxResult)); } String url = RequestUrls.DOUBAN_USER_PREFIX + "/" + userId + "/events/wish"; DoubanEventFeedObj events = this.client.getResponse(url, params, DoubanEventFeedObj.class, false); return events; } public DoubanEventFeedObj getAllEventsByLocationId(String locationId) throws DoubanException, IOException { return getEventsByLocationId(locationId, null, null, null); } public DoubanEventFeedObj getEventsByLocationIdAndType(String locationId, EventType type) throws DoubanException, IOException { return getEventsByLocationId(locationId, null, null, type); } public DoubanEventFeedObj getEventsByLocationId(String locationId, Integer startIndex, Integer maxResult, EventType type) throws DoubanException, IOException { List<NameValuePair> params = new ArrayList<NameValuePair>(); if (startIndex != null) { params.add(new BasicNameValuePair("start-index", "" + startIndex)); } if (maxResult != null) { params.add(new BasicNameValuePair("max-results", "" + maxResult)); } if (type != null) { params.add(new BasicNameValuePair("type", type.getValue())); } String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/location/" + locationId; DoubanEventFeedObj events = this.client.getResponse(url, params, DoubanEventFeedObj.class, false); return events; } public DoubanEventFeedObj searchEvent(String keyword) throws DoubanException, IOException { return searchEvent(keyword, null, null, null); } public DoubanEventFeedObj searchEventInLocation(String keyword, String locationId) throws DoubanException, IOException { return searchEvent(keyword, null, null, locationId); } public DoubanEventFeedObj searchEvent(String keyword, Integer startIndex, Integer maxResultCount, String locationId) throws DoubanException, IOException { List<NameValuePair> params = new ArrayList<NameValuePair>(); if (keyword != null && keyword.length() > 0) { params.add(new BasicNameValuePair("q", keyword)); } else { throw ErrorHandler.missingRequiredParam(); } if (startIndex != null) { params.add(new BasicNameValuePair("start-index", startIndex.toString())); } if (maxResultCount != null) { params.add(new BasicNameValuePair("max-results", maxResultCount.toString())); } if (locationId != null && locationId.length() > 0) { params.add(new BasicNameValuePair("location", locationId)); } else { params.add(new BasicNameValuePair("location", "all")); } DoubanEventFeedObj result = this.client.getResponse(RequestUrls.DOUBAN_EVENT_PREFIX + "s", params, DoubanEventFeedObj.class, false); return result; } @UnTested public boolean updateEvent(long eventId, String title, EventType type, String content, boolean inviteOnly, boolean canInvite, Date startTime, Date endTime, String where, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); DoubanEventEntryObj entry = generateEventEntryObj(title, type, content, inviteOnly, canInvite, startTime, endTime, where); if (entry == null) { throw ErrorHandler.getCustomDoubanException(100, "Illegal event data provided"); } try { int responseCode = this.client.putResponseCodeOnly(RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId, entry, true); if (responseCode != StatusCode.HTTP_STATUS_ACCEPTED) { return false; } return true; } catch (DoubanException ex) { if (ex.getErrorCode() == ErrorHandler.HTTP_RESPONSE_ERROR_STATUS_CODE) { logger.warning(ex.getErrorMsg()); return false; } else { throw ex; } } } @UnTested public boolean postNewEvent(String title, EventType type, String content, boolean inviteOnly, boolean canInvite, Date startTime, Date endTime, String where, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); DoubanEventEntryObj entry = generateEventEntryObj(title, type, content, inviteOnly, canInvite, startTime, endTime, where); System.out.println("cat string : " + Converters.parseDoubanObjToXMLStr(entry)); if (entry == null) { throw ErrorHandler.getCustomDoubanException(100, "Illegal event data provided"); } try { int responseCode = this.client.postResponseCodeOnly(RequestUrls.DOUBAN_EVENT_PREFIX + "s", entry, true); if (responseCode != StatusCode.HTTP_STATUS_CREATED) { //System.out.println("code : " + responseCode); return false; } return true; } catch (DoubanException ex) { if (ex.getErrorCode() == ErrorHandler.HTTP_RESPONSE_ERROR_STATUS_CODE) { logger.warning(ex.getErrorMsg()); return false; } else { throw ex; } } } @UnTested public boolean deleteEvent (long eventId, String content, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); DoubanEventEntryObj entry = new DoubanEventEntryObj(); entry.setContent(content); String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId + "/delete"; try { int responseCode = this.client.postResponseCodeOnly(url, entry, true); if (responseCode != StatusCode.HTTP_STATUS_OK) { return false; } return true; } catch (DoubanException ex) { if (ex.getErrorCode() == ErrorHandler.HTTP_RESPONSE_ERROR_STATUS_CODE) { logger.warning(ex.getErrorMsg()); return false; } else { throw ex; } } } public boolean participateEvent (long eventId, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId + "/participants"; try { int responseCode = this.client.postResponseCodeOnly(url, null, true); if (responseCode != StatusCode.HTTP_STATUS_CREATED) { return false; } return true; } catch (DoubanException ex) { if (ex.getErrorCode() == ErrorHandler.HTTP_RESPONSE_ERROR_STATUS_CODE) { logger.warning(ex.getErrorMsg()); return false; } else { throw ex; } } } public boolean wantToBeInAEvent (long eventId, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId + "/wishers"; try { int responseCode = this.client.postResponseCodeOnly(url, null, true); if (responseCode != StatusCode.HTTP_STATUS_CREATED) { return false; } return true; } catch (DoubanException ex) { if (ex.getErrorCode() == ErrorHandler.HTTP_RESPONSE_ERROR_STATUS_CODE) { logger.warning(ex.getErrorMsg()); return false; } else { throw ex; } } } public boolean quitEvent (long eventId, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId + "/participants"; try { int responseCode = this.client.deleteResponse(url, true); if (responseCode != StatusCode.HTTP_STATUS_OK) { return false; } return true; } catch (DoubanException ex) { if (ex.getErrorCode() == ErrorHandler.HTTP_RESPONSE_ERROR_STATUS_CODE) { logger.warning(ex.getErrorMsg()); return false; } else { throw ex; } } } public boolean nolongInterestedInEvent (long eventId, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); String url = RequestUrls.DOUBAN_EVENT_PREFIX + "/" + eventId + "/wishers"; try { int responseCode = this.client.deleteResponse(url, true); if (responseCode != StatusCode.HTTP_STATUS_OK) { return false; } return true; } catch (DoubanException ex) { if (ex.getErrorCode() == ErrorHandler.HTTP_RESPONSE_ERROR_STATUS_CODE) { logger.warning(ex.getErrorMsg()); return false; } else { throw ex; } } } private DoubanEventEntryObj generateEventEntryObj(String title, EventType type, String content, boolean inviteOnly, boolean canInvite, Date startTime, Date endTime, String where) { DoubanEventEntryObj entry = new DoubanEventEntryObj(); if (title != null && title.length() > 0) { entry.setTitle(title); } else { return null; } if (content != null && content.length() > 0) { entry.setContent(content); } else { return null; } if (type == null) { return null; } String typeStr = "http://www.douban.com/2007#event." + type.getValue(); //<category scheme="http://www.douban.com/2007#kind" term="http://www.douban.com/2007#event.music"/> DoubanCategoryObj cat = new DoubanCategoryObj(); cat.setScheme("http://www.douban.com/2007#kind"); cat.setTerm(typeStr); entry.setCategory(cat); DoubanAttributeObj inviteOnlyAtt = new DoubanAttributeObj(); inviteOnlyAtt.setName("invite_only"); DoubanAttributeObj canInviteAtt = new DoubanAttributeObj(); canInviteAtt.setName("can_invite"); if (inviteOnly) { inviteOnlyAtt.setValue("yes"); } else { inviteOnlyAtt.setValue("no"); } if (canInvite) { canInviteAtt.setValue("yes"); } else { canInviteAtt.setValue("no"); } List<DoubanAttributeObj> atts = new ArrayList<DoubanAttributeObj>(); atts.add(canInviteAtt); atts.add(inviteOnlyAtt); entry.setAttrs(atts); if (startTime.after(endTime)) { return null; } String startTimeStr = Converters.convertDateToStringInRFC3339(startTime); String endTimeStr = Converters.convertDateToStringInRFC3339(endTime); DoubanWhenObj when = new DoubanWhenObj(); when.setStartTime(startTimeStr); when.setEndTime(endTimeStr); entry.setWhen(when); DoubanWhereObj whereObj = new DoubanWhereObj(); whereObj.setValue(where); entry.setWhere(whereObj); return entry; } }