This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-bcel.git
commit 2dff910b71f42b4a3e35acd5fdf42891c9f8af85 Author: Gary David Gregory (Code signing key) <ggreg...@apache.org> AuthorDate: Sun Nov 20 14:51:25 2022 -0500 Add org.apache.bcel.classfile.Utility.packageToPath(String) --- src/changes/changes.xml | 1 + src/examples/Helloify.java | 2 +- src/examples/JasminVisitor.java | 10 +++++----- src/examples/Package.java | 5 +++-- src/main/java/org/apache/bcel/classfile/JavaClass.java | 2 +- src/main/java/org/apache/bcel/classfile/Utility.java | 13 ++++++++++++- src/main/java/org/apache/bcel/generic/CPInstruction.java | 3 ++- src/main/java/org/apache/bcel/generic/ConstantPoolGen.java | 4 ++-- .../java/org/apache/bcel/generic/InvokeInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/ObjectType.java | 2 +- src/main/java/org/apache/bcel/util/ClassLoader.java | 2 +- .../java/org/apache/bcel/util/ClassLoaderRepository.java | 3 ++- src/main/java/org/apache/bcel/util/ClassPath.java | 13 +++++-------- .../org/apache/bcel/verifier/statics/Pass2Verifier.java | 2 +- src/test/java/org/apache/bcel/AbstractTestCase.java | 3 ++- .../java/org/apache/bcel/verifier/tests/TestCreator.java | 3 ++- 16 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index d1557b31..533b2946 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -70,6 +70,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.bcel.util.Args.</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.bcel.generic.ArrayType.getClassName().</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.bcel.generic.Type.getClassName().</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.bcel.classfile.Utility.packageToPath(String).</action> <action type="add" dev="ggregory" due-to="Gary Gregory, Mark Roberts">org.apache.bcel.classfile.MethodParameter now implements org.apache.bcel.classfile.Node.</action> <!-- FIX --> <action type="fix" dev="ggregory" due-to="nbauma109, Gary Gregory">Typo in SimpleElementValue error message #161.</action> diff --git a/src/examples/Helloify.java b/src/examples/Helloify.java index ffff812a..8ffe46bd 100644 --- a/src/examples/Helloify.java +++ b/src/examples/Helloify.java @@ -51,7 +51,7 @@ public final class Helloify { int index = javaClass.getClassNameIndex(); index = ((ConstantClass) cp.getConstant(index)).getNameIndex(); - cp.setConstant(index, new ConstantUtf8(className.replace('.', '/'))); + cp.setConstant(index, new ConstantUtf8(Utility.packageToPath(className))); } /** diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index 66925ab0..e58e45de 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -251,7 +251,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { for (final CodeExceptionGen c : ehs) { final ObjectType caught = c.getCatchType(); final String className = caught == null ? // catch any exception, used when compiling finally - "all" : caught.getClassName().replace('.', '/'); + "all" : Utility.packageToPath(caught.getClassName()); out.println(".catch " + className + " from " + get(c.getStartPC()) + " to " + get(c.getEndPC()) + " using " + get(c.getHandlerPC())); } @@ -272,7 +272,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { @Override public void visitExceptionTable(final ExceptionTable e) { for (final String name : e.getExceptionNames()) { - out.println(".throws " + name.replace('.', '/')); + out.println(".throws " + Utility.packageToPath(name)); } printEndMethod(e); @@ -294,11 +294,11 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { out.println(".source " + clazz.getSourceFileName()); out.println("." + Utility.classOrInterface(clazz.getAccessFlags()) + " " + Utility.accessToString(clazz.getAccessFlags(), true) + " " - + clazz.getClassName().replace('.', '/')); - out.println(".super " + clazz.getSuperclassName().replace('.', '/')); + + Utility.packageToPath(clazz.getClassName())); + out.println(".super " + Utility.packageToPath(clazz.getSuperclassName())); for (final String iface : clazz.getInterfaceNames()) { - out.println(".implements " + iface.replace('.', '/')); + out.println(".implements " + Utility.packageToPath(iface)); } out.print("\n"); diff --git a/src/examples/Package.java b/src/examples/Package.java index 5c6bafab..484b0072 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -33,6 +33,7 @@ import org.apache.bcel.classfile.ConstantClass; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Utility; import org.apache.bcel.util.ClassPath; /** @@ -139,7 +140,7 @@ public class Package { * in allClasses */ void addDependents(final JavaClass clazz) throws IOException { - final String name = clazz.getClassName().replace('.', '/'); + final String name = Utility.packageToPath(clazz.getClassName()); allClasses.put(name, clazz); final ConstantPool pool = clazz.getConstantPool(); for (int i = 1; i < pool.getLength(); i++) { @@ -176,7 +177,7 @@ public class Package { if (clName.endsWith(JavaClass.EXTENSION)) { clName = clName.substring(0, clName.length() - JavaClass.EXTENSION.length()); } - clName = clName.replace('.', '/'); + clName = Utility.packageToPath(clName); try (final InputStream inputStream = classPath.getInputStream(clName)) { clazz = new ClassParser(inputStream, clName).parse(); } diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 4094a60a..d55cc1ba 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -586,7 +586,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public String getSourceFilePath() { final StringBuilder outFileName = new StringBuilder(); if (!packageName.isEmpty()) { - outFileName.append(packageName.replace('.', '/')); + outFileName.append(Utility.packageToPath(packageName)); outFileName.append('/'); } outFileName.append(sourceFileName); diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 9953bba0..0bf064ae 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -825,7 +825,7 @@ public abstract class Utility { } } if (!found) { - buf.append('L').append(type.replace('.', '/')).append(';'); + buf.append('L').append(packageToPath(type)).append(';'); } return buf.toString(); } @@ -1030,6 +1030,17 @@ public abstract class Utility { return buf.toString(); } + /** + * Converts '.'s to '/'s. + * + * @param name Source + * @return converted value + * @since 6.7.0 + */ + public static String packageToPath(final String name) { + return name.replace('.', '/'); + } + /** * Converts a path to a package name. * diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java index e25c95a1..c7b0e3ff 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CPInstruction.java @@ -22,6 +22,7 @@ import java.io.IOException; import org.apache.bcel.classfile.Constant; import org.apache.bcel.classfile.ConstantClass; import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.Utility; import org.apache.bcel.util.ByteSequence; /** @@ -132,7 +133,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct final Constant c = cp.getConstant(index); String str = cp.constantToString(c); if (c instanceof ConstantClass) { - str = str.replace('.', '/'); + str = Utility.packageToPath(str); } return org.apache.bcel.Const.getOpcodeName(super.getOpcode()) + " " + str; } diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index cf7ff315..fb5ed9fd 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -251,7 +251,7 @@ public class ConstantPoolGen { * @return index of entry */ public int addClass(final String str) { - return addClass_(str.replace('.', '/')); + return addClass_(Utility.packageToPath(str)); } private int addClass_(final String clazz) { @@ -587,7 +587,7 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupClass(final String str) { - return getIndex(classTable, str.replace('.', '/')); + return getIndex(classTable, Utility.packageToPath(str)); } /** diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index 2f781608..20405403 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -128,7 +128,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti final StringBuilder sb = new StringBuilder(opcodeName); if (tok.hasMoreTokens()) { sb.append(" "); - sb.append(tok.nextToken().replace('.', '/')); + sb.append(Utility.packageToPath(tok.nextToken())); if (tok.hasMoreTokens()) { sb.append(tok.nextToken()); } diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index 3959f7df..28e21254 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -45,7 +45,7 @@ public class ObjectType extends ReferenceType { * @param className fully qualified class name, e.g. java.lang.String */ public ObjectType(final String className) { - super(Const.T_REFERENCE, "L" + className.replace('.', '/') + ";"); + super(Const.T_REFERENCE, "L" + Utility.packageToPath(className) + ";"); this.className = Utility.pathToPackage(className); } diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index 680eca3e..ec31feda 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -123,7 +123,7 @@ public class ClassLoader extends java.lang.ClassLoader { final ConstantPool cp = clazz.getConstantPool(); final ConstantClass cl = cp.getConstant(clazz.getClassNameIndex(), Const.CONSTANT_Class, ConstantClass.class); final ConstantUtf8 name = cp.getConstantUtf8(cl.getNameIndex()); - name.setBytes(className.replace('.', '/')); + name.setBytes(Utility.packageToPath(className)); return clazz; } diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index c1a06d83..5ffcabe3 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -23,6 +23,7 @@ import java.util.Map; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Utility; /** * The repository maintains information about which classes have been loaded. @@ -74,7 +75,7 @@ public class ClassLoaderRepository implements Repository { */ @Override public JavaClass loadClass(final String className) throws ClassNotFoundException { - final String classFile = className.replace('.', '/'); + final String classFile = Utility.packageToPath(className); JavaClass RC = findClass(className); if (RC != null) { return RC; diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index dd3ff90a..6fe0df83 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -41,6 +41,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Utility; /** * Loads class files from the CLASSPATH. Inspired by sun.tools.ClassPath. @@ -261,7 +262,7 @@ public class ClassPath implements Closeable { @Override protected String toEntryName(final String name, final String suffix) { - return packageToFolder(name) + suffix; + return Utility.packageToPath(name) + suffix; } } @@ -282,7 +283,7 @@ public class ClassPath implements Closeable { @Override ClassFile getClassFile(final String name, final String suffix) { - final Path resolved = modulePath.resolve(packageToFolder(name) + suffix); + final Path resolved = modulePath.resolve(Utility.packageToPath(name) + suffix); if (Files.exists(resolved)) { return new ClassFile() { @@ -423,7 +424,7 @@ public class ClassPath implements Closeable { @Override protected String toEntryName(final String name, final String suffix) { - return "classes/" + packageToFolder(name) + suffix; + return "classes/" + Utility.packageToPath(name) + suffix; } } @@ -513,10 +514,6 @@ public class ClassPath implements Closeable { } } - static String packageToFolder(final String name) { - return name.replace('.', '/'); - } - private final String classPathString; private final ClassPath parent; @@ -679,7 +676,7 @@ public class ClassPath implements Closeable { * @throws IOException if an I/O error occurs. */ public InputStream getInputStream(final String name) throws IOException { - return getInputStream(packageToFolder(name), JavaClass.EXTENSION); + return getInputStream(Utility.packageToPath(name), JavaClass.EXTENSION); } /** diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 17a964c8..f5b1cd20 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -1144,7 +1144,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { final Constant c = cp.getConstant(obj.getNameIndex()); if (c instanceof ConstantUtf8) { // Ignore the case where it's not a ConstantUtf8 here, we'll find out later. final String className = ((ConstantUtf8) c).getBytes(); - if (className.startsWith(jc.getClassName().replace('.', '/') + "$")) { + if (className.startsWith(Utility.packageToPath(jc.getClassName()) + "$")) { hasInnerClass = true; } } diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index b8b150a6..af1d5059 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -31,6 +31,7 @@ import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; import org.apache.bcel.generic.AnnotationEntryGen; import org.apache.bcel.generic.ConstantPoolGen; import org.apache.bcel.generic.ElementValueGen; @@ -51,7 +52,7 @@ public abstract class AbstractTestCase { protected static final File TESTDATA = new File("target", "testdata"); // package base name in signature format, i.e. with '/' separators instead of '.' - protected static final String PACKAGE_BASE_SIG = PACKAGE_BASE_NAME.replace('.', '/'); + protected static final String PACKAGE_BASE_SIG = Utility.packageToPath(PACKAGE_BASE_NAME); public static void clear() { VerifierFactory.clear(); diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java index 3c49f4a3..ccb2b845 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java @@ -23,6 +23,7 @@ import java.io.OutputStream; import java.net.URISyntaxException; import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Utility; public abstract class TestCreator { @@ -56,6 +57,6 @@ public abstract class TestCreator { } protected String getPackageName() { - return getClass().getPackage().getName().replace('.', '/'); + return Utility.packageToPath(getClass().getPackage().getName()); } }