Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@
package org.apache.camel.component.jira.producer;

import java.io.File;
import java.io.InputStream;
import java.net.URI;

import com.atlassian.jira.rest.client.api.IssueRestClient;
import com.atlassian.jira.rest.client.api.JiraRestClient;
import com.atlassian.jira.rest.client.api.domain.Issue;
import org.apache.camel.Exchange;
import org.apache.camel.InvalidPayloadException;
import org.apache.camel.WrappedFile;
import org.apache.camel.component.jira.JiraEndpoint;
import org.apache.camel.support.DefaultProducer;

Expand All @@ -39,13 +41,35 @@ public void process(Exchange exchange) throws InvalidPayloadException {
String issueKey = exchange.getIn().getHeader(ISSUE_KEY, String.class);
if (issueKey == null) {
throw new IllegalArgumentException(
"Missing exchange input header named \'IssueKey\', it should specify the issue key to attach a file.");
"Missing exchange input header named 'IssueKey', it should specify the issue key to attach a file.");
}
File file = exchange.getIn().getMandatoryBody(File.class);

// check for java.io.File first before using input stream for file content
InputStream is = null;
String name = null;
File file = null;
Object body = exchange.getIn().getBody();
if (body instanceof File) {
file = (File) body;
} else {
WrappedFile wf = exchange.getIn().getBody(WrappedFile.class);
if (wf != null && wf.getFile() instanceof File) {
file = (File) wf.getFile();
}
}
if (file == null) {
is = exchange.getIn().getMandatoryBody(InputStream.class);
name = exchange.getIn().getHeader(Exchange.FILE_NAME, exchange.getMessage().getMessageId(), String.class);
}

JiraRestClient client = ((JiraEndpoint) getEndpoint()).getClient();
IssueRestClient issueClient = client.getIssueClient();
Issue issue = issueClient.getIssue(issueKey).claim();
URI attachmentsUri = issue.getAttachmentsUri();
issueClient.addAttachments(attachmentsUri, file);
if (file != null) {
issueClient.addAttachments(attachmentsUri, file);
} else {
issueClient.addAttachment(attachmentsUri, is, name);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.jira.producer;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Collection;

import com.atlassian.jira.rest.client.api.IssueRestClient;
import com.atlassian.jira.rest.client.api.JiraRestClient;
import com.atlassian.jira.rest.client.api.JiraRestClientFactory;
import com.atlassian.jira.rest.client.api.domain.Attachment;
import com.atlassian.jira.rest.client.api.domain.Issue;
import io.atlassian.util.concurrent.Promises;
import org.apache.camel.CamelContext;
import org.apache.camel.EndpointInject;
import org.apache.camel.Exchange;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jira.JiraComponent;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.spi.Registry;
import org.apache.camel.test.junit5.CamelTestSupport;
import org.apache.camel.util.FileUtil;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.apache.camel.component.jira.JiraConstants.ISSUE_KEY;
import static org.apache.camel.component.jira.JiraConstants.JIRA;
import static org.apache.camel.component.jira.JiraConstants.JIRA_REST_CLIENT_FACTORY;
import static org.apache.camel.component.jira.JiraTestConstants.JIRA_CREDENTIALS;
import static org.apache.camel.component.jira.JiraTestConstants.KEY;
import static org.apache.camel.component.jira.Utils.createIssue;
import static org.apache.camel.component.jira.Utils.createIssueWithAttachment;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
public class AttachFileProducerFromFileRouteTest extends CamelTestSupport {

@Mock
private JiraRestClient jiraClient;

@Mock
private JiraRestClientFactory jiraRestClientFactory;

@Mock
private IssueRestClient issueRestClient;

@Produce("direct:start")
private ProducerTemplate template;

@EndpointInject("mock:result")
private MockEndpoint mockResult;

private Issue issue;
private File attachedFile;

@Override
protected void bindToRegistry(Registry registry) {
registry.bind(JIRA_REST_CLIENT_FACTORY, jiraRestClientFactory);
}

public void setMocks() {
when(jiraRestClientFactory.createWithBasicHttpAuthentication(any(), any(), any())).thenReturn(jiraClient);
when(jiraClient.getIssueClient()).thenReturn(issueRestClient);

when(issueRestClient.getIssue(any())).then(inv -> {
if (issue == null) {
issue = createIssue(1);
}
return Promises.promise(issue);
});
when(issueRestClient.addAttachments(any(URI.class), any(File.class))).then(inv -> {
File attachedFileTmp = inv.getArgument(1);
// create a temp destiny file as the attached file is marked for removal on AttachFileProducer
attachedFile = File.createTempFile("camel-jira-test-", null);
Files.copy(attachedFileTmp.toPath(), attachedFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
attachedFile.deleteOnExit();
Collection<Attachment> attachments = new ArrayList<>();
attachments.add(new Attachment(
issue.getAttachmentsUri(), attachedFile.getName(), null, null,
Long.valueOf(attachedFile.length()).intValue(), null, null, null));
// re-create the issue with the attachment sent by the route
issue = createIssueWithAttachment(issue.getId(), issue.getSummary(), issue.getKey(), issue.getIssueType(),
issue.getDescription(), issue.getPriority(), issue.getAssignee(), attachments);
return null;
});
}

@Override
protected CamelContext createCamelContext() throws Exception {
FileUtil.removeDir(new File("target/attach"));
setMocks();
CamelContext camelContext = super.createCamelContext();
camelContext.disableJMX();
JiraComponent component = new JiraComponent(camelContext);
camelContext.addComponent(JIRA, component);
return camelContext;
}

@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() {
from("file:target/attach")
.setHeader(ISSUE_KEY, () -> KEY + "-1")
.to("jira://attach?jiraUrl=" + JIRA_CREDENTIALS)
.to(mockResult);
}
};
}

@Test
public void verifyAttachment() throws InterruptedException, IOException {
mockResult.expectedMessageCount(1);

String text = "A random text to use on the AttachFileProducerTest.java of camel-jira component.";
template.sendBodyAndHeader("file:target/attach", text, Exchange.FILE_NAME, "hello.txt");

mockResult.assertIsSatisfied();

Issue retrievedIssue = issueRestClient.getIssue(issue.getKey()).claim();
assertEquals(issue, retrievedIssue);
// there is only one attachment
Attachment attachFile = retrievedIssue.getAttachments().iterator().next();
assertEquals(attachFile.getFilename(), attachedFile.getName());
assertEquals(attachFile.getSize(), attachedFile.length());
}
}
Loading