PackageAdminClassLoader.java 3.47 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.osgi.framework.Bundle
 *  org.osgi.service.packageadmin.ExportedPackage
 *  org.osgi.service.packageadmin.PackageAdmin
 */
package com.adobe.granite.installer.factory.packages.impl;

import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import org.osgi.framework.Bundle;
import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
class PackageAdminClassLoader
extends ClassLoader {
    private final PackageAdmin packageAdmin;

    public PackageAdminClassLoader(PackageAdmin pckAdmin) {
        this.packageAdmin = pckAdmin;
    }

    private Bundle findBundleForPackage(String pckName) {
        ExportedPackage exportedPackage = this.packageAdmin.getExportedPackage(pckName);
        Bundle bundle = exportedPackage == null ? null : exportedPackage.getExportingBundle();
        return bundle;
    }

    private String getPackageFromResource(String resource) {
        int lastSlash = resource.lastIndexOf(47);
        String pckName = lastSlash == -1 ? "" : resource.substring(0, lastSlash).replace('/', '.');
        return pckName;
    }

    private String getPackageFromClassName(String name) {
        int lastDot = name.lastIndexOf(46);
        String pckName = lastDot == -1 ? "" : name.substring(0, lastDot);
        return pckName;
    }

    @Override
    public Enumeration<URL> getResources(String name) throws IOException {
        Bundle bundle;
        Enumeration e = super.getResources(name);
        if (!(e != null && e.hasMoreElements() || (bundle = this.findBundleForPackage(this.getPackageFromResource(name))) == null)) {
            e = bundle.getResources(name);
        }
        return e;
    }

    @Override
    public URL findResource(String name) {
        Bundle bundle;
        URL url = super.findResource(name);
        if (url == null && (bundle = this.findBundleForPackage(this.getPackageFromResource(name))) != null) {
            url = bundle.getResource(name);
        }
        return url;
    }

    @Override
    public Class<?> findClass(String name) throws ClassNotFoundException {
        Class clazz;
        block3 : {
            clazz = null;
            try {
                clazz = super.findClass(name);
            }
            catch (ClassNotFoundException cnfe) {
                Bundle bundle = this.findBundleForPackage(this.getPackageFromClassName(name));
                if (bundle == null) break block3;
                clazz = bundle.loadClass(name);
            }
        }
        if (clazz == null) {
            throw new ClassNotFoundException("Class not found " + name);
        }
        return clazz;
    }

    @Override
    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        Class clazz;
        block3 : {
            clazz = null;
            try {
                clazz = super.loadClass(name, resolve);
            }
            catch (ClassNotFoundException cnfe) {
                String pckName = this.getPackageFromClassName(name);
                Bundle bundle = this.findBundleForPackage(pckName);
                if (bundle == null) break block3;
                clazz = bundle.loadClass(name);
            }
        }
        if (clazz == null) {
            throw new ClassNotFoundException("Class not found " + name);
        }
        return clazz;
    }
}