You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2022/11/20 19:55:06 UTC

[commons-bcel] 01/02: Add org.apache.bcel.classfile.Utility.packageToPath(String)

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) <gg...@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());
     }
 }