Sfoglia il codice sorgente

117189: patch from Ron, tidied up by Matthew: reduce overhead when no aspects defined

tags/V1_5_0RC1
aclement 18 anni fa
parent
commit
a5ac5af396

+ 47
- 43
loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java Vedi File

*******************************************************************************/ *******************************************************************************/
package org.aspectj.weaver.loadtime; package org.aspectj.weaver.loadtime;


import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

import org.aspectj.asm.IRelationship; import org.aspectj.asm.IRelationship;
import org.aspectj.bridge.IMessage; import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.ISourceLocation; import org.aspectj.bridge.ISourceLocation;
import org.aspectj.bridge.Message; import org.aspectj.bridge.Message;
import org.aspectj.bridge.MessageUtil;
import org.aspectj.util.LangUtil; import org.aspectj.util.LangUtil;
import org.aspectj.weaver.ICrossReferenceHandler; import org.aspectj.weaver.ICrossReferenceHandler;
import org.aspectj.weaver.Lint; import org.aspectj.weaver.Lint;
import org.aspectj.weaver.UnresolvedType; import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.World; import org.aspectj.weaver.World;
import org.aspectj.weaver.Lint.Kind; import org.aspectj.weaver.Lint.Kind;
import org.aspectj.weaver.bcel.BcelObjectType;
import org.aspectj.weaver.bcel.BcelWeaver; import org.aspectj.weaver.bcel.BcelWeaver;
import org.aspectj.weaver.bcel.BcelWorld; import org.aspectj.weaver.bcel.BcelWorld;
import org.aspectj.weaver.bcel.Utility; import org.aspectj.weaver.bcel.Utility;
import org.aspectj.weaver.bcel.BcelObjectType;
import org.aspectj.weaver.loadtime.definition.Definition; import org.aspectj.weaver.loadtime.definition.Definition;
import org.aspectj.weaver.loadtime.definition.DocumentParser; import org.aspectj.weaver.loadtime.definition.DocumentParser;
import org.aspectj.weaver.patterns.PatternParser; import org.aspectj.weaver.patterns.PatternParser;
import org.aspectj.weaver.tools.GeneratedClassHandler; import org.aspectj.weaver.tools.GeneratedClassHandler;
import org.aspectj.weaver.tools.WeavingAdaptor; import org.aspectj.weaver.tools.WeavingAdaptor;


import java.io.File;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

/** /**
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/ */
weavingContext = wContext ; weavingContext = wContext ;
} }


List definitions = parseDefinitions(loader);
if (!enabled) {
return;
}
bcelWorld = new BcelWorld( bcelWorld = new BcelWorld(
loader, messageHandler, new ICrossReferenceHandler() { loader, messageHandler, new ICrossReferenceHandler() {
public void addCrossReference(ISourceLocation from, ISourceLocation to, IRelationship.Kind kind, boolean runtimeTest) { public void addCrossReference(ISourceLocation from, ISourceLocation to, IRelationship.Kind kind, boolean runtimeTest) {
} }
} }
); );

// //TODO this AJ code will call // //TODO this AJ code will call
// //org.aspectj.apache.bcel.Repository.setRepository(this); // //org.aspectj.apache.bcel.Repository.setRepository(this);
// //ie set some static things // //ie set some static things
weaver = new BcelWeaver(bcelWorld); weaver = new BcelWeaver(bcelWorld);


// register the definitions // register the definitions
registerDefinitions(weaver, loader);
registerDefinitions(weaver, loader, definitions);
messageHandler = bcelWorld.getMessageHandler();


// AV - see #113511 - not sure it is good to skip message handler
if (enabled) {
messageHandler = bcelWorld.getMessageHandler();
// after adding aspects
weaver.prepareForWeave();
}
//bcelWorld.setResolutionLoader(loader.getParent());//(ClassLoader)null);//
// after adding aspects
weaver.prepareForWeave();
} }


