Author: echatellier Date: 2014-07-19 12:11:28 +0200 (Sat, 19 Jul 2014) New Revision: 4044 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4044 Log: Ajout de commentaire sur les aspects aspectj Modified: trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJUrlClassLoader.java trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJWeavingAdaptor.java Modified: trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJUrlClassLoader.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJUrlClassLoader.java 2014-07-19 08:52:22 UTC (rev 4043) +++ trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJUrlClassLoader.java 2014-07-19 10:11:28 UTC (rev 4044) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2013 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2013 - 2014 Ifremer, Code Lutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -37,6 +37,18 @@ import org.aspectj.weaver.tools.TraceFactory; import org.aspectj.weaver.tools.WeavingClassLoader; +/** + * Cette classe est un copié/coller de {@link org.aspectj.weaver.loadtime.WeavingURLClassLoader} qui permet de définit + * notre propre instance de {@code adaptor} pour, dans le cas d'IsisFish, permettre d'ajouter des aspects à l'execution. + * + * Elle définie deux nouvelles méthodes: + * <ul> + * <li>{@link #deploy(Class)} : qui permet de deployer un nouvel aspect<li> + * <li>{@link #prepare()} : à appeler après l'ajout de tous les aspects dynamiques</li> + * </ul> + * + * @since 4.2.0.0 + */ public class AspectJUrlClassLoader extends ExtensibleURLClassLoader implements WeavingClassLoader { public static final String WEAVING_CLASS_PATH = "aj.class.path"; Modified: trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJWeavingAdaptor.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJWeavingAdaptor.java 2014-07-19 08:52:22 UTC (rev 4043) +++ trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJWeavingAdaptor.java 2014-07-19 10:11:28 UTC (rev 4044) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2013 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2013 - 2014 Ifremer, Code Lutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -33,6 +33,7 @@ import java.util.Iterator; import java.util.List; +import org.apache.commons.io.IOUtils; import org.aspectj.apache.bcel.classfile.ClassParser; import org.aspectj.apache.bcel.classfile.JavaClass; import org.aspectj.bridge.IMessageHandler; @@ -52,6 +53,24 @@ import org.aspectj.weaver.tools.cache.SimpleCache; import org.aspectj.weaver.tools.cache.SimpleCacheFactory; +/** + * Cette classe étend {@link WeavingAdaptor} pour avoir une instance personnalisée du champ {@link #weaver}. + * + * Toutes la logique consiste ensuite à pouvoir appeler le code {@code weaver.weave(wcp);} pour pouvoir déployer un + * apect à l'execution dans le {@code weaver} qui servira ensuite à "aspectiser une classe" via la méthode + * {@link #weaveClass(String, byte[])}. + * + * Elle utilise pour l'instant de l'introspection agressive pour acceder aux attributs privés de la classe parentes et + * les rendre visible. + * + * TODO : au lieu d'ajouter à la demande des aspects, on pourrait les ajouters en parmanence, mais en les activant de + * facon conditionnelle (if() cutpoint). + * A tester. Il est possible que sans le cas d'isis, une classe non aspectisée soit plus performante qu'une classe + * dont les aspects ne sont pas activés. + * Voir la discussion : http://aspectj.2085585.n4.nabble.com/Runtime-weaving-without-agent-tp4650837... + * + * @since 4.2.0.0 + */ public class AspectJWeavingAdaptor extends WeavingAdaptor { protected ClassLoader parentLoader; @@ -115,9 +134,10 @@ public byte[] deploy(Class<?> aspectClass) { byte[] result = null; + InputStream is = null; try { String name = aspectClass.getName(); - InputStream is = AspectJWeavingAdaptor.class.getResourceAsStream("/" + name.replace('.', '/') + ".class"); + is = AspectJWeavingAdaptor.class.getResourceAsStream("/" + name.replace('.', '/') + ".class"); byte[] bytes = FileUtil.readAsByteArray(is); is.close(); ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), name); @@ -134,6 +154,8 @@ } catch (IOException e) { throw new RuntimeException("Can't create aspect", e); + } finally { + IOUtils.closeQuietly(is); } return result;