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>

Reply via email to