package com.dongxuexidu.douban4j.service; import com.dongxuexidu.douban4j.constants.StatusCode; import com.dongxuexidu.douban4j.constants.RequestUrls; import com.dongxuexidu.douban4j.model.UnTested; import com.dongxuexidu.douban4j.model.app.DoubanException; import com.dongxuexidu.douban4j.model.collection.DoubanCollectionFeedObj; import com.dongxuexidu.douban4j.model.collection.DoubanCollectionObj; import com.dongxuexidu.douban4j.model.common.DoubanAttributeObj; import com.dongxuexidu.douban4j.model.common.DoubanRatingObj; import com.dongxuexidu.douban4j.model.common.DoubanTagObj; import com.dongxuexidu.douban4j.model.subject.DoubanSubjectObj; 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 DoubanCollectionService extends DoubanService { Logger logger = Logger.getLogger(DoubanCollectionService.class.getName()); public static enum CollectionCategory { Movie { @Override public String getValue() { return "movie"; } }, Book { @Override public String getValue() { return "book"; } }, Tv { @Override public String getValue() { return "tv"; } }, Music { @Override public String getValue() { return "music"; } }; public abstract String getValue(); } public enum CollectionStatus { BookWill(CollectionCategory.Book) { @Override public String getValue() { return "wish"; } }, BookIng(CollectionCategory.Book) { @Override public String getValue() { return "reading"; } }, BookEd(CollectionCategory.Book) { @Override public String getValue() { return "read"; } }, MovieWill(CollectionCategory.Movie) { @Override public String getValue() { return "wish"; } }, MovieEd(CollectionCategory.Movie) { @Override public String getValue() { return "watched"; } }, TvWill(CollectionCategory.Tv) { @Override public String getValue() { return "wish"; } }, TvIng(CollectionCategory.Tv) { @Override public String getValue() { return "watching"; } }, TvEd(CollectionCategory.Tv) { @Override public String getValue() { return "watched"; } }, MusicWill(CollectionCategory.Music) { @Override public String getValue() { return "wish"; } }, MusicIng(CollectionCategory.Music) { @Override public String getValue() { return "listening"; } }, MusicEd(CollectionCategory.Music) { @Override public String getValue() { return "listened"; } }; CollectionCategory category; CollectionStatus(CollectionCategory category) { this.category = category; } public CollectionCategory getCategory() { return this.category; } public abstract String getValue(); } public DoubanCollectionService() { super(); } public DoubanCollectionService(String accessToken) { super(accessToken); } public DoubanCollectionObj getCollectionById(Long collectionId) throws DoubanException, IOException { //System.out.println("url : " + RequestUrls.DOUBAN_COLLECTION_PREFIX + "/" + collectionId); DoubanCollectionObj result = this.client.getResponse(RequestUrls.DOUBAN_COLLECTION_PREFIX + "/" + collectionId, null, DoubanCollectionObj.class, false); return result; } public DoubanCollectionFeedObj getUsersCollection(String userId) throws DoubanException, IOException { return getUsersCollection(userId, null, null, null, null, null, null, null); } public DoubanCollectionFeedObj getUsersCollection(String userId, CollectionCategory category, String tag, CollectionStatus status, Integer startIndex, Integer maxResult, Date startDate, Date endDate) throws DoubanException, IOException { if (category != null && status != null) { if (status.getCategory() != category) { throw ErrorHandler.getCustomDoubanException(100, "Collection category and status doesn't match"); } } if (category == null && status != null) { throw ErrorHandler.getCustomDoubanException(100, "Collection category field is needed when you specified a status"); } List<NameValuePair> params = new ArrayList<NameValuePair>(); if (userId == null || userId.isEmpty()) { throw ErrorHandler.getCustomDoubanException(100, "user id cannot be null/empty when you're trying to get his/her collection"); } String url = RequestUrls.DOUBAN_USER_PREFIX + "/" + userId + "/collection"; if (category != null) { params.add(new BasicNameValuePair("cat", category.getValue())); } if (tag != null && tag.length() > 0) { params.add(new BasicNameValuePair("tag", tag)); } if (status != null) { params.add(new BasicNameValuePair("status", status.getValue())); } if (startIndex != null) { params.add(new BasicNameValuePair("start-index", startIndex.toString())); } if (maxResult != null) { params.add(new BasicNameValuePair("max-results", maxResult.toString())); } if (startDate != null) { params.add(new BasicNameValuePair("updated-min", Converters.convertDateToStringInRFC3339(startDate))); } if (endDate != null) { params.add(new BasicNameValuePair("updated-max", Converters.convertDateToStringInRFC3339(endDate))); } DoubanCollectionFeedObj result = this.client.getResponse(url, params, DoubanCollectionFeedObj.class, false); return result; } public boolean createNewCollection(CollectionStatus status, List<String> tags, int rating, String content, long subjectId, boolean isPrivate, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); DoubanCollectionObj collection = generateCollection(null, status, tags, rating, content, subjectId, isPrivate); if (collection == null) { throw ErrorHandler.getCustomDoubanException(100, "Collection data is not correct, please double check"); } try { int responseCode = this.client.postResponseCodeOnly(RequestUrls.DOUBAN_COLLECTION_PREFIX, collection, 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; } } } private DoubanCollectionObj generateCollection (Long id, CollectionStatus status, List<String> tags, int rating, String content, Long subjectId, Boolean isPrivate) { DoubanCollectionObj col = new DoubanCollectionObj(); if (status != null) { col.setStatus(status.getValue()); } else { return null; } if (id != null) { col.setId(RequestUrls.DOUBAN_COLLECTION_PREFIX + "/" + id); } DoubanRatingObj rat = new DoubanRatingObj(); if (rating > 5) { rating = 5; } else if (rating < 1) { rating = 1; } rat.setValue(rating); col.setRating(rat); if (tags != null && !tags.isEmpty()) { List<DoubanTagObj> tagsList = new ArrayList<DoubanTagObj>(); for (String t : tags) { DoubanTagObj tag = new DoubanTagObj(); tag.setName(t); tagsList.add(tag); } col.setTags(tagsList); } if (subjectId == null) { return null; } DoubanSubjectObj sub = new DoubanSubjectObj(); sub.setId("" + subjectId); col.setSubject(sub); col.setContent(content == null ? "" : content); if (isPrivate != null && isPrivate) { List<DoubanAttributeObj> atts = new ArrayList<DoubanAttributeObj>(); DoubanAttributeObj att = new DoubanAttributeObj(); att.setName("privacy"); att.setValue("private"); atts.add(att); col.setAtt(atts); } return col; } public boolean updateCollection(Long collectionId, CollectionStatus status, List<String> tags, int rating, String content, long subjectId, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); DoubanCollectionObj collection = generateCollection(collectionId, status, tags, rating, content, subjectId, null); if (collection == null || collectionId == null) { throw ErrorHandler.getCustomDoubanException(100, "Collection data is not correct, please double check"); } try { int responseCode = this.client.putResponseCodeOnly(RequestUrls.DOUBAN_COLLECTION_PREFIX + "/" + collectionId, collection, true); if (responseCode != StatusCode.HTTP_STATUS_ACCEPTED) { //System.out.println("response 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; } } } public boolean deleteCollection(Long collectionId, String accessToken) throws DoubanException, IOException { setAccessToken(accessToken); if (collectionId == null) { throw ErrorHandler.getCustomDoubanException(100, "Collection id cannot be null"); } try { int responseCode = this.client.deleteResponse(RequestUrls.DOUBAN_COLLECTION_PREFIX + "/" + collectionId, 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; } } } }