blob: 4804f6afb3d2863c2e404e253fa830f269375a4f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Frank Becker and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Frank Becker - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.bugzilla.rest.core;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.StringEntity;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.operations.IOperationMonitor;
import org.eclipse.mylyn.commons.repositories.http.core.CommonHttpClient;
import org.eclipse.mylyn.commons.repositories.http.core.CommonHttpResponse;
import org.eclipse.mylyn.commons.repositories.http.core.HttpUtil;
import org.eclipse.mylyn.internal.bugzilla.rest.core.response.data.BugzillaRestIdsResult;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.osgi.util.NLS;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonWriter;
public class BugzillaRestPostNewAttachment extends BugzillaRestPostRequest<BugzillaRestIdsResult> {
private final String bugReportID;
private final String comment;
private final AbstractTaskAttachmentSource source;
private final TaskAttribute attachmentAttribute;
public BugzillaRestPostNewAttachment(CommonHttpClient client, String bugReportID, String comment,
AbstractTaskAttachmentSource source, TaskAttribute attachmentAttribute, IOperationMonitor monitor) {
super(client, "/bug/" + bugReportID + "/attachment"); //$NON-NLS-1$ //$NON-NLS-2$
this.bugReportID = bugReportID;
this.comment = comment;
this.source = source;
this.attachmentAttribute = attachmentAttribute;
}
List<NameValuePair> requestParameters;
@Override
protected void addHttpRequestEntities(HttpRequestBase request) throws BugzillaRestException {
super.addHttpRequestEntities(request);
String description = source.getDescription();
String contentType = source.getContentType();
String filename = source.getName();
boolean isPatch = false;
boolean isPrivate = false;
if (attachmentAttribute != null) {
BugzillaRestAttachmentMapper mapper = BugzillaRestAttachmentMapper.createFrom(attachmentAttribute);
if (mapper.getDescription() != null) {
description = mapper.getDescription();
}
if (mapper.getContentType() != null) {
contentType = mapper.getContentType();
}
if (mapper.getFileName() != null) {
filename = mapper.getFileName();
}
if (mapper.isPatch() != null) {
isPatch = mapper.isPatch();
}
if (mapper.getAttachmentIsPrivate() != null) {
isPrivate = mapper.getAttachmentIsPrivate();
}
}
Assert.isNotNull(bugReportID);
Assert.isNotNull(source);
Assert.isNotNull(contentType);
ByteArrayOutputStream outb = new ByteArrayOutputStream();
InputStream is = null;
try {
is = source.createInputStream(null);
IOUtils.copy(is, outb);
} catch (CoreException | IOException e) {
throw new BugzillaRestException(
"BugzillaRestPostNewAttachment.createHttpRequestBase could not get stream form source", e);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
throw new BugzillaRestException(
"BugzillaRestPostNewAttachment.createHttpRequestBase could not cloase stream form source",
e);
}
}
}
if (description == null) {
throw new BugzillaRestException(new CoreException(new Status(IStatus.WARNING, BugzillaRestCore.ID_PLUGIN,
"Description required when submitting attachments")));
}
Base64 base64 = new Base64();
String dataBase64 = base64.encodeAsString(outb.toByteArray());
try {
StringWriter stringWriter = new StringWriter();
JsonWriter out = new JsonWriter(stringWriter);
out.setLenient(true);
out.beginObject();
addAuthenticationToGson(out, getClient().getLocation());
out.name("ids").beginArray().value(Integer.parseInt(bugReportID)).endArray(); //$NON-NLS-1$
out.name("is_patch").value(isPatch); //$NON-NLS-1$
out.name("summary").value(description); //$NON-NLS-1$
out.name("content_type").value(contentType); //$NON-NLS-1$
out.name("data").value(dataBase64); //$NON-NLS-1$
out.name("file_name").value(filename); //$NON-NLS-1$
out.name("is_private").value(isPrivate); //$NON-NLS-1$
if (attachmentAttribute != null) {
attachmentAttribute.getAttributes().values();
Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
for (TaskAttribute taskAttribute : attachmentAttribute.getAttributes().values()) {
changed.add(taskAttribute);
}
BugzillaRestGsonUtil.buildFlags(out, changed, attachmentAttribute);
}
out.endObject();
out.close();
StringEntity requestEntity = new StringEntity(stringWriter.toString());
((HttpPost) request).setEntity(requestEntity);
} catch (IOException e) {
throw new BugzillaRestException(
"BugzillaRestPostNewAttachment.createHttpRequestBase could not create RequestEntity", e);
}
}
@Override
protected BugzillaRestIdsResult parseFromJson(InputStreamReader in) {
TypeToken<BugzillaRestIdsResult> type = new TypeToken<BugzillaRestIdsResult>() {
};
return new Gson().fromJson(in, type.getType());
}
protected BugzillaRestStatus parseErrorFromJson(InputStreamReader in) {
TypeToken<BugzillaRestStatus> type = new TypeToken<BugzillaRestStatus>() {
};
return new Gson().fromJson(in, type.getType());
}
@Override
protected void doValidate(CommonHttpResponse response, IOperationMonitor monitor)
throws IOException, BugzillaRestException {
int statusCode = response.getStatusCode();
if (statusCode != 400 && statusCode != 201) {
if (statusCode == HttpStatus.SC_NOT_FOUND) {
throw new BugzillaRestResourceNotFoundException(
NLS.bind("Requested resource ''{0}'' does not exist", response.getRequestPath()));
}
throw new BugzillaRestException(NLS.bind("Unexpected response from Bugzilla REST server for ''{0}'': {1}",
response.getRequestPath(), HttpUtil.getStatusText(statusCode)));
}
}
@Override
protected BugzillaRestIdsResult doProcess(CommonHttpResponse response, IOperationMonitor monitor)
throws IOException, BugzillaRestException {
InputStream is = response.getResponseEntityAsStream();
InputStreamReader in = new InputStreamReader(is);
switch (response.getStatusCode()) {
case HttpURLConnection.HTTP_OK:
case HttpURLConnection.HTTP_CREATED:
return parseFromJson(in);
default:
BugzillaRestStatus status = parseErrorFromJson(in);
throw new BugzillaRestException(
NLS.bind("{2} (status: {1} from {0})", new String[] { response.getRequestPath(),
HttpUtil.getStatusText(response.getStatusCode()), status.getMessage() }));
}
}
}