diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.weaving.hook/src/org/eclipse/equinox/weaving/hooks/WeavingBundleFile.java')
-rw-r--r-- | bundles/org.eclipse.equinox.weaving.hook/src/org/eclipse/equinox/weaving/hooks/WeavingBundleFile.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.weaving.hook/src/org/eclipse/equinox/weaving/hooks/WeavingBundleFile.java b/bundles/org.eclipse.equinox.weaving.hook/src/org/eclipse/equinox/weaving/hooks/WeavingBundleFile.java new file mode 100644 index 000000000..fe5f47fbc --- /dev/null +++ b/bundles/org.eclipse.equinox.weaving.hook/src/org/eclipse/equinox/weaving/hooks/WeavingBundleFile.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * 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; + } + +} |