Ability to add new classes to an existing packge of jar If the jar has classes in that exact package, any new classes for the same package will be added. It will not add new packages.
diff --git a/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Clazz.java b/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Clazz.java index e312a47..9053913 100644 --- a/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Clazz.java +++ b/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Clazz.java
@@ -22,15 +22,21 @@ public class Clazz { private final String name; private final String prefix; + private final String packge; private final File file; private int applied; public Clazz(final String name, final File file) { this.name = name; this.prefix = name.replaceAll("\\.class$", ""); + this.packge = asPackage(name); this.file = file; } + public static String asPackage(final String path) { + return path.replaceAll("[^/]+\\.class$", ""); + } + public void applied() { this.applied++; } @@ -55,6 +61,10 @@ return file; } + public String getPackge() { + return packge; + } + @Override public boolean equals(final Object o) { if (this == o) return true;
diff --git a/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Transformation.java b/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Transformation.java index 2556876..982c44a 100644 --- a/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Transformation.java +++ b/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Transformation.java
@@ -16,13 +16,6 @@ */ package org.apache.tomee.patch.core; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Opcodes; -import org.tomitribe.swizzle.stream.StreamBuilder; -import org.tomitribe.util.IO; -import org.tomitribe.util.Mvn; - import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -37,6 +30,13 @@ import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.tomitribe.swizzle.stream.StreamBuilder; +import org.tomitribe.util.IO; +import org.tomitribe.util.Mvn; + import static org.tomitribe.jkta.util.Predicates.not; public class Transformation { @@ -225,121 +225,121 @@ } inputStream = StreamBuilder.create(inputStream) - .replace("javax.activation", "jakarta.activation") - .replace("javax.annotation", "jakarta.annotation") - .replace("javax.batch", "jakarta.batch") - .replace("javax.decorator", "jakarta.decorator") - .replace("javax.ejb", "jakarta.ejb") - .replace("javax.el", "jakarta.el") - .replace("javax.enterprise", "jakarta.enterprise") - .replace("javax\\.faces", "jakarta\\.faces") - .replace("javax.inject", "jakarta.inject") - .replace("javax.interceptor", "jakarta.interceptor") - .replace("javax.jms", "jakarta.jms") - .replace("javax.json", "jakarta.json") - .replace("javax.json.bind", "jakarta.json.bind") - .replace("javax.jws", "jakarta.jws") - .replace("javax.mail", "jakarta.mail") - .replace("javax.persistence", "jakarta.persistence") - .replace("javax.resource", "jakarta.resource") - .replace("javax.security.auth.message", "jakarta.security.auth.message") - .replace("javax.security.enterprise", "jakarta.security.enterprise") - .replace("javax.security.jacc", "jakarta.security.jacc") - .replace("javax.servlet", "jakarta.servlet") - .replace("javax.transaction", "jakarta.transaction") - .replace("javax.validation", "jakarta.validation") - .replace("javax.websocket", "jakarta.websocket") - .replace("javax.ws.rs", "jakarta.ws.rs") - .replace("javax.xml.bind", "jakarta.xml.bind") - .replace("javax.xml.soap", "jakarta.xml.soap") - .replace("javax.xml.ws", "jakarta.xml.ws") + .replace("javax.activation", "jakarta.activation") + .replace("javax.annotation", "jakarta.annotation") + .replace("javax.batch", "jakarta.batch") + .replace("javax.decorator", "jakarta.decorator") + .replace("javax.ejb", "jakarta.ejb") + .replace("javax.el", "jakarta.el") + .replace("javax.enterprise", "jakarta.enterprise") + .replace("javax\\.faces", "jakarta\\.faces") + .replace("javax.inject", "jakarta.inject") + .replace("javax.interceptor", "jakarta.interceptor") + .replace("javax.jms", "jakarta.jms") + .replace("javax.json", "jakarta.json") + .replace("javax.json.bind", "jakarta.json.bind") + .replace("javax.jws", "jakarta.jws") + .replace("javax.mail", "jakarta.mail") + .replace("javax.persistence", "jakarta.persistence") + .replace("javax.resource", "jakarta.resource") + .replace("javax.security.auth.message", "jakarta.security.auth.message") + .replace("javax.security.enterprise", "jakarta.security.enterprise") + .replace("javax.security.jacc", "jakarta.security.jacc") + .replace("javax.servlet", "jakarta.servlet") + .replace("javax.transaction", "jakarta.transaction") + .replace("javax.validation", "jakarta.validation") + .replace("javax.websocket", "jakarta.websocket") + .replace("javax.ws.rs", "jakarta.ws.rs") + .replace("javax.xml.bind", "jakarta.xml.bind") + .replace("javax.xml.soap", "jakarta.xml.soap") + .replace("javax.xml.ws", "jakarta.xml.ws") - // These sub packages to the above must be renamed back - .replace("jakarta.annotation.process", "javax.annotation.process") - .replace("jakarta.enterprise.deploy", "javax.enterprise.deploy") - .replace("jakarta.transaction.xa", "javax.transaction.xa") + // These sub packages to the above must be renamed back + .replace("jakarta.annotation.process", "javax.annotation.process") + .replace("jakarta.enterprise.deploy", "javax.enterprise.deploy") + .replace("jakarta.transaction.xa", "javax.transaction.xa") - // Packages that are often falsely renamed - // Exceptions to the exceptions + // Packages that are often falsely renamed + // Exceptions to the exceptions - .replace("jakarta.accessibility", "javax.accessibility") - .replace("jakarta.annotation.processing", "javax.annotation.processing") - .replace("jakarta.cache", "javax.cache") - .replace("jakarta.crypto", "javax.crypto") - .replace("jakarta.imageio", "javax.imageio") - .replace("jakarta.jdo", "javax.jdo") - .replace("jakarta.jmdns", "javax.jmdns") - .replace("jakarta.lang", "javax.lang") - .replace("jakarta.lang.model", "javax.lang.model") - .replace("jakarta.management", "javax.management") - .replace("jakarta.naming", "javax.naming") - .replace("jakarta.net", "javax.net") - .replace("jakarta.portlet", "javax.portlet") - .replace("jakarta.print", "javax.print") - .replace("jakarta.rmi", "javax.rmi") - .replace("jakarta.script", "javax.script") - .replace("jakarta.security.Principal", "javax.security.Principal") - .replace("jakarta.security.auth.AuthPermission", "javax.security.auth.AuthPermission") - .replace("jakarta.security.auth.Deprecated", "javax.security.auth.Deprecated") - .replace("jakarta.security.auth.DestroyFailedException", "javax.security.auth.DestroyFailedException") - .replace("jakarta.security.auth.Destroyable", "javax.security.auth.Destroyable") - .replace("jakarta.security.auth.LdapPrincipal", "javax.security.auth.LdapPrincipal") - .replace("jakarta.security.auth.NTDomainPrincipal", "javax.security.auth.NTDomainPrincipal") - .replace("jakarta.security.auth.NTNumericCredential", "javax.security.auth.NTNumericCredential") - .replace("jakarta.security.auth.NTSid", "javax.security.auth.NTSid") - .replace("jakarta.security.auth.NTSidDomainPrincipal", "javax.security.auth.NTSidDomainPrincipal") - .replace("jakarta.security.auth.NTSidGroupPrincipal", "javax.security.auth.NTSidGroupPrincipal") - .replace("jakarta.security.auth.NTSidPrimaryGroupPrincipal", "javax.security.auth.NTSidPrimaryGroupPrincipal") - .replace("jakarta.security.auth.NTSidUserPrincipal", "javax.security.auth.NTSidUserPrincipal") - .replace("jakarta.security.auth.NTUserPrincipal", "javax.security.auth.NTUserPrincipal") - .replace("jakarta.security.auth.PolicyFile", "javax.security.auth.PolicyFile") - .replace("jakarta.security.auth.PrincipalComparator", "javax.security.auth.PrincipalComparator") - .replace("jakarta.security.auth.PrivateCredentialPermission", "javax.security.auth.PrivateCredentialPermission") - .replace("jakarta.security.auth.RefreshFailedException", "javax.security.auth.RefreshFailedException") - .replace("jakarta.security.auth.Refreshable", "javax.security.auth.Refreshable") - .replace("jakarta.security.auth.SolarisNumericGroupPrincipal", "javax.security.auth.SolarisNumericGroupPrincipal") - .replace("jakarta.security.auth.SolarisNumericUserPrincipal", "javax.security.auth.SolarisNumericUserPrincipal") - .replace("jakarta.security.auth.SolarisPrincipal", "javax.security.auth.SolarisPrincipal") - .replace("jakarta.security.auth.Subject", "javax.security.auth.Subject") - .replace("jakarta.security.auth.SubjectDomainCombiner", "javax.security.auth.SubjectDomainCombiner") - .replace("jakarta.security.auth.UnixNumericGroupPrincipal", "javax.security.auth.UnixNumericGroupPrincipal") - .replace("jakarta.security.auth.UnixNumericUserPrincipal", "javax.security.auth.UnixNumericUserPrincipal") - .replace("jakarta.security.auth.UnixPrincipal", "javax.security.auth.UnixPrincipal") - .replace("jakarta.security.auth.UserPrincipal", "javax.security.auth.UserPrincipal") - .replace("jakarta.security.auth.X500Principal", "javax.security.auth.X500Principal") - .replace("jakarta.security.auth.callback", "javax.security.auth.callback") - .replace("jakarta.security.auth.kerberos", "javax.security.auth.kerberos") - .replace("jakarta.security.auth.login", "javax.security.auth.login") - .replace("jakarta.security.auth.spi", "javax.security.auth.spi") - .replace("jakarta.security.auth.subject", "javax.security.auth.subject") - .replace("jakarta.security.auth.x500", "javax.security.auth.x500") - .replace("jakarta.security.cert", "javax.security.cert") - .replace("jakarta.security.sasl", "javax.security.sasl") - .replace("jakarta.smartcardio", "javax.smartcardio") - .replace("jakarta.sound", "javax.sound") - .replace("jakarta.sql", "javax.sql") - .replace("jakarta.swing", "javax.swing") - .replace("jakarta.tools", "javax.tools") - .replace("jakarta.transaction.xa", "javax.transaction.xa") - .replace("jakarta.wsdl", "javax.wsdl") - .replace("jakarta.xml.XML", "javax.xml.XML") - .replace("jakarta.xml.access", "javax.xml.access") - .replace("jakarta.xml.catalog", "javax.xml.catalog") - .replace("jakarta.xml.crypto", "javax.xml.crypto") - .replace("jakarta.xml.datatype", "javax.xml.datatype") - .replace("jakarta.xml.messaging", "javax.xml.messaging") - .replace("jakarta.xml.namespace", "javax.xml.namespace") - .replace("jakarta.xml.parser", "javax.xml.parser") - .replace("jakarta.xml.parsers", "javax.xml.parsers") - .replace("jakarta.xml.registry", "javax.xml.registry") - .replace("jakarta.xml.rpc", "javax.xml.rpc") - .replace("jakarta.xml.stream", "javax.xml.stream") - .replace("jakarta.xml.transform", "javax.xml.transform") - .replace("jakarta.xml.validation", "javax.xml.validation") - .replace("jakarta.xml.xpath", "javax.xml.xpath") - .replace("javax.enterprise.deploy-api", "jakarta.enterprise.deploy-api") + .replace("jakarta.accessibility", "javax.accessibility") + .replace("jakarta.annotation.processing", "javax.annotation.processing") + .replace("jakarta.cache", "javax.cache") + .replace("jakarta.crypto", "javax.crypto") + .replace("jakarta.imageio", "javax.imageio") + .replace("jakarta.jdo", "javax.jdo") + .replace("jakarta.jmdns", "javax.jmdns") + .replace("jakarta.lang", "javax.lang") + .replace("jakarta.lang.model", "javax.lang.model") + .replace("jakarta.management", "javax.management") + .replace("jakarta.naming", "javax.naming") + .replace("jakarta.net", "javax.net") + .replace("jakarta.portlet", "javax.portlet") + .replace("jakarta.print", "javax.print") + .replace("jakarta.rmi", "javax.rmi") + .replace("jakarta.script", "javax.script") + .replace("jakarta.security.Principal", "javax.security.Principal") + .replace("jakarta.security.auth.AuthPermission", "javax.security.auth.AuthPermission") + .replace("jakarta.security.auth.Deprecated", "javax.security.auth.Deprecated") + .replace("jakarta.security.auth.DestroyFailedException", "javax.security.auth.DestroyFailedException") + .replace("jakarta.security.auth.Destroyable", "javax.security.auth.Destroyable") + .replace("jakarta.security.auth.LdapPrincipal", "javax.security.auth.LdapPrincipal") + .replace("jakarta.security.auth.NTDomainPrincipal", "javax.security.auth.NTDomainPrincipal") + .replace("jakarta.security.auth.NTNumericCredential", "javax.security.auth.NTNumericCredential") + .replace("jakarta.security.auth.NTSid", "javax.security.auth.NTSid") + .replace("jakarta.security.auth.NTSidDomainPrincipal", "javax.security.auth.NTSidDomainPrincipal") + .replace("jakarta.security.auth.NTSidGroupPrincipal", "javax.security.auth.NTSidGroupPrincipal") + .replace("jakarta.security.auth.NTSidPrimaryGroupPrincipal", "javax.security.auth.NTSidPrimaryGroupPrincipal") + .replace("jakarta.security.auth.NTSidUserPrincipal", "javax.security.auth.NTSidUserPrincipal") + .replace("jakarta.security.auth.NTUserPrincipal", "javax.security.auth.NTUserPrincipal") + .replace("jakarta.security.auth.PolicyFile", "javax.security.auth.PolicyFile") + .replace("jakarta.security.auth.PrincipalComparator", "javax.security.auth.PrincipalComparator") + .replace("jakarta.security.auth.PrivateCredentialPermission", "javax.security.auth.PrivateCredentialPermission") + .replace("jakarta.security.auth.RefreshFailedException", "javax.security.auth.RefreshFailedException") + .replace("jakarta.security.auth.Refreshable", "javax.security.auth.Refreshable") + .replace("jakarta.security.auth.SolarisNumericGroupPrincipal", "javax.security.auth.SolarisNumericGroupPrincipal") + .replace("jakarta.security.auth.SolarisNumericUserPrincipal", "javax.security.auth.SolarisNumericUserPrincipal") + .replace("jakarta.security.auth.SolarisPrincipal", "javax.security.auth.SolarisPrincipal") + .replace("jakarta.security.auth.Subject", "javax.security.auth.Subject") + .replace("jakarta.security.auth.SubjectDomainCombiner", "javax.security.auth.SubjectDomainCombiner") + .replace("jakarta.security.auth.UnixNumericGroupPrincipal", "javax.security.auth.UnixNumericGroupPrincipal") + .replace("jakarta.security.auth.UnixNumericUserPrincipal", "javax.security.auth.UnixNumericUserPrincipal") + .replace("jakarta.security.auth.UnixPrincipal", "javax.security.auth.UnixPrincipal") + .replace("jakarta.security.auth.UserPrincipal", "javax.security.auth.UserPrincipal") + .replace("jakarta.security.auth.X500Principal", "javax.security.auth.X500Principal") + .replace("jakarta.security.auth.callback", "javax.security.auth.callback") + .replace("jakarta.security.auth.kerberos", "javax.security.auth.kerberos") + .replace("jakarta.security.auth.login", "javax.security.auth.login") + .replace("jakarta.security.auth.spi", "javax.security.auth.spi") + .replace("jakarta.security.auth.subject", "javax.security.auth.subject") + .replace("jakarta.security.auth.x500", "javax.security.auth.x500") + .replace("jakarta.security.cert", "javax.security.cert") + .replace("jakarta.security.sasl", "javax.security.sasl") + .replace("jakarta.smartcardio", "javax.smartcardio") + .replace("jakarta.sound", "javax.sound") + .replace("jakarta.sql", "javax.sql") + .replace("jakarta.swing", "javax.swing") + .replace("jakarta.tools", "javax.tools") + .replace("jakarta.transaction.xa", "javax.transaction.xa") + .replace("jakarta.wsdl", "javax.wsdl") + .replace("jakarta.xml.XML", "javax.xml.XML") + .replace("jakarta.xml.access", "javax.xml.access") + .replace("jakarta.xml.catalog", "javax.xml.catalog") + .replace("jakarta.xml.crypto", "javax.xml.crypto") + .replace("jakarta.xml.datatype", "javax.xml.datatype") + .replace("jakarta.xml.messaging", "javax.xml.messaging") + .replace("jakarta.xml.namespace", "javax.xml.namespace") + .replace("jakarta.xml.parser", "javax.xml.parser") + .replace("jakarta.xml.parsers", "javax.xml.parsers") + .replace("jakarta.xml.registry", "javax.xml.registry") + .replace("jakarta.xml.rpc", "javax.xml.rpc") + .replace("jakarta.xml.stream", "javax.xml.stream") + .replace("jakarta.xml.transform", "javax.xml.transform") + .replace("jakarta.xml.validation", "javax.xml.validation") + .replace("jakarta.xml.xpath", "javax.xml.xpath") + .replace("javax.enterprise.deploy-api", "jakarta.enterprise.deploy-api") - .get(); + .get(); IO.copy(inputStream, outputStream); } @@ -466,15 +466,22 @@ } private boolean isPatched(final String path, final Jar jar) { + final String classPackage = path.endsWith(".class") ? Clazz.asPackage(path) : null; + + boolean patchedClass = false; for (final Clazz clazz : classes) { if (path.equals(clazz.getName()) || path.startsWith(clazz.getPrefix() + "$")) { jar.patch(clazz, classes); - return true; + patchedClass = true; + } + + if (classPackage != null && classPackage.equals(clazz.getPackge())) { + jar.patch(clazz, classes); } } - return false; + return patchedClass; } private static final OutputStream skipped = new OutputStream() {