This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch jira in repository https://gitbox.apache.org/repos/asf/camel.git
commit 1bb2f87dbd67f446ec1f12ca43ee6bab9eba261e Author: Claus Ibsen <[email protected]> AuthorDate: Mon Jun 12 09:03:04 2023 +0200 CAMEL-19423: camel-jira - Do not have special type converter. Attach should work with body as-is --- .../camel/component/jira/FileConverterLoader.java | 52 ---------------------- .../services/org/apache/camel/TypeConverterLoader | 2 - .../apache/camel/component/jira/FileConverter.java | 50 --------------------- .../jira/producer/AttachFileProducer.java | 30 +++++++++++-- ...va => AttachFileProducerFromFileRouteTest.java} | 26 +++++------ ...java => AttachFileProducerInputStreamTest.java} | 47 +++++++++---------- .../jira/producer/AttachFileProducerTest.java | 7 ++- 7 files changed, 64 insertions(+), 150 deletions(-) diff --git a/components/camel-jira/src/generated/java/org/apache/camel/component/jira/FileConverterLoader.java b/components/camel-jira/src/generated/java/org/apache/camel/component/jira/FileConverterLoader.java deleted file mode 100644 index 8c55edbdd91..00000000000 --- a/components/camel-jira/src/generated/java/org/apache/camel/component/jira/FileConverterLoader.java +++ /dev/null @@ -1,52 +0,0 @@ -/* Generated by camel build tools - do NOT edit this file! */ -package org.apache.camel.component.jira; - -import org.apache.camel.CamelContext; -import org.apache.camel.CamelContextAware; -import org.apache.camel.DeferredContextBinding; -import org.apache.camel.Exchange; -import org.apache.camel.TypeConversionException; -import org.apache.camel.TypeConverterLoaderException; -import org.apache.camel.spi.TypeConverterLoader; -import org.apache.camel.spi.TypeConverterRegistry; -import org.apache.camel.support.SimpleTypeConverter; -import org.apache.camel.support.TypeConverterSupport; -import org.apache.camel.util.DoubleMap; - -/** - * Generated by camel build tools - do NOT edit this file! - */ -@SuppressWarnings("unchecked") -@DeferredContextBinding -public final class FileConverterLoader implements TypeConverterLoader, CamelContextAware { - - private CamelContext camelContext; - - public FileConverterLoader() { - } - - @Override - public void setCamelContext(CamelContext camelContext) { - this.camelContext = camelContext; - } - - @Override - public CamelContext getCamelContext() { - return camelContext; - } - - @Override - public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException { - registerConverters(registry); - } - - private void registerConverters(TypeConverterRegistry registry) { - addTypeConverter(registry, java.io.File.class, org.apache.camel.component.file.GenericFile.class, false, - (type, exchange, value) -> org.apache.camel.component.jira.FileConverter.genericToFile((org.apache.camel.component.file.GenericFile) value, exchange)); - } - - private static void addTypeConverter(TypeConverterRegistry registry, Class<?> toType, Class<?> fromType, boolean allowNull, SimpleTypeConverter.ConversionMethod method) { - registry.addTypeConverter(toType, fromType, new SimpleTypeConverter(allowNull, method)); - } - -} diff --git a/components/camel-jira/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader b/components/camel-jira/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader deleted file mode 100644 index 49423652c19..00000000000 --- a/components/camel-jira/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by camel build tools - do NOT edit this file! -org.apache.camel.component.jira.FileConverterLoader diff --git a/components/camel-jira/src/main/java/org/apache/camel/component/jira/FileConverter.java b/components/camel-jira/src/main/java/org/apache/camel/component/jira/FileConverter.java deleted file mode 100644 index f3d838aedea..00000000000 --- a/components/camel-jira/src/main/java/org/apache/camel/component/jira/FileConverter.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardOpenOption; - -import org.apache.camel.Converter; -import org.apache.camel.Exchange; -import org.apache.camel.component.file.GenericFile; - -@Converter(generateLoader = true) -public final class FileConverter { - - private FileConverter() { - } - - @Converter - public static File genericToFile(GenericFile<File> genericFile, Exchange exchange) throws IOException { - Object body = genericFile.getBody(); - File file = null; - Path path; - if (body instanceof byte[]) { - byte[] bos = (byte[]) body; - path = Files.createTempFile(genericFile.getFileName(), null); - Files.write(path, bos, StandardOpenOption.CREATE); - path.toFile().deleteOnExit(); - } else { - file = (File) body; - } - return file; - } -} diff --git a/components/camel-jira/src/main/java/org/apache/camel/component/jira/producer/AttachFileProducer.java b/components/camel-jira/src/main/java/org/apache/camel/component/jira/producer/AttachFileProducer.java index b9184f3d7d7..e130481f76e 100644 --- a/components/camel-jira/src/main/java/org/apache/camel/component/jira/producer/AttachFileProducer.java +++ b/components/camel-jira/src/main/java/org/apache/camel/component/jira/producer/AttachFileProducer.java @@ -17,6 +17,7 @@ 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; @@ -24,6 +25,7 @@ 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; @@ -39,13 +41,35 @@ public class AttachFileProducer extends DefaultProducer { 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); + } } } diff --git a/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java b/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerFromFileRouteTest.java similarity index 92% copy from components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java copy to components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerFromFileRouteTest.java index 754795fc222..fb25a6fc381 100644 --- a/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java +++ b/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerFromFileRouteTest.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.net.URI; import java.nio.file.Files; import java.nio.file.StandardCopyOption; -import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Collection; @@ -33,6 +32,7 @@ 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; @@ -40,6 +40,7 @@ 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; @@ -57,7 +58,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -public class AttachFileProducerTest extends CamelTestSupport { +public class AttachFileProducerFromFileRouteTest extends CamelTestSupport { @Mock private JiraRestClient jiraClient; @@ -109,16 +110,9 @@ public class AttachFileProducerTest extends CamelTestSupport { }); } - private File generateSampleFile() throws IOException { - File sampleRandomFile = File.createTempFile("attach-test", null); - sampleRandomFile.deleteOnExit(); - String text = "A random text to use on the AttachFileProducerTest.java of camel-jira component."; - Files.write(sampleRandomFile.toPath(), text.getBytes(), StandardOpenOption.CREATE); - return sampleRandomFile; - } - @Override protected CamelContext createCamelContext() throws Exception { + FileUtil.removeDir(new File("target/attach")); setMocks(); CamelContext camelContext = super.createCamelContext(); camelContext.disableJMX(); @@ -132,7 +126,7 @@ public class AttachFileProducerTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() { - from("direct:start") + from("file:target/attach") .setHeader(ISSUE_KEY, () -> KEY + "-1") .to("jira://attach?jiraUrl=" + JIRA_CREDENTIALS) .to(mockResult); @@ -142,14 +136,18 @@ public class AttachFileProducerTest extends CamelTestSupport { @Test public void verifyAttachment() throws InterruptedException, IOException { - template.sendBody(generateSampleFile()); + 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()); - mockResult.expectedMessageCount(1); - mockResult.assertIsSatisfied(); } } diff --git a/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java b/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerInputStreamTest.java similarity index 79% copy from components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java copy to components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerInputStreamTest.java index 754795fc222..745907880ae 100644 --- a/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java +++ b/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerInputStreamTest.java @@ -16,12 +16,9 @@ */ package org.apache.camel.component.jira.producer; -import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.URI; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Collection; @@ -57,7 +54,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -public class AttachFileProducerTest extends CamelTestSupport { +public class AttachFileProducerInputStreamTest extends CamelTestSupport { @Mock private JiraRestClient jiraClient; @@ -75,7 +72,8 @@ public class AttachFileProducerTest extends CamelTestSupport { private MockEndpoint mockResult; private Issue issue; - private File attachedFile; + private String attachedName; + private int attachedSize; @Override protected void bindToRegistry(Registry registry) { @@ -92,16 +90,15 @@ public class AttachFileProducerTest extends CamelTestSupport { } 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(); + when(issueRestClient.addAttachment(any(URI.class), any(InputStream.class), any(String.class))).then(inv -> { + InputStream is = inv.getArgument(1); + attachedName = inv.getArgument(2); + attachedSize = is.readAllBytes().length; + Collection<Attachment> attachments = new ArrayList<>(); attachments.add(new Attachment( - issue.getAttachmentsUri(), attachedFile.getName(), null, null, - Long.valueOf(attachedFile.length()).intValue(), null, null, null)); + issue.getAttachmentsUri(), attachedName, null, null, + attachedSize, 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); @@ -109,14 +106,6 @@ public class AttachFileProducerTest extends CamelTestSupport { }); } - private File generateSampleFile() throws IOException { - File sampleRandomFile = File.createTempFile("attach-test", null); - sampleRandomFile.deleteOnExit(); - String text = "A random text to use on the AttachFileProducerTest.java of camel-jira component."; - Files.write(sampleRandomFile.toPath(), text.getBytes(), StandardOpenOption.CREATE); - return sampleRandomFile; - } - @Override protected CamelContext createCamelContext() throws Exception { setMocks(); @@ -142,14 +131,18 @@ public class AttachFileProducerTest extends CamelTestSupport { @Test public void verifyAttachment() throws InterruptedException, IOException { - template.sendBody(generateSampleFile()); + mockResult.expectedMessageCount(1); + + String text = "A random text to use on the AttachFileProducerTest.java of camel-jira component."; + template.sendBody("direct:start", text); + + 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()); - mockResult.expectedMessageCount(1); - mockResult.assertIsSatisfied(); + assertEquals(attachFile.getFilename(), attachedName); + assertEquals(attachFile.getSize(), attachedSize); } } diff --git a/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java b/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java index 754795fc222..3b15d3f4741 100644 --- a/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java +++ b/components/camel-jira/src/test/java/org/apache/camel/component/jira/producer/AttachFileProducerTest.java @@ -142,14 +142,17 @@ public class AttachFileProducerTest extends CamelTestSupport { @Test public void verifyAttachment() throws InterruptedException, IOException { + mockResult.expectedMessageCount(1); + template.sendBody(generateSampleFile()); + + 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()); - mockResult.expectedMessageCount(1); - mockResult.assertIsSatisfied(); } }
