/* * Copyright (c) 2015, Parallel Universe Software Co. All rights reserved. * * This program and the accompanying materials are licensed under * GNU General Public License, version 2, with the Classpath Exception * * http://openjdk.java.net/legal/gplv2+ce.html */ package co.paralleluniverse.xst; import java.io.IOException; import java.io.InputStream; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; final class ASMUtil { private static final String CLASS_FILE_NAME_EXTENSION = ".class"; public static InputStream getClassInputStream(String className, ClassLoader cl) { return cl.getResourceAsStream(classToResource(className)); } public static InputStream getClassInputStream(Class<?> clazz) { final InputStream is = getClassInputStream(clazz.getName(), clazz.getClassLoader()); if (is == null) throw new UnsupportedOperationException("Class file " + clazz.getName() + " could not be loaded by the class's classloader " + clazz.getClassLoader()); return is; } public static <T extends ClassVisitor> T accept(InputStream is, int flags, T visitor) throws IOException { if (is == null) return null; try (InputStream is1 = is) { new ClassReader(is1).accept(visitor, flags); return visitor; } } public static <T extends ClassVisitor> T accept(byte[] buffer, int flags, T visitor) throws IOException { if (buffer == null) throw new NullPointerException("Buffer is null"); new ClassReader(buffer).accept(visitor, flags); return visitor; } public static <T extends ClassVisitor> T accept(String className, ClassLoader cl, int flags, T visitor) throws IOException { return accept(getClassInputStream(className, cl), flags, visitor); } public static <T extends ClassVisitor> T accept(Class<?> clazz, int flags, T visitor) throws IOException { return accept(getClassInputStream(clazz), flags, visitor); } public static String classToResource(String className) { if (className == null) return null; return className.replace('.', '/') + CLASS_FILE_NAME_EXTENSION; } public static String classToResource(Class<?> clazz) { if (clazz == null) return null; return classToResource(clazz.getName()); } public static String classToSlashed(String className) { if (className == null) return null; return className.replace('.', '/'); } private ASMUtil() { } }