package test; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Modifier; import java.util.EnumSet; import java.util.Set; import org.xml.sax.SAXException; import aQute.bnd.component.AnnotationReader; import aQute.bnd.component.DSAnnotations; import aQute.bnd.osgi.Analyzer; import aQute.bnd.osgi.Builder; import aQute.bnd.osgi.ClassDataCollector; import aQute.bnd.osgi.Clazz; import aQute.bnd.osgi.Descriptors; import aQute.bnd.osgi.Descriptors.PackageRef; import aQute.bnd.osgi.FileResource; import aQute.bnd.osgi.Jar; import aQute.bnd.xmlattribute.XMLAttributeFinder; import aQute.lib.io.IO; import junit.framework.TestCase; @SuppressWarnings("restriction") public class ClazzTest extends TestCase { /** * <pre> * java.lang.ArrayIndexOutOfBoundsException: 43007 [bnd] at * aQute.bnd.osgi.Clazz.classConstRef(Clazz.java:1880) [bnd] at * aQute.bnd.osgi.Clazz.crawl(Clazz.java:1185) * </pre> * * This happened on the Jini platform * * @throws Exception */ public void testJiniPlatformClasses() throws Exception { Builder b = new Builder(); b.addClasspath(IO.getFile("jar/jsk-platform.jar")); b.setExportPackage("*"); Jar build = b.build(); assertTrue(b.check()); b.close(); } /** * Check that exceptions that are caught are added to the imports. */ // hide the direct reference in the throw public static class E extends SAXException { private static final long serialVersionUID = 1L; } public static class Catching { public void foo() { try { throw new E(); } catch (SAXException sax) { } } } public void testCaughtExceptions() throws Exception { Analyzer a = new Analyzer(); Clazz c = new Clazz(a, "", null); c.parseClassFile(new FileInputStream("bin/test/ClazzTest$Catching.class"), new ClassDataCollector() {}); assertTrue(c.getReferred().toString().contains("org.xml.sax")); } /** * There is an unused class constant in the This actually looks wrong since */ public void testUnusedClassConstant() throws Exception { Analyzer a = new Analyzer(); Clazz c = new Clazz(a, "", null); c.parseClassFile(new FileInputStream("testresources/TestWeavingHook.jclass"), new ClassDataCollector() {}); // TODO test someething here System.out.println(c.getReferred()); } /** * {@code java.lang.IllegalArgumentException: Expected IDENTIFIER: * <S:Z>()V;} This actually looks wrong since */ public void test375() throws Exception { Analyzer a = new Analyzer(); Clazz c = new Clazz(a, "", null); c.parseDescriptor("<S:[LFoo;>()V", Modifier.PUBLIC); c.parseDescriptor("<S:[Z>()V", Modifier.PUBLIC); c.parseDescriptor("<S:Z>()V", Modifier.PUBLIC); } public void testNoClassBound() throws Exception { Analyzer a = new Analyzer(); Clazz c = new Clazz(a, "", null); // From aQute.lib.collections.SortedList.fromIterator() c.parseDescriptor( "<T::Ljava/lang/Comparable<*>;>(Ljava/util/Iterator<TT;>;)LaQute/lib/collections/SortedList<TT;>;", Modifier.PUBLIC); } /** * Complaint from Groovy that the dynamic instruction fails. * * <pre> * [bndwrap] * java.lang.ArrayIndexOutOfBoundsException: 15 [bndwrap] at * aQute.bnd.osgi.Clazz.parseClassFile(Clazz.java:387) [bndwrap] at * aQute.bnd.osgi.Clazz.parseClassFile(Clazz.java:308) [bndwrap] at * aQute.bnd.osgi.Clazz.parseClassFileWithCollector(Clazz.java:297) * [bndwrap] at aQute.bnd.osgi.Clazz.parseClassFile(Clazz.java:286) * [bndwrap] at aQute.bnd.osgi.Analyzer.analyzeJar(Analyzer.java:1489) * [bndwrap] at * aQute.bnd.osgi.Analyzer.analyzeBundleClasspath(Analyzer.java:1387) * [bndwrap] Invalid class file: * groovy/inspect/swingui/AstNodeToScriptVisitor.class [bndwrap] Exception: * 15 * </pre> */ public static void testDynamicInstr() throws Exception { Analyzer a = new Analyzer(); Clazz c = new Clazz(a, "", null); c.parseClassFile(new FileInputStream("jar/AstNodeToScriptVisitor.jclass"), new ClassDataCollector() {}); Set<PackageRef> referred = c.getReferred(); Descriptors d = new Descriptors(); assertFalse(referred.contains(d.getPackageRef(""))); System.out.println(referred); } /** * Check if the class is not picking up false references when the * CLass.forName name is constructed. The DeploymentAdminPermission.1.jclass * turned out to use Class.forName with a name that was prefixed with a * package from a property. bnd discovered the suffix * (.DeploymentAdminPermission) but this ended up in the default package. So * now the clazz parser tests that the name guessed for Class.forName must * actually resemble a class name. */ public static void testClassForNameFalsePickup() throws Exception { Analyzer a = new Analyzer(); Clazz c = new Clazz(a, "", null); c.parseClassFile(new FileInputStream("jar/DeploymentAdminPermission.1.jclass"), new ClassDataCollector() {}); Set<PackageRef> referred = c.getReferred(); Descriptors d = new Descriptors(); assertFalse(referred.contains(d.getPackageRef(""))); System.out.println(referred); } /** * Test the uncamel */ public static void testUncamel() throws Exception { assertEquals("New", Clazz.unCamel("_new")); assertEquals("An XMLMessage", Clazz.unCamel("anXMLMessage")); assertEquals("A message", Clazz.unCamel("aMessage")); assertEquals("URL", Clazz.unCamel("URL")); assertEquals("A nice party", Clazz.unCamel("aNiceParty")); } public static void testAnalyzerCrawlInvokeInterfaceAIOOBException() throws Exception { Analyzer a = new Analyzer(); Clazz c = new Clazz(a, "", null); c.parseClassFile(new FileInputStream("jar/AnalyzerCrawlInvokerInterfaceAIOOBTest.jclass"), new ClassDataCollector() {}); Set<PackageRef> referred = c.getReferred(); System.out.println(referred); } public @interface RecursiveAnno { @RecursiveAnno("recursive") String value() default ""; } public void testRecursiveAnnotation() throws Exception { File file = IO.getFile("bin/test/ClazzTest$RecursiveAnno.class"); Analyzer analyzer = new Analyzer(); Clazz clazz = new Clazz(analyzer, file.getPath(), new FileResource(file)); clazz.parseClassFile(); analyzer.getClassspace().put(clazz.getClassName(), clazz); AnnotationReader.getDefinition(clazz, analyzer, EnumSet.noneOf(DSAnnotations.Options.class), new XMLAttributeFinder(analyzer), AnnotationReader.V1_3); } }