/* * Copyright (c) 2005 Aetrion LLC. */ package com.flickr4java.flickr.photos; import com.flickr4java.flickr.FlickrException; import com.flickr4java.flickr.util.StringUtilities; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * @author Anthony Eden * @version $Id: SearchParameters.java,v 1.20 2009/07/23 20:41:03 x-mago Exp $ */ public class SearchParameters { private String userId; private String groupId; private String woeId; private String media; private String contacts; private String[] tags; private String tagMode; private String text; private Date minUploadDate; private Date maxUploadDate; private Date minTakenDate; private Date maxTakenDate; private Date interestingnessDate; private String license; private Set<String> extras; private String[] bbox; private String placeId; private int accuracy = 0; private int privacyFilter = 0; private String safeSearch; private String[] machineTags; private String machineTagMode; private String latitude; private String longitude; private int radius = -1; private String radiusUnits; private boolean hasGeo = false; private boolean inGallery = false; private boolean isCommons = false; private boolean isGetty = false; public static final ThreadLocal<SimpleDateFormat> DATE_FORMATS = new ThreadLocal<SimpleDateFormat>() { @Override protected synchronized SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); } }; public static final ThreadLocal<SimpleDateFormat> MYSQL_DATE_FORMATS = new ThreadLocal<SimpleDateFormat>() { @Override protected synchronized SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }; /** order argument */ public static int DATE_POSTED_DESC = 0; /** order argument */ public static int DATE_POSTED_ASC = 1; /** order argument */ public static int DATE_TAKEN_DESC = 2; /** order argument */ public static int DATE_TAKEN_ASC = 3; /** order argument */ public static int INTERESTINGNESS_DESC = 4; /** order argument */ public static int INTERESTINGNESS_ASC = 5; /** order argument */ public static int RELEVANCE = 6; private int sort = 0; public SearchParameters() { } /** * Optional to use, if BBox is set. * <p> * Defaults to maximum value if not specified. * * @param accuracy * from 1 to 16 * @see com.flickr4java.flickr.Flickr#ACCURACY_WORLD * @see com.flickr4java.flickr.Flickr#ACCURACY_COUNTRY * @see com.flickr4java.flickr.Flickr#ACCURACY_REGION * @see com.flickr4java.flickr.Flickr#ACCURACY_CITY * @see com.flickr4java.flickr.Flickr#ACCURACY_STREET */ public void setAccuracy(int accuracy) { this.accuracy = accuracy; } public int getAccuracy() { return accuracy; } /** * @return the privacyFilter */ public int getPrivacyFilter() { return privacyFilter; } /** * @param privacyFilter * Return photos only matching a certain privacy level. * * This only applies when making an authenticated call to view photos you own. Valid values are: * <ul> * <li>1 public photos * <li>2 private photos visible to friends * <li>3 private photos visible to family * <li>4 private photos visible to friends & family * <li>5 completely private photos * </ul> */ public void setPrivacyFilter(int privacyFilter) { this.privacyFilter = privacyFilter; } public String getGroupId() { return groupId; } /** * The id of a group who's pool to search. If specified, only matching photos posted to the group's pool will be returned. * * @param groupId */ public void setGroupId(String groupId) { this.groupId = groupId; } /** * Any photo that has been geotagged. * <p> * * Geo queries require some sort of limiting agent in order to prevent the database from crying. This is basically like the check against * "parameterless searches" for queries without a geo component. * <p> * * A tag, for instance, is considered a limiting agent as are user defined min_date_taken and min_date_upload parameters &emdash; If no limiting factor is * passed flickr will return only photos added in the last 12 hours (though flickr may extend the limit in the future). * * @param hasGeo */ public void setHasGeo(boolean hasGeo) { this.hasGeo = hasGeo; } public boolean getHasGeo() { return hasGeo; } public String[] getTags() { return tags; } public void setTags(String[] tags) { this.tags = tags; } public String getTagMode() { return tagMode; } public void setTagMode(String tagMode) { this.tagMode = tagMode; } public String getText() { return text; } public void setText(String text) { this.text = text; } public Date getMinUploadDate() { return minUploadDate; } public void setMinUploadDate(Date minUploadDate) { this.minUploadDate = minUploadDate; } public Date getMaxUploadDate() { return maxUploadDate; } public void setMaxUploadDate(Date maxUploadDate) { this.maxUploadDate = maxUploadDate; } public Date getMinTakenDate() { return minTakenDate; } public void setMinTakenDate(Date minTakenDate) { this.minTakenDate = minTakenDate; } public Date getMaxTakenDate() { return maxTakenDate; } public void setMaxTakenDate(Date maxTakenDate) { this.maxTakenDate = maxTakenDate; } public String getLicense() { return license; } public void setLicense(String license) { this.license = license; } public Date getInterestingnessDate() { return interestingnessDate; } /** * Set the date, for which interesting Photos to request. * * @param intrestingnessDate */ public void setInterestingnessDate(Date intrestingnessDate) { this.interestingnessDate = intrestingnessDate; } /** * Set the machine tags, for which Photos to request. * * @param tags */ public void setMachineTags(String[] tags) { this.machineTags = tags; } public String[] getMachineTags() { return machineTags; } /** * Set the machine tags search mode to use when requesting photos * * @param tagMode */ public void setMachineTagMode(String tagMode) { this.machineTagMode = tagMode; } public String getMachineTagMode() { return machineTagMode; } /** * List of extra information to fetch for each returned record. Currently supported fields are: license, date_upload, date_taken, owner_name, icon_server, * original_format, last_update, geo, tags, machine_tags, o_dims, views, media, path_alias, url_sq, url_t, url_s, url_m, url_l, url_o * * @param extras * A set of extra-attributes * @see com.flickr4java.flickr.photos.Extras#ALL_EXTRAS * @see com.flickr4java.flickr.photos.Extras#MIN_EXTRAS */ public void setExtras(Set<String> extras) { this.extras = extras; } public Set<String> getExtras() { return extras; } /** * 4 values defining the Bounding Box of the area that will be searched. * <p> * The 4 values represent the bottom-left corner of the box and the top-right corner, minimum_longitude, minimum_latitude, maximum_longitude, * maximum_latitude. * <p> * * Longitude has a range of -180 to 180, latitude of -90 to 90. Defaults to -180, -90, 180, 90 if not specified. * <p> * * Unlike standard photo queries, geo (or bounding box) queries will only return 250 results per page. * <p> * * Geo queries require some sort of limiting agent in order to prevent the database from crying. This is basically like the check against * "parameterless searches" for queries without a geo component. * <p> * * A tag, for instance, is considered a limiting agent as are user defined min_date_taken and min_date_upload parameters. If no limiting factor is passed * flickr returns only photos added in the last 12 hours (though flickr may extend the limit in the future). * * @param minimum_longitude * @param minimum_latitude * @param maximum_longitude * @param maximum_latitude */ public void setBBox(String minimum_longitude, String minimum_latitude, String maximum_longitude, String maximum_latitude) { this.bbox = new String[] { minimum_longitude, minimum_latitude, maximum_longitude, maximum_latitude }; } public String[] getBBox() { return bbox; } /** * Optional safe search setting.<br> * Un-authed calls can only see Safe content. * * @param level * 1, 2 or 3 * @see com.flickr4java.flickr.Flickr#SAFETYLEVEL_SAFE * @see com.flickr4java.flickr.Flickr#SAFETYLEVEL_MODERATE * @see com.flickr4java.flickr.Flickr#SAFETYLEVEL_RESTRICTED */ public void setSafeSearch(String level) { this.safeSearch = level; } public String getSafeSearch() { return safeSearch; } public int getSort() { return sort; } /** * Set the sort-order. * <p> * The default is <a href="#DATE_POSTED_DESC">DATE_POSTED_DESC</a> * * @see com.flickr4java.flickr.photos.SearchParameters#DATE_POSTED_ASC * @see com.flickr4java.flickr.photos.SearchParameters#DATE_POSTED_DESC * @see com.flickr4java.flickr.photos.SearchParameters#DATE_TAKEN_ASC * @see com.flickr4java.flickr.photos.SearchParameters#DATE_TAKEN_DESC * @see com.flickr4java.flickr.photos.SearchParameters#INTERESTINGNESS_ASC * @see com.flickr4java.flickr.photos.SearchParameters#INTERESTINGNESS_DESC * @see com.flickr4java.flickr.photos.SearchParameters#RELEVANCE * @param order */ public void setSort(int order) { this.sort = order; } /** * @return A placeId * @see com.flickr4java.flickr.places.PlacesInterface#resolvePlaceId(String) */ @SuppressWarnings("javadoc") public String getPlaceId() { return placeId; } /** * PlaceId only used when bbox not set. * * Geo queries require some sort of limiting agent in order to prevent the database from crying. This is basically like the check against * "parameterless searches" for queries without a geo component. * <p> * * A tag, for instance, is considered a limiting agent as are user defined min_date_taken and min_date_upload parameters &emdash; If no limiting factor is * passed we return only photos added in the last 12 hours (though we may extend the limit in the future). * * @param placeId * @see com.flickr4java.flickr.places.PlacesInterface#resolvePlaceId(String) * @see com.flickr4java.flickr.places.Place#getPlaceId() * @see com.flickr4java.flickr.places.Location#getPlaceId() */ @SuppressWarnings("javadoc") public void setPlaceId(String placeId) { this.placeId = placeId; } public String getWoeId() { return woeId; } /** * A Where on Earth identifier to use to filter photo clusters.<br> * For example all the photos clustered by locality in the United States (WOE ID 23424977).<br> * (not used if bbox argument is present). * <p/> * * Geo queries require some sort of limiting agent in order to prevent the database from crying. This is basically like the check against * "parameterless searches" for queries without a geo component. * <p/> * * A tag, for instance, is considered a limiting agent as are user defined min_date_taken and min_date_upload parameters. If no limiting factor is passed we * return only photos added in the last 12 hours (though flickr may extend the limit in the future). * <p/> * * @param woeId * @see com.flickr4java.flickr.places.Place#getWoeId() * @see com.flickr4java.flickr.places.Location#getWoeId() */ public void setWoeId(String woeId) { this.woeId = woeId; } public String getMedia() { return media; } /** * Filter results by media type. Possible values are all (default), photos or videos. * * @param media */ public void setMedia(String media) throws FlickrException { if (media.equals("all") || media.equals("photos") || media.equals("videos")) { this.media = media; } else { throw new FlickrException("0", "Media type is not valid."); } } public String getContacts() { return contacts; } /** * Search your contacts. Valid arguments are either 'all' or 'ff' for just friends and family. * <p/> * * It requires that the "user_id" field also be set and allows you to limit queries to only photos belonging to that user's photos. As in : All my contacts * photos tagged "aaron". (Experimental) * * @param contacts */ public void setContacts(String contacts) { this.contacts = contacts; } public Map<String, Object> getAsParameters() { Map<String, Object> parameters = new HashMap<String, Object>(); String lat = getLatitude(); if (lat != null) { parameters.put("lat", lat); } String lon = getLongitude(); if (lon != null) { parameters.put("lon", lon); } int radius = getRadius(); if (radius > 0) { parameters.put("radius", Integer.toString(radius)); } String radiusUnits = getRadiusUnits(); if (radiusUnits != null) { parameters.put("radius_units", radiusUnits); } String media = getMedia(); if (media != null) { parameters.put("media", media); } String userId = getUserId(); if (userId != null) { parameters.put("user_id", userId); String contacts = getContacts(); if (contacts != null) { parameters.put("contacts", contacts); } } String groupId = getGroupId(); if (groupId != null) { parameters.put("group_id", groupId); } String[] tags = getTags(); if (tags != null) { parameters.put("tags", StringUtilities.join(tags, ",")); } String tagMode = getTagMode(); if (tagMode != null) { parameters.put("tag_mode", tagMode); } String[] mtags = getMachineTags(); if (mtags != null) { parameters.put("machine_tags", StringUtilities.join(mtags, ",")); } String mtagMode = getMachineTagMode(); if (mtagMode != null) { parameters.put("machine_tag_mode", mtagMode); } String text = getText(); if (text != null) { parameters.put("text", text); } Date minUploadDate = getMinUploadDate(); if (minUploadDate != null) { parameters.put("min_upload_date", Long.toString(minUploadDate.getTime() / 1000L)); } Date maxUploadDate = getMaxUploadDate(); if (maxUploadDate != null) { parameters.put("max_upload_date", Long.toString(maxUploadDate.getTime() / 1000L)); } Date minTakenDate = getMinTakenDate(); if (minTakenDate != null) { parameters.put("min_taken_date", ((DateFormat) MYSQL_DATE_FORMATS.get()).format(minTakenDate)); } Date maxTakenDate = getMaxTakenDate(); if (maxTakenDate != null) { parameters.put("max_taken_date", ((DateFormat) MYSQL_DATE_FORMATS.get()).format(maxTakenDate)); } String license = getLicense(); if (license != null) { parameters.put("license", license); } Date intrestingnessDate = getInterestingnessDate(); if (intrestingnessDate != null) { parameters.put("date", ((DateFormat) DATE_FORMATS.get()).format(intrestingnessDate)); } String[] bbox = getBBox(); if (bbox != null) { parameters.put("bbox", StringUtilities.join(bbox, ",")); if (accuracy > 0) { parameters.put("accuracy", Integer.toString(accuracy)); } } else { String woeId = getWoeId(); if (woeId != null) { parameters.put("woe_id", woeId); } } String safeSearch = getSafeSearch(); if (safeSearch != null) { parameters.put("safe_search", safeSearch); } boolean hasGeo = getHasGeo(); if (hasGeo) { parameters.put("has_geo", "true"); } boolean inGallery = getInGallery(); if (inGallery) { parameters.put("in_gallery", "true"); } boolean isCommons = getIsCommons(); if (isCommons) { parameters.put("is_commons", "true"); } boolean isGetty = getIsGetty(); if (isGetty) { parameters.put("is_getty", "true"); } if (privacyFilter > 0) { parameters.put("privacy_filter", Integer.toString(privacyFilter)); } if (extras != null && !extras.isEmpty()) { parameters.put("extras", StringUtilities.join(extras, ",")); } if (sort != DATE_POSTED_DESC) { String sortArg = null; if (sort == DATE_POSTED_ASC) { sortArg = "date-posted-asc"; } if (sort == DATE_TAKEN_DESC) { sortArg = "date-taken-desc"; } if (sort == DATE_TAKEN_ASC) { sortArg = "date-taken-asc"; } if (sort == INTERESTINGNESS_DESC) { sortArg = "interestingness-desc"; } if (sort == INTERESTINGNESS_ASC) { sortArg = "interestingness-asc"; } if (sort == RELEVANCE) { sortArg = "relevance"; } if (sortArg != null) { parameters.put("sort", sortArg); } } if (placeId != null && !placeId.isEmpty()) { parameters.put("place_id", placeId); } return parameters; } public void setLatitude(String lat) { latitude = lat; } public void setRadius(int r) { radius = r; } public void setLongitude(String lon) { longitude = lon; } public void setRadiusUnits(String units) { radiusUnits = units; } public String getLatitude() { return latitude; } public String getLongitude() { return longitude; } public int getRadius() { return radius; } public String getRadiusUnits() { return radiusUnits; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public void setInGallery(boolean inGallery) { this.inGallery = inGallery; } public boolean getInGallery() { return inGallery; } public void setIsCommons(boolean isCommons) { this.isCommons = isCommons; } public boolean getIsCommons() { return isCommons; } public void setIsGetty(boolean isGetty) { this.isGetty = isGetty; } public boolean getIsGetty() { return isGetty; } }