Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.weaving.caching/src/org/eclipse/equinox/weaving/internal/caching/BundleCachingService.java')
-rw-r--r--bundles/org.eclipse.equinox.weaving.caching/src/org/eclipse/equinox/weaving/internal/caching/BundleCachingService.java264
1 files changed, 0 insertions, 264 deletions
diff --git a/bundles/org.eclipse.equinox.weaving.caching/src/org/eclipse/equinox/weaving/internal/caching/BundleCachingService.java b/bundles/org.eclipse.equinox.weaving.caching/src/org/eclipse/equinox/weaving/internal/caching/BundleCachingService.java
deleted file mode 100644
index 2cf38a909..000000000
--- a/bundles/org.eclipse.equinox.weaving.caching/src/org/eclipse/equinox/weaving/internal/caching/BundleCachingService.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 2009 Heiko Seeberger 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:
- * Heiko Seeberger - initial implementation
- * Martin Lippert - asynchronous cache writing
- * Martin Lippert - caching of generated classes
- *******************************************************************************/
-
-package org.eclipse.equinox.weaving.internal.caching;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.text.MessageFormat;
-import java.util.Map;
-import java.util.concurrent.BlockingQueue;
-
-import org.eclipse.equinox.service.weaving.CacheEntry;
-import org.eclipse.equinox.service.weaving.ICachingService;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/**
- * <p>
- * {@link ICachingService} instantiated by {@link CachingServiceFactory} for
- * each bundle.
- * </p>
- * <p>
- *
- * @author Heiko Seeberger
- * @author Martin Lippert
- */
-public class BundleCachingService implements ICachingService {
-
- private static final int READ_BUFFER_SIZE = 8 * 1024;
-
- private final Bundle bundle;
-
- private File cacheDirectory;
-
- private final String cacheKey;
-
- private final BlockingQueue<CacheItem> cacheWriterQueue;
-
- /**
- * @param bundleContext Must not be null!
- * @param bundle Must not be null!
- * @param key Must not be null!
- * @param cacheWriterQueue The queue for items to be written to the cache,
- * must not be null
- * @throws IllegalArgumentException if given bundleContext or bundle is
- * null.
- */
- public BundleCachingService(final BundleContext bundleContext,
- final Bundle bundle, final String key,
- final BlockingQueue<CacheItem> cacheWriterQueue) {
-
- if (bundleContext == null) {
- throw new IllegalArgumentException(
- "Argument \"bundleContext\" must not be null!"); //$NON-NLS-1$
- }
- if (bundle == null) {
- throw new IllegalArgumentException(
- "Argument \"bundle\" must not be null!"); //$NON-NLS-1$
- }
- if (key == null) {
- throw new IllegalArgumentException(
- "Argument \"key\" must not be null!"); //$NON-NLS-1$
- }
-
- this.bundle = bundle;
- this.cacheKey = hashNamespace(key);
- this.cacheWriterQueue = cacheWriterQueue;
-
- final File dataFile = bundleContext.getDataFile(cacheKey);
- if (dataFile != null) {
- final String bundleCacheDir = bundle.getBundleId()
- + "-" + bundle.getLastModified(); //$NON-NLS-1$
- cacheDirectory = new File(dataFile, bundleCacheDir);
- } else {
- Log.error("Cannot initialize cache!", null); //$NON-NLS-1$
- }
- }
-
- /**
- * @see org.eclipse.equinox.service.weaving.ICachingService#canCacheGeneratedClasses()
- */
- public boolean canCacheGeneratedClasses() {
- return true;
- }
-
- /**
- * @see org.eclipse.equinox.service.weaving.ICachingService#findStoredClass(java.lang.String,
- * java.net.URL, java.lang.String)
- */
- public CacheEntry findStoredClass(final String namespace,
- final URL sourceFileURL, final String name) {
-
- if (name == null) {
- throw new IllegalArgumentException(
- "Argument \"name\" must not be null!"); //$NON-NLS-1$
- }
-
- byte[] storedClass = null;
- boolean isCached = false;
-
- if (cacheDirectory != null) {
- final File cachedBytecodeFile = new File(cacheDirectory, name);
- storedClass = read(name, cachedBytecodeFile);
- isCached = storedClass != null;
- }
-
- if (Log.isDebugEnabled()) {
- Log.debug(MessageFormat.format("for [{0}]: {1} {2}", bundle //$NON-NLS-1$
- .getSymbolicName(), ((storedClass != null) ? "Found" //$NON-NLS-1$
- : "Found NOT"), name)); //$NON-NLS-1$
- }
- return new CacheEntry(isCached, storedClass);
- }
-
- /**
- * Writes the remaining cache to disk.
- */
- public void stop() {
- }
-
- /**
- * @see org.eclipse.equinox.service.weaving.ICachingService#storeClass(java.lang.String,
- * java.net.URL, java.lang.Class, byte[])
- */
- public boolean storeClass(final String namespace, final URL sourceFileURL,
- final Class<?> clazz, final byte[] classbytes) {
- if (clazz == null) {
- throw new IllegalArgumentException(
- "Argument \"clazz\" must not be null!"); //$NON-NLS-1$
- }
- if (classbytes == null) {
- throw new IllegalArgumentException(
- "Argument \"classbytes\" must not be null!"); //$NON-NLS-1$
- }
- if (cacheDirectory == null) {
- return false;
- }
-
- final CacheItem item = new CacheItem(classbytes, cacheDirectory
- .getAbsolutePath(), clazz.getName());
-
- return this.cacheWriterQueue.offer(item);
- }
-
- /**
- * @see org.eclipse.equinox.service.weaving.ICachingService#storeClassAndGeneratedClasses(java.lang.String,
- * java.net.URL, java.lang.Class, byte[], java.util.Map)
- */
- public boolean storeClassAndGeneratedClasses(final String namespace,
- final URL sourceFileUrl, final Class<?> clazz,
- final byte[] classbytes, final Map<String, byte[]> generatedClasses) {
-
- final CacheItem item = new CacheItem(classbytes, cacheDirectory
- .getAbsolutePath(), clazz.getName(), generatedClasses);
-
- return this.cacheWriterQueue.offer(item);
- }
-
- /**
- * Hash the shared class namespace using MD5
- *
- * @param keyToHash
- * @return the MD5 version of the input string
- */
- private String hashNamespace(final String namespace) {
- MessageDigest md = null;
- try {
- md = MessageDigest.getInstance("MD5"); //$NON-NLS-1$
- } catch (final NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- final byte[] bytes = md.digest(namespace.getBytes());
- final StringBuffer result = new StringBuffer();
- for (final byte b : bytes) {
- int num;
- if (b < 0) {
- num = b + 256;
- } else {
- num = b;
- }
- String s = Integer.toHexString(num);
- while (s.length() < 2) {
- s = "0" + s; //$NON-NLS-1$
- }
- result.append(s);
- }
- return new String(result);
- }
-
- private byte[] read(final String name, final File file) {
- int length = (int) file.length();
-
- InputStream in = null;
- try {
- byte[] classbytes = new byte[length];
- int bytesread = 0;
- int readcount;
-
- in = new FileInputStream(file);
-
- if (length > 0) {
- classbytes = new byte[length];
- for (; bytesread < length; bytesread += readcount) {
- readcount = in.read(classbytes, bytesread, length
- - bytesread);
- if (readcount <= 0) /* if we didn't read anything */
- break; /* leave the loop */
- }
- } else /* BundleEntry does not know its own length! */{
- length = READ_BUFFER_SIZE;
- classbytes = new byte[length];
- readloop: while (true) {
- for (; bytesread < length; bytesread += readcount) {
- readcount = in.read(classbytes, bytesread, length
- - bytesread);
- if (readcount <= 0) /* if we didn't read anything */
- break readloop; /* leave the loop */
- }
- final byte[] oldbytes = classbytes;
- length += READ_BUFFER_SIZE;
- classbytes = new byte[length];
- System.arraycopy(oldbytes, 0, classbytes, 0, bytesread);
- }
- }
- if (classbytes.length > bytesread) {
- final byte[] oldbytes = classbytes;
- classbytes = new byte[bytesread];
- System.arraycopy(oldbytes, 0, classbytes, 0, bytesread);
- }
- return classbytes;
- } catch (final IOException e) {
- Log.debug(MessageFormat.format(
- "for [{0}]: Cannot read [1] from cache!", bundle //$NON-NLS-1$
- .getSymbolicName(), name));
- return null;
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (final IOException e) {
- Log.error(MessageFormat.format(
- "for [{0}]: Cannot close cache file for [1]!", //$NON-NLS-1$
- bundle.getSymbolicName(), name), e);
- }
- }
- }
- }
-
-}

Back to the top