View Javadoc

1   package org.varienaja.comments;
2   
3   import java.text.DateFormat;
4   import java.text.ParseException;
5   import java.text.SimpleDateFormat;
6   import java.util.Date;
7   import java.util.LinkedList;
8   import java.util.List;
9   
10  import org.apache.log4j.Logger;
11  import org.musicontroller.core.Playlist;
12  import org.varienaja.amazon.AmazonService;
13  
14  import com.amazon.webservices.AWSECommerceService.CustomerReviews;
15  import com.amazon.webservices.AWSECommerceService.EditorialReview;
16  import com.amazon.webservices.AWSECommerceService.Item;
17  
18  public class AmazonCommentService {
19  	private static final Logger log = Logger.getLogger(AmazonCommentService.class);
20  	private static final String AMAZONDATEFORMAT = "yyyy-MM-dd";
21  
22  	/**
23  	 * Queries the webservice of amazon.com for a list of Comments of a playlist.
24  	 * @param playlist The playlist
25  	 * @return A list of both (Customer)Reviews and EditorialReviews
26  	 */
27  	private List<Object> getAmazonComments(Playlist playlist) {
28  		List<Object> result = new LinkedList<Object>();
29  		AmazonService service = new AmazonService();
30  		try {
31  			for (Item item : service.searchReviews(playlist.getSongs().iterator().next().getSong().getBand().getName(),playlist.getName())) {
32  				CustomerReviews erss = item.getCustomerReviews();
33  				if (erss!=null) {
34  					com.amazon.webservices.AWSECommerceService.Review[] ers = erss.getReview();
35  					for (com.amazon.webservices.AWSECommerceService.Review er : ers) {
36  						result.add(er);
37  					}
38  				}
39  				EditorialReview[] ervs = item.getEditorialReviews();
40  				if (ervs!=null) {
41  					for (EditorialReview er : ervs) {
42  						result.add(er);
43  					}
44  				}
45  			}
46  		} catch (Exception e) {
47  			log.error("Error searching Amazon: "+e);
48  		}
49  		return result;
50  	}
51  	
52  	/**
53  	 * Queries Amazon for Editorial and Customer Comments, and returns them in the
54  	 * MusiContronner-format.
55  	 * @param playlist The playlist to get reviews for.
56  	 * @return A list of Review-objects
57  	 */
58  	public List<Comment> getComments(Playlist playlist) {
59  		List<Comment> reviews = new LinkedList<Comment>();
60  		for (Object rv : getAmazonComments(playlist)) {
61  			DateFormat df = new SimpleDateFormat(AMAZONDATEFORMAT);
62  			if (rv instanceof com.amazon.webservices.AWSECommerceService.Review) {
63  				com.amazon.webservices.AWSECommerceService.Review r = (com.amazon.webservices.AWSECommerceService.Review) rv;
64  				try {
65  					String source = "http://www.amazon.com/dp/"+r.getASIN();
66  					Comment review = new Comment(source ,r.getSummary(),df.parse(r.getDate()));
67  					
68  					CommentElement element = new CommentElement();
69  					element.setText(r.getContent());
70  					element.setType('T');
71  					review.addElement(element);
72  					reviews.add(review);
73  				} catch (ParseException e) {
74  					log.error("Error parsing date "+r.getDate()+" with format: "+AMAZONDATEFORMAT);
75  				}
76  			} else if (rv instanceof EditorialReview) {
77  				EditorialReview er = (EditorialReview) rv;
78  				Comment review = new Comment("www.amazon.com ",er.getSource(),new Date(0));
79  				
80  				CommentElement element = new CommentElement();
81  				element.setText(er.getContent());
82  				element.setType('T');
83  				review.addElement(element);
84  				reviews.add(review);
85  			}
86  		}
87  		if (reviews.size()>0) {
88  			log.debug("Downloaded "+reviews.size()+" comments from amazon.com");
89  		}
90  		return reviews;
91  	}
92  }