protected Class findClass()

in src/main/java/org/apache/cassandra/distributed/shared/InstanceClassLoader.java [140:208]


    protected Class<?> findClass(String name) throws ClassNotFoundException
    {
        if (transform == null)
            return super.findClass(name);

        String pkg = name.substring(0, name.lastIndexOf('.'));
        String path = name.replace('.', '/').concat(".class");
        URL url = getResource(path);
        if (url == null)
        {
            byte[] bytes = transform.transform(name, null);
            if (bytes == null)
                throw new ClassNotFoundException(name);
            if (null == getPackage(pkg))
                definePackage(pkg, null, null, null, null, null, null, null);
            return defineClass(name, bytes, 0, bytes.length);
        }
        try
        {
            URLConnection connection = url.openConnection();
            CodeSigner[] codeSigners = null;
            Manifest manifest = null;
            if (connection instanceof JarURLConnection)
            {
                manifest = ((JarURLConnection) connection).getManifest();
                codeSigners = ((JarURLConnection) connection).getJarEntry().getCodeSigners();
            }
            if (null == getPackage(pkg))
            {
                try
                {
                    if (manifest != null) definePackage(pkg, manifest, url);
                    else definePackage(pkg, null, null, null, null, null, null, null);
                }
                catch (IllegalArgumentException iae)
                {
                    if (null == getPackage(pkg))
                        throw iae;
                }
            }
            try (InputStream in = connection.getInputStream())
            {
                byte[] bytes = new byte[in.available()];
                int cur, total = 0;
                while (0 <= (cur = in.read(bytes, total, bytes.length - total)))
                {
                    total += cur;
                    if (cur == 0 && total == bytes.length)
                    {
                        int next = in.read();
                        if (next < 0)
                            break;

                        bytes = Arrays.copyOf(bytes, bytes.length * 2);
                        bytes[total++] = (byte)next;
                    }
                }
                if (total < bytes.length)
                    bytes = Arrays.copyOf(bytes, total);

                bytes = transform.transform(name, bytes);
                return defineClass(name, bytes, 0, bytes.length, new CodeSource(url, codeSigners));
            }
        }
        catch (Throwable t)
        {
            throw new ClassNotFoundException(name, t);
        }
    }