/*******************************************************************************
* Copyright (c) 2008 Mountainminds GmbH & Co. KG
* This software is provided under the terms of the Eclipse Public License v1.0
* See http://www.eclipse.org/legal/epl-v10.html.
*
* $Id: InstrumentationHook.java 1593 2010-10-18 17:48:01Z dcarver $
******************************************************************************/
package org.eclemma.runtime.equinox.internal;
import java.io.IOException;
import java.net.URLConnection;
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.Properties;
import org.eclemma.runtime.equinox.ICoverageAnalyzer;
import org.eclipse.osgi.baseadaptor.BaseAdaptor;
import org.eclipse.osgi.baseadaptor.BaseData;
import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
import org.eclipse.osgi.baseadaptor.hooks.AdaptorHook;
import org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook;
import org.eclipse.osgi.baseadaptor.loader.BaseClassLoader;
import org.eclipse.osgi.baseadaptor.loader.ClasspathEntry;
import org.eclipse.osgi.baseadaptor.loader.ClasspathManager;
import org.eclipse.osgi.framework.adaptor.BundleProtectionDomain;
import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
import org.eclipse.osgi.framework.log.FrameworkLog;
import org.eclipse.osgi.internal.loader.BundleLoader;
import org.eclipse.osgi.util.ManifestElement;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
/**
* Implementation of the required hooks delegating to {@link ICoverageAnalyzer}.
*
* @author Marc R. Hoffmann, Mikkel T Andersen
*/
public class InstrumentationHook implements AdaptorHook, ClassLoadingHook {
private final ICoverageAnalyzer analyzer;
public InstrumentationHook(ICoverageAnalyzer analyzer) {
this.analyzer = analyzer;
}
public void frameworkStart(BundleContext context) throws BundleException {
analyzer.start(context);
}
public void frameworkStop(BundleContext context) throws BundleException {
analyzer.stop();
}
public byte[] processClass(String name, byte[] classbytes,
ClasspathEntry classpathEntry, BundleEntry entry,
ClasspathManager manager) {
if (analyzer.shouldInstrumentClassesInBundle(manager.getBaseData()
.getSymbolicName())) {
return analyzer.instrument(manager.getBaseData().getSymbolicName(),
name, classbytes);
}
return null;
}
public BaseClassLoader createClassLoader(ClassLoader parent,
ClassLoaderDelegate delegate, BundleProtectionDomain domain,
BaseData data, String[] bundleclasspath) {
if (analyzer.shouldInstrumentClassesInBundle(data.getSymbolicName())) {
BundleLoader loader = (BundleLoader) delegate;
try {
loader.addDynamicImportPackage(ManifestElement.parseHeader(
Constants.DYNAMICIMPORT_PACKAGE, analyzer
.getRuntimePackages()));
} catch (BundleException be) {
throw new RuntimeException(be);
}
}
return null;
}
// Methods stubs for hooks we do not require:
public boolean addClassPathEntry(ArrayList cpEntries, String cp,
ClasspathManager hostmanager, BaseData sourcedata,
ProtectionDomain sourcedomain) {
return false;
}
public String findLibrary(BaseData data, String libName) {
return null;
}
public ClassLoader getBundleClassLoaderParent() {
return null;
}
public void initializedClassLoader(BaseClassLoader baseClassLoader,
BaseData data) {
}
public void addProperties(Properties properties) {
}
public FrameworkLog createFrameworkLog() {
return null;
}
public void frameworkStopping(BundleContext context) {
}
public void handleRuntimeError(Throwable error) {
}
public void initialize(BaseAdaptor adaptor) {
}
public URLConnection mapLocationToURLConnection(String location)
throws IOException {
return null;
}
public boolean matchDNChain(String pattern, String[] dnChain) {
return false;
}
}