Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java95
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;
+ }
+
+}

Back to the top