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.collection.DoubanCollectionFeedObj;
import com.dongxuexidu.douban4j.model.common.DoubanRatingObj;
import com.dongxuexidu.douban4j.model.review.DoubanReviewEntryObj;
import com.dongxuexidu.douban4j.model.review.DoubanReviewFeedObj;
import com.dongxuexidu.douban4j.model.subject.DoubanSubjectObj;
import com.dongxuexidu.douban4j.utils.ErrorHandler;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
/**
*
* @author Zhibo Wei <uglytroll@dongxuexidu.com>
*/
public class DoubanReviewService extends DoubanService {
Logger logger = Logger.getLogger(DoubanReviewService.class.getName());
public enum ReviewOrderBy {
Time {
@Override
public String getValue() {
return "time";
}
},
Score {
@Override
public String getValue() {
return "score";
}
};
public abstract String getValue();
}
public DoubanReviewService () {
super();
}
public DoubanReviewService (String accessToken) {
super(accessToken);
}
public DoubanReviewEntryObj getReviewById (long reviewId) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_REVIEW_PREFIX + "/" + reviewId;
DoubanReviewEntryObj result = this.client.getResponse(url, null, DoubanReviewEntryObj.class, false);
return result;
}
public DoubanReviewFeedObj getUsersReview (String userId) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_USER_PREFIX + "/" + userId + "/reviews";
DoubanReviewFeedObj result = this.client.getResponse(url, null, DoubanReviewFeedObj.class, false);
return result;
}
/**
* Book
*/
public DoubanReviewFeedObj getBookReviewsBySubjectId (long subjectId) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_BOOK_SUBJECT_PREFIX + "/" + subjectId + "/reviews";
return getReviewList(url, null, null, null);
}
public DoubanReviewFeedObj getBookReviewsBySubjectId (long subjectId, int startIndex, int maxResult, ReviewOrderBy orderBy) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_BOOK_SUBJECT_PREFIX + "/" + subjectId + "/reviews";
return getReviewList(url, startIndex, maxResult, orderBy);
}
public DoubanReviewFeedObj getBookReviewsByISBNId (String isbnId) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_BOOK_SUBJECT_PREFIX + "/isbn/" + isbnId + "/reviews";
return getReviewList(url, null, null, null);
}
public DoubanReviewFeedObj getBookReviewsByISBNId (String isbnId, int startIndex, int maxResult, ReviewOrderBy orderBy) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_BOOK_SUBJECT_PREFIX + "/isbn/" + isbnId + "/reviews";
return getReviewList(url, startIndex, maxResult, orderBy);
}
/**
* Movie
*/
public DoubanReviewFeedObj getMovieReviewsBySubjectId (long subjectId) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_MOVIE_SUBJECT_PREFIX + "/" + subjectId + "/reviews";
return getReviewList(url, null, null, null);
}
public DoubanReviewFeedObj getMovieReviewsBySubjectId (long subjectId, int startIndex, int maxResult, ReviewOrderBy orderBy) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_MOVIE_SUBJECT_PREFIX + "/" + subjectId + "/reviews";
return getReviewList(url, startIndex, maxResult, orderBy);
}
public DoubanReviewFeedObj getMovieReviewsByIMDBId (String imdbId) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_MOVIE_SUBJECT_PREFIX + "/imdb/" + imdbId + "/reviews";
return getReviewList(url, null, null, null);
}
public DoubanReviewFeedObj getMovieReviewsByIMDBId (String imdbId, int startIndex, int maxResult, ReviewOrderBy orderBy) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_MOVIE_SUBJECT_PREFIX + "/imdb/" + imdbId + "/reviews";
return getReviewList(url, startIndex, maxResult, orderBy);
}
/**
* Music
*/
public DoubanReviewFeedObj getMusicReviewsBySubjectId (long subjectId) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_MUSIC_SUBJECT_PREFIX + "/" + subjectId + "/reviews";
return getReviewList(url, null, null, null);
}
public DoubanReviewFeedObj getMusicReviewsBySubjectId (long subjectId, int startIndex, int maxResult, ReviewOrderBy orderBy) throws DoubanException, IOException {
String url = RequestUrls.DOUBAN_MUSIC_SUBJECT_PREFIX + "/" + subjectId + "/reviews";
return getReviewList(url, startIndex, maxResult, orderBy);
}
private DoubanReviewFeedObj getReviewList (String url, Integer startIndex, Integer maxResult, ReviewOrderBy orderBy) throws DoubanException, IOException {
List<NameValuePair> params = new ArrayList<NameValuePair>();
if (startIndex != null) {
params.add(new BasicNameValuePair("start-index", startIndex.toString()));
}
if (maxResult != null) {
params.add(new BasicNameValuePair("max-results", maxResult.toString()));
}
if (orderBy != null) {
params.add(new BasicNameValuePair("orderby", orderBy.getValue()));
}
DoubanReviewFeedObj result = this.client.getResponse(url, params, DoubanReviewFeedObj.class, false);
return result;
}
public boolean addNewReview (long subjectId, String content, int rating, String title, String accessToken) throws DoubanException, IOException {
setAccessToken(accessToken);
DoubanReviewEntryObj obj = generateReviewObj(subjectId, content, rating, title, null);
if (obj == null) {
throw ErrorHandler.getCustomDoubanException(100, "Review data is not correct, please double check");
}
try {
int responseCode = this.client.postResponseCodeOnly(RequestUrls.DOUBAN_REVIEW_PREFIX + "s", obj, 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 updateReview (long reviewId, long subjectId, String content, String title, int rating, String accessToken) throws DoubanException, IOException {
setAccessToken(accessToken);
DoubanReviewEntryObj obj = generateReviewObj(subjectId, content, rating, title, reviewId);
if (obj == null) {
throw ErrorHandler.getCustomDoubanException(100, "Review data is not correct, please double check");
}
try {
int responseCode = this.client.putResponseCodeOnly(RequestUrls.DOUBAN_REVIEW_PREFIX + "/" + reviewId, obj, 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;
}
}
}
public boolean deleteReview (long reviewId, String accessToken) throws DoubanException, IOException {
setAccessToken(accessToken);
try {
int responseCode = this.client.deleteResponse(RequestUrls.DOUBAN_REVIEW_PREFIX + "/" + reviewId, 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 DoubanReviewEntryObj generateReviewObj (long subjectId, String content, int rating, String title, Long reviewUrl) {
DoubanReviewEntryObj obj = new DoubanReviewEntryObj();
if (reviewUrl != null) {
obj.setId(RequestUrls.DOUBAN_REVIEW_PREFIX + "/" + reviewUrl);
}
DoubanSubjectObj sub = new DoubanSubjectObj();
sub.setId("" + subjectId);
obj.setSubject(sub);
if (content != null && content.length() > 0) {
obj.setContent(content);
} else {
obj.setContent("");
}
if (title != null && title.length() > 0) {
obj.setTitle(title);
} else {
obj.setTitle("");
}
DoubanRatingObj rat = new DoubanRatingObj();
if (rating > 5) {
rating = 5;
} else if (rating < 1) {
rating = 1;
}
rat.setValue(rating);
obj.setRating(rat);
return obj;
}
}