<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>finis coronat opus: Version AspectWerkz o por otra parte...</title>
    <link>http://www.finiscoronatopus.com/articles/2003/06/11/version-aspectwerkz-o-por-otra-parte</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>perpetrando historias desde 2002</description>
    <item>
      <title>Version AspectWerkz o por otra parte...</title>
      <description>&lt;title&gt;&lt;/title&gt;Hace unos dias &lt;a href="http://www.freeroller.net/page/mschinc"&gt;Merrick Schincariol &lt;/a&gt;publico &lt;a href="http://www.freeroller.net/page/mschinc/20030605#understanding_aop"&gt;un post&lt;/a&gt; para intentar aclarar lo que realmente se encuentra tras las siglas de AOP. Quiz&amp;aacute;s no sea el articulo m&amp;aacute;s completo sobre AOP pero si el m&amp;aacute;s *claro* que he leido al respecto. Hace hincapie en algo que normalmente suele quedar enterrado bajo el mejunge de conceptos t&amp;eacute;cnologicos existentes alrededor de AOP y con lo que estoy completamente de acuerdo:
&lt;blockquote&gt;&lt;i&gt;"If you remember nothing else about AOP, remember that it is fundamentally about separation of concern. Filtering, interceptors and other implementation techniques that seem to dominate the AOP discussion are simply recipes for applying the AOP methodology. They are not AOP in and of themselves".&lt;/i&gt;&lt;/blockquote&gt;
A pesar de ello hubo algo que no me acabo de convencer : la implementaci&amp;oacute;n del ejemplo en AspectJ. S&amp;iacute; , si ya se que solo es un ejemplo y que la implementaci&amp;oacute;n no es lo fundamental pero me gustaria ofrecer la contrapartida a ese ejemplo en otro de los frameworks existentes para AOP: &lt;a href="http://aspectwerkz.codehaus.org"&gt;Aspectwerkz&lt;/a&gt;.  Dejo para otro post la explicaci&amp;oacute;n del porque de mi inclinaci&amp;oacute;n por AspectWerkz y no por AspectJ.

Partimos de la misma clase desligada de todo &lt;i&gt;aspecto&lt;/i&gt; no relacionado directamente con su finalidad ultima: imprimir.
&lt;pre&gt;
public class PrintServer {
    // private variables
    // ...
    
    // constructor
    PrintServer() {
      // ...
    }
    
    public void printDocument(Document doc) {
        // ...
    }
    
    public PrinterInfo getPrinterInfo() {
        return retrievePrinterInfo();
    }
    
    // other printing methods 
    // ...
}
&lt;/pre&gt;

Y construimos el resto de requerimientos en base a aspectos de esa clase:
&lt;pre&gt;
// Para sincronizar el acceso
import EDU.oswego.cs.dl.util.concurrent.Mutex;

import org.codehaus.aspectwerkz.advice.AroundAdvice;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;

public class SynchronizationAdvice extends AroundAdvice {

    private Mutex m_mutex = new Mutex();

    public SynchronizationAdvice() {
        super();
    }

    public Object execute(final JoinPoint joinPoint) throws Throwable {
        System.out.println("Acquiring mutex\t" + Thread.currentThread());
        m_mutex.acquire();
        System.out.println("Has mutex\t\t" + Thread.currentThread());
        Object result = joinPoint.proceed();
        m_mutex.release();
        System.out.println("Releasing mutex\t" + Thread.currentThread());
        return result;
    }
}
&lt;/pre&gt;
&lt;pre&gt;
// para tracear las entradas y salidas...
import org.codehaus.aspectwerkz.advice.AroundAdvice;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;

public class LoggingAdvice extends AroundAdvice {

    public LoggingAdvice() {
        super();
    }

    public Object execute(final JoinPoint joinPoint) throws Throwable {
        MethodJoinPoint jp = (MethodJoinPoint)joinPoint;
        System.out.println(" entering " + jp.getTargetClass().getName() + 
                           "::" + jp.getMethodName());
        final Object result = joinPoint.proceed();
        System.out.println(" exiting " + jp.getTargetClass().getName() + 
                           "::" + jp.getMethodName());
        return result;
    }
}
&lt;/pre&gt;
&lt;pre&gt;
// Y finalmente para cachear...
import org.codehaus.aspectwerkz.advice.AroundAdvice;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;

