View Javadoc

1   package com.melloware.jukes.ws;
2   
3   import java.awt.Image;
4   import java.util.ArrayList;
5   import java.util.Collection;
6   
7   import org.apache.commons.lang.StringUtils;
8   import org.apache.commons.lang.builder.EqualsBuilder;
9   import org.apache.commons.lang.builder.HashCodeBuilder;
10  import org.apache.commons.lang.builder.ToStringBuilder;
11  import org.apache.commons.lang.builder.ToStringStyle;
12  import org.w3c.dom.Node;
13  import org.w3c.dom.NodeList;
14  
15  import com.melloware.jukes.file.image.ImageFactory;
16  
17  /**
18   * Wrapper class for an Amazon Product to mask the complexity from the user and
19   * provide easy accessor methods to the data contained within.
20   * <p>
21   * Copyright (c) 1999-2007 Melloware, Inc. <http://www.melloware.com>
22   * @author Emil A. Lefkof III <info@melloware.com>
23   * @version 4.0 AZ Development 2010
24   */
25  @SuppressWarnings("unchecked")
26  public final class AmazonItem {
27  
28     private final Collection tracks = new ArrayList();
29     private Image largeImage = null;
30     private Image mediumImage = null;
31     private Image smallImage = null;
32     private String disc = null;
33     private String artist = null;
34     private String itemId = null;
35     private String largeImageUrl = null;
36     private String mediumImageUrl = null;
37     private String releaseDate = null;
38     private String releaseYear = null;
39     private String smallImageUrl = null;
40     private int bestImageWidth = 0;
41     private int bestImageHeight = 0;
42  
43     /**
44      * Default constructor based on Amazon search result.
45      */
46     public AmazonItem(Node aAmazonItem) {
47        super();
48        initialize(aAmazonItem);
49     }
50  
51     /**
52      * Gets the disc.
53      * <p>
54      * @return Returns the disc.
55      */
56     public String getDisc() {
57        return this.disc;
58     }
59  
60     /**
61      * Gets the artist.
62      * <p>
63      * @return Returns the artist.
64      */
65     public String getArtist() {
66        return this.artist;
67     }
68  
69     /**
70      * Gets the itemId.
71      * <p>
72      * @return Returns the itemId.
73      */
74     public String getItemId() {
75        return this.itemId;
76     }
77  
78     /**
79      * Tries first large, then medium, then small
80      * <p>
81      * @return Returns the best fit url
82      */
83     public String getBestImageUrl() {
84        if (StringUtils.isNotBlank(this.largeImageUrl)) {
85           return this.largeImageUrl;
86        } else if (StringUtils.isNotBlank(this.mediumImageUrl)) {
87           return this.mediumImageUrl;
88        } else if (StringUtils.isNotBlank(this.smallImageUrl)) {
89           return this.smallImageUrl;
90        } else {
91           return "";
92        }
93     }
94  
95     /**
96      * Tries first large, then medium, then small
97      * <p>
98      * @return Returns the best fit image
99      */
100    public Image getBestImage() {
101       if (StringUtils.isNotBlank(this.largeImageUrl)) {
102          return getLargeImage();
103       } else if (StringUtils.isNotBlank(this.mediumImageUrl)) {
104          return getMediumImage();
105       } else if (StringUtils.isNotBlank(this.smallImageUrl)) {
106          return getSmallImage();
107       } else {
108          return null;
109       }
110    }
111 
112    /**
113     * Tries first small, then medium, then large
114     * <p>
115     * @return Returns the best fit image
116     */
117    public Image getSmallestImage() {
118       if (StringUtils.isNotBlank(this.smallImageUrl)) {
119          return getSmallImage();
120       } else if (StringUtils.isNotBlank(this.mediumImageUrl)) {
121          return getMediumImage();
122       } else if (StringUtils.isNotBlank(this.largeImageUrl)) {
123          return getLargeImage();
124       } else {
125          return null;
126       }
127    }
128 
129    /**
130     * Gets the largeImage.
131     * <p>
132     * @return Returns the largeImage.
133     */
134    public Image getLargeImage() {
135       if ((this.largeImage == null) && (this.largeImageUrl != null)) {
136          this.largeImage = ImageFactory.getImageFromUrl(this.largeImageUrl);
137       }
138       return this.largeImage;
139    }
140 
141    /**
142     * Gets the largeImageUrl.
143     * <p>
144     * @return Returns the largeImageUrl.
145     */
146    public String getLargeImageUrl() {
147       return this.largeImageUrl;
148    }
149 
150    /**
151     * Gets the mediumImage.
152     * <p>
153     * @return Returns the mediumImage.
154     */
155    public Image getMediumImage() {
156       if ((this.mediumImage == null) && (this.mediumImageUrl != null)) {
157          this.mediumImage = ImageFactory.getImageFromUrl(this.mediumImageUrl);
158       }
159       return this.mediumImage;
160    }
161 
162    /**
163     * Gets the mediumImageUrl.
164     * <p>
165     * @return Returns the mediumImageUrl.
166     */
167    public String getMediumImageUrl() {
168       return this.mediumImageUrl;
169    }
170 
171    /**
172     * Gets the releaseDate.
173     * <p>
174     * @return Returns the releaseDate.
175     */
176    public String getReleaseDate() {
177       return this.releaseDate;
178    }
179 
180    /**
181     * Gets the releaseYear.
182     * <p>
183     * @return Returns the releaseYear.
184     */
185    public String getReleaseYear() {
186       if ((this.releaseYear == null) && (this.releaseDate != null) && (this.releaseDate.length() > 4)) {
187          this.releaseYear = this.releaseDate.substring(0, 4);
188       }
189       return this.releaseYear;
190    }
191 
192    /**
193     * Gets the smallImage.
194     * <p>
195     * @return Returns the smallImage.
196     */
197    public Image getSmallImage() {
198       if ((this.smallImage == null) && (this.smallImageUrl != null)) {
199          this.smallImage = ImageFactory.getImageFromUrl(this.smallImageUrl);
200       }
201       return this.smallImage;
202    }
203 
204    /**
205     * Gets the smallImageUrl.
206     * <p>
207     * @return Returns the smallImageUrl.
208     */
209    public String getSmallImageUrl() {
210       return this.smallImageUrl;
211    }
212 
213    /**
214     * Gets the tracks.
215     * <p>
216     * @return Returns the tracks.
217     */
218    public Collection getTracks() {
219       return this.tracks;
220    }
221 
222    /**
223     * Default Equals method.
224     */
225    @Override
226    public boolean equals(Object obj) {
227       if (!(obj instanceof AmazonItem)) {
228          return false;
229       }
230       if (this == obj) {
231          return true;
232       }
233       AmazonItem rhs = (AmazonItem) obj;
234       EqualsBuilder builder = new EqualsBuilder();
235       builder.append(artist, rhs.artist);
236       builder.append(disc, rhs.disc);
237       builder.append(itemId, rhs.itemId);
238 
239       return builder.isEquals();
240    }
241 
242    /**
243     * Default hashcode method.
244     */
245    @Override
246    public int hashCode() {
247       return new HashCodeBuilder(17, 37).append(artist).append(disc).append(releaseDate).toHashCode();
248    }
249 
250    /**
251     * Default toString() method.
252     */
253    @Override
254    public String toString() {
255       ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE);
256       builder.append("artist", artist);
257       builder.append("disc", disc);
258       builder.append("itemId", itemId);
259       builder.append("smallImageUrl", smallImageUrl);
260       builder.append("mediumImageUrl", mediumImageUrl);
261       builder.append("largeImageUrl", largeImageUrl);
262       builder.append("releaseDate", releaseDate);
263 
264       return builder.toString();
265    }
266 
267    /**
268     * Initialize all the fields of this object from the Amazon Item.
269     */
270    private void initialize(Node aAmazonItem) {
271       final Node amazonItem = aAmazonItem;
272       if (amazonItem == null) {
273          throw new IllegalArgumentException("Amazon Item is null.");
274       }
275 
276       NodeList nodeList = amazonItem.getChildNodes();
277       if (nodeList.getLength() != 0) {
278          for (int i = 0; i < nodeList.getLength(); i = i + 1) {
279             Node n = nodeList.item(i);
280             if (n.getNodeName().equalsIgnoreCase("ASIN")) {
281                setItemId(n);
282             }
283             if (n.getNodeName().equalsIgnoreCase("SmallImage")) {
284                setSmallImage(n);
285             }
286             if (n.getNodeName().equalsIgnoreCase("MediumImage")) {
287                setMediumImage(n);
288             }
289             if (n.getNodeName().equalsIgnoreCase("LargeImage")) {
290                setLargeImage(n);
291             }
292             if (n.getNodeName().equalsIgnoreCase("ItemAttributes")) {
293                NodeList attributesList = n.getChildNodes();
294                if (attributesList.getLength() != 0) {
295                   for (int ii = 0; ii < attributesList.getLength(); ii = ii + 1) {
296                      Node attributeNode = attributesList.item(ii);
297                      if (attributeNode.getNodeName().equalsIgnoreCase("ARTIST")) {
298                         setArtist(attributeNode);
299                      }
300                      if (attributeNode.getNodeName().equalsIgnoreCase("TITLE")) {
301                         setTitle(attributeNode);
302                      }
303                      if (attributeNode.getNodeName().equalsIgnoreCase("RELEASEDATE")) {
304                         setReleaseDate(attributeNode);
305                      }
306                      if (attributeNode.getNodeName().equalsIgnoreCase("ORIGINALRELEASEDATE")) {
307                         setOriginalReleaseDate(attributeNode);
308                      }
309                   }
310                }
311             }
312 
313             if (n.getNodeName().equalsIgnoreCase("Tracks")) {
314                NodeList discsList = n.getChildNodes();
315                if (discsList.getLength() != 0) {
316                   for (int ij = 0; ij < discsList.getLength(); ij = ij + 1) { // loop
317                      // for
318                      // discs
319                      Node discNode = discsList.item(ij);
320                      if (discNode.getNodeName().equalsIgnoreCase("Disc")) {
321                         NodeList tracksList = discNode.getChildNodes();
322                         if (tracksList.getLength() != 0) {
323                            for (int iTr = 0; iTr < tracksList.getLength(); iTr = iTr + 1) { // loop
324                               // for
325                               // tracks
326                               Node trackNode = tracksList.item(iTr);
327                               if (trackNode.getNodeName().equalsIgnoreCase("Track")) {
328                                  setTrack(trackNode);
329                               }
330                            }
331                         }
332                      }
333                   }
334                }
335             }
336 
337          }
338       } else {
339          throw new IllegalArgumentException("Amazon Item is empty.");
340       }
341    }
342 
343    /**
344     * Gets the bestImageHeight.
345     * <p>
346     * @return Returns the bestImageHeight.
347     */
348    public int getBestImageHeight() {
349       return this.bestImageHeight;
350    }
351 
352    /**
353     * Gets the bestImageWidth.
354     * <p>
355     * @return Returns the bestImageWidth.
356     */
357    public int getBestImageWidth() {
358       return this.bestImageWidth;
359    }
360 
361    /**
362     * Set Item Id
363     */
364    private void setItemId(Node n) {
365       if (n.getNodeName().equalsIgnoreCase("ASIN")) {
366          this.itemId = n.getTextContent();
367       }
368    }
369 
370    /**
371     * Set Small Image
372     */
373    private void setSmallImage(Node n) {
374       if (n.getNodeName().equalsIgnoreCase("SmallImage")) {
375          final NodeList nodeList = n.getChildNodes();
376          if (nodeList.getLength() != 0) {
377             for (int i = 0; i < nodeList.getLength(); i = i + 1) {
378                Node node = nodeList.item(i);
379                if (node.getNodeName().equalsIgnoreCase("URL")) {
380                   this.smallImageUrl = node.getTextContent();
381                }
382                if (node.getNodeName().equalsIgnoreCase("Height")) {
383                   this.bestImageHeight = Integer.parseInt(node.getTextContent().trim());
384                }
385                if (node.getNodeName().equalsIgnoreCase("Width")) {
386                   this.bestImageWidth = Integer.parseInt(node.getTextContent().trim());
387                }
388             }
389          }
390       }
391    }
392 
393    /**
394     * Set Medium Image
395     */
396    private void setMediumImage(Node n) {
397       if (n.getNodeName().equalsIgnoreCase("MediumImage")) {
398          final NodeList nodeList = n.getChildNodes();
399          if (nodeList.getLength() != 0) {
400             for (int i = 0; i < nodeList.getLength(); i = i + 1) {
401                Node node = nodeList.item(i);
402                if (node.getNodeName().equalsIgnoreCase("URL")) {
403                   this.mediumImageUrl = node.getTextContent();
404                }
405                if (node.getNodeName().equalsIgnoreCase("Height")) {
406                   this.bestImageHeight = Integer.parseInt(node.getTextContent().trim());
407                }
408                if (node.getNodeName().equalsIgnoreCase("Width")) {
409                   this.bestImageWidth = Integer.parseInt(node.getTextContent().trim());
410                }
411             }
412          }
413       }
414    }
415 
416    /**
417     * Set Large Image
418     */
419    private void setLargeImage(Node n) {
420       if (n.getNodeName().equalsIgnoreCase("LargeImage")) {
421          final NodeList nodeList = n.getChildNodes();
422          if (nodeList.getLength() != 0) {
423             for (int i = 0; i < nodeList.getLength(); i = i + 1) {
424                Node node = nodeList.item(i);
425                if (node.getNodeName().equalsIgnoreCase("URL")) {
426                   this.largeImageUrl = node.getTextContent();
427                }
428                if (node.getNodeName().equalsIgnoreCase("Height")) {
429                   this.bestImageHeight = Integer.parseInt(node.getTextContent().trim());
430                }
431                if (node.getNodeName().equalsIgnoreCase("Width")) {
432                   this.bestImageWidth = Integer.parseInt(node.getTextContent().trim());
433                }
434             }
435          }
436       }
437    }
438 
439    /**
440     * Set Artist Name
441     */
442    private void setArtist(Node n) {
443       if (n.getNodeName().equalsIgnoreCase("ARTIST")) {
444          this.artist = n.getTextContent();
445       }
446    }
447 
448    /**
449     * Set Disc Title
450     */
451    private void setTitle(Node n) {
452       if (n.getNodeName().equalsIgnoreCase("TITLE")) {
453          this.disc = n.getTextContent();
454       }
455    }
456 
457    /**
458     * Set Disc Release Date from ReleaseDate node
459     */
460    private void setReleaseDate(Node n) {
461       if (n.getNodeName().equalsIgnoreCase("RELEASEDATE")) {
462          if (this.releaseDate == null) {
463             this.releaseDate = n.getTextContent();
464          }
465       }
466    }
467 
468    /**
469     * Set Disc Release Date from OriginalReleaseDate node
470     */
471    private void setOriginalReleaseDate(Node n) {
472       if (n.getNodeName().equalsIgnoreCase("ORIGINALRELEASEDATE")) {
473          if (n.getTextContent().length() > 0) {
474             this.releaseDate = n.getTextContent();
475          }
476       }
477    }
478 
479    /**
480     * Set Track Titles
481     */
482    private void setTrack(Node n) {
483       if (n.getNodeName().equalsIgnoreCase("TRACK")) {
484          final String trackName = n.getTextContent();
485          this.tracks.add(trackName);
486       }
487    }
488 
489 }