package com.roketgamer.gravatar; import java.io.FileNotFoundException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; /** * A gravatar is a dynamic image resource that is requested from the * gravatar.com server. This class calculates the gravatar url and fetches * gravatar images. See http://en.gravatar.com/site/implement/url . * * This class is thread-safe, Gravatar objects can be shared. * * Usage example: * * <code> * Gravatar gravatar = new Gravatar(); * gravatar.setSize(50); * gravatar.setRating(GravatarRating.GENERAL_AUDIENCES); * gravatar.setDefaultImage(GravatarDefaultImage.IDENTICON); * String url = gravatar.getUrl("iHaveAn@email.com"); * byte[] jpg = gravatar.download("info@ralfebert.de"); * </code> */ public final class Gravatar { private final static int DEFAULT_SIZE = 80; private final static String GRAVATAR_URL = "http://www.gravatar.com/avatar/"; private static final GravatarRating DEFAULT_RATING = GravatarRating.GENERAL_AUDIENCES; private static final GravatarDefaultImage DEFAULT_DEFAULT_IMAGE = GravatarDefaultImage.HTTP_404; private int size = DEFAULT_SIZE; private GravatarRating rating = DEFAULT_RATING; private GravatarDefaultImage defaultImage = DEFAULT_DEFAULT_IMAGE; /** * Specify a gravatar size between 1 and 512 pixels. If you omit this, a * default size of 80 pixels is used. */ public void setSize(int sizeInPixels) { Validate.isTrue(sizeInPixels >= 1 && sizeInPixels <= 512, "sizeInPixels needs to be between 1 and 512"); this.size = sizeInPixels; } /** * Specify a rating to ban gravatar images with explicit content. */ public void setRating(GravatarRating rating) { Validate.notNull(rating, "rating"); this.rating = rating; } /** * Specify the default image to be produced if no gravatar image was found. */ public void setDefaultImage(GravatarDefaultImage defaultImage) { Validate.notNull(defaultImage, "defaultImage"); this.defaultImage = defaultImage; } /** * Returns the Gravatar URL for the given email address. */ public String getUrl(String email) { Validate.notNull(email, "email"); // hexadecimal MD5 hash of the requested user's lowercased email address // with all whitespace trimmed String emailHash = DigestUtils.md5Hex(email.toLowerCase().trim()); String params = formatUrlParameters(); return GRAVATAR_URL + emailHash + ".jpg" + params; } /** * Downloads the gravatar for the given URL using Java {@link URL} and * returns a byte array containing the gravatar jpg, returns null if no * gravatar was found. */ public byte[] download(String email) throws GravatarDownloadException { InputStream stream = null; try { URL url = new URL(getUrl(email)); stream = url.openStream(); return IOUtils.toByteArray(stream); } catch (FileNotFoundException e) { return null; } catch (Exception e) { throw new GravatarDownloadException(e); } finally { IOUtils.closeQuietly(stream); } } private String formatUrlParameters() { List<String> params = new ArrayList<String>(); if (size != DEFAULT_SIZE) params.add("s=" + size); if (rating != DEFAULT_RATING) params.add("r=" + rating.getCode()); if (defaultImage != GravatarDefaultImage.GRAVATAR_ICON) params.add("d=" + defaultImage.getCode()); if (params.isEmpty()) return ""; else return "?" + StringUtils.join(params.iterator(), "&"); } }