public class CachingAdvice extends AroundAdvice {

    protected static Object cachedResult =null;

    public CachingAdvice() {
        super();
    }

    public Object execute(final JoinPoint joinPoint) throws Throwable {

        if (cachedResult != null) {
            return cachedResult;
        }
        final Object result = joinPoint.proceed();

        cachedResult = result;
        return result;
    }
}

&lt;/pre&gt;

Como se puede observar todas los aspectos se implementan como clases Java corrientes y molientes (gran, EMHO, diferencia con respecto a AspectJ)  heredando de &lt;i&gt;AroundAdvice&lt;/i&gt;, una clase proporcionada por AspectWerkz que permite controlar el antes y el despues de la ejecucion de ciertos metodos. ¿Qu&amp;eacute; metodos?. Uuups. Se me olvidaba. Para determinar la asociaci&amp;oacute;n de un aspecto a un determinado punto de nuestro codigo poseemos varios metodos: uno, el que detallo a continuaci&amp;oacute;n por simplicidad, que permite definir en un XML estas relaciones, y dos, la utlizaci&amp;oacute;n de los llamados atributos en tiempo de ejecuci&amp;oacute;n que no son sino cabeceras estilo Javadoc delante de ciertos metodos que permiten determinar, por ejemplo, que aspectos estan relacionados con el metodo en curso (de una manera muy similar a como se especifica en XDoclet). ¿Diferencias?. El segundo de los metodos implica una precompilaci&amp;oacute;n del codigo para generar lo que se denomina &lt;i&gt;"weave model"&lt;/i&gt;, que recopila la informaci&amp;oacute;n de estos atributos.&lt;br/&gt;
&lt;br/&gt;
Utilizando el primero de los metodos, tendriamos un XML como el siguiente:
&lt;br/&gt;
&lt;br/&gt;
&amp;lt;?xml&amp;nbsp;version="1.0"?&amp;gt;&lt;br/&gt;

&amp;lt;aspectwerkz&amp;gt;&lt;br/&gt;
&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;advice&amp;nbsp;name="logging"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class="LoggingAdvice"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deployment-model="perJVM"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attribute="log"/&amp;gt;&lt;br/&gt;
&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;advice&amp;nbsp;name="caching"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class="CachingAdvice"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deployment-model="perInstance"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/advice&amp;gt;&lt;br/&gt;
&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;advice&amp;nbsp;name="synchronization"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class="SynchronizationAdvice"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deployment-model="perJVM"/&amp;gt;&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;aspect&amp;nbsp;class="PrintServer"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;pointcut&amp;nbsp;type="method"&amp;nbsp;pattern="*getPrinterInfo()"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;advices-ref&amp;nbsp;name="caching"/&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/pointcut&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/aspect&amp;gt;&lt;br/&gt;
&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;aspect&amp;nbsp;class="PrintServer"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;pointcut&amp;nbsp;type="method"&amp;nbsp;pattern="*&amp;nbsp;&amp;nbsp;printDocument(..)"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;advice-ref&amp;nbsp;name="synchronization"/&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/pointcut&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/aspect&amp;gt;&lt;br/&gt;
&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;aspect&amp;nbsp;class="PrintServer"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;pointcut&amp;nbsp;type="method"&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;pattern&amp;gt;*&amp;nbsp;p*(..)&amp;lt;/pattern&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;advice-ref&amp;nbsp;name="logging"/&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/pointcut&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/aspect&amp;gt;&lt;br/&gt;
&lt;br/&gt;
&amp;lt;/aspectwerkz&amp;gt;&lt;br/&gt;&lt;br/&gt;
&lt;br/&gt;
Por ultimo resaltar la posibilidad de la utilizaci&amp;oacute;n de *expresiones regulares* para determinar los metodos (pattern) a los que queremos aplicar el aspecto.&lt;br/&gt; 
En fin, sigamos la implementaci&amp;oacute;n que sigamos, a nadie se le escapa, que aunque incipiente, AOP abre interesantes caminos en el campo del desarrollo software. Por ahora no existe una base amplia de IDEs que faciliten el desarrollo, exceptuando el proporcionado por AspectJ (aunque la gente de Eclipse ya esta trabajando en un plug-in),  pero bueno todo llegar&amp;aacute;...

