blob: 8e6d2efaea75a980b66c389291f8f3ddd1b88842 [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
* Heiko Seeberger AJDT 1.5.1 changes
* Martin Lippert minor changes and bugfixes
* Martin Lippert reworked
* Martin Lippert caching of generated classes
*******************************************************************************/
package org.eclipse.equinox.weaving.aspectj.loadtime;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.aspectj.weaver.IUnwovenClassFile;
import org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor;
import org.eclipse.equinox.weaving.aspectj.AspectJWeavingStarter;
/**
* The weaving adaptor for AspectJs load-time weaving API that deals with the
* OSGi specifics for load-time weaving
*/
public class OSGiWeavingAdaptor extends ClassLoaderWeavingAdaptor {
private final ClassLoader classLoader;
private boolean initialized;
private boolean initializing;
private final String namespace;
private final OSGiWeavingContext weavingContext;
public OSGiWeavingAdaptor(final ClassLoader loader,
final OSGiWeavingContext context, final String namespace) {
super();
this.classLoader = loader;
this.weavingContext = context;
this.namespace = namespace;
}
public Map<String, byte[]> getGeneratedClassesFor(final String className) {
final Map<?, ?> generated = this.generatedClasses;
final Map<String, byte[]> result = new HashMap<String, byte[]>();
final Iterator<?> generatedClassNames = generated.keySet().iterator();
while (generatedClassNames.hasNext()) {
final String name = (String) generatedClassNames.next();
final IUnwovenClassFile unwovenClass = (IUnwovenClassFile) generated
.get(name);
if (!className.equals(name)) {
result.put(name, unwovenClass.getBytes());
}
}
flushGeneratedClasses();
return result;
}
/**
* @see org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor#getNamespace()
*/
@Override
public String getNamespace() {
return namespace;
}
public void initialize() {
if (!initializing) {
if (!initialized) {
initializing = true;
super.initialize(classLoader, weavingContext);
initialized = true;
initializing = false;
if (AspectJWeavingStarter.verbose) {
if (isEnabled())
System.err
.println("[org.eclipse.equinox.weaving.aspectj] info weaving bundle '"
+ weavingContext.getClassLoaderName()
+ "'");
else
System.err
.println("[org.eclipse.equinox.weaving.aspectj] info not weaving bundle '"
+ weavingContext.getClassLoaderName()
+ "'");
}
}
}
}
// Bug 215177: Adapt to updated (AJ 1.5.4) super class signature:
/**
* @see org.aspectj.weaver.tools.WeavingAdaptor#weaveClass(java.lang.String,
* byte[], boolean)
*/
@Override
public byte[] weaveClass(final String name, byte[] bytes,
final boolean mustWeave) throws IOException {
/* Avoid recursion during adaptor initialization */
if (!initializing) {
if (!initialized) {
initializing = true;
initialize(classLoader, weavingContext);
initialized = true;
initializing = false;
}
// Bug 215177: Adapt to updated (AJ 1.5.4) super class signature:
bytes = super.weaveClass(name, bytes, mustWeave);
}
return bytes;
}
}