/** /**
* @param weaver * @param weaver
* @param loader * @param loader
*/ */
private void registerDefinitions(final BcelWeaver weaver, final ClassLoader loader) {
try {
MessageUtil.info(messageHandler, "register classloader " + getClassLoaderName(loader));
private List parseDefinitions(final ClassLoader loader) {
List definitions = new ArrayList();
try {
info("register classloader " + getClassLoaderName(loader));
//TODO av underoptimized: we will parse each XML once per CL that see it //TODO av underoptimized: we will parse each XML once per CL that see it
List definitions = new ArrayList();


//TODO av dev mode needed ? TBD -Daj5.def=... //TODO av dev mode needed ? TBD -Daj5.def=...
if (ClassLoader.getSystemClassLoader().equals(loader)) { if (ClassLoader.getSystemClassLoader().equals(loader)) {
String file = System.getProperty("aj5.def", null); String file = System.getProperty("aj5.def", null);
if (file != null) { if (file != null) {
MessageUtil.info(messageHandler, "using (-Daj5.def) " + file);
info("using (-Daj5.def) " + file);
definitions.add(DocumentParser.parse((new File(file)).toURL())); definitions.add(DocumentParser.parse((new File(file)).toURL()));
} }
} }


while (xmls.hasMoreElements()) { while (xmls.hasMoreElements()) {
URL xml = (URL) xmls.nextElement(); URL xml = (URL) xmls.nextElement();
MessageUtil.info(messageHandler, "using " + xml.getFile());
info("using " + xml.getFile());
definitions.add(DocumentParser.parse(xml)); definitions.add(DocumentParser.parse(xml));
} }
} }

// still go thru if definitions is empty since we will configure
// the default message handler in there
registerOptions(weaver, loader, definitions);

// AV - see #113511
if (!definitions.isEmpty()) {
registerAspectExclude(weaver, loader, definitions);
registerAspectInclude(weaver, loader, definitions);
registerAspects(weaver, loader, definitions);
registerIncludeExclude(weaver, loader, definitions);
registerDump(weaver, loader, definitions);
} else {
if (definitions.isEmpty()) {
enabled = false;// will allow very fast skip in shouldWeave() enabled = false;// will allow very fast skip in shouldWeave()
info("no configuration found. Disabling weaver for class loader " + getClassLoaderName(loader)); info("no configuration found. Disabling weaver for class loader " + getClassLoaderName(loader));
}
}
} catch (Exception e) {
enabled = false;// will allow very fast skip in shouldWeave()
warn("parse definitions failed",e);
}
return definitions;
}
private void registerDefinitions(final BcelWeaver weaver, final ClassLoader loader, List definitions) {
try {
registerOptions(weaver, loader, definitions);
registerAspectExclude(weaver, loader, definitions);
registerAspectInclude(weaver, loader, definitions);
registerAspects(weaver, loader, definitions);
registerIncludeExclude(weaver, loader, definitions);
registerDump(weaver, loader, definitions);
} catch (Exception e) { } catch (Exception e) {
enabled = false;// will allow very fast skip in shouldWeave() enabled = false;// will allow very fast skip in shouldWeave()
warn("register definition failed",e); warn("register definition failed",e);
public void flushGeneratedClasses(){ public void flushGeneratedClasses(){
generatedClasses = new HashMap(); generatedClasses = new HashMap();
} }
} }

+ 11
- 10
weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java Vedi File

* @exception IOException weave failed * @exception IOException weave failed
*/ */
public byte[] weaveClass (String name, byte[] bytes) throws IOException { public byte[] weaveClass (String name, byte[] bytes) throws IOException {
if (shouldWeave(name, bytes)) {
//System.out.println("WeavingAdaptor.weaveClass " + name);
info("weaving '" + name + "'");
bytes = getWovenBytes(name, bytes);
} else if (shouldWeaveAnnotationStyleAspect(name, bytes)) {
// an @AspectJ aspect needs to be at least munged by the aspectOf munger
info("weaving '" + name + "'");
bytes = getAtAspectJAspectBytes(name, bytes);
}
if (enabled) {
if (shouldWeave(name, bytes)) {
info("weaving '" + name + "'");
bytes = getWovenBytes(name, bytes);
} else if (shouldWeaveAnnotationStyleAspect(name, bytes)) {
// an @AspectJ aspect needs to be at least munged by the aspectOf munger
info("weaving '" + name + "'");
bytes = getAtAspectJAspectBytes(name, bytes);
}
}


return bytes; return bytes;
} }
*/ */
private boolean shouldWeave (String name, byte[] bytes) { private boolean shouldWeave (String name, byte[] bytes) {
name = name.replace('/','.'); name = name.replace('/','.');
boolean b = enabled && !generatedClasses.containsKey(name) && shouldWeaveName(name);
boolean b = !generatedClasses.containsKey(name) && shouldWeaveName(name);
return b && accept(name, bytes); return b && accept(name, bytes);
// && shouldWeaveAnnotationStyleAspect(name); // && shouldWeaveAnnotationStyleAspect(name);
// // we recall shouldWeaveAnnotationStyleAspect as we need to add aspectOf methods for @Aspect anyway // // we recall shouldWeaveAnnotationStyleAspect as we need to add aspectOf methods for @Aspect anyway

Loading…
Annulla
Salva