Package org.aspectj.weaver.bcel

Source Code of org.aspectj.weaver.bcel.ExtensibleURLClassLoader

/* *******************************************************************
* Copyright (c) 2004 IBM Corporation
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributors:
*     Matthew Webster, Adrian Colyer,
*     Martin Lippert     initial implementation
* ******************************************************************/

package org.aspectj.weaver.bcel;

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.CodeSource;

import org.aspectj.util.FileUtil;
import org.aspectj.weaver.BCException;
import org.aspectj.weaver.UnresolvedType;

public abstract class ExtensibleURLClassLoader extends URLClassLoader {

  private ClassPathManager classPath;

  public ExtensibleURLClassLoader(URL[] urls, ClassLoader parent) {
    super(urls, parent);

    // System.err.println("? ExtensibleURLClassLoader.<init>() path=" + WeavingAdaptor.makeClasspath(urls));
    try {
      classPath = new ClassPathManager(FileUtil.makeClasspath(urls), null);
    } catch (ExceptionInInitializerError ex) {
      ex.printStackTrace(System.out);
      throw ex;
    }
  }

  protected void addURL(URL url) {
    super.addURL(url); // amc - this call was missing and is needed in
    // WeavingURLClassLoader chains
    classPath.addPath(url.getPath(), null);
  }

  protected Class findClass(String name) throws ClassNotFoundException {
    // System.err.println("? ExtensibleURLClassLoader.findClass(" + name + ")");
    try {
      byte[] bytes = getBytes(name);
      if (bytes != null) {
        return defineClass(name, bytes);
      } else {
        throw new ClassNotFoundException(name);
      }
    } catch (IOException ex) {
      throw new ClassNotFoundException(name);
    }
  }

  protected Class defineClass(String name, byte[] b, CodeSource cs) throws IOException {
    // System.err.println("? ExtensibleURLClassLoader.defineClass(" + name + ",[" + b.length + "])");
    return defineClass(name, b, 0, b.length, cs);
  }

  protected byte[] getBytes(String name) throws IOException {
    byte[] b = null;
    UnresolvedType unresolvedType = null;
    try {
      unresolvedType = UnresolvedType.forName(name);
    } catch (BCException bce) {
      if (bce.getMessage().indexOf("nameToSignature") == -1) {
        bce.printStackTrace(System.err);
      }
      return null;
    }
    ClassPathManager.ClassFile classFile = classPath.find(unresolvedType);
    if (classFile != null) {
      try {
        b = FileUtil.readAsByteArray(classFile.getInputStream());
      } finally {
        classFile.close();
      }
    }
    return b;
  }

  private Class defineClass(String name, byte[] bytes /* ClassPathManager.ClassFile classFile */) throws IOException {
    String packageName = getPackageName(name);
    if (packageName != null) {
      Package pakkage = getPackage(packageName);
      if (pakkage == null) {
        definePackage(packageName, null, null, null, null, null, null, null);
      }
    }

    return defineClass(name, bytes, null);
  }

  private String getPackageName(String className) {
    int offset = className.lastIndexOf('.');
    return (offset == -1) ? null : className.substring(0, offset);
  }

}
TOP

Related Classes of org.aspectj.weaver.bcel.ExtensibleURLClassLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.