Commit 03d69b81 authored by Greg Messner's avatar Greg Messner
Browse files

Mods to support file upload (#171).

parent f1a73832
...@@ -227,6 +227,12 @@ ...@@ -227,6 +227,12 @@
<artifactId>jersey-apache-connector</artifactId> <artifactId>jersey-apache-connector</artifactId>
<version>${jersey.version}</version> <version>${jersey.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>
......
package org.gitlab4j.api; package org.gitlab4j.api;
import java.io.File;
import java.net.URL; import java.net.URL;
import java.net.URLEncoder; import java.net.URLEncoder;
...@@ -147,7 +148,7 @@ public abstract class AbstractApi implements Constants { ...@@ -147,7 +148,7 @@ public abstract class AbstractApi implements Constants {
* a ClientResponse instance with the data returned from the endpoint. * a ClientResponse instance with the data returned from the endpoint.
* *
* @param expectedStatus the HTTP status that should be returned from the server * @param expectedStatus the HTTP status that should be returned from the server
* @param stream the StreamingOutput taht will be used for the POST data * @param stream the StreamingOutput that will be used for the POST data
* @param mediaType the content-type for the streamed data * @param mediaType the content-type for the streamed data
* @param pathArgs variable list of arguments used to build the URI * @param pathArgs variable list of arguments used to build the URI
* @return a ClientResponse instance with the data returned from the endpoint * @return a ClientResponse instance with the data returned from the endpoint
...@@ -197,6 +198,46 @@ public abstract class AbstractApi implements Constants { ...@@ -197,6 +198,46 @@ public abstract class AbstractApi implements Constants {
} }
} }
/**
* Perform a file upload with the specified File instance and path objects, returning
* a ClientResponse instance with the data returned from the endpoint.
*
* @param expectedStatus the HTTP status that should be returned from the server
* @param name the name for the form field that contains the file name
* @param fileToUpload a File instance pointing to the file to upload
* @param mediaType the content-type of the uploaded file, if null will be determined from fileToUpload
* @param pathArgs variable list of arguments used to build the URI
* @return a ClientResponse instance with the data returned from the endpoint
* @throws GitLabApiException if any exception occurs during execution
*/
protected Response upload(Response.Status expectedStatus, String name, File fileToUpload, String mediaType, Object... pathArgs) throws GitLabApiException {
try {
return validate(getApiClient().upload(name, fileToUpload, mediaType, pathArgs), expectedStatus);
} catch (Exception e) {
throw handle(e);
}
}
/**
* Perform a file upload with the specified File instance and path objects, returning
* a ClientResponse instance with the data returned from the endpoint.
*
* @param expectedStatus the HTTP status that should be returned from the server
* @param name the name for the form field that contains the file name
* @param fileToUpload a File instance pointing to the file to upload
* @param mediaType the content-type of the uploaded file, if null will be determined from fileToUpload
* @param url the fully formed path to the GitLab API endpoint
* @return a ClientResponse instance with the data returned from the endpoint
* @throws GitLabApiException if any exception occurs during execution
*/
protected Response upload(Response.Status expectedStatus, String name, File fileToUpload, String mediaType, URL url) throws GitLabApiException {
try {
return validate(getApiClient().upload(name, fileToUpload, mediaType, url), expectedStatus);
} catch (Exception e) {
throw handle(e);
}
}
/** /**
* Perform an HTTP PUT call with the specified form data and path objects, returning * Perform an HTTP PUT call with the specified form data and path objects, returning
* a ClientResponse instance with the data returned from the endpoint. * a ClientResponse instance with the data returned from the endpoint.
......
package org.gitlab4j.api; package org.gitlab4j.api;
import static javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA_TYPE;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.net.URL; import java.net.URL;
...@@ -33,6 +36,11 @@ import org.gitlab4j.api.utils.JacksonJson; ...@@ -33,6 +36,11 @@ import org.gitlab4j.api.utils.JacksonJson;
import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.MultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
/** /**
* This class utilizes the Jersey client package to communicate with a GitLab API endpoint. * This class utilizes the Jersey client package to communicate with a GitLab API endpoint.
...@@ -224,6 +232,7 @@ public class GitLabApiClient { ...@@ -224,6 +232,7 @@ public class GitLabApiClient {
} }
clientConfig.register(JacksonJson.class); clientConfig.register(JacksonJson.class);
clientConfig.register(MultiPartFeature.class);
} }
/** /**
...@@ -450,6 +459,45 @@ public class GitLabApiClient { ...@@ -450,6 +459,45 @@ public class GitLabApiClient {
return (invocation(url, null).post(Entity.entity(stream, mediaType))); return (invocation(url, null).post(Entity.entity(stream, mediaType)));
} }
/**
* Perform a file upload as part of the , returning
* a ClientResponse instance with the data returned from the endpoint.
*
* @param name the name for the form field that contains the file name
* @param fileToUpload a File instance pointing to the file to upload
* @param mediaTypeString the content-type of the uploaded file, if null will be determined from fileToUpload
* @param pathArgs variable list of arguments used to build the URI
* @return a ClientResponse instance with the data returned from the endpoint
* @throws IOException if an error occurs while constructing the URL
*/
protected Response upload(String name, File fileToUpload, String mediaTypeString, Object... pathArgs) throws IOException {
URL url = getApiUrl(pathArgs);
return (upload(name, fileToUpload, mediaTypeString, url));
}
/**
* Perform a file upload using multipart/form-data, returning
* a ClientResponse instance with the data returned from the endpoint.
*
* @param name the name for the form field that contains the file name
* @param fileToUpload a File instance pointing to the file to upload
* @param mediaTypeString the content-type of the uploaded file, if null will be determined from fileToUpload
* @param url the fully formed path to the GitLab API endpoint
* @return a ClientResponse instance with the data returned from the endpoint
* @throws IOException if an error occurs while constructing the URL
*/
protected Response upload(String name, File fileToUpload, String mediaTypeString, URL url) throws IOException {
MediaType mediaType = (mediaTypeString != null ? MediaType.valueOf(mediaTypeString) : null);
try (MultiPart multiPart = new FormDataMultiPart()) {
FileDataBodyPart filePart = mediaType != null ?
new FileDataBodyPart(name, fileToUpload, mediaType) :
new FileDataBodyPart(name, fileToUpload);
multiPart.bodyPart(filePart);
return (invocation(url, null).post(Entity.entity(multiPart, MULTIPART_FORM_DATA_TYPE)));
}
}
/** /**
* Perform an HTTP PUT call with the specified form data and path objects, returning * Perform an HTTP PUT call with the specified form data and path objects, returning
* a ClientResponse instance with the data returned from the endpoint. * a ClientResponse instance with the data returned from the endpoint.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment