This is an automated email from the ASF dual-hosted git repository. zhfeng pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 844533901b85d940c5a778d07ddcbe8f63428adb Author: Zheng Feng <[email protected]> AuthorDate: Tue Jun 20 11:23:16 2023 +0800 Fix #4524 re-enable the jira tests and add jakarta renames --- extensions/jira/deployment/pom.xml | 4 + .../jira/deployment/JakartaEnablement.java | 114 +++++++++++++++++++++ extensions/jira/runtime/pom.xml | 10 ++ integration-tests/jira/pom.xml | 10 ++ .../quarkus/component/jira/it/JiraRoutes.java | 6 +- pom.xml | 2 + poms/build-parent/pom.xml | 5 + 7 files changed, 148 insertions(+), 3 deletions(-) diff --git a/extensions/jira/deployment/pom.xml b/extensions/jira/deployment/pom.xml index ad9edf0676..45ea626cf1 100644 --- a/extensions/jira/deployment/pom.xml +++ b/extensions/jira/deployment/pom.xml @@ -54,6 +54,10 @@ <groupId>io.quarkus</groupId> <artifactId>quarkus-rest-client-deployment</artifactId> </dependency> + <dependency> + <groupId>org.eclipse.transformer</groupId> + <artifactId>org.eclipse.transformer</artifactId> + </dependency> </dependencies> <build> diff --git a/extensions/jira/deployment/src/main/java/org/apache/camel/quarkus/component/jira/deployment/JakartaEnablement.java b/extensions/jira/deployment/src/main/java/org/apache/camel/quarkus/component/jira/deployment/JakartaEnablement.java new file mode 100644 index 0000000000..bc56b00107 --- /dev/null +++ b/extensions/jira/deployment/src/main/java/org/apache/camel/quarkus/component/jira/deployment/JakartaEnablement.java @@ -0,0 +1,114 @@ +/* + * 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.quarkus.component.jira.deployment; + +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import io.quarkus.bootstrap.classloading.QuarkusClassLoader; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.builditem.BytecodeTransformerBuildItem; +import org.eclipse.transformer.action.ActionContext; +import org.eclipse.transformer.action.ByteData; +import org.eclipse.transformer.action.impl.ActionContextImpl; +import org.eclipse.transformer.action.impl.ByteDataImpl; +import org.eclipse.transformer.action.impl.ClassActionImpl; +import org.eclipse.transformer.action.impl.SelectionRuleImpl; +import org.eclipse.transformer.action.impl.SignatureRuleImpl; +import org.eclipse.transformer.util.FileUtils; +import org.objectweb.asm.ClassReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Jira REST client is compiled using references to classes in the javax packages; + * we need to transform these to fix compatibility with jakarta packages. + * We do this by leveraging the Eclipse Transformer project during Augmentation, so + * that end users don't need to bother. + * + * This class must be removed when https://ecosystem.atlassian.net/browse/JRJC-262 + * gets resolved. + */ +public class JakartaEnablement { + + private static final List<String> CLASSES_NEEDING_TRANSFORMATION = List.of( + "com.atlassian.jira.rest.client.internal.json.JsonObjectParser", + "com.atlassian.jira.rest.client.internal.json.IssueJsonParser", + "com.atlassian.jira.rest.client.internal.json.RoleActorJsonParser", + + "com.atlassian.jira.rest.client.internal.async.AsynchronousAuditRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousGroupRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousIssueRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousMetadataRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousMyPermissionsRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousProjectRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousProjectRolesRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousVersionRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousUserRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousSearchRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousSessionRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousComponentRestClient", + "com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClient"); + + @BuildStep + void transformToJakarta(BuildProducer<BytecodeTransformerBuildItem> transformers) { + if (QuarkusClassLoader.isClassPresentAtRuntime("jakarta.ws.rs.Path")) { + JakartaTransformer tr = new JakartaTransformer(); + for (String classname : CLASSES_NEEDING_TRANSFORMATION) { + final BytecodeTransformerBuildItem item = new BytecodeTransformerBuildItem.Builder() + .setCacheable(true) + .setContinueOnFailure(false) + .setClassToTransform(classname) + .setClassReaderOptions(ClassReader.SKIP_DEBUG) + .setInputTransformer(tr::transform) + .build(); + transformers.produce(item); + } + } + } + + private static class JakartaTransformer { + + private final Logger logger; + private final ActionContext ctx; + // We need to prevent the Eclipse Transformer to adjust the "javax" packages. + // Thus why we split the strings. + private static final Map<String, String> renames = Map.of("javax" + ".ws.rs.core", "jakarta.ws.rs.core"); + + JakartaTransformer() { + logger = LoggerFactory.getLogger("JakartaTransformer"); + //N.B. we enable only this single transformation of package renames, not the full set of capabilities of Eclipse Transformer; + //this might need tailoring if the same idea gets applied to a different context. + ctx = new ActionContextImpl(logger, + new SelectionRuleImpl(logger, Collections.emptyMap(), Collections.emptyMap()), + new SignatureRuleImpl(logger, renames, null, null, null, null, null, Collections.emptyMap())); + } + + byte[] transform(final String name, final byte[] bytes) { + logger.debug("Jakarta EE compatibility enhancer for Quarkus: transforming " + name); + final ClassActionImpl classTransformer = new ClassActionImpl(ctx); + final ByteBuffer input = ByteBuffer.wrap(bytes); + final ByteData inputData = new ByteDataImpl(name, input, FileUtils.DEFAULT_CHARSET); + final ByteData outputData = classTransformer.apply(inputData); + return outputData.buffer().array(); + } + } + +} diff --git a/extensions/jira/runtime/pom.xml b/extensions/jira/runtime/pom.xml index 7475d9974d..f6daed2b6c 100644 --- a/extensions/jira/runtime/pom.xml +++ b/extensions/jira/runtime/pom.xml @@ -58,6 +58,16 @@ <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jira</artifactId> + <exclusions> + <exclusion> + <groupId>org.glassfish.jersey.core</groupId> + <artifactId>*</artifactId> + </exclusion> + <exclusion> + <groupId>org.glassfish.jersey.media</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> diff --git a/integration-tests/jira/pom.xml b/integration-tests/jira/pom.xml index 3a5b98d2bb..c58f8f2cf6 100644 --- a/integration-tests/jira/pom.xml +++ b/integration-tests/jira/pom.xml @@ -94,6 +94,16 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> + <configuration> + <!-- Theses classpath configurations must be removed when https://ecosystem.atlassian.net/browse/JRJC-262 gets resolved--> + <additionalClasspathElements> + <additionalClasspathElement>${project.build.directory}/camel-quarkus-integration-test-jira-${project.version}-native-image-source-jar/lib/modified-com.atlassian.jira.jira-rest-java-client-core-${jira-rest-client.version}.jar</additionalClasspathElement> + <additionalClasspathElement>${project.build.directory}/camel-quarkus-integration-test-jira-${project.version}-native-image-source-jar/camel-quarkus-integration-test-jira-${project.version}-runner.jar</additionalClasspathElement> + </additionalClasspathElements> + <classpathDependencyExcludes> + <classpathDependencyExclude>com.atlassian.jira:jira-rest-java-client-core</classpathDependencyExclude> + </classpathDependencyExcludes> + </configuration> <executions> <execution> <goals> diff --git a/integration-tests/jira/src/main/java/org/apache/camel/quarkus/component/jira/it/JiraRoutes.java b/integration-tests/jira/src/main/java/org/apache/camel/quarkus/component/jira/it/JiraRoutes.java index bb27bbe18f..eb47390df2 100644 --- a/integration-tests/jira/src/main/java/org/apache/camel/quarkus/component/jira/it/JiraRoutes.java +++ b/integration-tests/jira/src/main/java/org/apache/camel/quarkus/component/jira/it/JiraRoutes.java @@ -35,9 +35,9 @@ public class JiraRoutes extends RouteBuilder { from("jira:watchUpdates?jql=RAW(project=" + projectKey + ")&watchedFields=Summary&sendOnlyUpdatedField=false&maxResults=1") - .id("jiraUpdates") - .autoStartup(false) - .to("seda:jiraUpdates"); + .id("jiraUpdates") + .autoStartup(false) + .to("seda:jiraUpdates"); from("jira:newComments?jql=RAW(project=" + projectKey + ")&maxResults=1") .id("jiraComments") diff --git a/pom.xml b/pom.xml index b6302b7c42..bb97b18147 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,7 @@ <commons-lang.version>2.6</commons-lang.version><!-- used by hbase, should be pretty stable as commons-lang is not developed actively anymore --> <cxf.version>4.0.1</cxf.version><!-- @sync io.quarkiverse.cxf:quarkus-cxf-parent:${quarkiverse-cxf.version} prop:cxf.version --> <eddsa.version>${eddsa-version}</eddsa.version> + <eclipse-transformer.version>0.5.0</eclipse-transformer.version> <freemarker.version>2.3.32</freemarker.version><!-- @sync io.quarkiverse.freemarker:quarkus-freemarker-parent:${quarkiverse-freemarker.version} prop:freemarker.version --> <geny.version>0.6.2</geny.version> <github-api.version>1.313</github-api.version><!-- Used in a Groovy script bellow --> @@ -116,6 +117,7 @@ <jaxen.version>1.2.0</jaxen.version> <javassist.version>${javassist-version}</javassist.version><!-- debezium --> <jetty.version>${jetty-version}</jetty.version> + <jira-rest-client.version>${jira-rest-client-api-version}</jira-rest-client.version> <jna-platform.version>5.6.0</jna-platform.version><!-- @sync com.azure:azure-identity:${azure-identity.version} dep:net.java.dev.jna:jna-platform --> <jnr-ffi.version>2.2.13</jnr-ffi.version><!-- Mess in web3j transitive deps --> <jsch.version>0.2.9</jsch.version><!-- @sync io.quarkiverse.jsch:quarkus-jsch-parent:${quarkiverse-jsch.version} prop:jsch.version --> diff --git a/poms/build-parent/pom.xml b/poms/build-parent/pom.xml index 69999c442a..ca0f8efd25 100644 --- a/poms/build-parent/pom.xml +++ b/poms/build-parent/pom.xml @@ -44,6 +44,11 @@ <artifactId>assertj-core</artifactId> <version>${assertj.version}</version> </dependency> + <dependency> + <groupId>org.eclipse.transformer</groupId> + <artifactId>org.eclipse.transformer</artifactId> + <version>${eclipse-transformer.version}</version> + </dependency> </dependencies> </dependencyManagement> <build>