P.D.: No , martin no se me ha olvidado lo de la conversi&amp;oacute;n de patrones  ;-), estoy en ello.</description>
      <pubDate>Wed, 11 Jun 2003 03:09:24 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:8a6401935559cd42a2f90474bd588276</guid>
      <author>Aitor Garcia</author>
      <link>http://www.finiscoronatopus.com/articles/2003/06/11/version-aspectwerkz-o-por-otra-parte</link>
      <category>Java</category>
    </item>
    <item>
      <title>"Version AspectWerkz o por otra parte..." by lasterra@javahispano.org</title>
      <description>&lt;p&gt;Sinceramente, no tengo ni idea de &lt;span class='caps'&gt;AOP&lt;/span&gt;, solo he leido un poco pero me he fijado en dos cosas:&lt;/p&gt;


	&lt;p&gt;Segun he entendido, &lt;span class='caps'&gt;XEROX&lt;/span&gt; tiene la patente &lt;span class='caps'&gt;USA&lt;/span&gt; e &lt;span class='caps'&gt;AOP&lt;/span&gt;, eso hace que solo en el resto del mundo se puedan hacer cosas.&lt;/p&gt;


	&lt;p&gt;Tb me he visto, que a parte de AspectJ, y AspectWerkz,(ya ah comentado aitor la diferencia), existe uno que se llama Nanning, cuya principal caracteristica es que es solo Java, nada de descriptores, nada de cosas fuera del lenguaje. Eso, segun su autor, es una gran ventaja&amp;#8230;puedes trabajar desde YA con cualquier &lt;span class='caps'&gt;IDE&lt;/span&gt; y puedes refactoriazar.&lt;/p&gt;


	&lt;p&gt;A tener en cuenta.&lt;/p&gt;


	&lt;p&gt;PS: Me parecebn lo de la sindicación en javahispano, hasta hace 4 dias no hacia visitado nunca un blog (juro que nunca tendre uno :).&lt;/p&gt;</description>
      <pubDate>Wed, 11 Jun 2003 09:41:01 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:f89cfcca0104b245ec3a1afaa048a5da</guid>
      <link>http://www.finiscoronatopus.com/articles/2003/06/11/version-aspectwerkz-o-por-otra-parte#comment-173</link>
    </item>
    <item>
      <title>"Version AspectWerkz o por otra parte..." by Aitor</title>
      <description>&lt;p&gt;Que no, en serio, que era una broma ;-). El tema es que me he encontrado con que en varios sitios en los que se implementan patrones con AspectJ se utilizan clases como &amp;#8220;SingletonProtocol&amp;#8221; que &lt;strong&gt;per se&lt;/strong&gt; contienen ya la estructura del patrón. No sé, estoy investigando todavía, pero ya te comentaré.

Otro Saludo :-).&lt;/p&gt;</description>
      <pubDate>Wed, 11 Jun 2003 08:54:25 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:c386aeeb89505bb5b865970b264d1500</guid>
      <link>http://www.finiscoronatopus.com/articles/2003/06/11/version-aspectwerkz-o-por-otra-parte#comment-172</link>
    </item>
    <item>
      <title>"Version AspectWerkz o por otra parte..." by martin</title>
      <description>&lt;p&gt;Ehh.&lt;/p&gt;


	&lt;p&gt;Creo que lo de los patrones debería ser un trabajo en equipo ¿no? :P Estoy viendo que vas a hacer tu todo de lo lanzado que vas.&lt;/p&gt;


	&lt;p&gt;Un saludo ;)&lt;/p&gt;</description>
      <pubDate>Wed, 11 Jun 2003 08:35:02 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:fb1e5f687e3dc0f3899d7a317884aed7</guid>
      <link>http://www.finiscoronatopus.com/articles/2003/06/11/version-aspectwerkz-o-por-otra-parte#comment-171</link>
    </item>
  </channel>
</rss>
