blob: fe5f47fbcc95007dfe7795f6b7d02a5885852fe4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008, 2009 IBM Corporation and others.
* 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:
* David Knibb initial implementation
* Matthew Webster Eclipse 3.2 changes
* Martin Lippert caching optimizations
* Martin Lippert caching of generated classes
*******************************************************************************/
package org.eclipse.equinox.weaving.hooks;
import java.io.IOException;
import java.net.URL;
import org.eclipse.equinox.service.weaving.CacheEntry;
import org.eclipse.equinox.weaving.adaptors.Debug;
import org.eclipse.equinox.weaving.adaptors.IWeavingAdaptor;
import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
/**
* This is a wrapper for bundle files that allows the weaving runtime to create
* wrapped instances of bundle entry objects.
*
* Those bundle entry objects are used to return class bytes from the cache
* instead of the bundle itself.
*/
public class WeavingBundleFile extends AbstractWeavingBundleFile {
private final URL url;
/**
* Create a new wrapper for a bundle file
*
* @param adaptorProvider A provider that allows this wrapper to gain access
* to the adaptor of this bundle
* @param bundleFile The wrapped bundle file
* @throws IOException
*/
public WeavingBundleFile(final BundleAdaptorProvider adaptorProvider,
final BundleFile bundleFile) throws IOException {
super(adaptorProvider, bundleFile);
this.url = delegate.getBaseFile().toURL();
}
@Override
public BundleEntry getEntry(final String path) {
if (Debug.DEBUG_BUNDLE)
Debug.println("> AspectJBundleFile.getEntry() path=" + path
+ ", url=" + url);
BundleEntry entry = delegate.getEntry(path);
if (path.endsWith(".class") && entry != null) {
final int offset = path.lastIndexOf('.');
final String name = path.substring(0, offset).replace('/', '.');
final IWeavingAdaptor adaptor = getAdaptor();
if (adaptor != null) {
final CacheEntry cacheEntry = adaptor.findClass(name, url);
if (cacheEntry == null) {
entry = new WeavingBundleEntry(adaptor, entry, url, false);
if (Debug.DEBUG_BUNDLE)
Debug.println("- AspectJBundleFile.getEntry() path="
+ path + ", entry=" + entry);
} else if (cacheEntry.getCachedBytes() != null) {
entry = new CachedClassBundleEntry(adaptor, entry, path,
cacheEntry.getCachedBytes(), url);
} else {
entry = new WeavingBundleEntry(adaptor, entry, url,
cacheEntry.dontWeave());
}
}
} else if (path.endsWith(".class") && entry == null) {
final int offset = path.lastIndexOf('.');
final String name = path.substring(0, offset).replace('/', '.');
final IWeavingAdaptor adaptor = getAdaptor();
if (adaptor != null) {
final CacheEntry cacheEntry = adaptor.findClass(name, url);
if (cacheEntry != null && cacheEntry.getCachedBytes() != null) {
entry = new CachedGeneratedClassBundleEntry(adaptor, path,
cacheEntry.getCachedBytes(), url);
}
}
}
if (Debug.DEBUG_BUNDLE)
Debug.println("< AspectJBundleFile.getEntry() entry=" + entry);
return entry;
}
}