NoClassDefFoundErrorTrap.java revision 2362
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * This code is free software; you can redistribute it and/or modify it
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * under the terms of the GNU General Public License version 2 only, as
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * published by the Free Software Foundation.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * This code is distributed in the hope that it will be useful, but WITHOUT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * version 2 for more details (a copy is included in the LICENSE file that
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * accompanied this code).
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * You should have received a copy of the GNU General Public License version
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * 2 along with this work; if not, write to the Free Software Foundation,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * or visit www.oracle.com if you need additional information or have any
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * questions.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* @test
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * @bug 4205440
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * @summary When ObjectInputStream.inputClassDescriptor calls its protected
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * resolveClass, if a NoClassDefFoundError is thrown, that Error should be
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * propagated to the caller, instead of being trapped and transformed into
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * a ClassNotFoundException for the class being resolved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * @author Peter Jones
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * @build NoClassDefFoundErrorTrap
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * @run main NoClassDefFoundErrorTrap
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinimport java.io.*;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpublic class NoClassDefFoundErrorTrap {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin private static NoClassDefFoundError ncdfe;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin public interface Bar {}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin public static class Foo implements Bar, java.io.Serializable {}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /**
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Test subclass of ObjectInputStream that overrides resolveClass
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * to throw a NoClassDefFoundError if our test class "Foo" is to
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * be resolved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin public static class TestObjectInputStream extends ObjectInputStream {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin public TestObjectInputStream(InputStream in)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz throws IOException
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin super(in);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner protected Class resolveClass(ObjectStreamClass desc)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin throws IOException, ClassNotFoundException
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin String name = desc.getName();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (name.equals(Foo.class.getName())) {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ncdfe = new NoClassDefFoundError("Bar");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin throw ncdfe;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } else {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return super.resolveClass(desc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin public static void main(String[] args) {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin System.err.println("\nRegression test for bug 4205440\n");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin try {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Serialize a Foo instance to a byte array.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Foo foo = new Foo();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ByteArrayOutputStream bout = new ByteArrayOutputStream();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ObjectOutputStream out = new ObjectOutputStream(bout);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin out.writeObject(foo);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin byte[] stream = bout.toByteArray();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Deserialize the Foo instance using our test subclass of
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * ObjectInputStream that will throw NoClassDefFoundError.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ByteArrayInputStream bin = new ByteArrayInputStream(stream);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ObjectInputStream in = new TestObjectInputStream(bin);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * The test succeeds if we get the NoClassDefFoundError.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin try {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin in.readObject();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin } catch (NoClassDefFoundError e) {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (e == ncdfe) {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz System.err.println("TEST PASSED: " + e.toString());
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } else {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin throw e;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } catch (Exception e) {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin System.err.println("\nTEST FAILED:");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin e.printStackTrace();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz throw new RuntimeException("TEST FAILED: " + e.toString());
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
}