diff --git a/Flickr4Java/.gitignore b/.gitignore
similarity index 96%
rename from Flickr4Java/.gitignore
rename to .gitignore
index 71df0227..0acb4470 100644
--- a/Flickr4Java/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+.idea
target
.gradle
build/
diff --git a/BUILDING.md b/BUILDING.md
new file mode 100644
index 00000000..9a6c422a
--- /dev/null
+++ b/BUILDING.md
@@ -0,0 +1,56 @@
+# Building and Testing Flickr4Java
+
+## Building
+
+Flickr4Java uses [Gradle](http://www.gradle.org).
+Run gradle tasks from the directory that contains the `build.gradle` file.
+
+The following tasks are available:
+
+* Clean up: `gradle clean`
+* Compile (inc examples): `gradle compileJava`
+* Compile & test: `gradle build`
+* Create docs: `gradle javadoc`
+* Create docs jar: `gradle javadocJar`
+* Create src jar: `gradle sourcesJar`
+* Generate Eclipse project files: `gradle cleanEclipse eclipse`
+* Generate Idea project files: `gradle cleanIdea idea`
+* Show dependencies (libs etc): `gradle dependencies`
+
+## Testing
+
+To test:
+
+1. Copy `src/test/resources/setup.properties.example` to `src/test/resources/setup.properties`
+2. Run `gradle compiletestjava -q` — compile all sources
+3. Run `gradle setuptests -q` — this will prompt for authorisation
+ and update the `setup.properties` file with the test user's details
+4. Run `gradle test` — can be run as `gradle -Dtest.single=NameOfTest test` to
+ run only one test (because the full suite can take quite a while)
+
+(The `-q` above just hides some of the more verbose output; it can be left out.)
+
+Most of the tests are integration tests and require hitting the actual Flickr
+API service with DELETE permissions. The safest and easiest way to do this is to
+set up a test user account with the following:
+
+1. At least one photo with a location set, in at least one album, with exactly 3 tags.
+ Add this photo's ID as `photoid` and `geo.write.photoid` in `setup.properties`.
+2. At least one collection with title and description, containing at least one album
+ (the ID of the collection should be retrieved manually via the
+ [API explorer](https://www.flickr.com/services/api/explore/flickr.collections.getTree)
+ and be added as `collectionid` in `setup.properties`).
+3. At least one comment on another user's photo.
+4. Following at least one other user.
+5. At least one favorite.
+6. Allows 'anyone' "to see your stuff on a map".
+7. A member of at least one group, whose ID is saved as `testgroupid`.
+8. A gallery, containing at least one photo.
+9. An "[own Flickr address](https://www.flickr.com/profile_url.gne)" set to `username` (see below).
+10. *[List is incomplete]*
+
+The last few keys in the `setup.properties` need to be as follows:
+
+* Set the following keys in `setup.properties` to match your test user:
+ `nsid`, `username`, `displayname`, and `email`.
+* Point `imagefile` to a test image that will be uploaded (and then deleted).
diff --git a/Flickr4Java/CHANGELOG.txt b/CHANGELOG.txt
similarity index 100%
rename from Flickr4Java/CHANGELOG.txt
rename to CHANGELOG.txt
diff --git a/CONTRIB.md b/CONTRIB.md
new file mode 100644
index 00000000..6d6f7d84
--- /dev/null
+++ b/CONTRIB.md
@@ -0,0 +1,17 @@
+## Contributors
+
+### flickrj
+
+Anthony Eden (me at anthonyeden.com)
+Martin Goebel (x-mago at gmx.de)
+Matthew Ray (matthewhray at gmail.com)
+Matthew MacKenzie (matthew.mackenzie at gmail.com)
+Till Krech (till at dasburo.com)
+
+### Flickr4Java
+#### Main contributors/owners
+Allan (https://github.com/callmeal)
+Darren Greaves (https://github.com/boncey)
+
+#### Full list
+https://github.com/callmeal/Flickr4Java/graphs/contributors
diff --git a/Flickr4Java/BUILDING.txt b/Flickr4Java/BUILDING.txt
deleted file mode 100644
index ec8c3b45..00000000
--- a/Flickr4Java/BUILDING.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-Build uses gradle (http://www.gradle.org)
-
-Clean up: gradle clean
-Compile (inc examples): gradle compileJava
-Compile & test: gradle build
-Create docs: gradle javadoc
-Create docs jar: gradle javadocJar
-Create src jar: gradle sourcesJar
-
-NOTE: Copy src/test/resources/setup.properties.example to src/test/resources/setup.properties and fill out appropriately to run the integration tests
-
-To generate Eclipse project files: gradle cleanEclipse eclipse
-To generate Idea project files: gradle cleanIdea idea
-
-To show dependencies (libs etc): gradle dependencies
-
-
diff --git a/Flickr4Java/CONTRIB.txt b/Flickr4Java/CONTRIB.txt
deleted file mode 100644
index c00d154c..00000000
--- a/Flickr4Java/CONTRIB.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Contributors:
-
-Anthony Eden (me at anthonyeden.com)
-Martin Goebel (x-mago at gmx.de)
-Matthew Ray (matthewhray at gmail.com)
-Matthew MacKenzie (matthew.mackenzie at gmail.com)
-Till Krech (till at dasburo.com)
\ No newline at end of file
diff --git a/Flickr4Java/LICENSE-apache.txt b/Flickr4Java/LICENSE-apache.txt
deleted file mode 100644
index 183b52c0..00000000
--- a/Flickr4Java/LICENSE-apache.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xerces" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, International
- * Business Machines, Inc., http://www.ibm.com. For more
- * information on the Apache Software Foundation, please see
- * .
- */
diff --git a/Flickr4Java/LICENSE.txt b/Flickr4Java/LICENSE.txt
deleted file mode 100644
index bbe3905f..00000000
--- a/Flickr4Java/LICENSE.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*--
-
- Copyright (C) 2005 Aetrion LLC.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions, and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions, and the disclaimer that follows
- these conditions in the documentation and/or other materials
- provided with the distribution.
-
- 3. The name "flickrj" must not be used to endorse or promote products
- derived from this software without prior written permission. For
- written permission, please contact me@anthonyeden.com.
-
- 4. Products derived from this software may not be called "flickrj", nor
- may "flickrj" appear in their name, without prior written permission
- from Aetrion LLC (license@aetrion.com).
-
- In addition, I request (but do not require) that you include in the
- end-user documentation provided with the redistribution and/or in the
- software itself an acknowledgement equivalent to the following:
- "This product includes software developed by Aetrion LLC."
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- For more information on flickrj, please see .
-
- */
\ No newline at end of file
diff --git a/Flickr4Java/pom.xml b/Flickr4Java/pom.xml
deleted file mode 100644
index ed530280..00000000
--- a/Flickr4Java/pom.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
- 4.0.0
-
- com.flickr4java
- flickr
- 2.6-SNAPSHOT
- jar
- flickr4java
-
-
- 1.6
- 1.2.17
- 4.11
-
-
-
-
- org.scribe
- scribe
- 1.3.5
-
-
- org.apache.axis
- axis
- 1.4
-
-
- log4j
- log4j
- ${log4jVersion}
-
-
-
- junit
- junit
- ${junitVersion}
- test
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 2.3.2
-
- ${javaVersion}
- ${javaVersion}
-
-
-
- maven-release-plugin
- 2.4.1
-
- false
- release
- true
-
-
-
-
-
-
- src/main/resources
-
- **/*
-
-
-
- true
- src/main/resources
-
-
-
-
- scm:git:https://github.com/callmeal/Flickr4Java.git
- scm:git:git@github.com:callmeal/Flickr4Java.git
- https://github.com/callmeal/Flickr4Java
- HEAD
-
-
-
- bintray-boncey-Flickr4Java-Flickr4Java
- boncey-Flickr4Java-Flickr4Java
- https://api.bintray.com/maven/boncey/Flickr4Java/Flickr4Java
-
-
-
-
- release
-
-
-
- maven-source-plugin
-
-
- attach-sources
-
- jar
-
-
-
-
-
- maven-javadoc-plugin
-
-
- attach-javadocs
-
- jar
-
-
-
-
-
-
-
-
-
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/REST.java b/Flickr4Java/src/main/java/com/flickr4java/flickr/REST.java
deleted file mode 100644
index 7266e481..00000000
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/REST.java
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
-package com.flickr4java.flickr;
-
-import com.flickr4java.flickr.auth.Auth;
-import com.flickr4java.flickr.util.Base64;
-import com.flickr4java.flickr.util.DebugInputStream;
-import com.flickr4java.flickr.util.IOUtilities;
-import com.flickr4java.flickr.util.UrlUtilities;
-
-import org.apache.log4j.Logger;
-import org.scribe.builder.ServiceBuilder;
-import org.scribe.builder.api.FlickrApi;
-import org.scribe.model.OAuthRequest;
-import org.scribe.model.Token;
-import org.scribe.model.Verb;
-import org.scribe.oauth.OAuthService;
-import org.w3c.dom.Document;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Transport implementation using the REST interface.
- *
- * @author Anthony Eden
- * @version $Id: REST.java,v 1.26 2009/07/01 22:07:08 x-mago Exp $
- */
-public class REST extends Transport {
-
- private static final Logger logger = Logger.getLogger(REST.class);
-
- public static final String PATH = "/services/rest/";
-
- private static final String CHARSET_NAME = "UTF-8";
-
- private boolean proxyAuth = false;
-
- private String proxyUser = "";
-
- private String proxyPassword = "";
-
- private final DocumentBuilder builder;
-
- private static Object mutex = new Object();
-
- private Integer connectTimeoutMs;
-
- private Integer readTimeoutMs;
-
- /**
- * Construct a new REST transport instance.
- */
- public REST() {
- setTransportType(REST);
- setHost(API_HOST);
- setPath(PATH);
- setResponseClass(RESTResponse.class);
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- try {
- builder = builderFactory.newDocumentBuilder();
- } catch (ParserConfigurationException e) {
- throw new FlickrRuntimeException(e);
- }
- }
-
- /**
- * Construct a new REST transport instance using the specified host endpoint.
- *
- * @param host
- * The host endpoint
- */
- public REST(String host) {
- this();
- setHost(host);
- }
-
- /**
- * Construct a new REST transport instance using the specified host and port endpoint.
- *
- * @param host
- * The host endpoint
- * @param port
- * The port
- */
- public REST(String host, int port) {
- this();
- setHost(host);
- setPort(port);
- }
-
- /**
- * Set a proxy for REST-requests.
- *
- * @param proxyHost
- * @param proxyPort
- */
- public void setProxy(String proxyHost, int proxyPort) {
- System.setProperty("http.proxySet", "true");
- System.setProperty("http.proxyHost", proxyHost);
- System.setProperty("http.proxyPort", "" + proxyPort);
- }
-
- /**
- * Set a proxy with authentication for REST-requests.
- *
- * @param proxyHost
- * @param proxyPort
- * @param username
- * @param password
- */
- public void setProxy(String proxyHost, int proxyPort, String username, String password) {
- setProxy(proxyHost, proxyPort);
- proxyAuth = true;
- proxyUser = username;
- proxyPassword = password;
- }
-
- /**
- * Invoke an HTTP GET request on a remote host. You must close the InputStream after you are done with.
- *
- * @param path
- * The request path
- * @param parameters
- * The parameters (collection of Parameter objects)
- * @return The Response
- */
- @Override
- public com.flickr4java.flickr.Response get(String path, Map parameters, String sharedSecret) {
-
- OAuthRequest request = new OAuthRequest(Verb.GET, API_HOST + path);
- for (Map.Entry entry : parameters.entrySet()) {
- request.addQuerystringParameter(entry.getKey(), String.valueOf(entry.getValue()));
- }
-
- if (proxyAuth) {
- request.addHeader("Proxy-Authorization", "Basic " + getProxyCredentials());
- }
-
- RequestContext requestContext = RequestContext.getRequestContext();
- Auth auth = requestContext.getAuth();
- if (auth != null){
- Token requestToken = new Token(auth.getToken(), auth.getTokenSecret());
- OAuthService service = createOAuthService(parameters, sharedSecret);
- service.signRequest(requestToken, request);
- }
-
- if (Flickr.debugRequest) {
- logger.debug("GET: " + request.getCompleteUrl());
- }
- setTimeouts(request);
- org.scribe.model.Response scribeResponse = request.send();
-
- try {
-
- com.flickr4java.flickr.Response response = null;
- synchronized (mutex) {
- String strXml = scribeResponse.getBody();
- if (Flickr.debugStream) {
- logger.debug(strXml);
- }
- Document document = builder.parse(new InputSource(new StringReader(strXml)));
- response = (com.flickr4java.flickr.Response) responseClass.newInstance();
- response.parse(document);
- }
- return response;
- } catch (IllegalAccessException e) {
- throw new FlickrRuntimeException(e);
- } catch (InstantiationException e) {
- throw new FlickrRuntimeException(e);
- } catch (SAXException e) {
- throw new FlickrRuntimeException(e);
- } catch (IOException e) {
- throw new FlickrRuntimeException(e);
- }
- }
-
- /**
- * Invoke a non OAuth HTTP GET request on a remote host.
- *
- * This is only used for the Flickr OAuth methods checkToken and getAccessToken.
- *
- * @param path
- * The request path
- * @param parameters
- * The parameters
- * @return The Response
- */
- @Override
- public Response getNonOAuth(String path, Map parameters) {
- InputStream in = null;
- try {
- URL url = UrlUtilities.buildUrl(getHost(), getPort(), path, parameters);
- if (Flickr.debugRequest) {
- logger.debug("GET: " + url);
- }
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestMethod("GET");
- if (proxyAuth) {
- conn.setRequestProperty("Proxy-Authorization", "Basic " + getProxyCredentials());
- }
- setTimeouts(conn);
- conn.connect();
-
- if (Flickr.debugStream) {
- in = new DebugInputStream(conn.getInputStream(), System.out);
- } else {
- in = conn.getInputStream();
- }
-
- Response response = null;
- synchronized (mutex) {
- Document document = builder.parse(in);
- response = (Response) responseClass.newInstance();
- response.parse(document);
- }
- return response;
- } catch (IllegalAccessException e) {
- throw new FlickrRuntimeException(e);
- } catch (InstantiationException e) {
- throw new FlickrRuntimeException(e);
- } catch (IOException e) {
- throw new FlickrRuntimeException(e);
- } catch (SAXException e) {
- throw new FlickrRuntimeException(e);
- } finally {
- IOUtilities.close(in);
- }
- }
-
- /**
- * Invoke an HTTP POST request on a remote host.
- *
- * @param path
- * The request path
- * @param parameters
- * The parameters (collection of Parameter objects)
- * @return The Response object
- */
- @Override
- public com.flickr4java.flickr.Response post(String path, Map parameters, String sharedSecret, boolean multipart) {
-
- OAuthRequest request = new OAuthRequest(Verb.POST, API_HOST + path);
-
- if (multipart) {
- buildMultipartRequest(parameters, request);
- } else {
- buildNormalPostRequest(parameters, request);
- }
-
- RequestContext requestContext = RequestContext.getRequestContext();
- Auth auth = requestContext.getAuth();
- if (auth != null){
- Token requestToken = new Token(auth.getToken(), auth.getTokenSecret());
- OAuthService service = createOAuthService(parameters, sharedSecret);
- service.signRequest(requestToken, request);
- }
-
- if (multipart) {
- // Ensure all parameters (including oauth) are added to payload so signature matches
- parameters.putAll(request.getOauthParameters());
- request.addPayload(buildMultipartBody(parameters, getMultipartBoundary()));
- }
-
- if (proxyAuth) {
- request.addHeader("Proxy-Authorization", "Basic " + getProxyCredentials());
- }
-
- if (Flickr.debugRequest) {
- logger.debug("POST: " + request.getCompleteUrl());
- }
-
- org.scribe.model.Response scribeResponse = request.send();
-
- try {
- com.flickr4java.flickr.Response response = null;
- synchronized (mutex) {
- String strXml = scribeResponse.getBody();
- if (Flickr.debugStream) {
- logger.debug(strXml);
- }
- if (strXml.startsWith("oauth_problem=")) {
- throw new FlickrRuntimeException(strXml);
- }
- Document document = builder.parse(new InputSource(new StringReader(strXml)));
- response = (com.flickr4java.flickr.Response) responseClass.newInstance();
- response.parse(document);
- }
- return response;
- } catch (IllegalAccessException e) {
- throw new FlickrRuntimeException(e);
- } catch (InstantiationException e) {
- throw new FlickrRuntimeException(e);
- } catch (SAXException e) {
- throw new FlickrRuntimeException(e);
- } catch (IOException e) {
- throw new FlickrRuntimeException(e);
- }
- }
-
- /**
- *
- * @param parameters
- * @param sharedSecret
- * @return
- */
- private OAuthService createOAuthService(Map parameters, String sharedSecret) {
- OAuthService serviceBuilder;
- if (Flickr.debugRequest) {
- serviceBuilder = new ServiceBuilder().provider(FlickrApi.class).apiKey(String.valueOf(parameters.get(Flickr.API_KEY))).apiSecret(sharedSecret)
- .debug().build();
- } else {
- serviceBuilder = new ServiceBuilder().provider(FlickrApi.class).apiKey(String.valueOf(parameters.get(Flickr.API_KEY))).apiSecret(sharedSecret)
- .build();
- }
-
- return serviceBuilder;
- }
-
- /**
- *
- * @param parameters
- * @param request
- */
- private void buildNormalPostRequest(Map parameters, OAuthRequest request) {
- for (Map.Entry entry : parameters.entrySet()) {
- request.addBodyParameter(entry.getKey(), String.valueOf(entry.getValue()));
- }
- }
-
- /**
- *
- * @param parameters
- * @param request
- */
- private void buildMultipartRequest(Map parameters, OAuthRequest request) {
- request.addHeader("Content-Type", "multipart/form-data; boundary=" + getMultipartBoundary());
- for (Map.Entry entry : parameters.entrySet()) {
- String key = entry.getKey();
- if (!key.equals("photo")) {
- request.addQuerystringParameter(key, String.valueOf(entry.getValue()));
- }
- }
- }
-
- /**
- *
- * @return
- */
- private String getMultipartBoundary() {
- return "---------------------------7d273f7a0d3";
- }
-
- public boolean isProxyAuth() {
- return proxyAuth;
- }
-
- /**
- * Generates Base64-encoded credentials from locally stored username and password.
- *
- * @return credentials
- */
- public String getProxyCredentials() {
- return new String(Base64.encode((proxyUser + ":" + proxyPassword).getBytes()));
- }
-
- private byte[] buildMultipartBody(Map parameters, String boundary) {
-
- ByteArrayOutputStream buffer = new ByteArrayOutputStream();
- try {
- buffer.write(("--" + boundary + "\r\n").getBytes(CHARSET_NAME));
- for (Entry entry : parameters.entrySet()) {
- String key = entry.getKey();
- writeParam(key, entry.getValue(), buffer, boundary);
- }
- } catch (IOException e) {
- throw new FlickrRuntimeException(e);
- }
-
- if (Flickr.debugRequest) {
- String output = new String(buffer.toByteArray());
- logger.debug("Multipart body:\n" + output);
- }
- return buffer.toByteArray();
- }
-
- private void writeParam(String name, Object value, ByteArrayOutputStream buffer, String boundary) throws IOException {
- if (value instanceof InputStream) {
- buffer.write(("Content-Disposition: form-data; name=\"" + name + "\"; filename=\"image.jpg\";\r\n").getBytes(CHARSET_NAME));
- buffer.write(("Content-Type: image/jpeg" + "\r\n\r\n").getBytes(CHARSET_NAME));
- InputStream in = (InputStream) value;
- byte[] buf = new byte[512];
-
- int res = -1;
- while ((res = in.read(buf)) != -1) {
- buffer.write(buf,0,res);
- }
- buffer.write(("\r\n" + "--" + boundary + "\r\n").getBytes(CHARSET_NAME));
- } else if (value instanceof byte[]) {
- buffer.write(("Content-Disposition: form-data; name=\"" + name + "\"; filename=\"image.jpg\";\r\n").getBytes(CHARSET_NAME));
- buffer.write(("Content-Type: image/jpeg" + "\r\n\r\n").getBytes(CHARSET_NAME));
- buffer.write((byte[]) value);
- buffer.write(("\r\n" + "--" + boundary + "\r\n").getBytes(CHARSET_NAME));
- } else {
- buffer.write(("Content-Disposition: form-data; name=\"" + name + "\"\r\n\r\n").getBytes(CHARSET_NAME));
- buffer.write(((String) value).getBytes(CHARSET_NAME));
- buffer.write(("\r\n" + "--" + boundary + "\r\n").getBytes(CHARSET_NAME));
- }
- }
-
- private void setTimeouts(HttpURLConnection conn) {
- if (connectTimeoutMs != null) {
- conn.setConnectTimeout(connectTimeoutMs);
- }
- if (readTimeoutMs != null) {
- conn.setReadTimeout(readTimeoutMs);
- }
- }
-
- private void setTimeouts(OAuthRequest request) {
- if (connectTimeoutMs != null) {
- request.setConnectTimeout(connectTimeoutMs, TimeUnit.MILLISECONDS);
- }
- if (readTimeoutMs != null) {
- request.setReadTimeout(readTimeoutMs, TimeUnit.MILLISECONDS);
- }
- }
-
- public void setConnectTimeoutMs(Integer connectTimeoutMs) {
- this.connectTimeoutMs = connectTimeoutMs;
- }
-
- public void setReadTimeoutMs(Integer readTimeoutMs) {
- this.readTimeoutMs = readTimeoutMs;
- }
-}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/SOAPResponse.java b/Flickr4Java/src/main/java/com/flickr4java/flickr/SOAPResponse.java
deleted file mode 100644
index df8af3c0..00000000
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/SOAPResponse.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.flickr4java.flickr;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.axis.message.SOAPBody;
-import org.apache.axis.message.SOAPEnvelope;
-import org.apache.axis.message.SOAPFault;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import com.flickr4java.flickr.util.XMLUtilities;
-
-/**
- * Flickr SOAP Response object.
- *
- * @author Matt Ray
- */
-public class SOAPResponse implements Response {
-
- private List payload;
-
- private String errorCode;
-
- private String errorMessage;
-
- private SOAPEnvelope envelope;
-
- public SOAPResponse(SOAPEnvelope envelope) {
- this.envelope = envelope;
- }
-
- public void parse(Document document) {
- try {
- SOAPBody body = (SOAPBody) envelope.getBody();
-
- if (Flickr.debugStream) {
- System.out.println("SOAP RESPONSE.parse");
- System.out.println(body.getAsString());
- }
-
- SOAPFault fault = (SOAPFault) body.getFault();
- if (fault != null) {
- System.err.println("FAULT: " + fault.getAsString());
- errorCode = fault.getFaultCode();
- errorMessage = fault.getFaultString();
- } else {
- for (@SuppressWarnings("unchecked")
- Iterator i = body.getChildElements(); i.hasNext();) {
- Element bodyelement = i.next();
- bodyelement.normalize();
- // TODO: Verify that the payload is always a single XML node
- payload = (List) XMLUtilities.getChildElements(bodyelement);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public String getStat() {
- return null;
- }
-
- public Element getPayload() {
- if (payload.isEmpty()) {
- throw new RuntimeException("SOAP response payload has no elements");
- }
- return payload.get(0);
- }
-
- public Collection getPayloadCollection() {
- return payload;
- }
-
- public boolean isError() {
- return errorCode != null;
- }
-
- public String getErrorCode() {
- return errorCode;
- }
-
- public String getErrorMessage() {
- return errorMessage;
- }
-
-}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/OnlineStatus.java b/Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/OnlineStatus.java
deleted file mode 100644
index b91d781e..00000000
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/OnlineStatus.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
-package com.flickr4java.flickr.contacts;
-
-import java.io.Serializable;
-
-/**
- * Class representing the various types of online statuses.
- *
- * @author Anthony Eden
- */
-public class OnlineStatus implements Serializable {
- private static final long serialVersionUID = 12L;
-
- public static final int OFFLINE_TYPE = 0;
-
- public static final int AWAY_TYPE = 1;
-
- public static final int ONLINE_TYPE = 2;
-
- public static final int UNKNOWN_TYPE = 100;
-
- public static final OnlineStatus OFFLINE = new OnlineStatus(OFFLINE_TYPE);
-
- public static final OnlineStatus AWAY = new OnlineStatus(AWAY_TYPE);
-
- public static final OnlineStatus ONLINE = new OnlineStatus(ONLINE_TYPE);
-
- public static final OnlineStatus UNKNOWN = new OnlineStatus(UNKNOWN_TYPE);
-
- private int type;
-
- private OnlineStatus(int type) {
- this.type = type;
- }
-
- /**
- * Get the int value for the online status. This method is useful in switch statements.
- *
- * @return The int value for the online status
- */
- public int getType() {
- return type;
- }
-
- /**
- * Get an OnlineStatus object for a given int value.
- *
- * @param type
- * The int value
- * @return The OnlineStatus object
- */
- public static OnlineStatus fromType(int type) {
- switch (type) {
- case OFFLINE_TYPE:
- return OFFLINE;
- case AWAY_TYPE:
- return AWAY;
- case ONLINE_TYPE:
- return ONLINE;
- case UNKNOWN_TYPE:
- return UNKNOWN;
- default:
- throw new IllegalArgumentException("Unsupported online type: " + type);
- }
- }
-
- /**
- * Get the OnlineStatus value for a given int represented as a String
- *
- * @param type
- * The int represented as a String
- * @return The OnlineStatus object
- */
- public static OnlineStatus fromType(String type) {
- if (type == null || "".equals(type)) {
- return UNKNOWN;
- } else {
- return fromType(Integer.parseInt(type));
- }
- }
-}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/photos/suggestions/SuggestionsInterface.java b/Flickr4Java/src/main/java/com/flickr4java/flickr/photos/suggestions/SuggestionsInterface.java
deleted file mode 100644
index e0f5afa1..00000000
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/photos/suggestions/SuggestionsInterface.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * @author acaplan
- */
-package com.flickr4java.flickr.photos.suggestions;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.w3c.dom.Element;
-
-import com.flickr4java.flickr.Flickr;
-import com.flickr4java.flickr.FlickrException;
-import com.flickr4java.flickr.Response;
-import com.flickr4java.flickr.Transport;
-
-/**
- * @author acaplan
- *
- */
-public class SuggestionsInterface {
-
- public static final String METHOD_APPROVE_SUGGESTION = "flickr.photos.suggestions.approveSuggestion";
-
- public static final String METHOD_REJECT_SUGGESTION = "flickr.photos.suggestions.rejectSuggestion";
-
- public static final String METHOD_REMOVE_SUGGESTION = "flickr.photos.suggestions.removeSuggestion";
-
- public static final String METHOD_SUGGEST_LOCATION = "flickr.photos.suggestions.suggestLocation";
-
- public static final String METHOD_GET_LIST = "flickr.photos.suggestions.getList";
-
- private String apiKey;
-
- private String sharedSecret;
-
- private Transport transportAPI;
-
- public SuggestionsInterface(String apiKey, String sharedSecret, Transport transportAPI) {
- this.apiKey = apiKey;
- this.sharedSecret = sharedSecret;
- this.transportAPI = transportAPI;
- }
-
- public void approveSuggestion(String suggestionId) throws FlickrException {
- act(suggestionId, METHOD_APPROVE_SUGGESTION);
- }
-
- public void rejectSuggestion(String suggestionId) throws FlickrException {
- act(suggestionId, METHOD_REJECT_SUGGESTION);
- }
-
- public void removeSuggestion(String suggestionId) throws FlickrException {
- act(suggestionId, METHOD_REMOVE_SUGGESTION);
- }
-
- private void act(String suggestionId, String method) throws FlickrException {
- Map parameters = new HashMap();
- parameters.put("method", method);
- parameters.put(Flickr.API_KEY, apiKey);
- parameters.put("suggestion_id", suggestionId);
-
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
- if (response.isError()) {
- throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
- }
- }
-
- public void suggestLocation(String photoId, double lat, double lon, int accuracy, String woe_id, String place_id, String note) throws FlickrException {
- Map parameters = new HashMap();
- parameters.put("method", METHOD_SUGGEST_LOCATION);
- parameters.put(Flickr.API_KEY, apiKey);
- parameters.put("photo_id", photoId);
- parameters.put("lat", lat);
- parameters.put("lon", lon);
- if (accuracy > 0 && accuracy <= 16) {
- parameters.put("accuracy", accuracy);
- }
- if (woe_id != null) {
- parameters.put("woe_id", woe_id);
- }
- if (place_id != null) {
- parameters.put("place_id", place_id);
- }
- if (note != null) {
- parameters.put("note", note);
- }
-
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
- if (response.isError()) {
- throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
- }
- }
-
- public List getList(String photoId, String statusId) throws FlickrException {
- Map parameters = new HashMap();
- parameters.put("method", METHOD_GET_LIST);
- parameters.put(Flickr.API_KEY, apiKey);
- parameters.put("photo_id", photoId);
- parameters.put("status_id", statusId);
-
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
- if (response.isError()) {
- throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
- }
-
- Element suggestions = response.getPayload();
-
- return null;
- }
-
-}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/uploader/Uploader.java b/Flickr4Java/src/main/java/com/flickr4java/flickr/uploader/Uploader.java
deleted file mode 100644
index b114e872..00000000
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/uploader/Uploader.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
-
-package com.flickr4java.flickr.uploader;
-
-import com.flickr4java.flickr.Flickr;
-import com.flickr4java.flickr.FlickrException;
-import com.flickr4java.flickr.FlickrRuntimeException;
-import com.flickr4java.flickr.REST;
-import com.flickr4java.flickr.Transport;
-import com.flickr4java.flickr.util.IOUtilities;
-import com.flickr4java.flickr.util.StringUtilities;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * Upload a photo.
- *
- *
- * Setting {@link com.flickr4java.flickr.uploader.UploadMetaData#setAsync(boolean)} you can switch between synchronous and asynchronous uploads.
- *
- *
- * Synchronous uploads return the photoId, whilst asynchronous uploads return a ticketId.
- *
- *
- * TicketId's can be tracked with {@link com.flickr4java.flickr.photos.upload.UploadInterface#checkTickets(Set)} for completion.
- *
- * @author Anthony Eden
- * @version $Id: Uploader.java,v 1.12 2009/12/15 20:57:49 x-mago Exp $
- */
-public class Uploader {
- /**
- *
- */
- private static final String SERVICES_REPLACE_PATH = "/services/replace/";
-
- /**
- *
- */
- private static final String SERVICES_UPLOAD_PATH = "/services/upload/";
-
- private final String apiKey;
-
- private final String sharedSecret;
-
- private final Transport transport;
-
- /**
- * Construct an Uploader.
- *
- * @param apiKey
- * The API key
- */
- public Uploader(String apiKey, String sharedSecret) {
- this.apiKey = apiKey;
- this.sharedSecret = sharedSecret;
- this.transport = new REST();
- this.transport.setResponseClass(UploaderResponse.class);
- }
-
- /**
- * Upload a photo from a byte-array.
- *
- * @param data
- * The photo data as a byte array
- * @param metaData
- * The meta data
- * @return photoId or ticketId
- * @throws FlickrException
- */
- public String upload(byte[] data, UploadMetaData metaData) throws FlickrException {
- Map parameters = setUploadParameters(metaData);
- parameters.put("photo", data);
-
- UploaderResponse response = postPhoto(parameters, SERVICES_UPLOAD_PATH);
-
- return getResponseString(metaData.isAsync(), response);
- }
-
- /**
- * Upload a photo from a File.
- *
- * @param file
- * the photo file
- * @param metaData
- * The meta data
- * @return photoId or ticketId
- * @throws FlickrException
- */
- public String upload(File file, UploadMetaData metaData) throws FlickrException {
- InputStream in = null;
-
- try {
- in = new FileInputStream(file);
- return upload(in, metaData);
- } catch (IOException e) {
- throw new FlickrRuntimeException(e);
- } finally {
- IOUtilities.close(in);
- }
- }
-
- /**
- * Upload a photo from an InputStream.
- *
- * @param in
- * @param metaData
- * @return photoId or ticketId
- * @throws FlickrException
- */
- public String upload(InputStream in, UploadMetaData metaData) throws FlickrException {
- Map parameters = setUploadParameters(metaData);
- parameters.put("photo", in);
-
- UploaderResponse response = postPhoto(parameters, SERVICES_UPLOAD_PATH);
-
- return getResponseString(metaData.isAsync(), response);
- }
-
- /**
- * Replace a photo from an InputStream.
- *
- * @param in
- * @return photoId or ticketId
- * @throws FlickrException
- */
- public String replace(InputStream in, String flickrId, boolean async) throws FlickrException {
- Map parameters = setReplaceParameters(flickrId, async);
- parameters.put("photo", in);
-
- UploaderResponse response = postPhoto(parameters, SERVICES_REPLACE_PATH);
-
- return getResponseString(async, response);
- }
-
- /**
- * Replace a photo from an InputStream.
- *
- * @param data
- * @param flickrId
- * @param async
- * @return photoId or ticketId
- * @throws FlickrException
- */
- public String replace(byte[] data, String flickrId, boolean async) throws FlickrException {
- Map parameters = setReplaceParameters(flickrId, async);
-
- parameters.put("photo", data);
-
- UploaderResponse response = postPhoto(parameters, SERVICES_REPLACE_PATH);
-
- return getResponseString(async, response);
- }
-
- /**
- * Replace a photo from a File.
- *
- * @param file
- * @param flickrId
- * @param async
- * @return photoId or ticketId
- * @throws FlickrException
- */
- public String replace(File file, String flickrId, boolean async) throws FlickrException {
- InputStream in = null;
-
- try {
- in = new FileInputStream(file);
- return replace(in, flickrId, async);
- } catch (FileNotFoundException e) {
- throw new FlickrRuntimeException(e);
- } finally {
- IOUtilities.close(in);
- }
- }
-
- /**
- * Call the post multipart end point.
- *
- * @param parameters
- * @param path
- * @return
- * @throws FlickrException
- */
- private UploaderResponse postPhoto(Map parameters, String path) throws FlickrException {
- UploaderResponse response = (UploaderResponse) transport.post(path, parameters, sharedSecret, true);
- if (response.isError()) {
- throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
- }
- return response;
- }
-
- /**
- * Get the photo or ticket id from the response.
- *
- * @param async
- * @param response
- * @return
- */
- private String getResponseString(boolean async, UploaderResponse response) {
- String id = "";
- if (async) {
- id = response.getTicketId();
- } else {
- id = response.getPhotoId();
- }
- return id;
- }
-
- /**
- *
- * @param metaData
- * @return
- */
- private Map setUploadParameters(UploadMetaData metaData) {
- Map parameters = new TreeMap();
-
- parameters.put(Flickr.API_KEY, apiKey);
-
- String title = metaData.getTitle();
- if (title != null) {
- parameters.put("title", title);
- }
-
- String description = metaData.getDescription();
- if (description != null) {
- parameters.put("description", description);
- }
-
- Collection tags = metaData.getTags();
- if (tags != null) {
- parameters.put("tags", StringUtilities.join(tags, " "));
- }
-
- if (metaData.isHidden() != null) {
- parameters.put("hidden", metaData.isHidden().booleanValue() ? "1" : "0");
- }
-
- if (metaData.getSafetyLevel() != null) {
- parameters.put("safety_level", metaData.getSafetyLevel());
- }
-
- if (metaData.getContentType() != null) {
- parameters.put("content_type", metaData.getContentType());
- }
-
- parameters.put("is_public", metaData.isPublicFlag() ? "1" : "0");
- parameters.put("is_family", metaData.isFamilyFlag() ? "1" : "0");
- parameters.put("is_friend", metaData.isFriendFlag() ? "1" : "0");
- parameters.put("async", metaData.isAsync() ? "1" : "0");
-
- return parameters;
- }
-
- /**
- *
- * @param flickrId
- * @param async
- * @return
- */
- private Map setReplaceParameters(String flickrId, boolean async) {
- Map parameters = new TreeMap();
-
- parameters.put(Flickr.API_KEY, apiKey);
- parameters.put("async", async ? "1" : "0");
- parameters.put("photo_id", flickrId);
-
- return parameters;
- }
-
- /**
- * Return the {@link REST} impl used by this instance so that properties can
- * be set on it, eg {@link REST#setConnectTimeoutMs(Integer)}. TODO: should
- * return a wrapper that only allows "safe" properties to be set.
- *
- * @return The {@link REST} transport used by this instance
- */
- public REST getTransport() {
- return (REST) transport;
- }
-}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/util/Base64.java b/Flickr4Java/src/main/java/com/flickr4java/flickr/util/Base64.java
deleted file mode 100644
index 20f40d35..00000000
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/util/Base64.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xerces" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, International
- * Business Machines, Inc., http://www.apache.org. For more
- * information on the Apache Software Foundation, please see
- * .
- */
-
-package com.flickr4java.flickr.util;
-
-/**
- * This class provides encode/decode for RFC 2045 Base64 as defined by RFC 2045, N. Freed and N. Borenstein. RFC 2045: Multipurpose Internet Mail Extensions
- * (MIME) Part One: Format of Internet Message Bodies. Reference 1996 Available at: http://www.ietf.org/rfc/rfc2045.txt This class is used by XML Schema binary
- * format validation.
- *
- *
- * This implementation does not encode/decode streaming data. You need the data that you will encode/decode already on a byte array.
- *
- *
- * This is the latest pre commons-codec version of Base64.
- *
- * @author Jeffrey Rodriguez
- * @author Sandy Gao
- * @version Base64.java,v 1.8 2001/05/29 22:19:01 neilg Exp
- */
-public final class Base64 {
- static private final int BASELENGTH = 255;
-
- static private final int LOOKUPLENGTH = 64;
-
- static private final int TWENTYFOURBITGROUP = 24;
-
- static private final int EIGHTBIT = 8;
-
- static private final int SIXTEENBIT = 16;
-
- static private final int SIXBIT = 6;
-
- static private final int FOURBYTE = 4;
-
- static private final int SIGN = -128;
-
- static private final byte PAD = (byte) '=';
-
- static private final boolean fDebug = false;
-
- static private byte[] base64Alphabet = new byte[BASELENGTH];
-
- static private byte[] lookUpBase64Alphabet = new byte[LOOKUPLENGTH];
-
- static {
-
- for (int i = 0; i < BASELENGTH; i++) {
- base64Alphabet[i] = -1;
- }
- for (int i = 'Z'; i >= 'A'; i--) {
- base64Alphabet[i] = (byte) (i - 'A');
- }
- for (int i = 'z'; i >= 'a'; i--) {
- base64Alphabet[i] = (byte) (i - 'a' + 26);
- }
-
- for (int i = '9'; i >= '0'; i--) {
- base64Alphabet[i] = (byte) (i - '0' + 52);
- }
-
- base64Alphabet['+'] = 62;
- base64Alphabet['/'] = 63;
-
- for (int i = 0; i <= 25; i++)
- lookUpBase64Alphabet[i] = (byte) ('A' + i);
-
- for (int i = 26, j = 0; i <= 51; i++, j++)
- lookUpBase64Alphabet[i] = (byte) ('a' + j);
-
- for (int i = 52, j = 0; i <= 61; i++, j++)
- lookUpBase64Alphabet[i] = (byte) ('0' + j);
- lookUpBase64Alphabet[62] = (byte) '+';
- lookUpBase64Alphabet[63] = (byte) '/';
-
- }
-
- protected static boolean isWhiteSpace(byte octect) {
- return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
- }
-
- protected static boolean isPad(byte octect) {
- return (octect == PAD);
- }
-
- protected static boolean isData(byte octect) {
- return (base64Alphabet[octect] != -1);
- }
-
- public static boolean isBase64(String isValidString) {
- if (isValidString == null)
- return false;
- return (isArrayByteBase64(isValidString.getBytes()));
- }
-
- public static boolean isBase64(byte octect) {
- return (isWhiteSpace(octect) || isPad(octect) || isData(octect));
- }
-
- /**
- * remove WhiteSpace from MIME containing encoded Base64 data. e.g. " sdffferererrereresfsdfsdfsdff\n\r iiiiiiiiierejrlkwjerklwjerwerwr==\n\r"
- *
- * @param data
- * @return stripped data
- */
- public static synchronized byte[] removeWhiteSpace(byte[] data) {
- if (data == null)
- return null;
-
- int newSize = 0;
- int len = data.length;
- int i = 0;
- for (; i < len; i++) {
- if (!isWhiteSpace(data[i]))
- newSize++;
- }
-
- if (newSize == len)
- return data;// return input array since no whiteSpace
-
- byte[] arrayWithoutSpaces = new byte[newSize];// Allocate new array without whiteSpace
-
- int j = 0;
- for (i = 0; i < len; i++) {
- if (isWhiteSpace(data[i]))
- continue;
- else
- arrayWithoutSpaces[j++] = data[i];// copy non-WhiteSpace
- }
- return arrayWithoutSpaces;
-
- }
-
- public static synchronized boolean isArrayByteBase64(byte[] arrayOctect) {
- return (getDecodedDataLength(arrayOctect) >= 0);
- }
-
- /**
- * Encodes hex octects into Base64
- *
- * @param binaryData
- * Array containing binaryData
- * @return Encoded Base64 array
- */
- public static synchronized byte[] encode(byte[] binaryData) {
- if (binaryData == null)
- return null;
-
- int lengthDataBits = binaryData.length * EIGHTBIT;
- int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
- int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
- byte encodedData[] = null;
-
- if (fewerThan24bits != 0) // data not divisible by 24 bit
- encodedData = new byte[(numberTriplets + 1) * 4];
- else
- // 16 or 8 bit
- encodedData = new byte[numberTriplets * 4];
-
- byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
-
- int encodedIndex = 0;
- int dataIndex = 0;
- int i = 0;
- if (fDebug) {
- System.out.println("number of triplets = " + numberTriplets);
- }
- for (i = 0; i < numberTriplets; i++) {
-
- dataIndex = i * 3;
- b1 = binaryData[dataIndex];
- b2 = binaryData[dataIndex + 1];
- b3 = binaryData[dataIndex + 2];
-
- if (fDebug) {
- System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);
- }
-
- l = (byte) (b2 & 0x0f);
- k = (byte) (b1 & 0x03);
-
- encodedIndex = i * 4;
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
-
- byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
- byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
-
- encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
- if (fDebug) {
- System.out.println("val2 = " + val2);
- System.out.println("k4 = " + (k << 4));
- System.out.println("vak = " + (val2 | (k << 4)));
- }
-
- encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | (k << 4)];
- encodedData[encodedIndex + 2] = lookUpBase64Alphabet[(l << 2) | val3];
- encodedData[encodedIndex + 3] = lookUpBase64Alphabet[b3 & 0x3f];
- }
-
- // form integral number of 6-bit groups
- dataIndex = i * 3;
- encodedIndex = i * 4;
- if (fewerThan24bits == EIGHTBIT) {
- b1 = binaryData[dataIndex];
- k = (byte) (b1 & 0x03);
- if (fDebug) {
- System.out.println("b1=" + b1);
- System.out.println("b1<<2 = " + (b1 >> 2));
- }
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
- encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
- encodedData[encodedIndex + 1] = lookUpBase64Alphabet[k << 4];
- encodedData[encodedIndex + 2] = PAD;
- encodedData[encodedIndex + 3] = PAD;
- } else if (fewerThan24bits == SIXTEENBIT) {
-
- b1 = binaryData[dataIndex];
- b2 = binaryData[dataIndex + 1];
- l = (byte) (b2 & 0x0f);
- k = (byte) (b1 & 0x03);
-
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
- byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
-
- encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
- encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | (k << 4)];
- encodedData[encodedIndex + 2] = lookUpBase64Alphabet[l << 2];
- encodedData[encodedIndex + 3] = PAD;
- }
- return encodedData;
- }
-
- /**
- * Decodes Base64 data into octects
- *
- * @param base64Data
- * Byte array containing Base64 data
- * @return Array containind decoded data.
- */
- public static synchronized byte[] decode(byte[] base64Data) {
-
- if (base64Data == null)
- return null;
-
- byte[] normalizedBase64Data = removeWhiteSpace(base64Data);
-
- if (normalizedBase64Data.length % FOURBYTE != 0) {
- return null;// should be divisible by four
- }
-
- int numberQuadruple = (normalizedBase64Data.length / FOURBYTE);
-
- if (numberQuadruple == 0)
- return new byte[0];
-
- byte decodedData[] = null;
- byte b1 = 0, b2 = 0, b3 = 0, b4 = 0, marker0 = 0, marker1 = 0;
- byte d1 = 0, d2 = 0, d3 = 0, d4 = 0;
-
- // Throw away anything not in normalizedBase64Data
- // Adjust size
- int i = 0;
- int encodedIndex = 0;
- int dataIndex = 0;
- decodedData = new byte[(numberQuadruple) * 3];
-
- for (; i < numberQuadruple - 1; i++) {
-
- if (!isData((d1 = normalizedBase64Data[dataIndex++])) || !isData((d2 = normalizedBase64Data[dataIndex++]))
- || !isData((d3 = normalizedBase64Data[dataIndex++])) || !isData((d4 = normalizedBase64Data[dataIndex++])))
- return null;// if found "no data" just return null
-
- b1 = base64Alphabet[d1];
- b2 = base64Alphabet[d2];
- b3 = base64Alphabet[d3];
- b4 = base64Alphabet[d4];
-
- decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
- decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
- decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
- }
-
- if (!isData((d1 = normalizedBase64Data[dataIndex++])) || !isData((d2 = normalizedBase64Data[dataIndex++]))) {
- return null;// if found "no data" just return null
- }
-
- b1 = base64Alphabet[d1];
- b2 = base64Alphabet[d2];
-
- d3 = normalizedBase64Data[dataIndex++];
- d4 = normalizedBase64Data[dataIndex++];
- if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters
- if (isPad(d3) && isPad(d4)) { // Two PAD e.g. 3c[Pad][Pad]
- if ((b2 & 0xf) != 0)// last 4 bits should be zero
- return null;
- byte[] tmp = new byte[i * 3 + 1];
- System.arraycopy(decodedData, 0, tmp, 0, i * 3);
- tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
- return tmp;
- } else if (!isPad(d3) && isPad(d4)) { // One PAD e.g. 3cQ[Pad]
- b3 = base64Alphabet[d3];
- if ((b3 & 0x3) != 0)// last 2 bits should be zero
- return null;
- byte[] tmp = new byte[i * 3 + 2];
- System.arraycopy(decodedData, 0, tmp, 0, i * 3);
- tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
- tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
- return tmp;
- } else {
- return null;// an error like "3c[Pad]r", "3cdX", "3cXd", "3cXX" where X is non data
- }
- } else { // No PAD e.g 3cQl
- b3 = base64Alphabet[d3];
- b4 = base64Alphabet[d4];
- decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
- decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
- decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
-
- }
-
- return decodedData;
- }
-
- /**
- * returns length of decoded data given an array containing encoded data. WhiteSpace removing is done if data array not valid.
- *
- * @param base64Data
- * @return a -1 would be return if not
- */
- static public synchronized int getDecodedDataLength(byte[] base64Data) {
-
- if (base64Data == null)
- return -1;
-
- if (base64Data.length == 0)
- return 0;
-
- // byte[] normalizedBase64Data = removeWhiteSpace( base64Data );//Remove any whiteSpace
- byte[] decodedData = null;
-
- if ((decodedData = decode(base64Data)) == null)// decode could return a null byte array
- return -1;
-
- return decodedData.length;
- }
-}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/util/UrlUtilities.java b/Flickr4Java/src/main/java/com/flickr4java/flickr/util/UrlUtilities.java
deleted file mode 100644
index 9eabb4e7..00000000
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/util/UrlUtilities.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
-
-package com.flickr4java.flickr.util;
-
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.util.Map;
-
-/** @author Anthony Eden */
-public class UrlUtilities {
-
- public static final String UTF8 = "UTF-8";
-
- /**
- * Build a request URL.
- *
- * @param host
- * The host
- * @param port
- * The port
- * @param path
- * The path
- * @param parameters
- * The parameters
- * @return The URL
- * @throws MalformedURLException
- */
- public static URL buildUrl(String host, int port, String path, Map parameters) throws MalformedURLException {
- // see: AuthUtilities.getSignature()
- // AuthUtilities.addAuthToken(parameters);
-
- StringBuffer buffer = new StringBuffer();
- if (!host.startsWith("http://")) {
- buffer.append("http://");
- }
- buffer.append(host);
- if (port > 0) {
- buffer.append(':');
- buffer.append(port);
- }
- if (path == null) {
- path = "/";
- }
- buffer.append(path);
-
- if (!parameters.isEmpty()) {
- buffer.append('?');
- }
- int size = parameters.size();
- for (Map.Entry entry : parameters.entrySet()) {
- buffer.append(entry.getKey());
- buffer.append('=');
- Object value = entry.getValue();
- if (value != null) {
- String string = value.toString();
- try {
- string = URLEncoder.encode(string, UTF8);
- } catch (UnsupportedEncodingException e) {
- // Should never happen, but just in case
- }
- buffer.append(string);
- }
- if (--size != 0) {
- buffer.append('&');
- }
- }
-
- /*
- * RequestContext requestContext = RequestContext.getRequestContext(); Auth auth = requestContext.getAuth(); if (auth != null &&
- * !ignoreMethod(getMethod(parameters))) { buffer.append("&api_sig="); buffer.append(AuthUtilities.getSignature(sharedSecret, parameters)); }
- */
-
- return new URL(buffer.toString());
- }
-
- public static URL buildPostUrl(String host, int port, String path) throws MalformedURLException {
- StringBuffer buffer = new StringBuffer();
- buffer.append("http://");
- buffer.append(host);
- if (port > 0) {
- buffer.append(':');
- buffer.append(port);
- }
- if (path == null) {
- path = "/";
- }
- buffer.append(path);
- return new URL(buffer.toString());
- }
-
- /**
- * Construct the BuddyIconUrl.
- *
- * If none available, return the default, or an URL assembled from farm, iconserver and nsid.
- *
- * @see Flickr Documentation
- * @param iconFarm
- * @param iconServer
- * @param id
- * @return The BuddyIconUrl
- */
- public static String createBuddyIconUrl(int iconFarm, int iconServer, String id) {
- /**
- * The default-URL, if the iconServer equals 0.
- */
- String iconUrl = "http://www.flickr.com/images/buddyicon.jpg";
- if (iconServer > 0) {
- iconUrl = "http://farm" + iconFarm + ".static.flickr.com/" + iconServer + "/buddyicons/" + id + ".jpg";
- }
- return iconUrl;
- }
-
-}
diff --git a/Flickr4Java/src/main/resources/log4j.properties b/Flickr4Java/src/main/resources/log4j.properties
deleted file mode 100644
index 63e5511e..00000000
--- a/Flickr4Java/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-# Set root category priority to INFO and its only appender to CONSOLE.
-log4j.rootCategory=INFO, CONSOLE
-#log4j.rootCategory=INFO, CONSOLE, LOGFILE
-
-# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
-log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
-
-# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-log4j.appender.CONSOLE.Threshold=INFO
-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
-log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n
-
-# LOGFILE is set to be a File appender using a PatternLayout.
-log4j.appender.LOGFILE=org.apache.log4j.FileAppender
-log4j.appender.LOGFILE.File=axis.log
-log4j.appender.LOGFILE.Append=true
-log4j.appender.LOGFILE.Threshold=INFO
-log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
-log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
diff --git a/Flickr4Java/src/test/java/com/flickr4java/flickr/test/Flickr4JavaTest.java b/Flickr4Java/src/test/java/com/flickr4java/flickr/test/Flickr4JavaTest.java
deleted file mode 100644
index ff95a820..00000000
--- a/Flickr4Java/src/test/java/com/flickr4java/flickr/test/Flickr4JavaTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @author acaplan
- */
-package com.flickr4java.flickr.test;
-
-import org.junit.Before;
-
-import com.flickr4java.flickr.Flickr;
-import com.flickr4java.flickr.FlickrException;
-import com.flickr4java.flickr.REST;
-import com.flickr4java.flickr.RequestContext;
-import com.flickr4java.flickr.auth.Auth;
-import com.flickr4java.flickr.auth.Permission;
-
-/**
- * @author acaplan
- *
- */
-public class Flickr4JavaTest {
-
- protected Flickr flickr = null;
-
- protected TestProperties testProperties;
-
- @Before
- public void setUp() throws FlickrException {
- // Flickr.debugStream = true;
-
- testProperties = new TestProperties();
-
- REST rest = new REST();
- rest.setHost(testProperties.getHost());
-
- flickr = new Flickr(testProperties.getApiKey(), testProperties.getSecret(), rest);
-
- Auth auth = new Auth();
- auth.setPermission(Permission.READ);
- auth.setToken(testProperties.getToken());
- auth.setTokenSecret(testProperties.getTokenSecret());
-
- RequestContext requestContext = RequestContext.getRequestContext();
- requestContext.setAuth(auth);
- flickr.setAuth(auth);
- }
-}
diff --git a/Flickr4Java/src/test/java/com/flickr4java/flickr/test/UploaderTest.java b/Flickr4Java/src/test/java/com/flickr4java/flickr/test/UploaderTest.java
deleted file mode 100644
index b970c5b1..00000000
--- a/Flickr4Java/src/test/java/com/flickr4java/flickr/test/UploaderTest.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/* Copyright 2004, Aetrion LLC. All Rights Reserved. */
-
-package com.flickr4java.flickr.test;
-
-import static org.junit.Assert.assertNotNull;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.junit.Test;
-
-import com.flickr4java.flickr.FlickrException;
-import com.flickr4java.flickr.photos.PhotosInterface;
-import com.flickr4java.flickr.uploader.UploadMetaData;
-import com.flickr4java.flickr.uploader.Uploader;
-import com.flickr4java.flickr.util.IOUtilities;
-
-/**
- * @author Anthony Eden
- */
-public class UploaderTest extends Flickr4JavaTest {
-
- /**
- * Test photo uploading using a byte array.
- *
- * @throws IOException
- * @throws FlickrException
- */
- @Test
- public void testUploadByteArray() throws IOException, FlickrException {
- File imageFile = new File(testProperties.getImageFile());
- InputStream in = null;
- Uploader uploader = flickr.getUploader();
- PhotosInterface pint = flickr.getPhotosInterface();
-
- ByteArrayOutputStream out = null;
- try {
- in = new FileInputStream(imageFile);
- out = new ByteArrayOutputStream();
- int b = -1;
- while ((b = in.read()) != -1) {
- out.write((byte) b);
- }
- UploadMetaData metaData = buildPrivatePhotoMetadata();
- // check correct handling of escaped value
- metaData.setTitle("óöä");
- String photoId = uploader.upload(out.toByteArray(), metaData);
- assertNotNull(photoId);
- pint.delete(photoId);
- } finally {
- IOUtilities.close(in);
- IOUtilities.close(out);
- }
- }
-
- /**
- * Test photo upload using an InputStream.
- *
- * @throws IOException
- * @throws FlickrException
- */
- @Test
- public void testUploadInputStream() throws IOException, FlickrException {
- File imageFile = new File(testProperties.getImageFile());
- InputStream in = null;
- Uploader uploader = flickr.getUploader();
- PhotosInterface pint = flickr.getPhotosInterface();
-
- try {
- in = new FileInputStream(imageFile);
- UploadMetaData metaData = buildPrivatePhotoMetadata();
- metaData.setPublicFlag(false);
- // check correct handling of escaped value
- metaData.setTitle("óöä");
- String photoId = uploader.upload(in, metaData);
- assertNotNull(photoId);
- pint.delete(photoId);
- } finally {
- IOUtilities.close(in);
- }
- }
-
- /**
- * Test photo replace using an InputStream.
- *
- * @throws IOException
- * @throws FlickrException
- */
- @Test
- public void testReplaceInputStream() throws IOException, FlickrException {
- Uploader uploader = flickr.getUploader();
- PhotosInterface pint = flickr.getPhotosInterface();
- File imageFile = new File(testProperties.getImageFile());
- InputStream uploadIS = null;
- String photoId = null;
- try {
- uploadIS = new FileInputStream(imageFile);
-
- // Upload a photo, which we'll replace, then delete
- UploadMetaData metaData = buildPrivatePhotoMetadata();
- photoId = uploader.upload(uploadIS, metaData);
- } finally {
- IOUtilities.close(uploadIS);
- }
-
- InputStream replaceIS = null;
- try {
- replaceIS = new FileInputStream(imageFile);
-
- try {
- photoId = uploader.replace(replaceIS, photoId, false);
- assertNotNull(photoId);
- } catch (FlickrException e) {
- // Error code 1 means test account is not pro so don't fail test because of that
- if (!e.getErrorCode().equals("1")) {
- throw e;
- }
- }
- pint.delete(photoId);
- } finally {
- IOUtilities.close(replaceIS);
- }
- }
-
- /**
- * Test photo replace using a byte array.
- *
- * @throws IOException
- * @throws FlickrException
- */
- @Test
- public void testReplaceByteArray() throws IOException, FlickrException {
- File imageFile = new File(testProperties.getImageFile());
- InputStream in = null;
- ByteArrayOutputStream out = null;
- Uploader uploader = flickr.getUploader();
- PhotosInterface pint = flickr.getPhotosInterface();
-
- try {
- in = new FileInputStream(imageFile);
- out = new ByteArrayOutputStream();
- int b = -1;
- while ((b = in.read()) != -1) {
- out.write((byte) b);
- }
-
- // Upload a photo, which we'll replace, then delete
- UploadMetaData metaData = buildPrivatePhotoMetadata();
- String photoId = uploader.upload(out.toByteArray(), metaData);
-
- try {
- photoId = uploader.replace(out.toByteArray(), photoId, false);
- assertNotNull(photoId);
- } catch (FlickrException e) {
- // Error code 1 means test account is not pro so don't fail test because of that
- if (!e.getErrorCode().equals("1")) {
- throw e;
- }
- }
-
- pint.delete(photoId);
- } finally {
- IOUtilities.close(in);
- }
- }
-
- /**
- * Build {@link UploadMetaData} with public set to false so uploaded photos are private.
- *
- * @return
- */
- private UploadMetaData buildPrivatePhotoMetadata() {
- UploadMetaData uploadMetaData = new UploadMetaData();
- uploadMetaData.setPublicFlag(false);
- return uploadMetaData;
- }
-
-}
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000..527794c3
--- /dev/null
+++ b/ISSUE_TEMPLATE.md
@@ -0,0 +1,22 @@
+### Subject of the issue
+Describe your issue here.
+
+### Your environment
+* version of Flickr4Java
+* version of JDK
+
+### Steps to reproduce
+Tell us how to reproduce this issue.
+Please provide working code.
+
+### Expected behaviour
+Tell us what should happen
+
+### Actual behaviour
+Tell us what happens instead
+
+### Log
+```
+Please copy paste the log here if available
+
+```
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 00000000..82b96c85
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2004, Anthony Eden (@aeden), Darren Greaves (@boncey), Allan (@callmeal) and contributors.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/README.md b/README.md
index b641128b..90961797 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ __Note:__ This API has been forked from [FlickrJ at Sourceforge](http://flickrj.
This is a Java API which wraps the [REST-based Flickr API](http://www.flickr.com/services/api/).
-Comments and questions should be sent to the [GitHub Repo](https://github.com/callmeal/Flickr4Java).
+Comments and questions should be raised on the [GitHub Repo issue tracker](https://github.com/boncey/Flickr4Java/issues).
### Usage
@@ -14,32 +14,72 @@ To use the API just construct an instance of the class `com.flickr4java.flickr.t
For example, to send a test ping to the Flickr service:
String apiKey = "YOUR_API_KEY";
- Flickr f = new Flickr(apiKey);
+ String sharedSecret = "YOUR_SHARED_SECRET";
+ Flickr f = new Flickr(apiKey, sharedSecret, new REST());
TestInterface testInterface = f.getTestInterface();
- Collection results = testInterface.echo(Collections.EMPTY_LIST);
+ Collection results = testInterface.echo(Collections.EMPTY_MAP);
+
+See `/src/examples/java` for more.
-__Please note:__ this library is not thread safe.
+#### Setting User-Agent
+Since version 3.0.7 Flickr4Java passes the following User-Agent header in its requests
+
+ Flickr4Java/3.x
+
+If you want to override that and set your own you can pass in your own value. Note that no validation is performed on the provided string.
+
+ REST transport = new REST();
+ transport.setUserAgent("MyUserAgent/0.1");
+ Flickr f = new Flickr(apiKey, sharedSecret, transport);
### Requirements
-This API has been tested with JDK 1.4 and JDK 1.5. The default distribution is built with JDK 1.5 (it builds and runs fine under 1.6 and 1.7 too though).
+This API has been tested and built with JDK 1.8.
An API key is required to use this API. You can [request one on Flickr](http://www.flickr.com/services/api/).
-[scribe-java (v.1.3.2)](https://github.com/fernandezpablo85/scribe-java/wiki/Getting-Started) is also required for the OAuth functionality.
+#### Required libraries
+
+- [scribejava-api (v8.3.3 onwards)](https://github.com/scribejava/scribejava) (required for the OAuth functionality)
+- [SLF4J](https://www.slf4j.org) (runtime dependency for logging)
-### Download
+[See here](https://www.slf4j.org/manual.html#swapping) for details on how to choose and configure an SLF4J logging library.
-[Download the latest version from bintray](https://bintray.com/boncey/Flickr4Java/Flickr4Java).
+### Gradle
+
+ compile 'com.flickr4java:flickr4java:3.0.11'
### Maven
com.flickr4java
- flickr
- 2.5
+ flickr4java
+ 3.0.11
-It's hosted on [JCenter](https://bintray.com/bintray/jcenter), you may need to [download their settings.xml](https://bintray.com/repo/downloadMavenRepoSettingsFile/downloadSettings?repoPath=%2Fbintray%2Fjcenter) to get access to their repo.
+Flickr4Java is available on Maven Central so the above settings should be all you need.
+
+### Testing
+The tests now run against captured responses from Flickr (see `src/test/resources/payloads`) and don't contact the Flickr API at all.
+This means there is no longer any need to create a test account and populate a properties file.
+
+#### Functional testing against the Flickr API.
+This is the setup to run the tests against the Flickr API.
+*Not for the faint-hearted. Only do this to test large refactorings etc.*
+
+Create up a `setup.properties` file (see `src/test/resources/setup.properties.example`) with details of a real account on Flickr (I recommend setting up a test account for this purpose).
+Run tests as follows.
+
+ mvn -DsetupPropertiesPath=/path/to/your/setup.properties clean install
+
+Expect lots of failures and general flakiness as data has changed on Flickr and the tests or data need updating.
+
+### Dependency checker
+
+[OWASP dependency-check](https://github.com/jeremylong/DependencyCheck) is configured in the pom.xml.
+
+To run a dependency check
+
+ mvn -U clean verify -P dependency-check
diff --git a/Flickr4Java/build.gradle b/build.gradle
similarity index 69%
rename from Flickr4Java/build.gradle
rename to build.gradle
index db4e8db2..28dab1d6 100644
--- a/Flickr4Java/build.gradle
+++ b/build.gradle
@@ -2,12 +2,13 @@ apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'maven'
+apply plugin: 'application'
-version = '2.4'
+version = '3.0.11'
group = 'com.flickr4java.flickr'
-sourceCompatibility = '1.5'
-targetCompatibility = '1.5'
+sourceCompatibility = '1.8'
+targetCompatibility = '1.8'
repositories {
mavenCentral()
@@ -26,12 +27,17 @@ sourceSets {
}
dependencies {
- compile 'org.scribe:scribe:1.3.3'
- compile 'axis:axis:1.4'
- compile 'log4j:log4j:1.2.17'
+ compile 'com.github.scribejava:scribejava-apis:6.9.0'
+ compile 'org.slf4j:slf4j-api:1.7.25'
testCompile group: 'junit', name: 'junit', version: '4.11'
}
+task setupTests(type:JavaExec, dependsOn:classes) {
+ standardInput = System.in
+ main = 'com.flickr4java.flickr.test.Setup'
+ classpath = sourceSets.test.runtimeClasspath
+}
+
//create a javadoc jar for maven repo
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
diff --git a/Flickr4Java/config/Flickr4JavaFormatter.xml b/config/Flickr4JavaFormatter.xml
similarity index 100%
rename from Flickr4Java/config/Flickr4JavaFormatter.xml
rename to config/Flickr4JavaFormatter.xml
diff --git a/config/dependencyCheckSuppression.xml b/config/dependencyCheckSuppression.xml
new file mode 100644
index 00000000..f1524955
--- /dev/null
+++ b/config/dependencyCheckSuppression.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Flickr4Java/doc/flickr-photo-sizes.xml b/doc/flickr-photo-sizes.xml
similarity index 100%
rename from Flickr4Java/doc/flickr-photo-sizes.xml
rename to doc/flickr-photo-sizes.xml
diff --git a/Flickr4Java/doc/flickr-video-sizes.xml b/doc/flickr-video-sizes.xml
similarity index 100%
rename from Flickr4Java/doc/flickr-video-sizes.xml
rename to doc/flickr-video-sizes.xml
diff --git a/Flickr4Java/doc/photo-sizes b/doc/photo-sizes
similarity index 100%
rename from Flickr4Java/doc/photo-sizes
rename to doc/photo-sizes
diff --git a/Flickr4Java/doc/video-sizes b/doc/video-sizes
similarity index 100%
rename from Flickr4Java/doc/video-sizes
rename to doc/video-sizes
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 00000000..817ee979
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,277 @@
+
+
+ 4.0.0
+
+ com.flickr4java
+ flickr4java
+ 3.0.12-SNAPSHOT
+ jar
+ flickr4java
+ Java API For Flickr. Fork of FlickrJ.
+ https://github.com/boncey/Flickr4Java
+
+
+
+ boncey
+ Darren Greaves
+
+ developer
+
+
+
+ callmeal
+ Allan
+
+ developer
+
+
+
+
+
+
+ BSD 2-Clause License
+ https://github.com/boncey/Flickr4Java/blob/master/LICENSE.txt
+ repo
+
+
+
+
+ 1.8
+ 4.13.2
+ 2.0.5
+ 8.3.3
+ config/dependencyCheckSuppression.xml
+ 8.2.1
+
+
+
+
+
+ com.github.scribejava
+ scribejava-apis
+ ${scribe.version}
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+ org.slf4j
+ slf4j-simple
+ ${slf4j.version}
+ test
+
+
+ junit
+ junit
+ ${junitVersion}
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 2.5.3
+
+ true
+ false
+ release
+ deploy
+ ${arguments} -Prelease-sign-artifacts
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ ${javaVersion}
+ ${javaVersion}
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.22.2
+
+
+
+ ${setupPropertiesPath}
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.2.1
+
+
+ attach-sources
+ verify
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.2.0
+
+ 8
+
+
+
+ attach-javadocs
+
+ jar
+
+
+ -Xdoclint:none
+
+
+
+
+
+
+
+
+ src/main/resources
+
+ **/*
+
+
+
+ true
+ src/main/resources
+
+
+
+
+ scm:git:https://github.com/boncey/Flickr4Java.git
+ scm:git:git@github.com:boncey/Flickr4Java.git
+ https://github.com/boncey/Flickr4Java
+ HEAD
+
+
+
+ release
+
+
+
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.2.0
+
+ 8
+
+
+
+ attach-javadocs
+
+ jar
+
+
+ -Xdoclint:none
+
+
+
+
+
+
+
+
+ release-sign-artifacts
+
+
+ performRelease
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 1.6
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+ org.sonatype.central
+ central-publishing-maven-plugin
+ 0.9.0
+ true
+
+ central
+ true
+
+
+
+
+
+
+ dependency-check
+
+ false
+
+
+
+
+ org.owasp
+ dependency-check-maven
+ ${dependency.check.version}
+
+ ${dependency.check.suppression.file}
+ true
+
+
+
+ package
+
+ check
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-report-plugin
+ 2.22.2
+
+
+
+
diff --git a/Flickr4Java/src/examples/java/ActivityExample.java b/src/examples/java/ActivityExample.java
similarity index 96%
rename from Flickr4Java/src/examples/java/ActivityExample.java
rename to src/examples/java/ActivityExample.java
index 9350cf8a..1bb9beef 100644
--- a/Flickr4Java/src/examples/java/ActivityExample.java
+++ b/src/examples/java/ActivityExample.java
@@ -12,8 +12,6 @@
import org.xml.sax.SAXException;
-import javax.xml.parsers.ParserConfigurationException;
-
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@@ -52,6 +50,7 @@ public ActivityExample() throws IOException {
Auth auth = new Auth();
auth.setPermission(Permission.READ);
auth.setToken(properties.getProperty("token"));
+ auth.setTokenSecret(properties.getProperty("tokensecret"));
requestContext.setAuth(auth);
Flickr.debugRequest = false;
Flickr.debugStream = false;
diff --git a/Flickr4Java/src/examples/java/AuthExample.java b/src/examples/java/AuthExample.java
similarity index 73%
rename from Flickr4Java/src/examples/java/AuthExample.java
rename to src/examples/java/AuthExample.java
index d4c53b6e..b76802bb 100644
--- a/Flickr4Java/src/examples/java/AuthExample.java
+++ b/src/examples/java/AuthExample.java
@@ -5,14 +5,14 @@
import com.flickr4java.flickr.auth.AuthInterface;
import com.flickr4java.flickr.auth.Permission;
import com.flickr4java.flickr.util.IOUtilities;
-
-import org.scribe.model.Token;
-import org.scribe.model.Verifier;
+import com.github.scribejava.core.model.OAuth1RequestToken;
+import com.github.scribejava.core.model.OAuth1Token;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Scanner;
+import java.util.concurrent.ExecutionException;
/**
* Demonstrates the authentication-process.
@@ -26,7 +26,7 @@
*/
public class AuthExample {
- public static void auth() throws IOException, FlickrException {
+ public static void auth() throws IOException, FlickrException, ExecutionException, InterruptedException {
Properties properties;
InputStream in = null;
try {
@@ -43,24 +43,26 @@ public static void auth() throws IOException, FlickrException {
Scanner scanner = new Scanner(System.in);
- Token token = authInterface.getRequestToken();
- System.out.println("token: " + token);
+ OAuth1RequestToken requestToken = authInterface.getRequestToken();
+ System.out.println("token: " + requestToken);
- String url = authInterface.getAuthorizationUrl(token, Permission.READ);
+ String url = authInterface.getAuthorizationUrl(requestToken, Permission.DELETE);
System.out.println("Follow this URL to authorise yourself on Flickr");
System.out.println(url);
System.out.println("Paste in the token it gives you:");
System.out.print(">>");
String tokenKey = scanner.nextLine();
+ scanner.close();
- Token requestToken = authInterface.getAccessToken(token, new Verifier(tokenKey));
+ OAuth1Token accessToken = authInterface.getAccessToken(requestToken, tokenKey);
System.out.println("Authentication success");
- Auth auth = authInterface.checkToken(requestToken);
+ Auth auth = authInterface.checkToken(accessToken);
// This token can be used until the user revokes it.
- System.out.println("Token: " + requestToken.getToken());
+ System.out.println("Token: " + accessToken.getToken());
+ System.out.println("Secret: " + accessToken.getTokenSecret());
System.out.println("nsid: " + auth.getUser().getId());
System.out.println("Realname: " + auth.getUser().getRealName());
System.out.println("Username: " + auth.getUser().getUsername());
diff --git a/Flickr4Java/src/examples/java/Backup.java b/src/examples/java/Backup.java
similarity index 89%
rename from Flickr4Java/src/examples/java/Backup.java
rename to src/examples/java/Backup.java
index cf888ebe..e86f418f 100644
--- a/Flickr4Java/src/examples/java/Backup.java
+++ b/src/examples/java/Backup.java
@@ -13,10 +13,8 @@
import com.flickr4java.flickr.photosets.PhotosetsInterface;
import com.flickr4java.flickr.util.AuthStore;
import com.flickr4java.flickr.util.FileAuthStore;
-
-import org.scribe.model.Token;
-import org.scribe.model.Verifier;
-import org.xml.sax.SAXException;
+import com.github.scribejava.core.model.OAuth1RequestToken;
+import com.github.scribejava.core.model.OAuth1Token;
import java.io.BufferedInputStream;
import java.io.File;
@@ -57,11 +55,11 @@ public Backup(String apiKey, String nsid, String sharedSecret, File authsDir) th
}
}
- private void authorize() throws IOException, SAXException, FlickrException {
+ private void authorize() throws IOException, FlickrException {
AuthInterface authInterface = flickr.getAuthInterface();
- Token accessToken = authInterface.getRequestToken();
+ OAuth1RequestToken requestToken = authInterface.getRequestToken();
- String url = authInterface.getAuthorizationUrl(accessToken, Permission.READ);
+ String url = authInterface.getAuthorizationUrl(requestToken, Permission.READ);
System.out.println("Follow this URL to authorise yourself on Flickr");
System.out.println(url);
System.out.println("Paste in the token it gives you:");
@@ -69,9 +67,9 @@ private void authorize() throws IOException, SAXException, FlickrException {
String tokenKey = new Scanner(System.in).nextLine();
- Token requestToken = authInterface.getAccessToken(accessToken, new Verifier(tokenKey));
+ OAuth1Token accessToken = authInterface.getAccessToken(requestToken, tokenKey);
- Auth auth = authInterface.checkToken(requestToken);
+ Auth auth = authInterface.checkToken(accessToken);
RequestContext.getRequestContext().setAuth(auth);
this.authStore.store(auth);
System.out.println("Thanks. You probably will not have to do this every time. Now starting backup.");
diff --git a/src/examples/java/FlickrCrawler.java b/src/examples/java/FlickrCrawler.java
new file mode 100644
index 00000000..e9739d53
--- /dev/null
+++ b/src/examples/java/FlickrCrawler.java
@@ -0,0 +1,110 @@
+import com.flickr4java.flickr.Flickr;
+import com.flickr4java.flickr.FlickrException;
+import com.flickr4java.flickr.REST;
+import com.flickr4java.flickr.photos.Photo;
+import com.flickr4java.flickr.photos.PhotoList;
+import com.flickr4java.flickr.photos.SearchParameters;
+
+import javax.imageio.ImageIO;
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.prefs.Preferences;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/*
+ * - Java 7 is needed
+ * - insert your api- and secretkey
+ *
+ * start main with wanted tags as parameter, for example: FlickrCrawler.main(Sunset) and all pics will be saved in original size or large to pics\sunset\...
+ */
+public class FlickrCrawler {
+
+ private static String path = "";
+ private static Preferences userPrefs = Preferences.userNodeForPackage(FlickrCrawler.class);
+
+ // convert filename to clean filename
+ public static String convertToFileSystemChar(String name) {
+ String erg = "";
+ Matcher m = Pattern.compile("[a-z0-9 _#&@\\[\\(\\)\\]\\-\\.]", Pattern.CASE_INSENSITIVE).matcher(name);
+ while (m.find()) {
+ erg += name.substring(m.start(), m.end());
+ }
+ if (erg.length() > 200) {
+ erg = erg.substring(0, 200);
+ System.out.println("cut filename: " + erg);
+ }
+ return erg;
+ }
+
+ public static boolean saveImage(Flickr f, Photo p) {
+
+ String cleanTitle = convertToFileSystemChar(p.getTitle());
+
+ File orgFile = new File(path + File.separator + cleanTitle + "_" + p.getId() + "_o." + p.getOriginalFormat());
+ File largeFile = new File(path + File.separator + cleanTitle + "_" + p.getId() + "_b." + p.getOriginalFormat());
+
+ if (orgFile.exists() || largeFile.exists()) {
+ System.out.println(p.getTitle() + "\t" + p.getLargeUrl() + " skipped!");
+ return false;
+ }
+
+ try {
+ Photo nfo = f.getPhotosInterface().getInfo(p.getId(), null);
+ if (nfo.getOriginalSecret().isEmpty()) {
+ ImageIO.write(p.getLargeImage(), p.getOriginalFormat(), largeFile);
+ System.out.println(p.getTitle() + "\t" + p.getLargeUrl() + " was written to " + largeFile.getName());
+ } else {
+ p.setOriginalSecret(nfo.getOriginalSecret());
+ ImageIO.write(p.getOriginalImage(), p.getOriginalFormat(), orgFile);
+ System.out.println(p.getTitle() + "\t" + p.getOriginalUrl() + " was written to " + orgFile.getName());
+ }
+ } catch (FlickrException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return true;
+ }
+
+ public static void main(String[] args) {
+ if (args.length == 0) {
+ System.out.println("Parameter are needed as for searching. Example: FlickrCrawler.java sunset");
+ return;
+ }
+
+ String apikey = "apikey";
+ String secret = "secret";
+
+ Flickr flickr = new Flickr(apikey, secret, new REST());
+ SearchParameters searchParameters = new SearchParameters();
+ searchParameters.setAccuracy(1);
+
+ StringBuilder tagsBuilder = new StringBuilder();
+ for (String tmp : args) {
+ tagsBuilder.append(" " + tmp);
+ }
+ path = "pics" + File.separator + tagsBuilder.toString().substring(1);
+
+ new File(path).mkdirs();
+ searchParameters.setTags(args);
+
+ for (int i = userPrefs.getInt(path, 0); true; i++) {
+ userPrefs.putInt( path, i );
+ System.out.println("\tcurrent page: " + userPrefs.getInt(path, 0));
+ try {
+ PhotoList list = flickr.getPhotosInterface().search(searchParameters, 500, i);
+ if (list.isEmpty())
+ break;
+
+ Iterator itr = list.iterator();
+ while (itr.hasNext()) {
+ saveImage(flickr, (Photo) itr.next());
+ }
+ } catch (FlickrException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/src/examples/java/SearchExample.java b/src/examples/java/SearchExample.java
new file mode 100644
index 00000000..a1808010
--- /dev/null
+++ b/src/examples/java/SearchExample.java
@@ -0,0 +1,94 @@
+import com.flickr4java.flickr.Flickr;
+import com.flickr4java.flickr.FlickrException;
+import com.flickr4java.flickr.REST;
+import com.flickr4java.flickr.RequestContext;
+import com.flickr4java.flickr.auth.Auth;
+import com.flickr4java.flickr.auth.Permission;
+import com.flickr4java.flickr.photos.Photo;
+import com.flickr4java.flickr.photos.PhotoList;
+import com.flickr4java.flickr.photos.PhotosInterface;
+import com.flickr4java.flickr.photos.SearchParameters;
+import com.flickr4java.flickr.util.IOUtilities;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Demonstration of how to search.
+ */
+public class SearchExample
+{
+ static String apiKey;
+
+ static String sharedSecret;
+
+ Flickr f;
+
+ REST rest;
+
+ RequestContext requestContext;
+
+ Properties properties;
+
+ public SearchExample() throws IOException
+ {
+ String setupPropertiesPath = System.getenv("SETUP_PROPERTIES_PATH");
+
+ InputStream in = null;
+ try
+ {
+ if (setupPropertiesPath != null)
+ {
+ in = new FileInputStream(new File(setupPropertiesPath));
+ } else
+ {
+ in = getClass().getResourceAsStream("/setup.properties");
+ }
+ properties = new Properties();
+ properties.load(in);
+ } finally
+ {
+ IOUtilities.close(in);
+ }
+
+ f = new Flickr(properties.getProperty("apiKey"), properties.getProperty("secret"), new REST());
+ requestContext = RequestContext.getRequestContext();
+ Auth auth = new Auth();
+ auth.setPermission(Permission.READ);
+ auth.setToken(properties.getProperty("token"));
+ auth.setTokenSecret(properties.getProperty("tokensecret"));
+ requestContext.setAuth(auth);
+ Flickr.debugRequest = false;
+ Flickr.debugStream = false;
+ }
+
+ private void search(String text) throws FlickrException
+ {
+ PhotosInterface photos = f.getPhotosInterface();
+ SearchParameters params = new SearchParameters();
+ params.setMedia("videos"); // One of "photos", "videos" or "all"
+ params.setExtras(Stream.of("media").collect(Collectors.toSet()));
+ params.setText(text);
+ PhotoList results = photos.search(params, 5, 0);
+
+ results.forEach(p ->
+ {
+ System.out.println(String.format("Title: %s", p.getTitle()));
+ System.out.println(String.format("Media: %s", p.getMedia()));
+ System.out.println(String.format("Original Video URL: %s", p.getVideoOriginalUrl()));
+ });
+
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ SearchExample t = new SearchExample();
+ t.search(args.length == 0 ? "London" : args[0]);
+ }
+
+}
diff --git a/src/examples/java/UploadPhoto.java b/src/examples/java/UploadPhoto.java
new file mode 100644
index 00000000..bfaa1f9e
--- /dev/null
+++ b/src/examples/java/UploadPhoto.java
@@ -0,0 +1,835 @@
+import com.flickr4java.flickr.Flickr;
+import com.flickr4java.flickr.FlickrException;
+import com.flickr4java.flickr.REST;
+import com.flickr4java.flickr.RequestContext;
+import com.flickr4java.flickr.auth.Auth;
+import com.flickr4java.flickr.auth.AuthInterface;
+import com.flickr4java.flickr.auth.Permission;
+import com.flickr4java.flickr.people.PeopleInterface;
+import com.flickr4java.flickr.people.User;
+import com.flickr4java.flickr.photos.Photo;
+import com.flickr4java.flickr.photos.PhotoList;
+import com.flickr4java.flickr.photos.PhotosInterface;
+import com.flickr4java.flickr.photosets.Photoset;
+import com.flickr4java.flickr.photosets.Photosets;
+import com.flickr4java.flickr.photosets.PhotosetsInterface;
+import com.flickr4java.flickr.prefs.PrefsInterface;
+import com.flickr4java.flickr.uploader.UploadMetaData;
+import com.flickr4java.flickr.uploader.Uploader;
+import com.flickr4java.flickr.util.AuthStore;
+import com.flickr4java.flickr.util.FileAuthStore;
+import com.github.scribejava.core.model.OAuth1RequestToken;
+import com.github.scribejava.core.model.OAuth1Token;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Scanner;
+import java.util.Set;
+
+/**
+ * A simple program to upload photos to a set. It checks for files already uploaded assuming the title is not changed so that it can be rerun if partial upload
+ * is done. It uses the tag field to store the filename as OrigFileName to be used while downloading if the title has been changed. If setup.properties is not
+ * available, pass the apiKey and secret as arguments to the program.
+ *
+ * This sample also uses the AuthStore interface, so users will only be asked to authorize on the first run.
+ *
+ * Please NOTE that this needs Java 7 to work. Java 7 was released on July 28, 2011 and soon Java 6 may not be supported anymore ( Jul 2014).
+ *
+ * @author Keyur Parikh
+ */
+
+public class UploadPhoto {
+
+ private static final Logger logger = LoggerFactory.getLogger(UploadPhoto.class);
+
+ private String nsid;
+
+ private String username;
+
+ // private final String sharedSecret;
+
+ private final Flickr flickr;
+
+ private AuthStore authStore;
+
+ public boolean flickrDebug = false;
+
+ private boolean setOrigFilenameTag = true;
+
+ private boolean replaceSpaces = false;
+
+ private int privacy = -1;
+
+ HashMap allSetsMap = new HashMap();
+
+ HashMap> setNameToId = new HashMap>();
+
+ public static final SimpleDateFormat smp = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss a");
+
+ public UploadPhoto(String apiKey, String nsid, String sharedSecret, File authsDir, String username) throws FlickrException {
+ flickr = new Flickr(apiKey, sharedSecret, new REST());
+
+ this.username = username;
+ this.nsid = nsid;
+ // this.sharedSecret = sharedSecret;
+
+ if (authsDir != null) {
+ this.authStore = new FileAuthStore(authsDir);
+ }
+
+ // If one of them is not filled in, find and populate it.
+ if (username == null || username.equals(""))
+ setUserName();
+ if (nsid == null || nsid.equals(""))
+ setNsid();
+
+ }
+
+ private void setUserName() throws FlickrException {
+ if (nsid != null && !nsid.equals("")) {
+ Auth auth = null;
+ if (authStore != null) {
+ auth = authStore.retrieve(nsid);
+ if (auth != null) {
+ username = auth.getUser().getUsername();
+ }
+ }
+ // For this to work: REST.java or PeopleInterface needs to change to pass apiKey
+ // as the parameter to the call which is not authenticated.
+
+ if (auth == null) {
+ // Get nsid using flickr.people.findByUsername
+ PeopleInterface peopleInterf = flickr.getPeopleInterface();
+ User u = peopleInterf.getInfo(nsid);
+ if (u != null) {
+ username = u.getUsername();
+ }
+ }
+ }
+ }
+
+ /**
+ * Check local saved copy first ??. If Auth by username is available, then we will not need to make the API call.
+ *
+ * @throws FlickrException if there was a problem connecting to Flickr
+ */
+
+ private void setNsid() throws FlickrException {
+
+ if (username != null && !username.equals("")) {
+ Auth auth = null;
+ if (authStore != null) {
+ auth = authStore.retrieve(username); // assuming FileAuthStore is enhanced else need to
+ // keep in user-level files.
+
+ if (auth != null) {
+ nsid = auth.getUser().getId();
+ }
+ }
+ if (auth != null)
+ return;
+
+ Auth[] allAuths = authStore.retrieveAll();
+ for (int i = 0; i < allAuths.length; i++) {
+ if (username.equals(allAuths[i].getUser().getUsername())) {
+ nsid = allAuths[i].getUser().getId();
+ return;
+ }
+ }
+
+ // For this to work: REST.java or PeopleInterface needs to change to pass apiKey
+ // as the parameter to the call which is not authenticated.
+
+ // Get nsid using flickr.people.findByUsername
+ PeopleInterface peopleInterf = flickr.getPeopleInterface();
+ User u = peopleInterf.findByUsername(username);
+ if (u != null) {
+ nsid = u.getId();
+ }
+ }
+ }
+
+ private void authorize() throws IOException, FlickrException {
+ AuthInterface authInterface = flickr.getAuthInterface();
+ OAuth1RequestToken accessToken = authInterface.getRequestToken();
+
+ // Try with DELETE permission. At least need write permission for upload and add-to-set.
+ String url = authInterface.getAuthorizationUrl(accessToken, Permission.DELETE);
+ System.out.println("Follow this URL to authorise yourself on Flickr");
+ System.out.println(url);
+ System.out.println("Paste in the token it gives you:");
+ System.out.print(">>");
+
+ Scanner scanner = new Scanner(System.in);
+ String tokenKey = scanner.nextLine();
+
+ OAuth1Token requestToken = authInterface.getAccessToken(accessToken, tokenKey);
+
+ Auth auth = authInterface.checkToken(requestToken);
+ RequestContext.getRequestContext().setAuth(auth);
+ this.authStore.store(auth);
+ scanner.close();
+ System.out.println("Thanks. You probably will not have to do this every time. Auth saved for user: " + auth.getUser().getUsername() + " nsid is: "
+ + auth.getUser().getId());
+ System.out.println(" AuthToken: " + auth.getToken() + " tokenSecret: " + auth.getTokenSecret());
+ }
+
+ /**
+ * If the Authtoken was already created in a separate program but not saved to file.
+ *
+ * @param authToken
+ * @param tokenSecret
+ * @param username
+ * @return
+ * @throws IOException
+ */
+ private Auth constructAuth(String authToken, String tokenSecret, String username) throws IOException {
+
+ Auth auth = new Auth();
+ auth.setToken(authToken);
+ auth.setTokenSecret(tokenSecret);
+
+ // Prompt to ask what permission is needed: read, update or delete.
+ auth.setPermission(Permission.fromString("delete"));
+
+ User user = new User();
+ // Later change the following 3. Either ask user to pass on command line or read
+ // from saved file.
+ user.setId(nsid);
+ user.setUsername((username));
+ user.setRealName("");
+ auth.setUser(user);
+ this.authStore.store(auth);
+ return auth;
+ }
+
+ public void setAuth(String authToken, String username, String tokenSecret) throws IOException, FlickrException {
+ RequestContext rc = RequestContext.getRequestContext();
+ Auth auth = null;
+
+ if (authToken != null && !authToken.equals("") && tokenSecret != null && !tokenSecret.equals("")) {
+ auth = constructAuth(authToken, tokenSecret, username);
+ rc.setAuth(auth);
+ } else {
+ if (this.authStore != null) {
+ auth = this.authStore.retrieve(this.nsid);
+ if (auth == null) {
+ this.authorize();
+ } else {
+ rc.setAuth(auth);
+ }
+ }
+ }
+ }
+
+ public int getPrivacy() throws Exception {
+
+ PrefsInterface prefi = flickr.getPrefsInterface();
+ privacy = prefi.getPrivacy();
+
+ return (privacy);
+ }
+
+ private String makeSafeFilename(String input) {
+ byte[] fname = input.getBytes();
+ byte[] bad = new byte[] { '\\', '/', '"', '*' };
+ byte replace = '_';
+ for (int i = 0; i < fname.length; i++) {
+ for (byte element : bad) {
+ if (fname[i] == element) {
+ fname[i] = replace;
+ }
+ }
+ if (replaceSpaces && fname[i] == ' ')
+ fname[i] = '_';
+ }
+ return new String(fname);
+ }
+
+ public String uploadfile(String filename, String inpTitle) throws Exception {
+ String photoId;
+
+ RequestContext rc = RequestContext.getRequestContext();
+
+ if (this.authStore != null) {
+ Auth auth = this.authStore.retrieve(this.nsid);
+ if (auth == null) {
+ this.authorize();
+ } else {
+ rc.setAuth(auth);
+ }
+ }
+
+ // PhotosetsInterface pi = flickr.getPhotosetsInterface();
+ // PhotosInterface photoInt = flickr.getPhotosInterface();
+ // Map allPhotos = new HashMap();
+ /**
+ * 1 : Public 2 : Friends only 3 : Family only 4 : Friends and Family 5 : Private
+ **/
+ if (privacy == -1)
+ getPrivacy();
+
+ UploadMetaData metaData = new UploadMetaData();
+
+ if (privacy == 1)
+ metaData.setPublicFlag(true);
+ if (privacy == 2 || privacy == 4)
+ metaData.setFriendFlag(true);
+ if (privacy == 3 || privacy == 4)
+ metaData.setFamilyFlag(true);
+
+ if (basefilename == null || basefilename.equals(""))
+ basefilename = filename; // "image.jpg";
+
+ String title = basefilename;
+ boolean setMimeType = true; // change during testing. Doesn't seem to be supported at this time in flickr.
+ if (setMimeType) {
+ if (basefilename.lastIndexOf('.') > 0) {
+ title = basefilename.substring(0, basefilename.lastIndexOf('.'));
+ String suffix = basefilename.substring(basefilename.lastIndexOf('.') + 1);
+ // Set Mime Type if known.
+
+ // Later use a mime-type properties file or a hash table of all known photo and video types
+ // allowed by flickr.
+
+ if (suffix.equalsIgnoreCase("png")) {
+ metaData.setFilemimetype("image/png");
+ } else if (suffix.equalsIgnoreCase("mpg") || suffix.equalsIgnoreCase("mpeg")) {
+ metaData.setFilemimetype("video/mpeg");
+ } else if (suffix.equalsIgnoreCase("mov")) {
+ metaData.setFilemimetype("video/quicktime");
+ }
+ }
+ }
+ logger.debug(" File : " + filename);
+ logger.debug(" basefilename : " + basefilename);
+
+ if (inpTitle != null && !inpTitle.equals("")) {
+ title = inpTitle;
+ logger.debug(" title : " + inpTitle);
+ metaData.setTitle(title);
+ } // flickr defaults the title field from file name.
+
+ // UploadMeta is using String not Tag class.
+
+ // Tags are getting mangled by yahoo stripping off the = , '.' and many other punctuation characters
+ // and converting to lower case: use the raw tag field to find the real value for checking and
+ // for download.
+ if (setOrigFilenameTag) {
+ List tags = new ArrayList();
+ String tmp = basefilename;
+ basefilename = makeSafeFilename(basefilename);
+ tags.add("OrigFileName='" + basefilename + "'");
+ metaData.setTags(tags);
+
+ if (!tmp.equals(basefilename)) {
+ System.out.println(" File : " + basefilename + " contains special characters. stored as " + basefilename + " in tag field");
+ }
+ }
+
+ // File imageFile = new File(filename);
+ // InputStream in = null;
+ Uploader uploader = flickr.getUploader();
+
+ // ByteArrayOutputStream out = null;
+ try {
+ // in = new FileInputStream(imageFile);
+ // out = new ByteArrayOutputStream();
+
+ // int b = -1;
+ /**
+ * while ((b = in.read()) != -1) { out.write((byte) b); }
+ **/
+
+ /**
+ * byte[] buf = new byte[1024]; while ((b = in.read(buf)) != -1) { // fos.write(read); out.write(buf, 0, b); }
+ **/
+
+ metaData.setFilename(basefilename);
+ // check correct handling of escaped value
+
+ File f = new File(filename);
+ photoId = uploader.upload(f, metaData);
+
+ logger.debug(" File : " + filename + " uploaded: photoId = " + photoId);
+ } finally {
+
+ }
+
+ return (photoId);
+ }
+
+ public void getPhotosetsInfo() {
+
+ PhotosetsInterface pi = flickr.getPhotosetsInterface();
+ try {
+ int setsPage = 1;
+ while (true) {
+ Photosets photosets = pi.getList(nsid, 500, setsPage, null);
+ Collection setsColl = photosets.getPhotosets();
+ Iterator setsIter = setsColl.iterator();
+ while (setsIter.hasNext()) {
+ Photoset set = setsIter.next();
+ allSetsMap.put(set.getId(), set);
+
+ // 2 or more sets can in theory have the same name. !!!
+ ArrayList setIdarr = setNameToId.get(set.getTitle());
+ if (setIdarr == null) {
+ setIdarr = new ArrayList();
+ setIdarr.add(new String(set.getId()));
+ setNameToId.put(set.getTitle(), setIdarr);
+ } else {
+ setIdarr.add(new String(set.getId()));
+ }
+ }
+
+ if (setsColl.size() < 500) {
+ break;
+ }
+ setsPage++;
+ }
+ logger.debug(" Sets retrieved: " + allSetsMap.size());
+ // all_sets_retrieved = true;
+ // Print dups if any.
+
+ Set keys = setNameToId.keySet();
+ Iterator iter = keys.iterator();
+ while (iter.hasNext()) {
+ String name = iter.next();
+ ArrayList setIdarr = setNameToId.get(name);
+ if (setIdarr != null && setIdarr.size() > 1) {
+ System.out.println("There is more than 1 set with this name : " + setNameToId.get(name));
+ for (int j = 0; j < setIdarr.size(); j++) {
+ System.out.println(" id: " + setIdarr.get(j));
+ }
+ }
+ }
+
+ } catch (FlickrException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private String setid = null;
+
+ private String basefilename = null;
+
+ private final PhotoList photos = new PhotoList();
+
+ private final HashMap filePhotos = new HashMap();
+
+ private static void Usage() {
+ System.out.println("Usage: java " + UploadPhoto.class.getName() + " [ -n nsid | -u username ] -s setName { File../Directories}");
+ System.out.println(" Must pass either -u username or -n nsid ");
+ System.out.println(" Must pass -s followed by set-name(albums) followed by file/directories.");
+ System.out
+ .println("apiKey and shared secret must be available as apiKey and secret via setup.properties or passed as -apiKey key -secret shared-secret");
+ System.exit(1);
+ }
+
+ /**
+ * @return the setOrigFilenameTag
+ */
+ public boolean isSetorigfilenametag() {
+ return setOrigFilenameTag;
+ }
+
+ /**
+ * @param setOrigFilenameTag
+ * the setOrigFilenameTag to set
+ */
+ public void setSetorigfilenametag(boolean setOrigFilenameTag) {
+ this.setOrigFilenameTag = setOrigFilenameTag;
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ String apiKey = null; // args[0];
+ String sharedSecret = null; // args[1];
+
+ Properties properties = new Properties();
+ InputStream in = null;
+ try {
+ in = UploadPhoto.class.getResourceAsStream("/setup.properties");
+ if (in != null) {
+ properties.load(in);
+ apiKey = properties.getProperty("apiKey");
+ sharedSecret = properties.getProperty("secret");
+ if (apiKey != null && sharedSecret != null)
+ logger.debug("Found setup.properties in classpath and set apiKey and shared secret");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (in != null)
+ in.close();
+ }
+
+ if (args.length < 5) {
+ Usage();
+ System.exit(1);
+ }
+
+ ArrayList uploadfileArgs = new ArrayList();
+ ArrayList optionArgs = new ArrayList();
+
+ // Flickr.debugRequest = true; // keep it false else entire file will be in stdout.
+
+ // Flickr.debugStream = true;
+
+ String authsDirStr = System.getProperty("user.home") + File.separatorChar + ".flickrAuth";
+
+ String nsid = null;
+ String username = null;
+ String accessToken = null; // Optional entry.
+ String tokenSecret = null; // Optional entry.
+ String setName = null;
+
+ boolean settagname = true; // Default to true to add tag while uploading.
+
+ int i = 0;
+ /***
+ * for(i = 0; i < args.length; i++) { System.out.println("args[" + i + "] " + args[i]); }
+ **/
+
+ for (i = 0; i < args.length; i++) {
+ switch (args[i]) {
+ case "-n":
+ if (i < args.length)
+ nsid = args[++i];
+ break;
+ case "-u":
+ if (i < args.length)
+ username = args[++i];
+ break;
+ case "-apiKey":
+ if (i < args.length)
+ apiKey = args[++i];
+ break;
+
+ case "-secret":
+ if (i < args.length)
+ sharedSecret = args[++i];
+ break;
+ case "-notags":
+ if (i < args.length)
+ settagname = false;
+ break;
+
+ case "-a":
+ if (i < args.length)
+ accessToken = args[++i];
+ break;
+ case "-t":
+ if (i < args.length)
+ tokenSecret = args[++i];
+ break;
+ case "-s":
+ if (i < args.length)
+ setName = args[++i];
+ break;
+ case "-option":
+ if (i < args.length)
+ optionArgs.add(args[++i]);
+ break;
+ default:
+ if (setName != null)
+ uploadfileArgs.add(args[i]);
+ else {
+ Usage();
+ System.exit(1);
+ }
+ }
+ }
+
+ if (apiKey == null || sharedSecret == null || (username == null && nsid == null) || (setName == null) || (uploadfileArgs.size() == 0)) {
+ Usage();
+ System.exit(1);
+ }
+
+ UploadPhoto bf = new UploadPhoto(apiKey, nsid, sharedSecret, new File(authsDirStr), username);
+ for (i = 0; i < optionArgs.size(); i++) {
+ bf.addOption(optionArgs.get(i));
+ }
+ bf.setSetorigfilenametag(settagname);
+ bf.setAuth(accessToken, username, tokenSecret);
+
+ if (!bf.canUpload())
+ System.exit(1);
+
+ bf.getPrivacy();
+
+ bf.getPhotosetsInfo();
+
+ if (setName != null && !setName.equals("")) {
+
+ bf.getSetPhotos(setName);
+ }
+
+ // String photoid;
+
+ for (i = 0; i < uploadfileArgs.size(); i++) {
+ String filename = uploadfileArgs.get(i);
+
+ File f = new File(filename);
+ if (f.isDirectory()) {
+ String[] filelist = f.list(new UploadFilenameFilter());
+ logger.debug("Processing directory : " + uploadfileArgs.get(i));
+ for (int j = 0; j < filelist.length; j++) {
+ bf.processFileArg(uploadfileArgs.get(i) + File.separatorChar + filelist[j], setName);
+ }
+ } else {
+ bf.processFileArg(filename, setName);
+ }
+ }
+ }
+
+ private static final String[] photoSuffixes = { "jpg", "jpeg", "png", "gif", "bmp", "tif", "tiff" };
+
+ private static final String[] videoSuffixes = { "3gp", "3gp", "avi", "mov", "mp4", "mpg", "mpeg", "wmv", "ogg", "ogv", "m2v" };
+
+ static class UploadFilenameFilter implements FilenameFilter {
+
+ // Following suffixes from flickr upload page. An App should have this configurable,
+ // for videos and photos separately.
+
+ @Override
+ public boolean accept(File dir, String name) {
+ if (isValidSuffix(name))
+ return true;
+ else
+ return false;
+ }
+
+ }
+
+ private static boolean isValidSuffix(String basefilename) {
+ if (basefilename.lastIndexOf('.') <= 0) {
+ return false;
+ }
+ String suffix = basefilename.substring(basefilename.lastIndexOf('.') + 1).toLowerCase();
+ for (int i = 0; i < photoSuffixes.length; i++) {
+ if (photoSuffixes[i].equals(suffix))
+ return true;
+ }
+ for (int i = 0; i < videoSuffixes.length; i++) {
+ if (videoSuffixes[i].equals(suffix))
+ return true;
+ }
+ logger.debug(basefilename + " does not have a valid suffix, skipped.");
+ return false;
+ }
+
+ private void processFileArg(String filename, String setName) throws Exception {
+ String photoid;
+ if (filename.equals("")) {
+ System.out.println("filename must be entered for uploadfile ");
+ return;
+ }
+ if (filename.lastIndexOf(File.separatorChar) > 0)
+ basefilename = filename.substring(filename.lastIndexOf(File.separatorChar) + 1, filename.length());
+ else
+ basefilename = filename;
+
+ boolean fileUploaded = checkIfLoaded(filename);
+
+ if (!fileUploaded) {
+ if (!isValidSuffix(basefilename)) {
+ System.out.println(" File: " + basefilename + " is not a supported filetype for flickr (invalid suffix)");
+ return;
+ }
+
+ File f = new File(filename);
+ if (!f.exists() || !f.canRead()) {
+ System.out.println(" File: " + filename + " cannot be processed, does not exist or is unreadable.");
+ return;
+ }
+ logger.debug("Calling uploadfile for filename : " + filename);
+ logger.info("Upload of " + filename + " started at: " + smp.format(new Date()) + "\n");
+
+ photoid = uploadfile(filename, null);
+ // Add to Set. Create set if it does not exist.
+ if (photoid != null) {
+ addPhotoToSet(photoid, setName);
+ }
+ logger.info("Upload of " + filename + " finished at: " + smp.format(new Date()) + "\n");
+
+ } else {
+ logger.info(" File: " + filename + " has already been loaded on " + getUploadedTime(filename));
+ }
+ }
+
+ private void addOption(String opt) {
+
+ switch (opt) {
+ case "replaceSpaces":
+ replaceSpaces = true;
+ break;
+
+ case "notags":
+ setSetorigfilenametag(false);
+ break;
+
+ default: // Not supported at this time.
+ System.out.println("Option: " + opt + " is not supported at this time");
+ }
+ }
+
+ private boolean canUpload() {
+ RequestContext rc = RequestContext.getRequestContext();
+ Auth auth = null;
+ auth = rc.getAuth();
+ if (auth == null) {
+ System.out.println(" Cannot upload, there is no authorization information.");
+ return false;
+ }
+ Permission perm = auth.getPermission();
+ if ((perm.getType() == Permission.WRITE_TYPE) || (perm.getType() == Permission.DELETE_TYPE))
+ return true;
+ else {
+ System.out.println(" Cannot upload, You need write or delete permission, you have : " + perm.toString());
+ return false;
+ }
+ }
+
+ /**
+ * The assumption here is that for a given set only unique file-names will be loaded and the title field can be used. Later change to use the tags field (
+ * OrigFileName) and strip off the suffix.
+ *
+ * @param filename
+ * @return
+ */
+ private boolean checkIfLoaded(String filename) {
+
+ String title;
+ if (basefilename.lastIndexOf('.') > 0)
+ title = basefilename.substring(0, basefilename.lastIndexOf('.'));
+ else
+ return false;
+
+ if (filePhotos.containsKey(title))
+ return true;
+
+ return false;
+ }
+
+ private String getUploadedTime(String filename) {
+
+ String title = "";
+ if (basefilename.lastIndexOf('.') > 0)
+ title = basefilename.substring(0, basefilename.lastIndexOf('.'));
+
+ if (filePhotos.containsKey(title)) {
+ Photo p = filePhotos.get(title);
+ if (p.getDatePosted() != null) {
+ return (smp.format(p.getDatePosted()));
+ }
+ }
+
+ return "";
+ }
+
+ private void getSetPhotos(String setName) throws FlickrException {
+ // Check if this is an existing set. If it is get all the photo list to avoid reloading already
+ // loaded photos.
+ ArrayList setIdarr;
+ setIdarr = setNameToId.get(setName);
+ if (setIdarr != null) {
+ setid = setIdarr.get(0);
+ PhotosetsInterface pi = flickr.getPhotosetsInterface();
+
+ Set extras = new HashSet();
+ /**
+ * A comma-delimited 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_o
+ */
+
+ extras.add("date_upload");
+ extras.add("original_format");
+ extras.add("media");
+ // extras.add("url_o");
+ extras.add("tags");
+
+ int setPage = 1;
+ while (true) {
+ PhotoList tmpSet = pi.getPhotos(setid, extras, Flickr.PRIVACY_LEVEL_NO_FILTER, 500, setPage);
+
+ int tmpSetSize = tmpSet.size();
+ photos.addAll(tmpSet);
+ if (tmpSetSize < 500) {
+ break;
+ }
+ setPage++;
+ }
+ for (int i = 0; i < photos.size(); i++) {
+ filePhotos.put(photos.get(i).getTitle(), photos.get(i));
+ }
+ if (flickrDebug) {
+ logger.debug("Set title: " + setName + " id: " + setid + " found");
+ logger.debug(" Photos in Set already loaded: " + photos.size());
+ }
+ }
+ }
+
+ public void addPhotoToSet(String photoid, String setName) throws Exception {
+
+ ArrayList setIdarr;
+
+ // all_set_maps.
+
+ PhotosetsInterface psetsInterface = flickr.getPhotosetsInterface();
+
+ Photoset set = null;
+
+ if (setid == null) {
+ // In case it is a new photo-set.
+ setIdarr = setNameToId.get(setName);
+ if (setIdarr == null) {
+ // setIdarr should be null since we checked it getSetPhotos.
+ // Create the new set.
+ // set the setid .
+
+ String description = "";
+ set = psetsInterface.create(setName, description, photoid);
+ setid = set.getId();
+
+ setIdarr = new ArrayList();
+ setIdarr.add(new String(setid));
+ setNameToId.put(setName, setIdarr);
+
+ allSetsMap.put(set.getId(), set);
+ }
+ } else {
+ set = allSetsMap.get(setid);
+ psetsInterface.addPhoto(setid, photoid);
+ }
+ // Add to photos .
+
+ // Add Photo to existing set.
+ PhotosInterface photoInt = flickr.getPhotosInterface();
+ Photo p = photoInt.getPhoto(photoid);
+ if (p != null) {
+ photos.add(p);
+ String title;
+ if (basefilename.lastIndexOf('.') > 0)
+ title = basefilename.substring(0, basefilename.lastIndexOf('.'));
+ else
+ title = p.getTitle();
+ filePhotos.put(title, p);
+ }
+ }
+}
diff --git a/Flickr4Java/src/examples/resources/setup.properties.example b/src/examples/resources/setup.properties.example
similarity index 100%
rename from Flickr4Java/src/examples/resources/setup.properties.example
rename to src/examples/resources/setup.properties.example
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/Flickr.java b/src/main/java/com/flickr4java/flickr/Flickr.java
similarity index 92%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/Flickr.java
rename to src/main/java/com/flickr4java/flickr/Flickr.java
index 270c1d2f..7d06f5cd 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/Flickr.java
+++ b/src/main/java/com/flickr4java/flickr/Flickr.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr;
import com.flickr4java.flickr.activity.ActivityInterface;
@@ -14,6 +12,7 @@
import com.flickr4java.flickr.favorites.FavoritesInterface;
import com.flickr4java.flickr.galleries.GalleriesInterface;
import com.flickr4java.flickr.groups.GroupsInterface;
+import com.flickr4java.flickr.groups.discuss.GroupDiscussInterface;
import com.flickr4java.flickr.groups.members.MembersInterface;
import com.flickr4java.flickr.groups.pools.PoolsInterface;
import com.flickr4java.flickr.interestingness.InterestingnessInterface;
@@ -25,6 +24,7 @@
import com.flickr4java.flickr.photos.geo.GeoInterface;
import com.flickr4java.flickr.photos.licenses.LicensesInterface;
import com.flickr4java.flickr.photos.notes.NotesInterface;
+import com.flickr4java.flickr.photos.suggestions.SuggestionsInterface;
import com.flickr4java.flickr.photos.transform.TransformInterface;
import com.flickr4java.flickr.photos.upload.UploadInterface;
import com.flickr4java.flickr.photosets.PhotosetsInterface;
@@ -49,12 +49,12 @@
*
*
* The user who authenticates himself, can manage this permissions at his list of Third-party
- * applications (You -> Your account -> Extending Flickr -> Account Links -> edit).
+ * applications (You / Your account / Extending Flickr / Account Links / edit).
*
* @author Anthony Eden
* @version $Id: Flickr.java,v 1.45 2009/06/23 21:51:25 x-mago Exp $
*/
-public class Flickr {
+public class Flickr implements IFlickr {
/**
* The default endpoint host.
@@ -76,11 +76,6 @@ public class Flickr {
*/
public static boolean debugRequest = false;
- /**
- * If set to true, trace messages will be printed to STDOUT.
- */
- public static boolean tracing = false;
-
private String apiKey;
private String sharedSecret;
@@ -155,6 +150,10 @@ public class Flickr {
private CamerasInterface cameraInterface;
+ private SuggestionsInterface suggestionsInterface;
+
+ private GroupDiscussInterface discussionInterface;
+
/**
* @see com.flickr4java.flickr.photos.PhotosInterface#setContentType(String, String)
* @see com.flickr4java.flickr.prefs.PrefsInterface#getContentType()
@@ -290,6 +289,7 @@ public Flickr(String apiKey, String sharedSecret, Transport transport) {
*
* @return The API key
*/
+ @Override
public String getApiKey() {
return apiKey;
}
@@ -300,6 +300,7 @@ public String getApiKey() {
* @param apiKey
* The API key which cannot be null
*/
+ @Override
public void setApiKey(String apiKey) {
if (apiKey == null) {
throw new IllegalArgumentException("API key must not be null");
@@ -307,6 +308,7 @@ public void setApiKey(String apiKey) {
this.apiKey = apiKey;
}
+ @Override
public void setAuth(Auth auth) {
this.auth = auth;
}
@@ -316,6 +318,7 @@ public void setAuth(Auth auth) {
*
* @return The Auth-object
*/
+ @Override
public Auth getAuth() {
return auth;
}
@@ -325,6 +328,7 @@ public Auth getAuth() {
*
* @return The Shared-Secret
*/
+ @Override
public String getSharedSecret() {
return sharedSecret;
}
@@ -335,6 +339,7 @@ public String getSharedSecret() {
* @param sharedSecret
* The Shared-Secret which cannot be null
*/
+ @Override
public void setSharedSecret(String sharedSecret) {
if (sharedSecret == null) {
throw new IllegalArgumentException("Shared-Secret must not be null");
@@ -347,6 +352,7 @@ public void setSharedSecret(String sharedSecret) {
*
* @return The Tranport interface
*/
+ @Override
public Transport getTransport() {
return transport;
}
@@ -356,6 +362,7 @@ public Transport getTransport() {
*
* @param transport
*/
+ @Override
public void setTransport(Transport transport) {
if (transport == null) {
throw new IllegalArgumentException("Transport must not be null");
@@ -368,6 +375,7 @@ public void setTransport(Transport transport) {
*
* @return The AuthInterface
*/
+ @Override
public AuthInterface getAuthInterface() {
if (authInterface == null) {
authInterface = new AuthInterface(apiKey, sharedSecret, transport);
@@ -380,6 +388,7 @@ public AuthInterface getAuthInterface() {
*
* @return The ActivityInterface
*/
+ @Override
public ActivityInterface getActivityInterface() {
if (activityInterface == null) {
activityInterface = new ActivityInterface(apiKey, sharedSecret, transport);
@@ -387,6 +396,7 @@ public ActivityInterface getActivityInterface() {
return activityInterface;
}
+ @Override
public synchronized BlogsInterface getBlogsInterface() {
if (blogsInterface == null) {
blogsInterface = new BlogsInterface(apiKey, sharedSecret, transport);
@@ -394,6 +404,7 @@ public synchronized BlogsInterface getBlogsInterface() {
return blogsInterface;
}
+ @Override
public CommentsInterface getCommentsInterface() {
if (commentsInterface == null) {
commentsInterface = new CommentsInterface(apiKey, sharedSecret, transport);
@@ -401,6 +412,7 @@ public CommentsInterface getCommentsInterface() {
return commentsInterface;
}
+ @Override
public CommonsInterface getCommonsInterface() {
if (commonsInterface == null) {
commonsInterface = new CommonsInterface(apiKey, sharedSecret, transport);
@@ -408,6 +420,7 @@ public CommonsInterface getCommonsInterface() {
return commonsInterface;
}
+ @Override
public ContactsInterface getContactsInterface() {
if (contactsInterface == null) {
contactsInterface = new ContactsInterface(apiKey, sharedSecret, transport);
@@ -415,6 +428,7 @@ public ContactsInterface getContactsInterface() {
return contactsInterface;
}
+ @Override
public FavoritesInterface getFavoritesInterface() {
if (favoritesInterface == null) {
favoritesInterface = new FavoritesInterface(apiKey, sharedSecret, transport);
@@ -422,6 +436,7 @@ public FavoritesInterface getFavoritesInterface() {
return favoritesInterface;
}
+ @Override
public GeoInterface getGeoInterface() {
if (geoInterface == null) {
geoInterface = new GeoInterface(apiKey, sharedSecret, transport);
@@ -429,6 +444,7 @@ public GeoInterface getGeoInterface() {
return geoInterface;
}
+ @Override
public GroupsInterface getGroupsInterface() {
if (groupsInterface == null) {
groupsInterface = new GroupsInterface(apiKey, sharedSecret, transport);
@@ -439,6 +455,7 @@ public GroupsInterface getGroupsInterface() {
/**
* @return the interface to the flickr.interestingness methods
*/
+ @Override
public synchronized InterestingnessInterface getInterestingnessInterface() {
if (interestingnessInterface == null) {
interestingnessInterface = new InterestingnessInterface(apiKey, sharedSecret, transport);
@@ -446,6 +463,7 @@ public synchronized InterestingnessInterface getInterestingnessInterface() {
return interestingnessInterface;
}
+ @Override
public LicensesInterface getLicensesInterface() {
if (licensesInterface == null) {
licensesInterface = new LicensesInterface(apiKey, sharedSecret, transport);
@@ -453,6 +471,7 @@ public LicensesInterface getLicensesInterface() {
return licensesInterface;
}
+ @Override
public MachinetagsInterface getMachinetagsInterface() {
if (machinetagsInterface == null) {
machinetagsInterface = new MachinetagsInterface(apiKey, sharedSecret, transport);
@@ -460,6 +479,7 @@ public MachinetagsInterface getMachinetagsInterface() {
return machinetagsInterface;
}
+ @Override
public MembersInterface getMembersInterface() {
if (membersInterface == null) {
membersInterface = new MembersInterface(apiKey, sharedSecret, transport);
@@ -467,6 +487,7 @@ public MembersInterface getMembersInterface() {
return membersInterface;
}
+ @Override
public NotesInterface getNotesInterface() {
if (notesInterface == null) {
notesInterface = new NotesInterface(apiKey, sharedSecret, transport);
@@ -474,6 +495,7 @@ public NotesInterface getNotesInterface() {
return notesInterface;
}
+ @Override
public PandaInterface getPandaInterface() {
if (pandaInterface == null) {
pandaInterface = new PandaInterface(apiKey, sharedSecret, transport);
@@ -481,6 +503,7 @@ public PandaInterface getPandaInterface() {
return pandaInterface;
}
+ @Override
public PoolsInterface getPoolsInterface() {
if (poolsInterface == null) {
poolsInterface = new PoolsInterface(apiKey, sharedSecret, transport);
@@ -488,6 +511,7 @@ public PoolsInterface getPoolsInterface() {
return poolsInterface;
}
+ @Override
public PeopleInterface getPeopleInterface() {
if (peopleInterface == null) {
peopleInterface = new PeopleInterface(apiKey, sharedSecret, transport);
@@ -495,6 +519,7 @@ public PeopleInterface getPeopleInterface() {
return peopleInterface;
}
+ @Override
public PhotosInterface getPhotosInterface() {
if (photosInterface == null) {
photosInterface = new PhotosInterface(apiKey, sharedSecret, transport);
@@ -502,6 +527,7 @@ public PhotosInterface getPhotosInterface() {
return photosInterface;
}
+ @Override
public PhotosetsCommentsInterface getPhotosetsCommentsInterface() {
if (photosetsCommentsInterface == null) {
photosetsCommentsInterface = new PhotosetsCommentsInterface(apiKey, sharedSecret, transport);
@@ -509,6 +535,7 @@ public PhotosetsCommentsInterface getPhotosetsCommentsInterface() {
return photosetsCommentsInterface;
}
+ @Override
public PhotosetsInterface getPhotosetsInterface() {
if (photosetsInterface == null) {
photosetsInterface = new PhotosetsInterface(apiKey, sharedSecret, transport);
@@ -516,6 +543,7 @@ public PhotosetsInterface getPhotosetsInterface() {
return photosetsInterface;
}
+ @Override
public CollectionsInterface getCollectionsInterface() {
if (collectionsInterface == null) {
collectionsInterface = new CollectionsInterface(apiKey, sharedSecret, transport);
@@ -523,6 +551,7 @@ public CollectionsInterface getCollectionsInterface() {
return collectionsInterface;
}
+ @Override
public PlacesInterface getPlacesInterface() {
if (placesInterface == null) {
placesInterface = new PlacesInterface(apiKey, sharedSecret, transport);
@@ -530,6 +559,7 @@ public PlacesInterface getPlacesInterface() {
return placesInterface;
}
+ @Override
public PrefsInterface getPrefsInterface() {
if (prefsInterface == null) {
prefsInterface = new PrefsInterface(apiKey, sharedSecret, transport);
@@ -537,6 +567,7 @@ public PrefsInterface getPrefsInterface() {
return prefsInterface;
}
+ @Override
public ReflectionInterface getReflectionInterface() {
if (reflectionInterface == null) {
reflectionInterface = new ReflectionInterface(apiKey, sharedSecret, transport);
@@ -549,6 +580,7 @@ public ReflectionInterface getReflectionInterface() {
*
* @return The TagsInterface
*/
+ @Override
public TagsInterface getTagsInterface() {
if (tagsInterface == null) {
tagsInterface = new TagsInterface(apiKey, sharedSecret, transport);
@@ -556,6 +588,7 @@ public TagsInterface getTagsInterface() {
return tagsInterface;
}
+ @Override
public TestInterface getTestInterface() {
if (testInterface == null) {
testInterface = new TestInterface(apiKey, sharedSecret, transport);
@@ -563,6 +596,7 @@ public TestInterface getTestInterface() {
return testInterface;
}
+ @Override
public TransformInterface getTransformInterface() {
if (transformInterface == null) {
transformInterface = new TransformInterface(apiKey, sharedSecret, transport);
@@ -570,6 +604,7 @@ public TransformInterface getTransformInterface() {
return transformInterface;
}
+ @Override
public UploadInterface getUploadInterface() {
if (uploadInterface == null) {
uploadInterface = new UploadInterface(apiKey, sharedSecret, transport);
@@ -577,6 +612,7 @@ public UploadInterface getUploadInterface() {
return uploadInterface;
}
+ @Override
public Uploader getUploader() {
if (uploader == null) {
uploader = new Uploader(apiKey, sharedSecret);
@@ -584,6 +620,7 @@ public Uploader getUploader() {
return uploader;
}
+ @Override
public UrlsInterface getUrlsInterface() {
if (urlsInterface == null) {
urlsInterface = new UrlsInterface(apiKey, sharedSecret, transport);
@@ -591,6 +628,7 @@ public UrlsInterface getUrlsInterface() {
return urlsInterface;
}
+ @Override
public GalleriesInterface getGalleriesInterface() {
if (galleriesInterface == null) {
galleriesInterface = new GalleriesInterface(apiKey, sharedSecret, transport);
@@ -598,6 +636,7 @@ public GalleriesInterface getGalleriesInterface() {
return galleriesInterface;
}
+ @Override
public StatsInterface getStatsInterface() {
if (statsInterface == null) {
statsInterface = new StatsInterface(apiKey, sharedSecret, transport);
@@ -605,6 +644,7 @@ public StatsInterface getStatsInterface() {
return statsInterface;
}
+ @Override
public CamerasInterface getCamerasInterface() {
if (cameraInterface == null) {
cameraInterface = new CamerasInterface(apiKey, sharedSecret, transport);
@@ -612,4 +652,31 @@ public CamerasInterface getCamerasInterface() {
return cameraInterface;
}
+ /**
+ * Get the SuggestionsInterface.
+ *
+ * @return The SuggestionsInterface
+ */
+ @Override
+ public SuggestionsInterface getSuggestionsInterface() {
+ if (suggestionsInterface == null) {
+ suggestionsInterface = new SuggestionsInterface(apiKey, sharedSecret, transport);
+ }
+ return suggestionsInterface;
+ }
+
+ /**
+ * Get the GroupDiscussInterface.
+ *
+ * @return The GroupDiscussInterface
+ */
+
+ @Override
+ public GroupDiscussInterface getDiscussionInterface() {
+ if (discussionInterface == null) {
+ discussionInterface = new GroupDiscussInterface(apiKey, sharedSecret, transport);
+ }
+ return discussionInterface;
+ }
+
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/FlickrException.java b/src/main/java/com/flickr4java/flickr/FlickrException.java
similarity index 91%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/FlickrException.java
rename to src/main/java/com/flickr4java/flickr/FlickrException.java
index 40a2b243..56d13c43 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/FlickrException.java
+++ b/src/main/java/com/flickr4java/flickr/FlickrException.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr;
/**
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/FlickrRuntimeException.java b/src/main/java/com/flickr4java/flickr/FlickrRuntimeException.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/FlickrRuntimeException.java
rename to src/main/java/com/flickr4java/flickr/FlickrRuntimeException.java
diff --git a/src/main/java/com/flickr4java/flickr/IFlickr.java b/src/main/java/com/flickr4java/flickr/IFlickr.java
new file mode 100644
index 00000000..3e25530a
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/IFlickr.java
@@ -0,0 +1,126 @@
+package com.flickr4java.flickr;
+
+import com.flickr4java.flickr.activity.ActivityInterface;
+import com.flickr4java.flickr.auth.Auth;
+import com.flickr4java.flickr.auth.AuthInterface;
+import com.flickr4java.flickr.blogs.BlogsInterface;
+import com.flickr4java.flickr.cameras.CamerasInterface;
+import com.flickr4java.flickr.collections.CollectionsInterface;
+import com.flickr4java.flickr.commons.CommonsInterface;
+import com.flickr4java.flickr.contacts.ContactsInterface;
+import com.flickr4java.flickr.favorites.FavoritesInterface;
+import com.flickr4java.flickr.galleries.GalleriesInterface;
+import com.flickr4java.flickr.groups.GroupsInterface;
+import com.flickr4java.flickr.groups.discuss.GroupDiscussInterface;
+import com.flickr4java.flickr.groups.members.MembersInterface;
+import com.flickr4java.flickr.groups.pools.PoolsInterface;
+import com.flickr4java.flickr.interestingness.InterestingnessInterface;
+import com.flickr4java.flickr.machinetags.MachinetagsInterface;
+import com.flickr4java.flickr.panda.PandaInterface;
+import com.flickr4java.flickr.people.PeopleInterface;
+import com.flickr4java.flickr.photos.PhotosInterface;
+import com.flickr4java.flickr.photos.comments.CommentsInterface;
+import com.flickr4java.flickr.photos.geo.GeoInterface;
+import com.flickr4java.flickr.photos.licenses.LicensesInterface;
+import com.flickr4java.flickr.photos.notes.NotesInterface;
+import com.flickr4java.flickr.photos.suggestions.SuggestionsInterface;
+import com.flickr4java.flickr.photos.transform.TransformInterface;
+import com.flickr4java.flickr.photos.upload.UploadInterface;
+import com.flickr4java.flickr.photosets.PhotosetsInterface;
+import com.flickr4java.flickr.photosets.comments.PhotosetsCommentsInterface;
+import com.flickr4java.flickr.places.PlacesInterface;
+import com.flickr4java.flickr.prefs.PrefsInterface;
+import com.flickr4java.flickr.reflection.ReflectionInterface;
+import com.flickr4java.flickr.stats.StatsInterface;
+import com.flickr4java.flickr.tags.TagsInterface;
+import com.flickr4java.flickr.test.TestInterface;
+import com.flickr4java.flickr.uploader.Uploader;
+import com.flickr4java.flickr.urls.UrlsInterface;
+
+public interface IFlickr {
+ String getApiKey();
+
+ void setApiKey(String apiKey);
+
+ void setAuth(Auth auth);
+
+ Auth getAuth();
+
+ String getSharedSecret();
+
+ void setSharedSecret(String sharedSecret);
+
+ Transport getTransport();
+
+ void setTransport(Transport transport);
+
+ AuthInterface getAuthInterface();
+
+ ActivityInterface getActivityInterface();
+
+ BlogsInterface getBlogsInterface();
+
+ CommentsInterface getCommentsInterface();
+
+ CommonsInterface getCommonsInterface();
+
+ ContactsInterface getContactsInterface();
+
+ FavoritesInterface getFavoritesInterface();
+
+ GeoInterface getGeoInterface();
+
+ GroupsInterface getGroupsInterface();
+
+ InterestingnessInterface getInterestingnessInterface();
+
+ LicensesInterface getLicensesInterface();
+
+ MachinetagsInterface getMachinetagsInterface();
+
+ MembersInterface getMembersInterface();
+
+ NotesInterface getNotesInterface();
+
+ PandaInterface getPandaInterface();
+
+ PoolsInterface getPoolsInterface();
+
+ PeopleInterface getPeopleInterface();
+
+ PhotosInterface getPhotosInterface();
+
+ PhotosetsCommentsInterface getPhotosetsCommentsInterface();
+
+ PhotosetsInterface getPhotosetsInterface();
+
+ CollectionsInterface getCollectionsInterface();
+
+ PlacesInterface getPlacesInterface();
+
+ PrefsInterface getPrefsInterface();
+
+ ReflectionInterface getReflectionInterface();
+
+ TagsInterface getTagsInterface();
+
+ TestInterface getTestInterface();
+
+ TransformInterface getTransformInterface();
+
+ UploadInterface getUploadInterface();
+
+ Uploader getUploader();
+
+ UrlsInterface getUrlsInterface();
+
+ GalleriesInterface getGalleriesInterface();
+
+ StatsInterface getStatsInterface();
+
+ CamerasInterface getCamerasInterface();
+
+ SuggestionsInterface getSuggestionsInterface();
+
+ GroupDiscussInterface getDiscussionInterface();
+}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/Parameter.java b/src/main/java/com/flickr4java/flickr/Parameter.java
similarity index 84%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/Parameter.java
rename to src/main/java/com/flickr4java/flickr/Parameter.java
index 54dd321f..e292cc6e 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/Parameter.java
+++ b/src/main/java/com/flickr4java/flickr/Parameter.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr;
/**
@@ -29,7 +27,7 @@ public Parameter(String name, Object value) {
public Parameter(String name, long value) {
this.name = name;
- this.value = new Long(value);
+ this.value = value;
}
public String getName() {
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/ProxyAuthenticator.java b/src/main/java/com/flickr4java/flickr/ProxyAuthenticator.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/ProxyAuthenticator.java
rename to src/main/java/com/flickr4java/flickr/ProxyAuthenticator.java
diff --git a/src/main/java/com/flickr4java/flickr/REST.java b/src/main/java/com/flickr4java/flickr/REST.java
new file mode 100644
index 00000000..785f4318
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/REST.java
@@ -0,0 +1,381 @@
+
+package com.flickr4java.flickr;
+
+import com.flickr4java.flickr.auth.Auth;
+import com.flickr4java.flickr.uploader.Payload;
+import com.flickr4java.flickr.uploader.UploadMetaData;
+import com.flickr4java.flickr.util.DebugInputStream;
+import com.flickr4java.flickr.util.IOUtilities;
+import com.flickr4java.flickr.util.OAuthUtilities;
+import com.flickr4java.flickr.util.UrlUtilities;
+import com.github.scribejava.core.httpclient.multipart.FileByteArrayBodyPartPayload;
+import com.github.scribejava.core.model.OAuth1AccessToken;
+import com.github.scribejava.core.model.OAuthRequest;
+import com.github.scribejava.core.model.Parameter;
+import com.github.scribejava.core.model.Verb;
+import com.github.scribejava.core.oauth.OAuth10aService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Transport implementation using the REST interface.
+ *
+ * @author Anthony Eden
+ * @version $Id: REST.java,v 1.26 2009/07/01 22:07:08 x-mago Exp $
+ */
+public class REST extends Transport {
+
+ private static final Logger logger = LoggerFactory.getLogger(REST.class);
+
+ private static final String PATH = "/services/rest/";
+
+ /**
+ * Error code from Flickr API when the service is unavailable.
+ */
+ private static final String FLICKR_SERVICE_UNAVAILABLE = "105";
+
+ private boolean proxyAuth = false;
+
+ private String proxyUser = "";
+
+ private String proxyPassword = "";
+
+ private String userAgent = "Flickr4Java/3.x";
+
+ private Integer connectTimeoutMs;
+
+ private Integer readTimeoutMs;
+
+ /**
+ * Construct a new REST transport instance.
+ */
+ public REST() {
+ setTransportType(REST);
+ setHost(API_HOST);
+ setPath(PATH);
+ setScheme(DEFAULT_SCHEME);
+ setResponseClass(RESTResponse.class);
+ }
+
+ /**
+ * Construct a new REST transport instance using the specified host endpoint.
+ *
+ * @param host The host endpoint
+ */
+ public REST(String host) {
+ this();
+ setHost(host);
+ }
+
+ /**
+ * Construct a new REST transport instance using the specified host and port endpoint.
+ *
+ * @param host The host endpoint
+ * @param port The port
+ */
+ public REST(String host, int port) {
+ this();
+ setHost(host);
+ setPort(port);
+ }
+
+ /**
+ * Set a proxy for REST-requests.
+ *
+ * @param proxyHost
+ * @param proxyPort
+ */
+ public void setProxy(String proxyHost, int proxyPort) {
+ System.setProperty("http.proxySet", "true");
+ System.setProperty("http.proxyHost", proxyHost);
+ System.setProperty("http.proxyPort", "" + proxyPort);
+ System.setProperty("https.proxyHost", proxyHost);
+ System.setProperty("https.proxyPort", "" + proxyPort);
+ }
+
+ /**
+ * Set a proxy with authentication for REST-requests.
+ *
+ * @param proxyHost
+ * @param proxyPort
+ * @param username
+ * @param password
+ */
+ public void setProxy(String proxyHost, int proxyPort, String username, String password) {
+ setProxy(proxyHost, proxyPort);
+ proxyAuth = true;
+ proxyUser = username;
+ proxyPassword = password;
+ }
+
+ /**
+ * Override the default User-Agent header passed in requests to the Flickr API.
+ * @param userAgent
+ * @return
+ */
+ public REST setUserAgent(String userAgent) {
+ this.userAgent = userAgent;
+ return this;
+ }
+
+ /**
+ * Invoke an HTTP GET request on a remote host. You must close the InputStream after you are done with.
+ *
+ * @param path The request path
+ * @param parameters The parameters (collection of Parameter objects)
+ * @return The Response
+ */
+ @Override
+ public com.flickr4java.flickr.Response get(String path, Map parameters, String apiKey, String sharedSecret) throws FlickrException {
+
+ OAuthRequest request = new OAuthRequest(Verb.GET, buildUrl(path));
+ for (Map.Entry entry : parameters.entrySet()) {
+ request.addQuerystringParameter(entry.getKey(), String.valueOf(entry.getValue()));
+ }
+
+ if (proxyAuth) {
+ request.addHeader("Proxy-Authorization", "Basic " + getProxyCredentials());
+ }
+
+ request.addHeader("User-Agent", userAgent);
+
+ RequestContext requestContext = RequestContext.getRequestContext();
+ Auth auth = requestContext.getAuth();
+ OAuth10aService service = OAuthUtilities.createOAuthService(apiKey, sharedSecret, connectTimeoutMs, readTimeoutMs);
+ if (auth != null) {
+ OAuth1AccessToken requestToken = new OAuth1AccessToken(auth.getToken(), auth.getTokenSecret());
+ service.signRequest(requestToken, request);
+ } else {
+ // For calls that do not require authorization e.g. flickr.people.findByUsername which could be the
+ // first call if the user did not supply the user-id (i.e. nsid).
+ if (!parameters.containsKey(Flickr.API_KEY)) {
+ request.addQuerystringParameter(Flickr.API_KEY, apiKey);
+ }
+ }
+
+ if (Flickr.debugRequest) {
+ logger.debug("GET: " + request.getCompleteUrl());
+ }
+
+ try {
+ return handleResponse(request, service);
+ } catch (ReflectiveOperationException | SAXException | IOException | InterruptedException | ExecutionException | ParserConfigurationException e) {
+ throw new FlickrRuntimeException(e);
+ }
+ }
+
+ /**
+ * Invoke an HTTP POST request on a remote host.
+ *
+ * @param path The request path
+ * @param parameters The parameters (collection of Parameter objects)
+ * @return The Response object
+ */
+ @Override
+ public com.flickr4java.flickr.Response post(String path, Map parameters, String apiKey, String sharedSecret) throws FlickrException {
+
+ OAuthRequest request = OAuthUtilities.buildNormalPostRequest(parameters, buildUrl(path));
+
+ request.addHeader("User-Agent", userAgent);
+
+ OAuth10aService service = createAndSignRequest(apiKey, sharedSecret, request);
+
+ try {
+ return handleResponse(request, service);
+ } catch (ReflectiveOperationException | InterruptedException | ExecutionException | IOException | SAXException | ParserConfigurationException e) {
+ throw new FlickrRuntimeException(e);
+ }
+ }
+
+ /**
+ * Invoke an HTTP POST request on a remote host.
+ *
+ * @param path The request path
+ * @param metaData The parameters (collection of Parameter objects)
+ * @param payload
+ * @return The Response object
+ */
+ @Override
+ public com.flickr4java.flickr.Response postMultiPart(String path, UploadMetaData metaData, Payload payload, String apiKey, String sharedSecret) throws FlickrException {
+
+ Map uploadParameters = new HashMap<>(metaData.getUploadParameters());
+ OAuthRequest request = OAuthUtilities.buildMultipartRequest(uploadParameters, buildUrl(path));
+
+ request.addHeader("User-Agent", userAgent);
+
+ OAuth10aService service = createAndSignRequest(apiKey, sharedSecret, request);
+
+ // Ensure all parameters (including oauth) are added to payload so signature matches
+ uploadParameters.putAll(request.getOauthParameters());
+
+ request.addBodyPartPayloadInMultipartPayload(new FileByteArrayBodyPartPayload(payload.getPayload(), "photo", metaData.getFilename()));
+ uploadParameters.forEach((param, uploadPayload) -> request.addBodyPartPayloadInMultipartPayload(new FileByteArrayBodyPartPayload(uploadPayload.getBytes(), param)));
+
+ try {
+ return handleResponse(request, service);
+ } catch (ReflectiveOperationException | InterruptedException | ExecutionException | IOException | SAXException | ParserConfigurationException e) {
+ throw new FlickrRuntimeException(e);
+ }
+ }
+
+ private OAuth10aService createAndSignRequest(String apiKey, String sharedSecret, OAuthRequest request) {
+ OAuth10aService service = OAuthUtilities.createOAuthService(apiKey, sharedSecret, connectTimeoutMs, readTimeoutMs);
+ OAuthUtilities.signRequest(service, request, proxyAuth ? getProxyCredentials() : null);
+ return service;
+ }
+
+ private String buildUrl(String path) {
+ return String.format("%s://%s%s", getScheme(), getHost(), path);
+ }
+
+ private Response handleResponse(OAuthRequest request, OAuth10aService service) throws InterruptedException, ExecutionException, IOException, SAXException, ParserConfigurationException, FlickrException, ReflectiveOperationException {
+ com.github.scribejava.core.model.Response scribeResponse = service.execute(request);
+
+ if (!scribeResponse.isSuccessful()) {
+ throw new FlickrException(FLICKR_SERVICE_UNAVAILABLE, String.format("Received '%s' error from Flickr with status %d", scribeResponse.getMessage(), scribeResponse.getCode()));
+ }
+ String strXml = scribeResponse.getBody().trim();
+ if (Flickr.debugStream) {
+ logger.debug(strXml);
+ }
+ if (strXml.startsWith("oauth_problem=")) {
+ throw new FlickrRuntimeException(strXml);
+ }
+
+ DocumentBuilder builder = getDocumentBuilder();
+ Document document = builder.parse(new InputSource(new StringReader(strXml)));
+ Response f4jResponse = (Response) responseClass.getConstructor().newInstance();
+ f4jResponse.parse(document);
+
+ // Enable this method to update the test payloads
+ // dumpResponseToFile(request, strXml);
+
+ return f4jResponse;
+ }
+
+ /**
+ * Invoke a non OAuth HTTP GET request on a remote host.
+ *
+ * This is only used for the Flickr OAuth methods checkToken and getAccessToken.
+ *
+ * @param path The request path
+ * @param parameters The parameters
+ * @return The Response
+ */
+ @Override
+ public Response getNonOAuth(String path, Map parameters) {
+ InputStream in = null;
+ try {
+ URL url = UrlUtilities.buildUrl(getScheme(), getHost(), getPort(), path, parameters);
+ if (Flickr.debugRequest) {
+ logger.debug("GET: " + url);
+ }
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestMethod("GET");
+ if (proxyAuth) {
+ conn.setRequestProperty("Proxy-Authorization", "Basic " + getProxyCredentials());
+ }
+
+ conn.setRequestProperty("User-Agent", userAgent);
+
+ setTimeouts(conn);
+ conn.connect();
+
+ if (Flickr.debugStream) {
+ in = new DebugInputStream(conn.getInputStream(), System.out);
+ } else {
+ in = conn.getInputStream();
+ }
+
+ Response response;
+ DocumentBuilder builder = getDocumentBuilder();
+ Document document = builder.parse(in);
+ response = (Response) responseClass.newInstance();
+ response.parse(document);
+
+ return response;
+ } catch (IllegalAccessException | SAXException | IOException | InstantiationException | ParserConfigurationException e) {
+ throw new FlickrRuntimeException(e);
+ } finally {
+ IOUtilities.close(in);
+ }
+ }
+
+ public boolean isProxyAuth() {
+ return proxyAuth;
+ }
+
+ /**
+ * Generates Base64-encoded credentials from locally stored username and password.
+ *
+ * @return credentials
+ */
+ public String getProxyCredentials() {
+ return new String(Base64.getEncoder().encode((proxyUser + ":" + proxyPassword).getBytes()));
+ }
+
+ private void setTimeouts(HttpURLConnection conn) {
+ if (connectTimeoutMs != null) {
+ conn.setConnectTimeout(connectTimeoutMs);
+ }
+ if (readTimeoutMs != null) {
+ conn.setReadTimeout(readTimeoutMs);
+ }
+ }
+
+ public void setConnectTimeoutMs(Integer connectTimeoutMs) {
+ this.connectTimeoutMs = connectTimeoutMs;
+ }
+
+ public void setReadTimeoutMs(Integer readTimeoutMs) {
+ this.readTimeoutMs = readTimeoutMs;
+ }
+
+ private DocumentBuilder getDocumentBuilder() throws ParserConfigurationException {
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ return builderFactory.newDocumentBuilder();
+ }
+
+ // Generate responses for offline tests
+
+ private void dumpResponseToFile(OAuthRequest request, String strXml) throws IOException {
+ Verb verb = request.getVerb();
+ Optional flickrMethod = Optional.empty();
+ switch (verb) {
+ case GET:
+ flickrMethod = request.getQueryStringParams().getParams().stream().filter(param -> param.getKey().equals("method")).findFirst().map(Parameter::getValue);
+ break;
+ case POST:
+ flickrMethod = request.getBodyParams().getParams().stream().filter(param -> param.getKey().equals("method")).findFirst().map(Parameter::getValue);
+ break;
+ }
+ if (flickrMethod.isPresent()) {
+ String filename = String.format("%s.xml", flickrMethod.get());
+ Path filePath = Paths.get("src/test/resources/payloads/" + verb, filename);
+ Files.write(filePath, strXml.getBytes());
+ logger.info(String.format("Writing payload to file '%s'", filePath));
+ } else {
+ logger.warn("Not dumping response to file as method not found in request for URL {}", request.getUrl());
+ }
+ }
+}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/RESTResponse.java b/src/main/java/com/flickr4java/flickr/RESTResponse.java
similarity index 93%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/RESTResponse.java
rename to src/main/java/com/flickr4java/flickr/RESTResponse.java
index 719b5c3a..e35da74d 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/RESTResponse.java
+++ b/src/main/java/com/flickr4java/flickr/RESTResponse.java
@@ -1,15 +1,13 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr;
-import java.util.Collection;
-import java.util.List;
+import com.flickr4java.flickr.util.XMLUtilities;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import com.flickr4java.flickr.util.XMLUtilities;
+import java.util.Collection;
+import java.util.List;
/**
* Flickr Response object.
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/RequestContext.java b/src/main/java/com/flickr4java/flickr/RequestContext.java
similarity index 92%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/RequestContext.java
rename to src/main/java/com/flickr4java/flickr/RequestContext.java
index 1ef52e27..030b0b63 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/RequestContext.java
+++ b/src/main/java/com/flickr4java/flickr/RequestContext.java
@@ -1,14 +1,12 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr;
+import com.flickr4java.flickr.auth.Auth;
+
import java.util.ArrayList;
import java.util.List;
-import com.flickr4java.flickr.auth.Auth;
-
/**
* A thread local variable used to hold contextual information used in requests. To get an instance of this class use RequestContext.getRequestContext(). The
* method will return a RequestContext object which is only usable within the current thread.
@@ -31,7 +29,7 @@ public class RequestContext {
* @return The RequestContext
*/
public static RequestContext getRequestContext() {
- return (RequestContext) threadLocal.get();
+ return threadLocal.get();
}
public Auth getAuth() {
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/Response.java b/src/main/java/com/flickr4java/flickr/Response.java
similarity index 84%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/Response.java
rename to src/main/java/com/flickr4java/flickr/Response.java
index eaa9445c..6b37a11b 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/Response.java
+++ b/src/main/java/com/flickr4java/flickr/Response.java
@@ -1,14 +1,12 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
-package com.flickr4java.flickr;
-import java.util.Collection;
+package com.flickr4java.flickr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import java.util.Collection;
+
/**
* @author Anthony Eden
*/
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/SearchResultList.java b/src/main/java/com/flickr4java/flickr/SearchResultList.java
similarity index 92%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/SearchResultList.java
rename to src/main/java/com/flickr4java/flickr/SearchResultList.java
index b5ec5e21..61af8d2e 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/SearchResultList.java
+++ b/src/main/java/com/flickr4java/flickr/SearchResultList.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr;
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/Transport.java b/src/main/java/com/flickr4java/flickr/Transport.java
similarity index 60%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/Transport.java
rename to src/main/java/com/flickr4java/flickr/Transport.java
index 6eaddced..162db44c 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/Transport.java
+++ b/src/main/java/com/flickr4java/flickr/Transport.java
@@ -1,13 +1,15 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr;
+import com.flickr4java.flickr.uploader.Payload;
+import com.flickr4java.flickr.uploader.UploadMetaData;
+
import java.util.Map;
/**
- * The abstract Transport class provides a common interface for transporting requests to the Flickr servers. Flickr offers several transport methods including
- * REST, SOAP and XML-RPC. Flickr4Java currently implements the REST transport and work is being done to include the SOAP transport.
+ * The abstract Transport class provides a common interface for transporting requests to the Flickr servers.
+ * Flickr offers several transport methods including REST, SOAP and XML-RPC.
+ * Flickr4Java currently implements the REST transport.
*
* @author Matt Ray
* @author Anthony Eden
@@ -16,10 +18,15 @@ public abstract class Transport {
public static final String REST = "REST";
- public static final String SOAP = "SOAP";
+ protected static final String API_HOST = "api.flickr.com";
- protected static final String API_HOST = "http://api.flickr.com";
+ /**
+ * Host is different for upload, need to set it from Uploader.java.
+ */
+ public static final String UPLOAD_API_HOST = "up.flickr.com";
+ protected static final String DEFAULT_SCHEME = "https";
+
private String transportType;
protected Class> responseClass;
@@ -28,7 +35,9 @@ public abstract class Transport {
private String host;
- private int port = 80;
+ private int port = 443;
+
+ private String scheme;
public String getHost() {
return host;
@@ -62,6 +71,14 @@ public void setPath(String path) {
this.path = path;
}
+ public String getScheme() {
+ return scheme;
+ }
+
+ public void setScheme(String scheme) {
+ this.scheme = scheme;
+ }
+
/**
* Invoke an HTTP GET request on a remote host. You must close the InputStream after you are done with.
*
@@ -69,11 +86,12 @@ public void setPath(String path) {
* The request path
* @param parameters
* The parameters (collection of Parameter objects)
+ * @param apiKey
* @param sharedSecret
* @return The Response
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
- public abstract Response get(String path, Map parameters, String sharedSecret) throws FlickrException;
+ public abstract Response get(String path, Map parameters, String apiKey, String sharedSecret) throws FlickrException;
/**
* Invoke an HTTP POST request on a remote host.
@@ -82,27 +100,27 @@ public void setPath(String path) {
* The request path
* @param parameters
* The parameters (List of Parameter objects)
+ * @param apiKey
* @param sharedSecret
* @return The Response object
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
- public abstract Response post(String path, Map parameters, String sharedSecret, boolean multipart) throws FlickrException;
+ public abstract Response post(String path, Map parameters, String apiKey, String sharedSecret) throws FlickrException;
/**
- * Invoke an HTTP POST request on a remote host.
- *
+ * Invoke an HTTP POST multipart request on a remote host.
+ *
* @param path
* The request path
* @param parameters
* The parameters (List of Parameter objects)
+ * @param payload
+ * @param apiKey
* @param sharedSecret
* @return The Response object
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
- public Response post(String path, Map parameters, String sharedSecret) throws FlickrException {
-
- return post(path, parameters, sharedSecret, false);
- }
+ public abstract Response postMultiPart(String path, UploadMetaData parameters, Payload payload, String apiKey, String sharedSecret) throws FlickrException;
/**
* Invoke a non OAuth HTTP GET request on a remote host.
@@ -114,9 +132,9 @@ public Response post(String path, Map parameters, String sharedS
* @param parameters
* The parameters
* @return The Response
- * @throws FlickrException
+ * @throws FlickrRuntimeException
*/
- public abstract Response getNonOAuth(String path, Map parameters) throws FlickrException;
+ public abstract Response getNonOAuth(String path, Map parameters) throws FlickrRuntimeException;
public void setResponseClass(Class> responseClass) {
if (responseClass == null) {
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/activity/ActivityInterface.java b/src/main/java/com/flickr4java/flickr/activity/ActivityInterface.java
similarity index 94%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/activity/ActivityInterface.java
rename to src/main/java/com/flickr4java/flickr/activity/ActivityInterface.java
index d13f4e33..0dacaa5a 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/activity/ActivityInterface.java
+++ b/src/main/java/com/flickr4java/flickr/activity/ActivityInterface.java
@@ -1,20 +1,19 @@
package com.flickr4java.flickr.activity;
+import com.flickr4java.flickr.FlickrException;
+import com.flickr4java.flickr.Response;
+import com.flickr4java.flickr.Transport;
+import com.flickr4java.flickr.util.XMLUtilities;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import com.flickr4java.flickr.Flickr;
-import com.flickr4java.flickr.FlickrException;
-import com.flickr4java.flickr.Response;
-import com.flickr4java.flickr.Transport;
-import com.flickr4java.flickr.util.XMLUtilities;
-
/**
* Gather activity information belonging to the calling user.
*
@@ -46,13 +45,12 @@ public ActivityInterface(String apiKey, String sharedSecret, Transport transport
* @param perPage
* @param page
* @return ItemList
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public ItemList userComments(int perPage, int page) throws FlickrException {
ItemList items = new ItemList();
Map parameters = new HashMap();
parameters.put("method", METHOD_USER_COMMENTS);
- parameters.put(Flickr.API_KEY, apiKey);
if (perPage > 0) {
parameters.put("per_page", "" + perPage);
@@ -62,7 +60,7 @@ public ItemList userComments(int perPage, int page) throws FlickrException
parameters.put("page", "" + page);
}
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -90,13 +88,12 @@ public ItemList userComments(int perPage, int page) throws FlickrException
* @param page
* @param timeframe
* @return ItemList
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public ItemList userPhotos(int perPage, int page, String timeframe) throws FlickrException {
ItemList items = new ItemList();
Map parameters = new HashMap();
parameters.put("method", METHOD_USER_PHOTOS);
- parameters.put(Flickr.API_KEY, apiKey);
if (perPage > 0) {
parameters.put("per_page", "" + perPage);
@@ -114,7 +111,7 @@ public ItemList userPhotos(int perPage, int page, String timeframe) throws
}
}
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/activity/Event.java b/src/main/java/com/flickr4java/flickr/activity/Event.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/activity/Event.java
rename to src/main/java/com/flickr4java/flickr/activity/Event.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/activity/Item.java b/src/main/java/com/flickr4java/flickr/activity/Item.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/activity/Item.java
rename to src/main/java/com/flickr4java/flickr/activity/Item.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/activity/ItemList.java b/src/main/java/com/flickr4java/flickr/activity/ItemList.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/activity/ItemList.java
rename to src/main/java/com/flickr4java/flickr/activity/ItemList.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/auth/Auth.java b/src/main/java/com/flickr4java/flickr/auth/Auth.java
similarity index 91%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/auth/Auth.java
rename to src/main/java/com/flickr4java/flickr/auth/Auth.java
index 32441bbf..44ea9e94 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/auth/Auth.java
+++ b/src/main/java/com/flickr4java/flickr/auth/Auth.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.auth;
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/auth/AuthInterface.java b/src/main/java/com/flickr4java/flickr/auth/AuthInterface.java
similarity index 68%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/auth/AuthInterface.java
rename to src/main/java/com/flickr4java/flickr/auth/AuthInterface.java
index 325d9b91..358a1415 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/auth/AuthInterface.java
+++ b/src/main/java/com/flickr4java/flickr/auth/AuthInterface.java
@@ -1,31 +1,32 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.auth;
import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
+import com.flickr4java.flickr.FlickrRuntimeException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.people.User;
import com.flickr4java.flickr.util.ByteUtilities;
import com.flickr4java.flickr.util.XMLUtilities;
-
-import org.apache.log4j.Logger;
-import org.scribe.builder.ServiceBuilder;
-import org.scribe.builder.api.FlickrApi;
-import org.scribe.exceptions.OAuthException;
-import org.scribe.model.Token;
-import org.scribe.model.Verifier;
-import org.scribe.oauth.OAuthService;
+import com.github.scribejava.apis.FlickrApi;
+import com.github.scribejava.core.builder.ServiceBuilder;
+import com.github.scribejava.core.exceptions.OAuthException;
+import com.github.scribejava.core.model.OAuth1RequestToken;
+import com.github.scribejava.core.model.OAuth1Token;
+import com.github.scribejava.core.oauth.OAuth10aService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
+import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.TreeMap;
+import java.util.concurrent.ExecutionException;
/**
* Authentication interface.
@@ -49,7 +50,7 @@ public class AuthInterface {
private final Transport transportAPI;
- private final static Logger logger = Logger.getLogger(AuthInterface.class);
+ private final static Logger logger = LoggerFactory.getLogger(AuthInterface.class);
private int maxGetTokenRetries = 3;
@@ -70,9 +71,9 @@ public AuthInterface(String apiKey, String sharedSecret, Transport transport) {
/**
* Get the OAuth request token - this is step one of authorization.
*
- * @return the {@link Token}, store this for when the user returns from the Flickr website.
+ * @return the {@link OAuth1RequestToken}, store this for when the user returns from the Flickr website.
*/
- public Token getRequestToken() {
+ public OAuth1RequestToken getRequestToken() {
return getRequestToken(null);
}
@@ -82,15 +83,21 @@ public Token getRequestToken() {
*
* @param callbackUrl
* optional callback URL - required for web auth flow, will be set to "oob" if not specified.
- * @return the {@link Token}, store this for when the user returns from the Flickr website.
+ * @return the {@link OAuth1RequestToken}, store this for when the user returns from the Flickr website.
*/
- public Token getRequestToken(String callbackUrl) {
-
+ public OAuth1RequestToken getRequestToken(String callbackUrl) {
String callback = (callbackUrl != null) ? callbackUrl : OUT_OF_BOUND_AUTH_METHOD;
- OAuthService service = new ServiceBuilder().provider(FlickrApi.class).apiKey(apiKey).apiSecret(sharedSecret).callback(callback).build();
+ OAuth10aService service = new ServiceBuilder(apiKey)
+ .apiSecret(sharedSecret)
+ .callback(callback)
+ .build(FlickrApi.instance());
- return service.getRequestToken();
+ try {
+ return service.getRequestToken();
+ } catch (IOException | InterruptedException | ExecutionException e) {
+ throw new FlickrRuntimeException(e);
+ }
}
/**
@@ -99,38 +106,39 @@ public Token getRequestToken(String callbackUrl) {
* @param oAuthRequestToken
* the token from a {@link AuthInterface#getRequestToken} call.
*/
- public String getAuthorizationUrl(Token oAuthRequestToken, Permission permission) {
-
- OAuthService service = new ServiceBuilder().provider(FlickrApi.class).apiKey(apiKey).apiSecret(sharedSecret).build();
+ public String getAuthorizationUrl(OAuth1RequestToken oAuthRequestToken, Permission permission) {
+ OAuth10aService service = new ServiceBuilder(apiKey)
+ .apiSecret(sharedSecret)
+ .build(FlickrApi.instance());
String authorizationUrl = service.getAuthorizationUrl(oAuthRequestToken);
return String.format("%s&perms=%s", authorizationUrl, permission.toString());
}
/**
* Trade the request token for an access token, this is step three of authorization.
- *
- * @param oAuthRequestToken
+ * @param oAuthRequestToken
* this is the token returned by the {@link AuthInterface#getRequestToken} call.
* @param verifier
- * the Verifier created from the code entered by a user or passed back to a callback URL.
*/
@SuppressWarnings("boxing")
- public Token getAccessToken(Token oAuthRequestToken, Verifier verifier) {
- OAuthService service = new ServiceBuilder().provider(FlickrApi.class).apiKey(apiKey).apiSecret(sharedSecret).build();
+ public OAuth1Token getAccessToken(OAuth1RequestToken oAuthRequestToken, String verifier) {
+ OAuth10aService service = new ServiceBuilder(apiKey)
+ .apiSecret(sharedSecret)
+ .build(FlickrApi.instance());
// Flickr seems to return invalid token sometimes so retry a few times.
// See http://www.flickr.com/groups/api/discuss/72157628028927244/
- Token accessToken = null;
+ OAuth1Token accessToken = null;
boolean success = false;
for (int i = 0; i < maxGetTokenRetries && !success; i++) {
try {
accessToken = service.getAccessToken(oAuthRequestToken, verifier);
success = true;
- } catch (OAuthException e) {
- if (i == maxGetTokenRetries) {
+ } catch (OAuthException | IOException | InterruptedException | ExecutionException e) {
+ if (i == maxGetTokenRetries - 1) {
logger.error(String.format("OAuthService.getAccessToken failing after %d tries, re-throwing exception", i), e);
- throw e;
+ throw new FlickrRuntimeException(e);
} else {
logger.warn(String.format("OAuthService.getAccessToken failed, try number %d: %s", i, e.getMessage()));
try {
@@ -142,9 +150,6 @@ public Token getAccessToken(Token oAuthRequestToken, Verifier verifier) {
}
}
- assert accessToken != null;
- assert success;
-
return accessToken;
}
@@ -154,11 +159,10 @@ public Token getAccessToken(Token oAuthRequestToken, Verifier verifier) {
* @param accessToken
* The authentication token
* @return The Auth object
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
- public Auth checkToken(Token accessToken) throws FlickrException {
-
- return checkToken(accessToken.getToken(), accessToken.getSecret());
+ public Auth checkToken(OAuth1Token accessToken) throws FlickrException {
+ return checkToken(accessToken.getToken(), accessToken.getTokenSecret());
}
/**
@@ -167,12 +171,18 @@ public Auth checkToken(Token accessToken) throws FlickrException {
* The authentication token
* @param tokenSecret
* @return The Auth object
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
* @see "http://www.flickr.com/services/api/flickr.auth.oauth.checkToken.html"
*/
public Auth checkToken(String authToken, String tokenSecret) throws FlickrException {
- Map parameters = constructNonOAuthParameters(authToken, METHOD_CHECK_TOKEN);
+ // Use TreeMap so keys are automatically sorted alphabetically
+ Map parameters = new TreeMap();
+ parameters.put("method", METHOD_CHECK_TOKEN);
+ parameters.put("oauth_token", authToken);
+ parameters.put(Flickr.API_KEY, apiKey);
+ // This method call must be signed using Flickr (not OAuth) style signing
+ parameters.put("api_sig", getSignature(sharedSecret, parameters));
Response response = transportAPI.getNonOAuth(transportAPI.getPath(), parameters);
if (response.isError()) {
@@ -189,39 +199,28 @@ public Auth checkToken(String authToken, String tokenSecret) throws FlickrExcept
* Calling this method will delete the auth token used to make the request.
*
* @param authToken
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
* @see "http://www.flickr.com/services/api/flickr.auth.oauth.getAccessToken.html"
*/
- public Token exchangeAuthToken(String authToken) throws FlickrException {
+ public OAuth1RequestToken exchangeAuthToken(String authToken) throws FlickrException {
- Map parameters = constructNonOAuthParameters(authToken, METHOD_EXCHANGE_TOKEN);
+ // Use TreeMap so keys are automatically sorted alphabetically
+ Map parameters = new TreeMap();
+ parameters.put("method", METHOD_EXCHANGE_TOKEN);
+ parameters.put(Flickr.API_KEY, apiKey);
+ // This method call must be signed using Flickr (not OAuth) style signing
+ parameters.put("api_sig", getSignature(sharedSecret, parameters));
Response response = transportAPI.getNonOAuth(transportAPI.getPath(), parameters);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
- Token accessToken = constructToken(response);
+ OAuth1RequestToken accessToken = constructToken(response);
return accessToken;
}
- /**
- *
- * @param authToken
- * @param method
- */
- private Map constructNonOAuthParameters(String authToken, String method) {
- // Use TreeMap so keys are automatically sorted alphabetically
- Map parameters = new TreeMap();
- parameters.put("method", method);
- parameters.put(Flickr.API_KEY, apiKey);
- parameters.put("oauth_token", authToken);
- // This method call must be signed using Flickr (not OAuth) style signing
- parameters.put("api_sig", getSignature(sharedSecret, parameters));
- return parameters;
- }
-
/**
*
* @param response
@@ -249,12 +248,12 @@ private Auth constructAuth(Response response, String authToken, String tokenSecr
*
* @param response
*/
- private Token constructToken(Response response) {
+ private OAuth1RequestToken constructToken(Response response) {
Element authElement = response.getPayload();
String oauthToken = XMLUtilities.getChildValue(authElement, "oauth_token");
String oauthTokenSecret = XMLUtilities.getChildValue(authElement, "oauth_token_secret");
- Token token = new Token(oauthToken, oauthTokenSecret);
+ OAuth1RequestToken token = new OAuth1RequestToken(oauthToken, oauthTokenSecret);
return token;
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/auth/Permission.java b/src/main/java/com/flickr4java/flickr/auth/Permission.java
similarity index 95%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/auth/Permission.java
rename to src/main/java/com/flickr4java/flickr/auth/Permission.java
index 993c43d4..da29fae3 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/auth/Permission.java
+++ b/src/main/java/com/flickr4java/flickr/auth/Permission.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.auth;
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/blogs/Blog.java b/src/main/java/com/flickr4java/flickr/blogs/Blog.java
similarity index 90%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/blogs/Blog.java
rename to src/main/java/com/flickr4java/flickr/blogs/Blog.java
index fc93f4e5..80eabc84 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/blogs/Blog.java
+++ b/src/main/java/com/flickr4java/flickr/blogs/Blog.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.blogs;
import java.math.BigDecimal;
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/blogs/BlogsInterface.java b/src/main/java/com/flickr4java/flickr/blogs/BlogsInterface.java
similarity index 86%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/blogs/BlogsInterface.java
rename to src/main/java/com/flickr4java/flickr/blogs/BlogsInterface.java
index e89fcf58..d3f11461 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/blogs/BlogsInterface.java
+++ b/src/main/java/com/flickr4java/flickr/blogs/BlogsInterface.java
@@ -1,24 +1,21 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
-package com.flickr4java.flickr.blogs;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
+package com.flickr4java.flickr.blogs;
-import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.photos.Photo;
import com.flickr4java.flickr.util.XMLUtilities;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* Interface for working with Flickr blog configurations.
*
@@ -33,11 +30,11 @@ public class BlogsInterface {
private static final String METHOD_POST_PHOTO = "flickr.blogs.postPhoto";
- private String apiKey;
+ private final String apiKey;
- private String sharedSecret;
+ private final String sharedSecret;
- private Transport transportAPI;
+ private final Transport transportAPI;
public BlogsInterface(String apiKey, String sharedSecret, Transport transport) {
this.apiKey = apiKey;
@@ -51,15 +48,14 @@ public BlogsInterface(String apiKey, String sharedSecret, Transport transport) {
* This method does not require authentication.
*
* @return List of Services
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public Collection getServices() throws FlickrException {
List list = new ArrayList();
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_SERVICES);
- parameters.put(Flickr.API_KEY, apiKey);
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -84,12 +80,11 @@ public Collection getServices() throws FlickrException {
* The blog ID
* @param blogPassword
* The blog password
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public void postPhoto(Photo photo, String blogId, String blogPassword) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_POST_PHOTO);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("blog_id", blogId);
parameters.put("photo_id", photo.getId());
@@ -99,7 +94,7 @@ public void postPhoto(Photo photo, String blogId, String blogPassword) throws Fl
parameters.put("blog_password", blogPassword);
}
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -112,7 +107,7 @@ public void postPhoto(Photo photo, String blogId, String blogPassword) throws Fl
* The photo metadata
* @param blogId
* The blog ID
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public void postPhoto(Photo photo, String blogId) throws FlickrException {
postPhoto(photo, blogId, null);
@@ -128,9 +123,8 @@ public Collection getList() throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_LIST);
- parameters.put(Flickr.API_KEY, apiKey);
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/blogs/Service.java b/src/main/java/com/flickr4java/flickr/blogs/Service.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/blogs/Service.java
rename to src/main/java/com/flickr4java/flickr/blogs/Service.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/Brand.java b/src/main/java/com/flickr4java/flickr/cameras/Brand.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/Brand.java
rename to src/main/java/com/flickr4java/flickr/cameras/Brand.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/Camera.java b/src/main/java/com/flickr4java/flickr/cameras/Camera.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/Camera.java
rename to src/main/java/com/flickr4java/flickr/cameras/Camera.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/CamerasInterface.java b/src/main/java/com/flickr4java/flickr/cameras/CamerasInterface.java
similarity index 91%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/CamerasInterface.java
rename to src/main/java/com/flickr4java/flickr/cameras/CamerasInterface.java
index 705d7296..457a9ff8 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/CamerasInterface.java
+++ b/src/main/java/com/flickr4java/flickr/cameras/CamerasInterface.java
@@ -3,13 +3,12 @@
*/
package com.flickr4java.flickr.cameras;
-import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.util.XMLUtilities;
-
-import org.apache.log4j.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -30,10 +29,10 @@ public class CamerasInterface {
private static final String METHOD_GET_BRAND_MODELS = "flickr.cameras.getBrandModels";
/**
- * Logger for log4j.
+ * Logger.
*/
@SuppressWarnings("unused")
- private static Logger _log = Logger.getLogger(CamerasInterface.class);
+ private static Logger _log = LoggerFactory.getLogger(CamerasInterface.class);
private final String apiKey;
@@ -54,14 +53,13 @@ public CamerasInterface(String apiKey, String sharedSecret, Transport transportA
*
*
* @return List of Brands
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public List getBrands() throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_BRANDS);
- parameters.put(Flickr.API_KEY, apiKey);
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -87,15 +85,14 @@ public List getBrands() throws FlickrException {
*
*
* @return List of Brands
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public List getBrandModels(String strBrand) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_BRAND_MODELS);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("brand", strBrand);
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/Details.java b/src/main/java/com/flickr4java/flickr/cameras/Details.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/cameras/Details.java
rename to src/main/java/com/flickr4java/flickr/cameras/Details.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/collections/Collection.java b/src/main/java/com/flickr4java/flickr/collections/Collection.java
similarity index 96%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/collections/Collection.java
rename to src/main/java/com/flickr4java/flickr/collections/Collection.java
index 974bfe42..2a54c18f 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/collections/Collection.java
+++ b/src/main/java/com/flickr4java/flickr/collections/Collection.java
@@ -2,8 +2,8 @@
import com.flickr4java.flickr.photos.Photo;
import com.flickr4java.flickr.photosets.Photoset;
-
-import org.apache.log4j.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Date;
@@ -18,10 +18,10 @@
public class Collection {
/**
- * Logger for log4j.
+ * Logger.
*/
@SuppressWarnings("unused")
- private static Logger _log = Logger.getLogger(Collection.class);
+ private static Logger _log = LoggerFactory.getLogger(Collection.class);
private String id;
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/collections/CollectionsInterface.java b/src/main/java/com/flickr4java/flickr/collections/CollectionsInterface.java
similarity index 94%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/collections/CollectionsInterface.java
rename to src/main/java/com/flickr4java/flickr/collections/CollectionsInterface.java
index 6836fe55..80856155 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/collections/CollectionsInterface.java
+++ b/src/main/java/com/flickr4java/flickr/collections/CollectionsInterface.java
@@ -1,14 +1,13 @@
package com.flickr4java.flickr.collections;
-import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.photos.PhotoUtils;
import com.flickr4java.flickr.photosets.Photoset;
import com.flickr4java.flickr.util.XMLUtilities;
-
-import org.apache.log4j.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -30,10 +29,10 @@ public class CollectionsInterface {
private static final String METHOD_GET_TREE = "flickr.collections.getTree";
/**
- * Logger for log4j.
+ * Logger.
*/
@SuppressWarnings("unused")
- private static Logger _log = Logger.getLogger(CollectionsInterface.class);
+ private static Logger _log = LoggerFactory.getLogger(CollectionsInterface.class);
private final String apiKey;
@@ -56,15 +55,14 @@ public CollectionsInterface(String apiKey, String sharedSecret, Transport transp
* the id of the collection (from the getTree call, not from the collection URL).
*
* @return the given Collection
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public Collection getInfo(String collectionId) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_INFO);
parameters.put("collection_id", collectionId);
- parameters.put(Flickr.API_KEY, apiKey);
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -85,7 +83,7 @@ public Collection getInfo(String collectionId) throws FlickrException {
* the user id of the collection owner (optional - defaults to calling user).
*
* @return List of Institution
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public List getTree(String collectionId, String userId) throws FlickrException {
Map parameters = new HashMap();
@@ -96,9 +94,8 @@ public List getTree(String collectionId, String userId) throws Flick
if (userId != null) {
parameters.put("user_id", userId);
}
- parameters.put(Flickr.API_KEY, apiKey);
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/commons/CommonsInterface.java b/src/main/java/com/flickr4java/flickr/commons/CommonsInterface.java
similarity index 92%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/commons/CommonsInterface.java
rename to src/main/java/com/flickr4java/flickr/commons/CommonsInterface.java
index 38680ab7..93927010 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/commons/CommonsInterface.java
+++ b/src/main/java/com/flickr4java/flickr/commons/CommonsInterface.java
@@ -1,18 +1,17 @@
package com.flickr4java.flickr.commons;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.util.XMLUtilities;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
/**
*
* @author mago
@@ -39,15 +38,14 @@ public CommonsInterface(String apiKey, String sharedSecret, Transport transportA
* This method does not require authentication.
*
* @return List of Institution
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public ArrayList getInstitutions() throws FlickrException {
ArrayList institutions = new ArrayList();
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_INSTITUTIONS);
- parameters.put(Flickr.API_KEY, apiKey);
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/commons/Institution.java b/src/main/java/com/flickr4java/flickr/commons/Institution.java
similarity index 85%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/commons/Institution.java
rename to src/main/java/com/flickr4java/flickr/commons/Institution.java
index 6467761d..a9b2bc9e 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/commons/Institution.java
+++ b/src/main/java/com/flickr4java/flickr/commons/Institution.java
@@ -53,7 +53,7 @@ public void setDateLaunch(long date) {
public void setDateLaunch(String date) {
if (date == null || "".equals(date))
return;
- setDateLaunch(Long.parseLong(date) * (long) 1000);
+ setDateLaunch(Long.parseLong(date) * 1000);
}
public String getSiteUrl() {
@@ -80,4 +80,9 @@ public void setFlickrUrl(String flickrUrl) {
this.flickrUrl = flickrUrl;
}
+ @Override
+ public String toString() {
+ return String.format("Institution [name=%s]", name);
+ }
+
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/Contact.java b/src/main/java/com/flickr4java/flickr/contacts/Contact.java
similarity index 79%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/Contact.java
rename to src/main/java/com/flickr4java/flickr/contacts/Contact.java
index e968a661..d8545116 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/Contact.java
+++ b/src/main/java/com/flickr4java/flickr/contacts/Contact.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.contacts;
import com.flickr4java.flickr.util.BuddyIconable;
@@ -116,11 +114,25 @@ public void setAwayMessage(String awayMessage) {
*
* @see Flickr Documentation
* @return The BuddyIconUrl
+ * @deprecated use {@link #getSecureBuddyIconUrl() }
*/
+ @Deprecated
public String getBuddyIconUrl() {
return UrlUtilities.createBuddyIconUrl(iconFarm, iconServer, id);
}
+ /**
+ * Construct the BuddyIconUrl using {@code https} scheme.
+ *
+ * If none available, return the default, or an URL assembled from farm, iconserver and nsid.
+ *
+ * @see Flickr Documentation
+ * @return The BuddyIconUrl
+ */
+ public String getSecureBuddyIconUrl() {
+ return UrlUtilities.createSecureBuddyIconUrl(iconFarm, iconServer, id);
+ }
+
public int getIconFarm() {
return iconFarm;
}
@@ -147,7 +159,7 @@ public void setIconServer(String iconServer) {
/**
* Get the contact's path alias, which may appear instead of nsid in urls published by Flickr. For example feeds have urls of the form
- * .../photos/${NSID_OR_PATHALIAS}/${PHOTO_ID} & .../people/${NSID_OR_PATHALIAS}. This allows clients to look up a {@link Contact} given such a url. (Note
+ * .../photos/${NSID_OR_PATHALIAS}/${PHOTO_ID} and .../people/${NSID_OR_PATHALIAS}. This allows clients to look up a {@link Contact} given such a url. (Note
* that <author> elements in feeds have a <flickr:nsid> child which could be used instead of the lookup this method
* enables.)
*
diff --git a/src/main/java/com/flickr4java/flickr/contacts/ContactList.java b/src/main/java/com/flickr4java/flickr/contacts/ContactList.java
new file mode 100644
index 00000000..eba3d747
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/contacts/ContactList.java
@@ -0,0 +1,11 @@
+package com.flickr4java.flickr.contacts;
+
+import com.flickr4java.flickr.SearchResultList;
+
+
+public class ContactList extends SearchResultList {
+
+ // (avoid compiler warning)
+ private static final long serialVersionUID = -4735611134085303463L;
+
+}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/ContactsInterface.java b/src/main/java/com/flickr4java/flickr/contacts/ContactsInterface.java
similarity index 90%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/ContactsInterface.java
rename to src/main/java/com/flickr4java/flickr/contacts/ContactsInterface.java
index 6795ddd8..90790e6a 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/contacts/ContactsInterface.java
+++ b/src/main/java/com/flickr4java/flickr/contacts/ContactsInterface.java
@@ -1,8 +1,14 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.contacts;
+import com.flickr4java.flickr.FlickrException;
+import com.flickr4java.flickr.Response;
+import com.flickr4java.flickr.Transport;
+import com.flickr4java.flickr.util.XMLUtilities;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
@@ -10,15 +16,6 @@
import java.util.List;
import java.util.Map;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import com.flickr4java.flickr.Flickr;
-import com.flickr4java.flickr.FlickrException;
-import com.flickr4java.flickr.Response;
-import com.flickr4java.flickr.Transport;
-import com.flickr4java.flickr.util.XMLUtilities;
-
/**
* Interface for working with Flickr contacts.
*
@@ -51,18 +48,21 @@ public ContactsInterface(String apiKey, String sharedSecret, Transport transport
* @return The Collection of Contact objects
*/
public Collection getList() throws FlickrException {
- List contacts = new ArrayList();
-
+ ContactList contacts = new ContactList();
+
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_LIST);
- parameters.put(Flickr.API_KEY, apiKey);
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
Element contactsElement = response.getPayload();
+ contacts.setPage(contactsElement.getAttribute("page"));
+ contacts.setPages(contactsElement.getAttribute("pages"));
+ contacts.setPerPage(contactsElement.getAttribute("perpage"));
+ contacts.setTotal(contactsElement.getAttribute("total"));
NodeList contactNodes = contactsElement.getElementsByTagName("contact");
for (int i = 0; i < contactNodes.getLength(); i++) {
Element contactElement = (Element) contactNodes.item(i);
@@ -94,18 +94,17 @@ public Collection getList() throws FlickrException {
* Limits the resultset to contacts that have uploaded photos since this date. The date should be in the form of a Unix timestamp. The default,
* and maximum, offset is (1) hour. (Optional, can be null)
* @param filter
- * Limit the result set to all contacts or only those who are friends or family.
+ * Limit the result set to all contacts or only those who are friends or family.
* Valid options are: ff -> friends and family, all -> all your contacts. (Optional, can be null)
*
* @return List of Contacts
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public Collection getListRecentlyUploaded(Date lastUpload, String filter) throws FlickrException {
List contacts = new ArrayList();
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_LIST_RECENTLY_UPLOADED);
- parameters.put(Flickr.API_KEY, apiKey);
if (lastUpload != null) {
parameters.put("date_lastupload", String.valueOf(lastUpload.getTime() / 1000L));
@@ -114,7 +113,7 @@ public Collection getListRecentlyUploaded(Date lastUpload, String filte
parameters.put("filter", filter);
}
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -150,17 +149,16 @@ public Collection getListRecentlyUploaded(Date lastUpload, String filte
* @param userId
* The user ID
* @return The Collection of Contact objects
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public Collection getPublicList(String userId) throws FlickrException {
List contacts = new ArrayList();
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_PUBLIC_LIST);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("user_id", userId);
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
diff --git a/src/main/java/com/flickr4java/flickr/contacts/OnlineStatus.java b/src/main/java/com/flickr4java/flickr/contacts/OnlineStatus.java
new file mode 100644
index 00000000..3b55706f
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/contacts/OnlineStatus.java
@@ -0,0 +1,81 @@
+
+package com.flickr4java.flickr.contacts;
+
+import java.io.Serializable;
+
+import static com.flickr4java.flickr.contacts.OnlineStatus.OnlineStatusType.AWAY_TYPE;
+import static com.flickr4java.flickr.contacts.OnlineStatus.OnlineStatusType.OFFLINE_TYPE;
+import static com.flickr4java.flickr.contacts.OnlineStatus.OnlineStatusType.ONLINE_TYPE;
+import static com.flickr4java.flickr.contacts.OnlineStatus.OnlineStatusType.UNKNOWN_TYPE;
+
+/**
+ * Class representing the various types of online statuses.
+ *
+ * @author Anthony Eden
+ */
+public enum OnlineStatus implements Serializable {
+
+ OFFLINE(OFFLINE_TYPE),
+ AWAY(AWAY_TYPE),
+ ONLINE(ONLINE_TYPE),
+ UNKNOWN(UNKNOWN_TYPE);
+
+ private static final long serialVersionUID = 12L;
+
+ private final int type;
+
+ private OnlineStatus(int type) {
+ this.type = type;
+ }
+
+ /**
+ * Get the int value for the online status. This method is useful in switch statements.
+ *
+ * @return The int value for the online status
+ */
+ public int getType() {
+ return type;
+ }
+
+ /**
+ * Get an OnlineStatus object for a given int value.
+ *
+ * @param type The int value
+ * @return The OnlineStatus object
+ */
+ public static OnlineStatus fromType(int type) {
+ switch (type) {
+ case OFFLINE_TYPE:
+ return OFFLINE;
+ case AWAY_TYPE:
+ return AWAY;
+ case ONLINE_TYPE:
+ return ONLINE;
+ case UNKNOWN_TYPE:
+ return UNKNOWN;
+ default:
+ throw new IllegalArgumentException("Unsupported online type: " + type);
+ }
+ }
+
+ /**
+ * Get the OnlineStatus value for a given int represented as a String
+ *
+ * @param type The int represented as a String
+ * @return The OnlineStatus object
+ */
+ public static OnlineStatus fromType(String type) {
+ if (type == null || "".equals(type)) {
+ return UNKNOWN;
+ } else {
+ return fromType(Integer.parseInt(type));
+ }
+ }
+
+ static class OnlineStatusType {
+ static final int OFFLINE_TYPE = 0;
+ static final int AWAY_TYPE = 1;
+ static final int ONLINE_TYPE = 2;
+ static final int UNKNOWN_TYPE = 100;
+ }
+}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/favorites/FavoritesInterface.java b/src/main/java/com/flickr4java/flickr/favorites/FavoritesInterface.java
similarity index 87%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/favorites/FavoritesInterface.java
rename to src/main/java/com/flickr4java/flickr/favorites/FavoritesInterface.java
index f898484b..d226c0b1 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/favorites/FavoritesInterface.java
+++ b/src/main/java/com/flickr4java/flickr/favorites/FavoritesInterface.java
@@ -1,18 +1,6 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
-package com.flickr4java.flickr.favorites;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.log4j.Logger;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
+package com.flickr4java.flickr.favorites;
-import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
@@ -21,6 +9,15 @@
import com.flickr4java.flickr.photos.PhotoList;
import com.flickr4java.flickr.photos.PhotoUtils;
import com.flickr4java.flickr.util.StringUtilities;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
/**
* Interface for working with Flickr favorites.
@@ -30,7 +27,7 @@
*/
public class FavoritesInterface {
- private static final Logger logger = Logger.getLogger(FavoritesInterface.class);
+ private static final Logger logger = LoggerFactory.getLogger(FavoritesInterface.class);
public static final String METHOD_ADD = "flickr.favorites.add";
@@ -59,15 +56,14 @@ public FavoritesInterface(String apiKey, String sharedSecret, Transport transpor
*
* @param photoId
* The photo ID
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public void add(String photoId) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_ADD);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("photo_id", photoId);
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -79,9 +75,9 @@ public void add(String photoId) throws FlickrException {
* @param userId
* The optional user ID. Null value will be ignored.
* @param perPage
- * The optional per page value. Values <= 0 will be ignored.
+ * The optional per page value. Values {@code <= 0} will be ignored.
* @param page
- * The page to view. Values <= 0 will be ignored.
+ * The page to view. Values {@code <= 0} will be ignored.
* @param extras
* a Set Strings representing extra parameters to send
* @return The Collection of Photo objects
@@ -92,7 +88,6 @@ public PhotoList getList(String userId, int perPage, int page, Set parameters = new HashMap();
parameters.put("method", METHOD_GET_LIST);
- parameters.put(Flickr.API_KEY, apiKey);
if (userId != null) {
parameters.put("user_id", userId);
@@ -107,7 +102,7 @@ public PhotoList getList(String userId, int perPage, int page, Set getList(String userId, int perPage, int page, Set getPublicList(String userId, int perPage, int page, Set extras) throws FlickrException {
@@ -147,7 +142,6 @@ public PhotoList getPublicList(String userId, int perPage, int page, Set<
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_PUBLIC_LIST);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("user_id", userId);
@@ -161,7 +155,7 @@ public PhotoList getPublicList(String userId, int perPage, int page, Set<
parameters.put("page", String.valueOf(page));
}
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -188,11 +182,10 @@ public PhotoList getPublicList(String userId, int perPage, int page, Set<
public void remove(String photoId) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_REMOVE);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("photo_id", photoId);
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -210,12 +203,11 @@ public void remove(String photoId) throws FlickrException {
public PhotoContext getContext(String photoId, String userId) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_CONTEXT);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("photo_id", photoId);
parameters.put("user_id", userId);
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/galleries/GalleriesInterface.java b/src/main/java/com/flickr4java/flickr/galleries/GalleriesInterface.java
similarity index 91%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/galleries/GalleriesInterface.java
rename to src/main/java/com/flickr4java/flickr/galleries/GalleriesInterface.java
index 45911246..fbc2974f 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/galleries/GalleriesInterface.java
+++ b/src/main/java/com/flickr4java/flickr/galleries/GalleriesInterface.java
@@ -3,16 +3,6 @@
*/
package com.flickr4java.flickr.galleries;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
@@ -22,6 +12,15 @@
import com.flickr4java.flickr.photos.PhotoList;
import com.flickr4java.flickr.util.XMLUtilities;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
/**
* @author acaplan
*
@@ -76,14 +75,13 @@ public GalleriesInterface(String apiKey, String sharedSecret, Transport transpor
* @param page
* The page number
* @return gallery
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*
- * @see flickr.galleries.getList
+ * @see flickr.galleries.getList
*/
public List getList(String userId, int perPage, int page) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_LIST);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("user_id", userId);
if (perPage > 0) {
parameters.put("per_page", String.valueOf(perPage));
@@ -92,7 +90,7 @@ public List getList(String userId, int perPage, int page) throws Flickr
parameters.put("page", String.valueOf(page));
}
- Response response = transport.post(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -131,12 +129,11 @@ public List getList(String userId, int perPage, int page) throws Flickr
public void addPhoto(String strGalleryId, String photoId, String strComment) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_ADD_PHOTO);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("gallery_id", strGalleryId);
parameters.put("photo_id", photoId);
parameters.put("comment", strComment);
- Response response = transport.post(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -145,11 +142,10 @@ public void addPhoto(String strGalleryId, String photoId, String strComment) thr
public void editMeta(String strGalleryId, String strTitle, String strDescription) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_EDIT_META);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("title", strTitle);
parameters.put("description", strDescription);
- Response response = transport.post(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -158,12 +154,11 @@ public void editMeta(String strGalleryId, String strTitle, String strDescription
public void editPhoto(String strGalleryId, String strPhotoId, String strComment) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_EDIT_PHOTO);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("gallery_id", strGalleryId);
parameters.put("photo_id", strPhotoId);
parameters.put("comment", strComment);
- Response response = transport.post(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -172,12 +167,11 @@ public void editPhoto(String strGalleryId, String strPhotoId, String strComment)
public void editPhotos(String strGalleryId, String strPrimaryPhotoId, String strPhotoIds) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_EDIT_PHOTOS);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("gallery_id", strGalleryId);
parameters.put("primary_photo_id", strPrimaryPhotoId);
parameters.put("photo_ids", strPhotoIds);
- Response response = transport.post(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -186,10 +180,9 @@ public void editPhotos(String strGalleryId, String strPrimaryPhotoId, String str
public Gallery getInfo(String strGalleryId) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_INFO);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("gallery_id", strGalleryId);
- Response response = transport.post(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -221,19 +214,18 @@ public Gallery getInfo(String strGalleryId) throws FlickrException {
* @param strTitle
* @param strDescription
* @param primaryPhotoId
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public Gallery create(String strTitle, String strDescription, String primaryPhotoId) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_CREATE);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("title", strTitle);
parameters.put("description", strDescription);
if (primaryPhotoId != null) {
parameters.put("primary_photo_id ", primaryPhotoId);
}
- Response response = transport.post(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.post(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -263,14 +255,13 @@ public Gallery create(String strTitle, String strDescription, String primaryPhot
* @param page
* The page offset (0 to ignore)
* @return A Collection of Photo objects
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public PhotoList getPhotos(String galleryId, Set extras, int perPage, int page) throws FlickrException {
PhotoList photos = new PhotoList();
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_PHOTOS);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("gallery_id", galleryId);
@@ -293,7 +284,7 @@ public PhotoList getPhotos(String galleryId, Set extras, int perP
parameters.put("page", String.valueOf(page));
}
- Response response = transport.get(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.get(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -313,7 +304,7 @@ public PhotoList getPhotos(String galleryId, Set extras, int perP
User owner = new User();
owner.setId(photoElement.getAttribute("owner"));
photo.setOwner(owner);
- photo.setUrl("http://flickr.com/photos/" + owner.getId() + "/" + photo.getId());
+ photo.setUrl("https://flickr.com/photos/" + owner.getId() + "/" + photo.getId());
photo.setServer(photoElement.getAttribute("server"));
photo.setFarm(photoElement.getAttribute("farm"));
photo.setTitle(photoElement.getAttribute("title"));
@@ -339,14 +330,13 @@ public PhotoList getPhotos(String galleryId, Set extras, int perP
* @param page
* The page offset (0 to ignore)
* @return A Collection of Photo objects
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public PhotoList getListForPhoto(String photoId, int perPage, int page) throws FlickrException {
PhotoList photos = new PhotoList();
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_LIST_FOR_PHOTO);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("photo_id", photoId);
@@ -357,7 +347,7 @@ public PhotoList getListForPhoto(String photoId, int perPage, int page) t
parameters.put("page", String.valueOf(page));
}
- Response response = transport.get(transport.getPath(), parameters, sharedSecret);
+ Response response = transport.get(transport.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -377,7 +367,7 @@ public PhotoList getListForPhoto(String photoId, int perPage, int page) t
User owner = new User();
owner.setId(photoElement.getAttribute("owner"));
photo.setOwner(owner);
- photo.setUrl("http://flickr.com/photos/" + owner.getId() + "/" + photo.getId());
+ photo.setUrl("https://flickr.com/photos/" + owner.getId() + "/" + photo.getId());
photo.setServer(photoElement.getAttribute("server"));
photo.setFarm(photoElement.getAttribute("farm"));
photo.setTitle(photoElement.getAttribute("title"));
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/galleries/Gallery.java b/src/main/java/com/flickr4java/flickr/galleries/Gallery.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/galleries/Gallery.java
rename to src/main/java/com/flickr4java/flickr/galleries/Gallery.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/galleries/GalleryList.java b/src/main/java/com/flickr4java/flickr/galleries/GalleryList.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/galleries/GalleryList.java
rename to src/main/java/com/flickr4java/flickr/galleries/GalleryList.java
diff --git a/src/main/java/com/flickr4java/flickr/groups/Blast.java b/src/main/java/com/flickr4java/flickr/groups/Blast.java
new file mode 100644
index 00000000..9ac0696a
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/groups/Blast.java
@@ -0,0 +1,50 @@
+package com.flickr4java.flickr.groups;
+
+public class Blast {
+
+ private String dateBlastAdded;
+
+ private String userId;
+
+ private String blast;
+
+ /**
+ * Unix timestamp formatted date
+ *
+ * @return date blast was added
+ */
+ public String getDateBlastAdded() {
+ return dateBlastAdded;
+ }
+
+ public void setDateBlastAdded(String dateBlastAdded) {
+ this.dateBlastAdded = dateBlastAdded;
+ }
+
+ /**
+ * Blaster's user_id
+ *
+ * @return user_id
+ */
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ /**
+ * Text of the blast
+ *
+ * @return blast text
+ */
+ public String getBlast() {
+ return blast;
+ }
+
+ public void setBlast(String blast) {
+ this.blast = blast;
+ }
+
+}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Category.java b/src/main/java/com/flickr4java/flickr/groups/Category.java
similarity index 91%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Category.java
rename to src/main/java/com/flickr4java/flickr/groups/Category.java
index c0c32125..7a765271 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Category.java
+++ b/src/main/java/com/flickr4java/flickr/groups/Category.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.groups;
import java.util.Collection;
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Group.java b/src/main/java/com/flickr4java/flickr/groups/Group.java
similarity index 64%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Group.java
rename to src/main/java/com/flickr4java/flickr/groups/Group.java
index c9bc3b5a..3be27cc6 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Group.java
+++ b/src/main/java/com/flickr4java/flickr/groups/Group.java
@@ -1,11 +1,10 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.groups;
-import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.util.BuddyIconable;
import com.flickr4java.flickr.util.UrlUtilities;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Class representing a Flickr Group.
@@ -14,12 +13,18 @@
*/
public class Group implements BuddyIconable {
+ private static Logger _log = LoggerFactory.getLogger(Group.class);
+
private String id;
private String name;
private int members;
+ private int poolCount;
+
+ private int topicCount;
+
private String privacy;
private int iconFarm;
@@ -30,6 +35,10 @@ public class Group implements BuddyIconable {
private Throttle throttle;
+ private Blast blast;
+
+ private Restriction restriction;
+
private String lang;
private boolean poolModerated;
@@ -83,8 +92,43 @@ public void setMembers(String members) {
setMembers(Integer.parseInt(members));
} catch (NumberFormatException nfe) {
setMembers(0);
- if (Flickr.tracing)
- System.out.println("trace: Group.setMembers(String) encountered a number format " + "exception. members set to 0");
+ _log.trace("Group.setMembers(String) encountered a number format exception. members set to 0");
+ }
+ }
+
+ public int getPoolCount() {
+ return poolCount;
+ }
+
+ public void setPoolCount(int poolCount) {
+ this.poolCount = poolCount;
+ }
+
+ public void setPoolCount(String poolCount) {
+ try {
+ if (poolCount != null)
+ setPoolCount(Integer.parseInt(poolCount));
+ } catch (NumberFormatException nfe) {
+ setPoolCount(0);
+ _log.trace("Group.setPoolCount(String) encountered a number format exception. poolCount set to 0");
+ }
+ }
+
+ public int getTopicCount() {
+ return topicCount;
+ }
+
+ public void setTopicCount(int topicCount) {
+ this.topicCount = topicCount;
+ }
+
+ public void setTopicCount(String topicCount) {
+ try {
+ if (topicCount != null)
+ setTopicCount(Integer.parseInt(topicCount));
+ } catch (NumberFormatException nfe) {
+ setPoolCount(0);
+ _log.trace("Group.setTopicCount(String) encountered a number format exception. topicCount set to 0");
}
}
@@ -92,6 +136,7 @@ public void setMembers(String members) {
* @deprecated
* @return the online-state
*/
+ @Deprecated
public int getOnline() {
return online;
}
@@ -100,6 +145,7 @@ public int getOnline() {
* @deprecated
* @param online
*/
+ @Deprecated
public void setOnline(int online) {
this.online = online;
}
@@ -108,14 +154,14 @@ public void setOnline(int online) {
* @deprecated
* @param online
*/
+ @Deprecated
public void setOnline(String online) {
try {
if (online != null)
setOnline(Integer.parseInt(online));
} catch (NumberFormatException nfe) {
setOnline(0);
- if (Flickr.tracing)
- System.out.println("trace: Group.setOnline(String) encountered a number format " + "exception. online set to 0");
+ _log.trace("Group.setOnline(String) encountered a number format exception. online set to 0");
}
}
@@ -123,6 +169,7 @@ public void setOnline(String online) {
* @deprecated
* @return chatId
*/
+ @Deprecated
public String getChatId() {
return chatId;
}
@@ -131,6 +178,7 @@ public String getChatId() {
* @deprecated
* @param chatId
*/
+ @Deprecated
public void setChatId(String chatId) {
this.chatId = chatId;
}
@@ -139,6 +187,7 @@ public void setChatId(String chatId) {
* @deprecated
* @return the number of users in chat
*/
+ @Deprecated
public int getInChat() {
return inChat;
}
@@ -147,6 +196,7 @@ public int getInChat() {
* @deprecated
* @param inChat
*/
+ @Deprecated
public void setInChat(int inChat) {
this.inChat = inChat;
}
@@ -155,15 +205,14 @@ public void setInChat(int inChat) {
* @deprecated
* @param inChat
*/
+ @Deprecated
public void setInChat(String inChat) {
try {
if (inChat != null)
setInChat(Integer.parseInt(inChat));
} catch (NumberFormatException nfe) {
setInChat(0);
- if (Flickr.tracing) {
- System.out.println("trace: Group.setInChat(String) encountered a number format " + "exception. InChat set to 0");
- }
+ _log.trace("Group.setInChat(String) encountered a number format exception. InChat set to 0");
}
}
@@ -188,7 +237,7 @@ public int getPhotoCount() {
}
/**
- * @deprecated
+ *
* @param photoCount
*/
public void setPhotoCount(int photoCount) {
@@ -196,7 +245,7 @@ public void setPhotoCount(int photoCount) {
}
/**
- * @deprecated
+ *
* @param photoCount
*/
public void setPhotoCount(String photoCount) {
@@ -205,9 +254,7 @@ public void setPhotoCount(String photoCount) {
setPhotoCount(Integer.parseInt(photoCount));
} catch (NumberFormatException nfe) {
setPhotoCount(0);
- if (Flickr.tracing) {
- System.out.println("trace: Group.setPhotoCount(String) encountered a number format " + "exception. PhotoCount set to 0");
- }
+ _log.trace("Group.setPhotoCount(String) encountered a number format exception. PhotoCount set to 0");
}
}
}
@@ -216,6 +263,7 @@ public void setPhotoCount(String photoCount) {
* @deprecated
* @return boolean
*/
+ @Deprecated
public boolean isEighteenPlus() {
return eighteenPlus;
}
@@ -224,6 +272,7 @@ public boolean isEighteenPlus() {
* @deprecated
* @param eighteenPlus
*/
+ @Deprecated
public void setEighteenPlus(boolean eighteenPlus) {
this.eighteenPlus = eighteenPlus;
}
@@ -252,28 +301,34 @@ public void setPoolModerated(boolean poolModerated) {
this.poolModerated = poolModerated;
}
+ @Override
public int getIconFarm() {
return iconFarm;
}
+ @Override
public void setIconFarm(int iconFarm) {
this.iconFarm = iconFarm;
}
+ @Override
public void setIconFarm(String iconFarm) {
if (iconFarm != null) {
setIconFarm(Integer.parseInt(iconFarm));
}
}
+ @Override
public int getIconServer() {
return iconServer;
}
+ @Override
public void setIconServer(int iconServer) {
this.iconServer = iconServer;
}
+ @Override
public void setIconServer(String iconServer) {
if (iconServer != null) {
setIconServer(Integer.parseInt(iconServer));
@@ -287,11 +342,26 @@ public void setIconServer(String iconServer) {
*
* @see Flickr Documentation
* @return The BuddyIconUrl
+ * @deprecated use {@link #getSecureBuddyIconUrl() }
*/
+ @Override
+ @Deprecated
public String getBuddyIconUrl() {
return UrlUtilities.createBuddyIconUrl(iconFarm, iconServer, id);
}
+ /**
+ * Construct the BuddyIconUrl using {@code https} scheme.
+ *
+ * If none available, return the default, or an URL assembled from farm, iconserver and nsid.
+ *
+ * @see Flickr Documentation
+ * @return The BuddyIconUrl
+ */
+ public String getSecureBuddyIconUrl() {
+ return UrlUtilities.createSecureBuddyIconUrl(iconFarm, iconServer, id);
+ }
+
public Throttle getThrottle() {
return throttle;
}
@@ -300,6 +370,22 @@ public void setThrottle(Throttle throttle) {
this.throttle = throttle;
}
+ public Blast getBlast() {
+ return blast;
+ }
+
+ public void setBlast(Blast blast) {
+ this.blast = blast;
+ }
+
+ public Restriction getRestriction() {
+ return restriction;
+ }
+
+ public void setRestriction(Restriction restriction) {
+ this.restriction = restriction;
+ }
+
/**
* @return the invitationOnly
*/
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/GroupList.java b/src/main/java/com/flickr4java/flickr/groups/GroupList.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/groups/GroupList.java
rename to src/main/java/com/flickr4java/flickr/groups/GroupList.java
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/GroupsInterface.java b/src/main/java/com/flickr4java/flickr/groups/GroupsInterface.java
similarity index 69%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/groups/GroupsInterface.java
rename to src/main/java/com/flickr4java/flickr/groups/GroupsInterface.java
index 03912ab0..17848438 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/GroupsInterface.java
+++ b/src/main/java/com/flickr4java/flickr/groups/GroupsInterface.java
@@ -1,23 +1,21 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.groups;
+import com.flickr4java.flickr.FlickrException;
+import com.flickr4java.flickr.Response;
+import com.flickr4java.flickr.Transport;
+import com.flickr4java.flickr.util.XMLUtilities;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import com.flickr4java.flickr.Flickr;
-import com.flickr4java.flickr.FlickrException;
-import com.flickr4java.flickr.Response;
-import com.flickr4java.flickr.Transport;
-import com.flickr4java.flickr.util.XMLUtilities;
-
/**
* Interface for working with Flickr Groups.
*
@@ -26,6 +24,8 @@
*/
public class GroupsInterface {
+ private static Logger _log = LoggerFactory.getLogger(GroupsInterface.class);
+
public static final String METHOD_BROWSE = "flickr.groups.browse";
public static final String METHOD_GET_ACTIVE_LIST = "flickr.groups.getActiveList";
@@ -40,11 +40,11 @@ public class GroupsInterface {
public static final String METHOD_LEAVE = "flickr.groups.leave";
- private String apiKey;
+ private final String apiKey;
- private String sharedSecret;
+ private final String sharedSecret;
- private Transport transportAPI;
+ private final Transport transportAPI;
public GroupsInterface(String apiKey, String sharedSecret, Transport transportAPI) {
this.apiKey = apiKey;
@@ -58,22 +58,22 @@ public GroupsInterface(String apiKey, String sharedSecret, Transport transportAP
* @param catId
* The optional category id. Null value will be ignored.
* @return The Collection of Photo objects
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
* @deprecated Flickr returns just empty results
*/
+ @Deprecated
public Category browse(String catId) throws FlickrException {
List subcategories = new ArrayList();
List groups = new ArrayList();
Map parameters = new HashMap();
parameters.put("method", METHOD_BROWSE);
- parameters.put(Flickr.API_KEY, apiKey);
if (catId != null) {
parameters.put("cat_id", catId);
}
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -124,10 +124,9 @@ public Category browse(String catId) throws FlickrException {
public Group getInfo(String groupId) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_GET_INFO);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("group_id", groupId);
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -143,6 +142,8 @@ public Group getInfo(String groupId) throws FlickrException {
group.setDescription(XMLUtilities.getChildValue(groupElement, "description"));
group.setMembers(XMLUtilities.getChildValue(groupElement, "members"));
group.setPrivacy(XMLUtilities.getChildValue(groupElement, "privacy"));
+ group.setPoolCount(XMLUtilities.getChildValue(groupElement, "pool_count"));
+ group.setTopicCount(XMLUtilities.getChildValue(groupElement, "topic_count"));
NodeList throttleNodes = groupElement.getElementsByTagName("throttle");
int n = throttleNodes.getLength();
@@ -160,7 +161,38 @@ public Group getInfo(String groupId) throws FlickrException {
throttle.setRemaining(Integer.parseInt(remainingStr));
}
} else if (n > 1) {
- System.err.println("WARNING: more than one throttle element in group");
+ _log.warn("WARNING: more than one throttle element in group");
+ }
+
+ NodeList restrictionNodes = groupElement.getElementsByTagName("restrictions");
+ n = restrictionNodes.getLength();
+ if (n == 1) {
+ Element restrictionElement = (Element) restrictionNodes.item(0);
+ Restriction restriction = new Restriction();
+ group.setRestriction(restriction);
+ restriction.setIsPhotosOk("1".equals(restrictionElement.getAttribute("photos_ok")));
+ restriction.setIsVideosOk("1".equals(restrictionElement.getAttribute("videos_ok")));
+ restriction.setIsImagesOk("1".equals(restrictionElement.getAttribute("images_ok")));
+ restriction.setIsScreensOk("1".equals(restrictionElement.getAttribute("screens_ok")));
+ restriction.setIsArtOk("1".equals(restrictionElement.getAttribute("art_ok")));
+ restriction.setIsSafeOk("1".equals(restrictionElement.getAttribute("safe_ok")));
+ restriction.setIsModerateOk("1".equals(restrictionElement.getAttribute("moderate_ok")));
+ restriction.setIsRestrictedOk("1".equals(restrictionElement.getAttribute("restricted_ok")));
+ restriction.setIsHasGeo("1".equals(restrictionElement.getAttribute("has_geo")));
+ } else if (n > 1) {
+ _log.warn("WARNING: more than one throttle element in group");
+ }
+ NodeList blastNodes = groupElement.getElementsByTagName("blast");
+ n = blastNodes.getLength();
+ if (n == 1) {
+ Element blastElement = (Element) blastNodes.item(0);
+ Blast blast = new Blast();
+ group.setBlast(blast);
+ blast.setUserId(blastElement.getAttribute("user_id"));
+ blast.setDateBlastAdded(blastElement.getAttribute("date_blast_added"));
+ blast.setBlast(XMLUtilities.getChildValue(groupElement, "blast"));
+ } else if (n > 1) {
+ _log.warn("WARNING: more than one throttle element in group");
}
return group;
@@ -177,13 +209,12 @@ public Group getInfo(String groupId) throws FlickrException {
* @param page
* The page of results to return. If this argument is 0, it defaults to 1.
* @return A GroupList Object. Only the fields id, name and eighteenplus in the Groups will be set.
- * @throws FlickrException
+ * @throws FlickrException if there was a problem connecting to Flickr
*/
public Collection search(String text, int perPage, int page) throws FlickrException {
GroupList groupList = new GroupList();
Map parameters = new HashMap();
parameters.put("method", METHOD_SEARCH);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("text", text);
@@ -194,7 +225,7 @@ public Collection search(String text, int perPage, int page) throws Flick
parameters.put("page", String.valueOf(page));
}
- Response response = transportAPI.get(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -216,27 +247,27 @@ public Collection search(String text, int perPage, int page) throws Flick
/**
* Join a group as a public member.
- *
- * Note: if a group has rules - the client must display the rules to the user and the
- * user must accept them prior to joining the group. The acceptRules parameter indicates
- * that the user has accepted those rules.
- *
- * @param groupId - the id of the group to join
- * @param acceptRules - if a group has rules, true indicates the user has accepted the rules
- *
+ *
+ * Note: if a group has rules - the client must display the rules to the user and the user must accept them prior to joining the group. The acceptRules
+ * parameter indicates that the user has accepted those rules.
+ *
+ * @param groupId
+ * - the id of the group to join
+ * @param acceptRules
+ * - if a group has rules, true indicates the user has accepted the rules
+ *
* @see flickr.groups.join
*/
public void join(String groupId, Boolean acceptRules) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_JOIN);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("group_id", groupId);
if (acceptRules != null) {
- parameters.put("accept_rules",acceptRules);
+ parameters.put("accept_rules", acceptRules);
}
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -244,24 +275,25 @@ public void join(String groupId, Boolean acceptRules) throws FlickrException {
/**
* Request to join a group.
- *
- * Note: if a group has rules, the client must display the rules to the user and the user must
- * accept them (which is indicated by passing a true value to acceptRules) prior to making the
- * join request.
- *
- * @param groupId - groupId parameter
- * @param message - (required) message to group administrator
- * @param acceptRules - (required) parameter indicating user has accepted groups rules
+ *
+ * Note: if a group has rules, the client must display the rules to the user and the user must accept them (which is indicated by passing a true value to
+ * acceptRules) prior to making the join request.
+ *
+ * @param groupId
+ * - groupId parameter
+ * @param message
+ * - (required) message to group administrator
+ * @param acceptRules
+ * - (required) parameter indicating user has accepted groups rules
*/
- public void joinRequest(String groupId,String message, boolean acceptRules) throws FlickrException {
+ public void joinRequest(String groupId, String message, boolean acceptRules) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_JOIN_REQUEST);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("group_id", groupId);
parameters.put("message", message);
parameters.put("accept_rules", acceptRules);
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
@@ -269,21 +301,22 @@ public void joinRequest(String groupId,String message, boolean acceptRules) thro
/**
* Leave a group.
- *
- * @see lickr.groups.leave for
- * a description of the various behaviors possible when a user leaves a group.
- *
- * @param groupId - the id of the group to leave
- * @param deletePhotos - delete photos by this user from group
+ *
+ * @see lickr.groups.leave for a description of the various behaviors possible
+ * when a user leaves a group.
+ *
+ * @param groupId
+ * - the id of the group to leave
+ * @param deletePhotos
+ * - delete photos by this user from group
*/
public void leave(String groupId, Boolean deletePhotos) throws FlickrException {
Map parameters = new HashMap();
parameters.put("method", METHOD_LEAVE);
- parameters.put(Flickr.API_KEY, apiKey);
parameters.put("group_id", groupId);
parameters.put("delete_photos", deletePhotos);
- Response response = transportAPI.post(transportAPI.getPath(), parameters, sharedSecret);
+ Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
diff --git a/src/main/java/com/flickr4java/flickr/groups/Restriction.java b/src/main/java/com/flickr4java/flickr/groups/Restriction.java
new file mode 100644
index 00000000..ddd95c6d
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/groups/Restriction.java
@@ -0,0 +1,134 @@
+package com.flickr4java.flickr.groups;
+
+public class Restriction {
+
+ private Boolean photosOk;
+
+ private Boolean videosOk;
+
+ private Boolean imagesOk;
+
+ private Boolean screensOk;
+
+ private Boolean artOk;
+
+ private Boolean safeOk;
+
+ private Boolean moderateOk;
+
+ private Boolean restrictedOk;
+
+ private Boolean hasGeo;
+
+ /**
+ *
+ *
+ * @return Are Photos allowed in the group
+ */
+ public Boolean isPhotosOk() {
+ return photosOk;
+ }
+
+ public void setIsPhotosOk(Boolean value) {
+ this.photosOk = value;
+ }
+
+ /**
+ *
+ *
+ * @return Are Videos allowed in the group
+ */
+ public Boolean isVideosOk() {
+ return videosOk;
+ }
+
+ public void setIsVideosOk(Boolean value) {
+ this.videosOk = value;
+
+ }
+
+ /**
+ *
+ *
+ * @return Are Images allowed in the group
+ */
+ public Boolean isImagesOk() {
+ return imagesOk;
+ }
+
+ public void setIsImagesOk(Boolean value) {
+ this.imagesOk = value;
+ }
+ /**
+ *
+ * @return Are Screens allowed in the group
+ */
+ public Boolean isScreensOk() {
+ return screensOk;
+ }
+
+ public void setIsScreensOk(Boolean value) {
+ this.screensOk = value;
+ }
+
+ /**
+ *
+ * @return Are art allowed in the group
+ */
+ public Boolean isArtOk() {
+ return artOk;
+ }
+
+ public void setIsArtOk(Boolean value) {
+ this.artOk = value;
+ }
+
+ /**
+ *
+ * @return Are Safe rated images allowed in the group
+ */
+ public Boolean isSafeOk() {
+ return safeOk;
+ }
+
+ public void setIsSafeOk(Boolean value) {
+ this.safeOk = value;
+ }
+ /**
+ *
+ * @return Are Moderate rated images allowed in the group
+ */
+ public Boolean isModerateOk() {
+ return moderateOk;
+ }
+
+ public void setIsModerateOk(Boolean value) {
+ this.moderateOk = value;
+ }
+
+ /**
+ *
+ * @return Are Restricted rated images allowed in the group
+ */
+ public Boolean isRestrictedOk() {
+ return restrictedOk;
+ }
+
+ public void setIsRestrictedOk(Boolean value) {
+ this.restrictedOk = value;
+ }
+
+ /**
+ *
+ * @return Are Geo-tagged images allowed in the group
+ */
+ public Boolean isHasGeo() {
+ return hasGeo;
+ }
+
+ public void setIsHasGeo(Boolean value) {
+ this.hasGeo = value;
+ }
+
+
+}
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Subcategory.java b/src/main/java/com/flickr4java/flickr/groups/Subcategory.java
similarity index 87%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Subcategory.java
rename to src/main/java/com/flickr4java/flickr/groups/Subcategory.java
index 4ea067f3..987852c6 100644
--- a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Subcategory.java
+++ b/src/main/java/com/flickr4java/flickr/groups/Subcategory.java
@@ -1,6 +1,4 @@
-/*
- * Copyright (c) 2005 Aetrion LLC.
- */
+
package com.flickr4java.flickr.groups;
/**
diff --git a/Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Throttle.java b/src/main/java/com/flickr4java/flickr/groups/Throttle.java
similarity index 100%
rename from Flickr4Java/src/main/java/com/flickr4java/flickr/groups/Throttle.java
rename to src/main/java/com/flickr4java/flickr/groups/Throttle.java
diff --git a/src/main/java/com/flickr4java/flickr/groups/discuss/GroupDiscussInterface.java b/src/main/java/com/flickr4java/flickr/groups/discuss/GroupDiscussInterface.java
new file mode 100644
index 00000000..8ea93448
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/groups/discuss/GroupDiscussInterface.java
@@ -0,0 +1,238 @@
+package com.flickr4java.flickr.groups.discuss;
+
+import com.flickr4java.flickr.FlickrException;
+import com.flickr4java.flickr.Response;
+import com.flickr4java.flickr.Transport;
+import com.flickr4java.flickr.util.XMLUtilities;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Group.Discuss Interface.
+ *
+ * @author Jonathan Willis
+ */
+public class GroupDiscussInterface {
+
+ public static final String METHOD_TOPICS_GET_LIST = "flickr.groups.discuss.topics.getList";
+
+ public static final String METHOD_TOPICS_GET_INFO = "flickr.groups.discuss.topics.getInfo";
+
+ public static final String METHOD_REPLIES_GET_LIST = "flickr.groups.discuss.replies.getList";
+
+ public static final String METHOD_REPLIES_GET_INFO = "flickr.groups.discuss.replies.getInfo";
+
+ private final String apiKey;
+
+ private final String sharedSecret;
+
+ private final Transport transportAPI;
+
+ public GroupDiscussInterface(String apiKey, String sharedSecret, Transport transportAPI) {
+ this.apiKey = apiKey;
+ this.sharedSecret = sharedSecret;
+ this.transportAPI = transportAPI;
+ }
+
+ /**
+ * Get a list of topics from a group.
+ *
+ * @param groupId
+ * Unique identifier of a group returns a list of topics for a given group {@link com.flickr4java.flickr.groups.Group}.
+ * @param perPage
+ * Number of records per page.
+ * @param page
+ * Result-section.
+ * @return A group topic list
+ * @throws FlickrException if there was a problem connecting to Flickr
+ * @see API Documentation
+ */
+ public TopicList getTopicsList(String groupId, int perPage, int page) throws FlickrException {
+ TopicList topicList = new TopicList();
+ Map parameters = new HashMap();
+ parameters.put("method", METHOD_TOPICS_GET_LIST);
+
+ parameters.put("group_id", groupId);
+
+ if (perPage > 0) {
+ parameters.put("per_page", "" + perPage);
+ }
+ if (page > 0) {
+ parameters.put("page", "" + page);
+ }
+
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
+ if (response.isError()) {
+ throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
+ }
+
+ Element topicElements = response.getPayload();
+ topicList.setPage(topicElements.getAttribute("page"));
+ topicList.setPages(topicElements.getAttribute("pages"));
+ topicList.setPerPage(topicElements.getAttribute("perpage"));
+ topicList.setTotal(topicElements.getAttribute("total"));
+ topicList.setGroupId(topicElements.getAttribute("group_id"));
+ topicList.setIconServer(Integer.parseInt(topicElements.getAttribute("iconserver")));
+ topicList.setIconFarm(Integer.parseInt(topicElements.getAttribute("iconfarm")));
+ topicList.setName(topicElements.getAttribute("name"));
+ topicList.setMembers(Integer.parseInt(topicElements.getAttribute("members")));
+ topicList.setPrivacy(Integer.parseInt(topicElements.getAttribute("privacy")));
+ topicList.setLanguage(topicElements.getAttribute("lang"));
+ topicList.setIsPoolModerated("1".equals(topicElements.getAttribute("ispoolmoderated")));
+
+ NodeList topicNodes = topicElements.getElementsByTagName("topic");
+ for (int i = 0; i < topicNodes.getLength(); i++) {
+ Element element = (Element) topicNodes.item(i);
+ topicList.add(parseTopic(element));
+ }
+ return topicList;
+ }
+
+ /**
+ * Get info for a given topic
+ *
+ * @param topicId
+ * Unique identifier of a topic for a given group {@link Topic}.
+ * @return A group topic
+ * @throws FlickrException if there was a problem connecting to Flickr
+ * @see API Documentation
+ */
+ public Topic getTopicInfo(String topicId) throws FlickrException {
+ Map parameters = new HashMap();
+ parameters.put("method", METHOD_TOPICS_GET_INFO);
+ parameters.put("topic_id", topicId);
+
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
+ if (response.isError()) {
+ throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
+ }
+
+ Element topicElement = response.getPayload();
+
+ return parseTopic(topicElement);
+ }
+
+ /**
+ * Get list of replies
+ *
+ * @param topicId
+ * Unique identifier of a topic for a given group {@link Topic}.
+ * @return A reply object
+ * @throws FlickrException if there was a problem connecting to Flickr
+ * @see API Documentation
+ */
+ public ReplyObject getReplyList(String topicId, int perPage, int page) throws FlickrException {
+ ReplyList reply = new ReplyList();
+ TopicList topic = new TopicList();
+ Map parameters = new HashMap();
+ parameters.put("method", METHOD_REPLIES_GET_LIST);
+
+ parameters.put("topic_id", topicId);
+
+ if (perPage > 0) {
+ parameters.put("per_page", "" + perPage);
+ }
+ if (page > 0) {
+ parameters.put("page", "" + page);
+ }
+
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
+ if (response.isError()) {
+ throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
+ }
+
+ Element replyElements = response.getPayload();
+ ReplyObject ro = new ReplyObject();
+ NodeList replyNodes = replyElements.getElementsByTagName("reply");
+ for (int i = 0; i < replyNodes.getLength(); i++) {
+ Element replyNodeElement = (Element) replyNodes.item(i);
+ // Element replyElement = XMLUtilities.getChild(replyNodeElement, "reply");
+ reply.add(parseReply(replyNodeElement));
+ ro.setReplyList(reply);
+
+ }
+ NodeList topicNodes = replyElements.getElementsByTagName("topic");
+ for (int i = 0; i < topicNodes.getLength(); i++) {
+ Element replyNodeElement = (Element) replyNodes.item(i);
+ // Element topicElement = XMLUtilities.getChild(replyNodeElement, "topic");
+ topic.add(parseTopic(replyNodeElement));
+ ro.setTopicList(topic);
+ }
+
+ return ro;
+ }
+
+ /**
+ * Get info for a given topic reply
+ *
+ * @param topicId
+ * Unique identifier of a topic for a given group {@link Topic}.
+ * @param replyId
+ * Unique identifier of a reply for a given topic {@link Reply}.
+ * @return A group topic
+ * @throws FlickrException if there was a problem connecting to Flickr
+ * @see API Documentation
+ */
+ public Reply getReplyInfo(String topicId, String replyId) throws FlickrException {
+ Map parameters = new HashMap();
+ parameters.put("method", METHOD_REPLIES_GET_INFO);
+ parameters.put("topic_id", topicId);
+ parameters.put("reply_id", replyId);
+
+ Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
+ if (response.isError()) {
+ throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
+ }
+
+ Element replyElement = response.getPayload();
+
+ return parseReply(replyElement);
+ }
+
+ private Topic parseTopic(Element tElement) {
+ Topic topic = new Topic();
+ topic.setAuthorId(tElement.getAttribute("author"));
+ topic.setAuthorname(tElement.getAttribute("authorname"));
+ topic.setIsCanDelete("1".equals(tElement.getAttribute("can_delete")));
+ topic.setIsCanEdit("1".equals(tElement.getAttribute("can_edit")));
+ topic.setIsCanReply("1".equals(tElement.getAttribute("can_reply")));
+ if (!tElement.getAttribute("count_replies").equals("")) {
+ topic.setCountReplies(Integer.parseInt(tElement.getAttribute("count_replies")));
+ }
+ topic.setDatecreate(tElement.getAttribute("datecreate"));
+ topic.setDatelastpost(tElement.getAttribute("datelastpost"));
+ topic.setIconfarm(Integer.parseInt(tElement.getAttribute("iconfarm")));
+ topic.setIconserver(Integer.parseInt(tElement.getAttribute("iconserver")));
+ topic.setIsLocked("1".equals(tElement.getAttribute("is_locked")));
+ topic.setMessage(XMLUtilities.getChildValue(tElement, "message"));
+ topic.setRole(tElement.getAttribute("role"));
+ topic.setIsSticky("1".equals(tElement.getAttribute("is_sticky")));
+ topic.setSubject(tElement.getAttribute("subject"));
+ topic.setTopicId(tElement.getAttribute("id"));
+ topic.setIsPro("1".equals(tElement.getAttribute("is_pro")));
+ topic.setLastReply(tElement.getAttribute("last_reply"));
+ return topic;
+ }
+
+ private Reply parseReply(Element rElement) {
+ Reply reply = new Reply();
+ reply.setAuthorId(rElement.getAttribute("author"));
+ reply.setAuthorname(rElement.getAttribute("authorname"));
+ reply.setIsCanDelete("1".equals(rElement.getAttribute("can_delete")));
+ reply.setIsCanEdit("1".equals(rElement.getAttribute("can_edit")));
+ reply.setDatecreate(rElement.getAttribute("datecreate"));
+ reply.setLastEdit(rElement.getAttribute("lastedit"));
+ reply.setIconfarm(Integer.parseInt(rElement.getAttribute("iconfarm")));
+ reply.setIconserver(Integer.parseInt(rElement.getAttribute("iconserver")));
+ reply.setMessage(XMLUtilities.getChildValue(rElement, "message"));
+ reply.setRole(rElement.getAttribute("role"));
+ reply.setReplyId(rElement.getAttribute("id"));
+ reply.setIsPro("1".equals(rElement.getAttribute("is_pro")));
+ return reply;
+ }
+
+}
diff --git a/src/main/java/com/flickr4java/flickr/groups/discuss/Reply.java b/src/main/java/com/flickr4java/flickr/groups/discuss/Reply.java
new file mode 100644
index 00000000..d21f60c1
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/groups/discuss/Reply.java
@@ -0,0 +1,90 @@
+package com.flickr4java.flickr.groups.discuss;
+
+public class Reply {
+
+ private String replyId;
+ private String authorId;
+ private String authorname;
+ private String role;
+ private int iconserver;
+ private int iconfarm;
+ private boolean canEdit;
+ private boolean canDelete;
+ private String datecreate;
+ private String message;
+ private String lastEdit;
+ private boolean isPro;
+
+ public String getReplyId() {
+ return replyId;
+ }
+ public void setReplyId(String replyId) {
+ this.replyId = replyId;
+ }
+ public String getAuthorId() {
+ return authorId;
+ }
+ public void setAuthorId(String authorId) {
+ this.authorId = authorId;
+ }
+ public String getAuthorname() {
+ return authorname;
+ }
+ public void setAuthorname(String authorname) {
+ this.authorname = authorname;
+ }
+ public int getIconserver() {
+ return iconserver;
+ }
+ public void setIconserver(int iconserver) {
+ this.iconserver = iconserver;
+ }
+ public String getRole() {
+ return role;
+ }
+ public void setRole(String role) {
+ this.role = role;
+ }
+ public int getIconfarm() {
+ return iconfarm;
+ }
+ public void setIconfarm(int iconfarm) {
+ this.iconfarm = iconfarm;
+ }
+ public boolean isCanEdit() {
+ return canEdit;
+ }
+ public void setIsCanEdit(boolean canEdit) {
+ this.canEdit = canEdit;
+ }
+ public boolean isCanDelete() {
+ return canDelete;
+ }
+ public void setIsCanDelete(boolean canDelete) {
+ this.canDelete = canDelete;
+ }
+ public String getDatecreate() {
+ return datecreate;
+ }
+ public void setDatecreate(String datecreate) {
+ this.datecreate = datecreate;
+ }
+ public String getMessage() {
+ return message;
+ }
+ public void setMessage(String message) {
+ this.message = message;
+ }
+ public String getLastEdit() {
+ return lastEdit;
+ }
+ public void setLastEdit(String lastEdit) {
+ this.lastEdit = lastEdit;
+ }
+ public boolean isPro() {
+ return isPro;
+ }
+ public void setIsPro(boolean isPro) {
+ this.isPro = isPro;
+ }
+}
diff --git a/src/main/java/com/flickr4java/flickr/groups/discuss/ReplyList.java b/src/main/java/com/flickr4java/flickr/groups/discuss/ReplyList.java
new file mode 100644
index 00000000..5a47fb61
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/groups/discuss/ReplyList.java
@@ -0,0 +1,12 @@
+package com.flickr4java.flickr.groups.discuss;
+
+import java.util.ArrayList;
+
+public class ReplyList extends ArrayList {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 2830506892011990291L;
+
+}
diff --git a/src/main/java/com/flickr4java/flickr/groups/discuss/ReplyObject.java b/src/main/java/com/flickr4java/flickr/groups/discuss/ReplyObject.java
new file mode 100644
index 00000000..4a7460bc
--- /dev/null
+++ b/src/main/java/com/flickr4java/flickr/groups/discuss/ReplyObject.java
@@ -0,0 +1,26 @@
+package com.flickr4java.flickr.groups.discuss;
+
+import java.util.ArrayList;
+
+public class ReplyObject {
+
+ private ArrayList topicList = new ArrayList();
+ private ArrayList