<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>KoziołekWeb &#187; AspectJ</title>
	<atom:link href="http://koziolekweb.pl/tag/aspectj/feed/" rel="self" type="application/rss+xml" />
	<link>http://koziolekweb.pl</link>
	<description>Sięgam tam gdzie wzrok nie sięga, a tam NullPointerException</description>
	<lastBuildDate>Tue, 22 May 2012 11:25:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<image>\n<url>http://koziolekweb.pl/icon.png</url>\n<title>KoziołekWeb</title>\n<link>http://koziolekweb.pl</link>\n<width></width>\n<height></height>\n</image>\n		<item>
		<title>Guice, a JSR-303 z pomocą AspectJ</title>
		<link>http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/</link>
		<comments>http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 15:52:24 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[Guice]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Bean Validation]]></category>
		<category><![CDATA[JSR-303]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2400</guid>
		<description><![CDATA[      
      Problem mam. Mój własny walidator zgodny z JSR-303 wymaga dostępu do usługi zewnętrznej. Oczywiście instancja walidatora jest tworzona przez silnik Bean Validation. Mogę co prawda w metodzie initialize stworzyć ręcznie usługę, ale ja lubię Guice&#8230; Problem z Bean Validation polega na tym, że nie za bardzo idzie wpiąć się do niego w taki sposób by [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Problem mam. Mój własny walidator zgodny z JSR-303 wymaga dostępu do usługi zewnętrznej. Oczywiście instancja walidatora jest tworzona przez silnik Bean Validation. Mogę co prawda w metodzie <samp>initialize</samp> stworzyć ręcznie usługę, ale ja lubię Guice&#8230;</p>
<p>Problem z Bean Validation polega na tym, że nie za bardzo idzie wpiąć się do niego w taki sposób by walidatory były tworzone i zarządzane przez kontener DI. Nie wiem czy to jest tylko moje niedopatrzenie wraz z niechęcią do czytania dokumentacji czy też jakaś głębsza myśl związana z całym JSRem, ale generalnie obiekty walidatorów są tworzone poza naszym zasięgiem. Chcąc zatem coś wstrzyknąć do takiego obiektu należy się uzbroić w cierpliwość. Najprostsza metoda polega oczywiście na wywołaniu metody <samp>injector.injectMembers(this)</samp> w metodzie <samp>initialize</samp> walidatora. Tyle tylko, że jak mamy wiele walidatorów to zaczyna się robić nieciekawie. Dziedziczenie tu niewiele zmienia, bo i tak musimy zaśmiecać kod, tym razem wywołaniem <samp>super.initialize()</samp>. Jak się zapomni to dupa blada.<br />
Rozwiązaniem jest użycie programowania aspektowego i wkompilowanie odpowiedniego kawałka kodu. Guice udostępnia oczywiście interfejs AOP, ale&#8230;</p>
<blockquote><p>It is not possible to use method interception on instances that aren&#8217;t constructed by Guice.</p></blockquote>
<p><a href="http://code.google.com/p/google-guice/wiki/AOP">źródło</a></p>
<p>czyli jeżeli walidatory nie są tworzone przez Guice to se można do usranej śmierci zwalczać NPE. Z pomocą przychodzi nam w tym przypadku AspectJ. Wystarczy machnąć taki oto prosty aspekcik:</p>
<p class="listing">listing 1. Wstrzyknięcie zależności do walidatora</p>
<pre class="java" name="code">@Aspect
public class ValidationInitAspect {

	@Pointcut("execution( * javax.validation.ConstraintValidator+.initialize(..))")
	public void initialize(){}

	@Around("initialize()")
	public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
		System.out.println("Init");
		App.injector.injectMembers(joinPoint.getThis());
		return joinPoint.proceed();
	}

}
</pre>
<p>e&#8217;wiola jak mawiają Francuzi. Co się dzieje? Pointcut wskazuje na metodę <samp>initialize</samp> wszystkich klas będących <samp>ConstraintValidator</samp>. Wstrzykujemy oczywiście w miejsce <a href="http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/">wykonania, a nie wywołania</a>. Jedynym fakupem jest konieczność zapewnienia sobie dostępu do injectora, tu realizowane jest to poprzez zrobienie go publicznym, statycznym polem w klasie głównej aplikacji. </p>
<p>Wiem, że hak, ale działa.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/&amp;title=Guice%2C+a+JSR-303+z+pomoc%C4%85+AspectJ" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Del.icio.us" alt="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/&amp;title=Guice%2C+a+JSR-303+z+pomoc%C4%85+AspectJ" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do digg" alt="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Technorati" alt="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/&amp;title=Guice%2C+a+JSR-303+z+pomoc%C4%85+AspectJ" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Stumble Upon" alt="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/&amp;title=Guice%2C+a+JSR-303+z+pomoc%C4%85+AspectJ" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Google Bookmarks" alt="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/&amp;t=Guice%2C+a+JSR-303+z+pomoc%C4%85+AspectJ" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do FaceBook" alt="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/&amp;title=Guice%2C+a+JSR-303+z+pomoc%C4%85+AspectJ" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do wykop.pl" alt="dodaj 'Guice, a JSR-303 z pomocą AspectJ' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/02/08/guice-a-jsr-303-z-pomoca-aspectj/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Różnica pomiędzy call i execution w AspectJ</title>
		<link>http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/</link>
		<comments>http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 11:24:18 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2386</guid>
		<description><![CDATA[      
      Różnica wredna, która potrafi zepsuć dzień. Generalnie zarówno call jak i execution nie różnią się jeżeli chodzi o moment wywołania. Jeżeli zdefiniujemy, że mają być wkompilowane przed to zostaną wkompilowane przed. Jeżeli po to po. Kompilator zapewnia, że w danym przepływie sterowania aspekt będzie umieszczony w odpowiednim miejscu. Oczywiście przy założeniu, że nie ma tam [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Różnica wredna, która potrafi zepsuć dzień. </p>
<p>Generalnie zarówno <samp>call</samp> jak i <samp>execution</samp> nie różnią się jeżeli chodzi o moment wywołania. Jeżeli zdefiniujemy, że mają być wkompilowane przed to zostaną wkompilowane przed. Jeżeli po to po. Kompilator zapewnia, że w danym przepływie sterowania aspekt będzie umieszczony w odpowiednim miejscu. Oczywiście przy założeniu, że nie ma tam jakiś dodatkowych aspektów. Różnica leży w tym gdzie kompilator umieszcza kod. </p>
<h4>Położenie <samp>call</samp></h4>
<p>Jeżeli używamy <samp>call</samp> to kompilator umieści kod porady w miejscu gdzie wywoływana jest dana metoda. Czyli jeżeli metoda A.a woła metodę B.b to kod zostanie umieszczony w metodzie A.a.</p>
<h4>Położenie <samp>execution</samp></h4>
<p>Jeżeli używamy <samp>execution</samp> to kompilator umieści kod w wywoływanej metodzie. Przykładowo jeżeli A.a woła B.b to kod zostanie umieszczony w B.b.</p>
<h4>Gdzie jest to istotne</h4>
<p>W praktyce jeżeli wrzucamy kod aspektowy do naszych klas to nie ma różnicy czy użyjemy <samp>call</samp> czy <samp>execution</samp>. Kompilator i tak musi przeorać cały kod źródłowy&#8230; no właśnie. Kod źródłowy&#8230; Jeżeli wasza metoda jest wywoływana przez jakaś zewnętrzną bibliotekę np. chcecie dodać kod aspektowy do testu oznaczonego <samp>@Test</samp> to użycie <samp>call</samp> skończy się komunikatem <samp>Xlint:adviceDidNotMatch</samp>. Kompilator nie doda waszej porady ponieważ nie pracuje na kodzie wywołującym metodę. Dotyczy to też sytuacji gdzie do wywołania metody używacie refleksji. W takim wypadku macie dwa wyjścia. Po pierwsze użyć <samp>execution</samp>, co jest prostsze, ale narusza wasz kod (przyjmuję tu pracę z weaveringiem w czasie kompilacji). Po drugie użyć <samp>call</call> wraz z weaveringiem w czasie ładowania klas.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Del.icio.us" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do digg" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Technorati" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Stumble Upon" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Google Bookmarks" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;t=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do FaceBook" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/&amp;title=R%C3%B3%C5%BCnica+pomi%C4%99dzy+call+i+execution+w+AspectJ" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Różnica pomiędzy call i execution w AspectJ' do wykop.pl" alt="dodaj 'Różnica pomiędzy call i execution w AspectJ' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/01/23/roznica-pomiedzy-call-i-execution-w-aspectj/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AspectJ in Action &#8211; Review</title>
		<link>http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/</link>
		<comments>http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 20:12:17 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Książka]]></category>
		<category><![CDATA[Recenzja]]></category>
		<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[in english]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[WJUG]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1535</guid>
		<description><![CDATA[      
      Title:AspectJ in Action Author:Ramnivas Laddad Year:2009 ISBN:193-3988-05-3 This post is a part of &#8220;Book for Review Program&#8221;. For details look this page [PL]. Some time ago I tried to learn aspect oriented programming (AOP) but failed. When I was lend &#8220;AspectJ in Action&#8221; form Warsaw JUG library I promised myself &#8211; I start to use [...]]]></description>
			<content:encoded><![CDATA[      
      <div class="book"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 86px;" src="http://www.manning.com/laddad2/laddad2_cover150.jpg" border="0" alt="" /></p>
<div class="book_desc"><span style="font-weight:bold;">Title:</span>AspectJ in Action<br />
<span style="font-weight:bold;">Author:</span>Ramnivas Laddad<br />
<span style="font-weight:bold;">Year:</span>2009<br />
<span style="font-weight:bold;">ISBN:</span>193-3988-05-3<br />
This post is a part of &#8220;Book for Review Program&#8221;. For details look this <a href="http://groups.google.com/group/warszawa-jug/web/biblioteka-warszawskiego-juga">page</a> [PL].
</div>
</div>
<p>Some time ago I tried to learn aspect oriented programming (AOP) but failed. When I was lend &#8220;AspectJ in Action&#8221; form Warsaw JUG library I promised myself &#8211; I start to use AOP.<br />
Ramnivas Laddad wrote great book about AOP and the most advanced AOP solution &#8211; AspectJ. Book has two parts. The first (chapters 1-9) describes basic issues of AOP and their implementation in AspectJ. We learn for it most important ideas of AOP (Join Points, Aspects, Poitcutting, etc.) and AJ API. Author begins with the simplest of things and move to more complex issues e.g.Dynamic Weaving, Weaving Model. In the last chapter, in first part, has described the integration of Spring Framework and Spring proxy-based AOP.<br />
The second part (chapters 10-17) deals with the practical application of AOP. Author shows not invasive methods of logging, tracing, securing and managing transactional API. Also describes basic design patterns used in AOP and testing AOP applications.<br />
In conclusion &#8220;AspectJ in Action&#8221; by Ramnivas Laddad is a &#8220;must have&#8221; book. You should have this book in your library because it is one of the the best books about programming in Java ever. </p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/&amp;title=AspectJ+in+Action+%26%238211%3B+Review" title="dodaj 'AspectJ in Action &#8211; Review' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'AspectJ in Action &#8211; Review' do Del.icio.us" alt="dodaj 'AspectJ in Action &#8211; Review' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/&amp;title=AspectJ+in+Action+%26%238211%3B+Review" title="dodaj 'AspectJ in Action &#8211; Review' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'AspectJ in Action &#8211; Review' do digg" alt="dodaj 'AspectJ in Action &#8211; Review' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/" title="dodaj 'AspectJ in Action &#8211; Review' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'AspectJ in Action &#8211; Review' do Technorati" alt="dodaj 'AspectJ in Action &#8211; Review' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/&amp;title=AspectJ+in+Action+%26%238211%3B+Review" title="dodaj 'AspectJ in Action &#8211; Review' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'AspectJ in Action &#8211; Review' do Stumble Upon" alt="dodaj 'AspectJ in Action &#8211; Review' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/&amp;title=AspectJ+in+Action+%26%238211%3B+Review" title="dodaj 'AspectJ in Action &#8211; Review' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'AspectJ in Action &#8211; Review' do Google Bookmarks" alt="dodaj 'AspectJ in Action &#8211; Review' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/&amp;t=AspectJ+in+Action+%26%238211%3B+Review" title="dodaj 'AspectJ in Action &#8211; Review' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'AspectJ in Action &#8211; Review' do FaceBook" alt="dodaj 'AspectJ in Action &#8211; Review' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/&amp;title=AspectJ+in+Action+%26%238211%3B+Review" title="dodaj 'AspectJ in Action &#8211; Review' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'AspectJ in Action &#8211; Review' do wykop.pl" alt="dodaj 'AspectJ in Action &#8211; Review' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2010/01/02/aspectj-in-action-review/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AspectJ &#8211; Join Point i pointcut, teoria</title>
		<link>http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/</link>
		<comments>http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 21:09:42 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1529</guid>
		<description><![CDATA[      
      Co dziś miałbym przedstawić? Wiemy już mniej więcej co to jest programowanie aspektowe i jak się to je. Wiemy jak zdefiniować poradę (i czym mniej więcej ona jest), umieścić ją w kodzie za pomocą punktu przecięcia i uruchomić program. Należałoby teraz powiedzieć czym są punkty przecięcia. Jednakże jest to dość skomplikowane i na razie musimy [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Co dziś miałbym przedstawić?</p>
<p>Wiemy już mniej więcej co to jest programowanie aspektowe i jak się to je. Wiemy jak zdefiniować poradę (i czym mniej więcej ona jest), umieścić ją w kodzie za pomocą punktu przecięcia i uruchomić program. Należałoby teraz powiedzieć czym są punkty przecięcia. Jednakże jest to dość skomplikowane i na razie musimy załapać trochę teorii.</p>
<h4>Vox populi i moja teoria języków</h4>
<p>W książce &#8220;AspectJ In Action&#8221; Ramnivas Laddad podaje pewne bardzo ciekawe podejście do problemu zdefiniowania czym jest punkt wejścia, a czym punkt przecięcia. <a href="http://notatnik.mekk.waw.pl/">Mekk</a> w <a href="http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/#comment-1351">komentarzu</a> do pierwszego tekstu o AspectJ prosił o dokładniejsze omówienie tego problemu. Zatem oto jestem <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Każdy paradygmat programowania definiuje pewne ogólne pojęcia. W programowaniu obiektowym są to obiekty i ich interakcje pomiędzy sobą. W programowaniu proceduralnym mamy do czynienia z procedurami, a w przypadku programowania imperatywnego takim pojęciem jest instrukcja. W przypadku programowania aspektowego mamy do czynienia z aspektem, czyli pewnym elementem logiki programu, który można odseparować od reszty. W klasycznym modelu różne aspekty przeplatają się w programie tworząc coś w rodzaju warkocza (<em>ang. tress</em>). Rozumienie kodu jest podobne do rozplątywania warkocza. Proces ten jest żmudny i może być nieprzyjemny. W programowaniu aspektowym poszczególne elementy są splatane przez tkacza (<em>ang.weaver</em>) tak jak płótno. Dzięki czemu możemy łatwo wyciągnąć pojedynczą nić &#8211; aspekt. Idąc tym torem rozumowania stajemy jednak przed pytaniem czym są zatem punkty przecięcia i punkty wejścia w programowaniu aspektowym?<br />
Wróćmy na chwilę do świata obiektów. W naszym Obiektowie (genialne pojęcie wymyślone przez Piotr Rajce przy tłumaczeniu<br />
<a href="http://helion.pl/ksiazki/hfooad.htm">Head First Object-Oriented Analysis and Design</a>) na poziomie abstrakcji mamy Obiekty i ich interakcje. Jeżeli jednak zejdziemy do dzielnicy Javowo to zobaczymy, że poza Obiektami mamy jeszcze Klasy, Interfejsy, Enumy, Adnotacje i wiele innych <strong>elementów języka</strong>. No właśnie&#8230; języka&#8230; Język programowania niezależnie od realizowanych paradygmatów można podzielić na dwa elementy &#8211; specyfikację i implementację. Specyfikacja jest to opis jak realizowane są paradygmaty, jakie elementy zawiera język w celu osiągnięcia tego celu i jak elementy języka mają się do modelu ogólnego. Implementacja znowuż to praktyczna realizacja specyfikacji.<br />
W takim kontekście AspectJ jest rozszerzeniem języka Java o paradygmat aspektowy. Rozszerzenie to specyfikuje nowe elementy języka &#8211; punkty dostępu, punkty przecięcia, porady, deklaracje oraz ich interakcję z innymi, już istniejącymi, elementami, a także implementuje tą dodatkową specyfikację.<br />
Uff&#8230; rozumiecie coś z tego? Jeżeli tak to dobrze, jeżeli nie to też dobrze.</p>
<h4>Każdy programuje aspektowo</h4>
<p>Każdy chyba liznął &#8220;programowania w html i css&#8221;. Można zatem powiedzieć, że w pewnym sensie miał już do czynienia z programowaniem aspektowym. Nie jasne? Wróćmy więc od teorii. Paradygmat aspektowy mówi nam o aspektach. Nie mówi nic o konkretnej realizacji. Jeżeli popatrzymy na zwykłe dokumenty html i css oraz to jak realizowana jest ich obsługa w przeglądarce to pewne skojarzenia zaczynają się same nasuwać. Po pierwsze dokument html jest zbiorem punktów dostępu. Każdy element dokumentu jest takim punktem ponieważ można dla niego stworzyć regułę CSS. Każdy zdefiniowany selektor w dokumencie CSS jest punktem przecięcia. Wskazuje on jaki punkt dostępu należy wybrać i zaaplikować mu poradę &#8211; zestaw stylów.<br />
Podobnie można opisać bazę danych. Każda krotka jest punktem dostępu. Zapytanie języka danych jest punktem przecięcia. Rezultat jest poradą.</p>
<h4>Punkt dostępu i punk przecięcia w Javie</h4>
<p>Popatrzmy zatem na kod Javy. Każda metoda jest punktem dostępu. Punktami takimi w rozumieniu AspectJ &#8211; czyli konkretnej implementacji aspektowej, są też &#8211; inicjacja klasy (jej ładowanie), obiektu (jego tworzenie), porada (tak jak metoda) oraz aspekt (tak jak klasa &#8211; aspekty są domyślnie singletonami). Dość specyficznymi w &#8220;załapaniu&#8221; punktami dostępu są też miejsca odczytu i przypisania wartości do pola obiektu. AspectJ nie umieszcza na liście punktów dostępu elementów kodu takich jak pętle, instrukcje warunkowe, bloki kodu, etykiety (tak w Javie mamy etykiety).<br />
Punktem przecięcia jest zdefiniowany, za pomocą specjalnego języka, podzbiór punktów dostępu. Punkt przecięcia używa w swoich definicjach składni podobnej do tej znanej z sygnatur metod. Mamy zatem możliwość wyboru punktu dostępu na podstawie nazwy lub jej części np. <samp>* *.set*(..)</samp> &#8211; oznacza dowolną metodę, której nazwa zaczyna się od <samp>set</samp>, modyfikatora dostępu, nazwy pakietu, ilości oraz rodzaju argumentów w metodzie, adnotacji, użytych typów generycznych, zwracanych wyjątków, hierarchii dziedziczenia np. <samp>* NKWD+</samp> oznacza każdą klasę dziedziczącą po <samp>NKWD</samp> (wybór tylko w dół hierarchii). Do punktu przecięcia, a w praktyce do wszystkich wybranych przez niego punktów dostępu, stosuje się poradę.</p>
<h4>Podsumowanie</h4>
<p>Zrozumienie modelu w jakim pracują punkty przecięcia jest bardzo trudne, ale to kluczowy element AspectJ. Na całe szczęście można pociąć ten temat na mniejsze i prostsze dawki. Na początek wystarczy to co już widzieliśmy, czyli dostęp do metod i typów na podstawie nazwy lub dodanej im adnotacji.<br />
Na chwilę obecną nie będę poruszał problemu punktów przecięcia dla kontekstu wywołania.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/&amp;title=AspectJ+%26%238211%3B+Join+Point+i+pointcut%2C+teoria" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Del.icio.us" alt="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/&amp;title=AspectJ+%26%238211%3B+Join+Point+i+pointcut%2C+teoria" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do digg" alt="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Technorati" alt="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/&amp;title=AspectJ+%26%238211%3B+Join+Point+i+pointcut%2C+teoria" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Stumble Upon" alt="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/&amp;title=AspectJ+%26%238211%3B+Join+Point+i+pointcut%2C+teoria" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Google Bookmarks" alt="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/&amp;t=AspectJ+%26%238211%3B+Join+Point+i+pointcut%2C+teoria" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do FaceBook" alt="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/&amp;title=AspectJ+%26%238211%3B+Join+Point+i+pointcut%2C+teoria" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do wykop.pl" alt="dodaj 'AspectJ &#8211; Join Point i pointcut, teoria' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/12/30/aspectj-join-point-i-pointcut-teoria/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AspectJ trochę szczegółów &#8211; rodzaje porad</title>
		<link>http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/</link>
		<comments>http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 14:25:06 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[Dekorator]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1526</guid>
		<description><![CDATA[      
      Wiemy już jak napisać aspekt i poznaliśmy dwa &#8220;rodzaje składni&#8221; aspektów. Czas na dokładniejsze przyjrzenie się temu jak wygląda składnia i jakie możliwości nam daje. Na chwilę obecną wiemy, że aspekt to jednostka kodu, która jest wstawiana za pomocą odpowiedniego narzędzia &#8211; kompilatora aspektowego lub agenta JVM do kodu programu. Pytanie jednak jakie mamy możliwości [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Wiemy już jak napisać aspekt i poznaliśmy dwa &#8220;rodzaje składni&#8221; aspektów. Czas na dokładniejsze przyjrzenie się temu jak wygląda składnia i jakie możliwości nam daje. Na chwilę obecną wiemy, że aspekt to jednostka kodu, która jest wstawiana za pomocą odpowiedniego narzędzia &#8211; kompilatora aspektowego lub agenta JVM do kodu programu. Pytanie jednak jakie mamy możliwości wstawiania kodu i jakie rodzaje porad możemy tworzyć.</p>
<h4>Rodzaje porad</h4>
<p>Porada jest to pojedyncza operacja wstawiana w odpowiedni punkt przecięcia. Generalnie istnieją trzy rodzaje porad (i ich zrozumienie jest naprawdę proste w porównaniu z definicjami punktów przecięcia). Pierwszy to znana nam już porada <samp>before</samp>. Wstawiana jest w kod przed wykonaniem danego działania. Po jej wykonaniu wykonywany jest kod punktu przecięcia.<br />
Drugim rodzajem porad są porady <samp>after</samp>. Tu sprawy trochę się komplikują. Po pierwsze mogą wystąpić trzy podrodzaje porady. Pierwsze to zwykłe porady. Wykonane będą zawsze po kodzie punktu przecięcia. Jeżeli wysypie się on z jakimkolwiek błędem nasza porada zostanie wykonana i dopiero po niej zostanie wyrzucony błąd. Drugie to porady <samp>afterthrowing</samp>, które wykonają się wtedy i tylko wtedy, gdy kod punktu przecięcia wywali wyjątek. Kod porady wykona się przed zwróceniem wyjątku lub po, bo całość nie jest jakoś specjalnie synchronizowana. Trzeci rodzaj to porady <samp>afterreturning</samp>, które to wykonają się tylko wtedy gdy kod w punkcie przecięcia zakończy się prawidłowo. Poniżej przykładowy aspekt, który ilustruje działanie wszystkich tych dróg:</p>
<p class="listing">Listing 1. Porada typu <samp>after</samp></p>
<pre class="java" name="code">
package pl.koziolekweb.blog.aspectj;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class ErrorHandlerAspect {

	@Pointcut("execution(* NKWD.*(..))")
	public void handleError(){}

	@After("handleError()")
	public void handleErrorAdvice(){
		System.out.println("Metoda wyrzuca błąd");
	}

	@AfterThrowing(value = "handleError()", throwing = "runtimeException")
	public void handleErrorThrowsAdvice(RuntimeException runtimeException) {
		System.out.println("Metoda wyrzuciła błąd: "
				+ runtimeException.getLocalizedMessage());
	}

	@AfterReturning("handleError()")
	public void handleErrorNotThrowAdvice(){
		System.out.println("Metoda nie wyrzuciła błędu");
	}
}
</pre>
<p>Pobaw się z dodawaniem deklaracji wyjątku do klasy <samp>NKWD</samp> i zobacz co się stanie.<br />
Trzeci rodzaj porad to porady <samp>around</samp>. Są one szczególnie przydatne wszędzie tam, gdzie zazwyczaj do wykonywania jakiś czynności wykorzystujemy wzorzec metody szablonowej. Jednocześnie szablon nie realizuje samego algorytmu, a jedynie pozwala na wykonanie czynności takich jak logowanie startu i końca akcji, blokowanie obiektów (ukochany <samp>ReadWriteLock</samp>), rozpoczynanie i kończenie transakcji, proste profilowanie. Kolejnym wzorcem, który można zastąpić tym rodzajem porady jest dekorator. Bardzo dobrym pomysłem jest dekorowanie obiektów w sposób przezroczysty dla klienta. Niestety klient musi w takim wypadku korzystać z interfejsu do komunikacji z obiektem (co jest bardzo fajne) i uzyskiwać obiekty z jakiejś fabryki (co jest upierdliwe zarówno dla klienta jak i programisty). Oczywiście jest Spring, EJB3.x czy Pico, ale jakoś nie widzę sensu ich użycia tylko dla jednego małego dekoratora (pamiętaj, używanie frameworków powoduje gwałtowne rozrastanie się kodu wynikowego). Zresztą nie zawsze da się użyć frameworku.<br />
Problemem z tym rodzajem porady jest konieczność wstawienia jakiegoś elementu, który pozwalał by na określenie jaki kod ma być wykonany przed, a jaki po wykonaniu kodu punktu przecięcia. AspectJ dostarcza odpowiedniego pseudo słowa kluczowego <samp>proceed()</samp>. Jest to pseudo słowo kluczowe ponieważ w praktyce jest to metoda <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Napiszmy profiler, który będzie sprawdzał ile czasu zajmuje użytkownikowi wpisanie hasła. Przy okazji mały refaktoring kodu <samp>NKWD</samp>:</p>
<p class="listing">Listing 2. Nowa wersja <samp>NKWD</samp></p>
<pre class="java" name="code">
package pl.koziolekweb.blog.aspectj;

import java.util.Scanner;

public class NKWD {

	private boolean isAuth = false;

	public void auth(){
		if (isAuth) {
			return;
		} else {
			String password = readPassword();
			isAuth = validatePassword(password);
			if (!isAuth) {
				throw new RuntimeException("Wypad na Łubiankę");
			}
		}
	}

	private String readPassword() {
		System.out.print("podaj hasło: ");
		Scanner scanner = new Scanner(System.in);
		String password = scanner.next();
		return password;
	}

	private boolean validatePassword(String password) {
		return "dupa".equals(password);
	}
}
</pre>
<p>Czas na nasz nowy aspekt <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p class="listing">Listing 3. Aspekt profilujący.</p>
<pre class="java" name="code">
package pl.koziolekweb.blog.aspectj;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class InputProfilingAspect {

	@Pointcut("call(* java.util.Scanner.next(..))")
	public void profile() {
	}

	@Around("profile()")
	public Object profileAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
		long start = System.nanoTime();
		Object processResult = joinPoint.proceed();
		long stop = System.nanoTime();
		System.out.println("Czas wpisania hasła: "
				+ ((stop - start) * 0.000000001) + " sekundy");
		return processResult;
	}
}
</pre>
<p>Kolejnym problemem jest konieczność zachowania sygnatury dekorowanej metody. Zatem w przypadku wykorzystania składni @AspectJ jak i .aj należy zadbać by porada zwracała odpowiedni obiekt. Na całe szczęście <samp>proceed</samp> zwraca <samp>Object</samp>, a odpowiednie rzutowanie zostaje wykonane poza naszą ingerencją przez weavera. Co jednak w przypadku gdy metoda przyjmuje parametry? Sprawdźmy ile czasu zajmie wypisanie komunikatu powitalnego dla konkretnego użyszkodnika. </p>
<p class="listing">Listing 3. Aspekt profilujący z parametrami.</p>
<pre class="java" name="code">
package pl.koziolekweb.blog.aspectj;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MessageProfilingAspect {

	@Pointcut("call(* Service.welcome(String)) &#038;&#038; args(string)")
	public void profile(String string){}

	@Around("profile(string)")
	public void proflieAdvice(ProceedingJoinPoint joinPoint, String string) throws Throwable{
		long start = System.nanoTime();
		joinPoint.proceed(new Object[]{string});
		long stop = System.nanoTime();
		System.out.println("Czas wpisania wiadomości: "
				+ ((stop - start) * 0.000000001) + " sekundy");
	}

}
</pre>
<p>Jak widać coś jest nie tak. Czasy się nie zgadzają. Czas wypisania komunikatu jest dłuższy niż czas wpisywania hasła. Wniosek, czas jest liczony globalnie. Cóż&#8230; takie życie. Wynika to z modelu jaki przyjęto dla tworzenia aspektów. Opisze to później, a na teraz należy pamiętać, że domyślnie aspekty są tworzone jako singletony.</p>
<h4>Podsumowania</h4>
<p>Wiemy już jakie mamy rodzaje porad. Jeżeli nie rozumiesz jak to działa to nie przejmuj się. Zrozumienie tego modelu tak jak zrozumienie modelu punktów przecięcia wymaga dużo czasu i jeszcze więcej praktyki. W następnej części omówię właśnie model punktów przecięcia. Jest to bardzo ważna i bardzo trudna rzecz. Dlatego też skupię się na podstawowych rodzajach punktów przecięcia.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/&amp;title=AspectJ+troch%C4%99+szczeg%C3%B3%C5%82%C3%B3w+%26%238211%3B+rodzaje+porad" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Del.icio.us" alt="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/&amp;title=AspectJ+troch%C4%99+szczeg%C3%B3%C5%82%C3%B3w+%26%238211%3B+rodzaje+porad" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do digg" alt="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Technorati" alt="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/&amp;title=AspectJ+troch%C4%99+szczeg%C3%B3%C5%82%C3%B3w+%26%238211%3B+rodzaje+porad" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Stumble Upon" alt="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/&amp;title=AspectJ+troch%C4%99+szczeg%C3%B3%C5%82%C3%B3w+%26%238211%3B+rodzaje+porad" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Google Bookmarks" alt="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/&amp;t=AspectJ+troch%C4%99+szczeg%C3%B3%C5%82%C3%B3w+%26%238211%3B+rodzaje+porad" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do FaceBook" alt="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/&amp;title=AspectJ+troch%C4%99+szczeg%C3%B3%C5%82%C3%B3w+%26%238211%3B+rodzaje+porad" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do wykop.pl" alt="dodaj 'AspectJ trochę szczegółów &#8211; rodzaje porad' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/12/29/aspectj-troche-szczegolow-rodzaje-porad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>@AspectJ i adnotacje Java</title>
		<link>http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/</link>
		<comments>http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 15:31:23 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[AspectJ]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1515</guid>
		<description><![CDATA[      
      Jak wspominałem wczoraj poza plikami .aj AspectJ posiada też drugi rodzaj składni oparty o czysty kod Java. Jest to o tyle fajne rozwiązanie, że nie trzeba mieć na pokładzie kompilatora aspektowego, a wystarczy tylko zwykły javac + biblioteka z adnotacjami. Jest to o tyle ważne, że przy dużej aplikacji statyczne wstawianie aspektów jest dość żmudne. [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Jak wspominałem wczoraj poza plikami .aj AspectJ posiada też drugi rodzaj składni oparty o czysty kod Java. Jest to o tyle fajne rozwiązanie, że nie trzeba mieć na pokładzie kompilatora aspektowego, a wystarczy tylko zwykły <samp>javac</samp> + biblioteka z adnotacjami. Jest to o tyle ważne, że przy dużej aplikacji statyczne wstawianie aspektów jest dość żmudne. O sposobach wstawiania aspektów jeszcze będę pisał. Generalnie nie zawsze chcemy by aspekty były nam potrzebne. Załóżmy, że mamy do wykonania dużą ilość testów jednostkowych dla klas biznesowych. Kompilowanie dodatkowego kodu jest nam niepotrzebne. Tak samo jak uruchamianie niestandardowego kompilatora. Jednocześnie pliki .aj będą traktowane jako wróg publiczny przez standardowy kompilator i cały proces będzie się sypał. W takim przypadku najlepszym rozwiązaniem jest użycie składni pure java.</p>
<h4>Aspekt jako klasa Java</h4>
<p>Każdy plik .java jest prawidłowym plikiem dla kompilatora <samp>ajc</samp>. Z drugiej strony plik .aj nie jest akceptowany przez kompilator <samp>java</samp>, chyba że nie ma w nim żadnych elementów aspektowych (co jest głupie w takim przypadku). Mamy jednak do dyspozycji mechanizm adnotacji, który pozwala na tworzenie kodu aspektów za pomocą standardowych mechanizmów języka. Sięgając do przykładu ze wczoraj przepiszmy nasz aspekt na czysty kod javowy.</p>
<p class="listing">Listing 1. Aspekt jako klasa Java</p>
<pre class="java" name="code">
package pl.koziolekweb.blog.aspectj;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class SecurityAspect {

	private NKWD nkwd = new NKWD();

	@Pointcut("call( * Service.welcome(..))")
	public void auth() {
	}

	@Before("auth()")
	public void authBefore() {
		System.out.println("NKWD działa");
		nkwd.auth();
	}

}
</pre>
<p>Jak widać wszystko jest bardzo przejrzyste i jasne. Jedynym wrzodem na dupie jest tu konieczność tworzenia nadmiarowego kodu do definiowania punktów przecięcia. Po co ta pusta metoda? Ja nie wiem i nie rozumiem.<br />
Generalnie wszytko bangla. Co ciekawe jak w linii poleceń zrobimy sobie coś takiego:</p>
<p class="listing">Listing 2. Aspekt kompilowany <samp>javac</samp></p>
<pre class="bash" name="code">
C:\Documents and Settings\Asia\workspace\SimpleAspectJ\src>javac -d ..\bin pl\koziolekweb\blog\aspectj\*.java -classpath g:\Bartek\eclipse\plugin\org.aspectj.runtime_1.6.6.20090930185500\aspectjrt.jar;.
</pre>
<p>To po uruchomieniu kodu całość będzie działać, a jedyną różnicą będzie brak aspektów. No właśnie jak działa kompilator&#8230;</p>
<h4>Mechanizm waevingu AspectJ</h4>
<p>Istnieją trzy metody wstrzykiwania kodu aspektu do kodu programu. Pierwszy z nich to mechanizm statyczny oparty o analizę kodu źródłowego. Jest on bardzo dobry jeżeli chcemy wstawić kod &#8220;na mur beton&#8221;. Dodatkowo za pomocą analizy statycznej można rozszerzyć klasę o dodatkowe interfejsy wraz z implementacją (też będzie o tym). Z drugiej strony statycznie nie uzyskamy kontekstu wywołania aspektu co powoduje, że odpadają nam pewne fajne feature&#8217;y. Metoda ta jest stosowana przez bezpośrednie wywołanie kompilatora <samp>ajc</samp> w eclipse.<br />
Drugą metodą jest wstawianie w bytecode. Jeżeli mamy skompilowany kod javowy i aspektowy w osobnych bibliotekach to za pomocą kompilatora <samp>ajc</samp> możemy dokonać modyfikacji kodu bajtowego i wstawić kod aspektu. To też jest mechanizm statyczny, jednak umożliwia wykonanie wiązania na kodzie do którego nie mamy źródeł. Jest to bardzo przydatne rozwiązanie gdy chcemy dokonać reverse engineeringu na małą skalę tzn. chcemy zmienić sposób działania biblioteki bez modyfikacji źródeł i pisania kodu związanego (rozszerzającego) z tą biblioteką. Mechanizm ten można porównać do linkera znanego z C/C++. Nie jest to to samo, ale generalnie efekt jest zbliżony.<br />
Trzecią metodą jest dynamiczne wiązanie kodu aspektu z kodem aplikacji. Jest to upierdliwe, ale bardzo dobre jeżeli zależy nam na aspektach wykonywanych w ramach kontekstu wykonania (o tym też będzie). Generalnie sprowadza się to do napisania pliku XML i umieszczeniu go w katalogu META-INF. Następnie wystarczy uruchomić JVM z odpowiednim parametrem.</p>
<p class="listing">Listing 3. Plik <samp>aop-ajc.xml</samp></p>
<pre class="xml" name="code">
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
	<aspects>
		<aspect name="pl.koziolekweb.blog.aspectj.SecurityAspect"/>
	</aspects>
</aspectj>
</pre>
<p class="listing">Listing 4. Użycie agenta</p>
<pre class="bash" name="code">
C:\Documents and Settings\Asia\workspace\SimpleAspectJ\bin>java -classpath g:\Bartek\eclipse\plugins\org.aspectj.runtime_1.6.6.20090930185500\aspectjrt.jar;.;.\META-INF -javaagent:g:\Bartek\eclipse\plugins\org.aspectj.weaver_1.6.6.20090930185500\aspectjweaver.jar pl.koziolekweb.blog.aspectj.Main
</pre>
<p>Tu uwaga ważna jest kolejność parametrów najpierw classpath, potem javaagent, a na końcu klasa uruchamiana. Inaczej nie będzie banglać.<br />
Ostatnim elementem naszej zabawy w dniu dzisiejszym będzie odpowiedź na pytanie jak używać aspektów odnośnie klas adnotowanych. Skoro już umiemy definiować aspekty jako klasy java za pomocą adnotacji to należy uzupełnić ten kawałek wiedzy.</p>
<h4>Po co nam adnotacje?</h4>
<p>W naszym przykładzie byliśmy proszeni o hasło przed uruchomieniem metody <samp>welcome()</samp>, ale chcemy, żeby system jednak pozwalał nam na wyświetlenie komunikatu powitalnego i po zalogowaniu komunikatu dla konkretnego użyszkodnika. W pierwszym odruchu można zmienić definicję punktu przecięcia, ale jest to do dupy. Dwa główne powody to ograniczenie zasięgu aspektu do metod o konkretnej nazwie co może i jest fajne, ale niestety mało przydatne oraz pozbawianie się przenośności. W dużym systemie ten drugi powód jest szczególnie widoczny, ponieważ musimy definiować punkty przecięcia dla wielu klas z różnych pakietów. Powoduje to niepotrzebną komplikację kodu i utrudnia późniejszą jego konserwację.<br />
Na początek dopiszmy jeszcze jedną klasę, które będzie siedziała w innym pakiecie niż nasza aplikacja oraz będziemy wykorzystywać jej metody podobnie jak klasy <samp>Service</samp>:</p>
<p class="listing">Listing 5. Klasa <samp>SomeService</samp></p>
<pre class="java" name="code">
package pl.koziolekweb.blog.aspectj.services;

public class SomeService {

	public void message() {
		System.out.println("wiadomość");
	}

	public void messageToHex(Long long1) {
		System.out.println("Wartość hex: " + Long.toHexString(long1));
	}
}
// zmiany w Main
	service.welcome("Koziołek");
	SomeService someService  = new SomeService();
	someService.message();
	someService.messageToHex(new Long(666l));
</pre>
<p>Jeżeli teraz trzeba było by dla każdej metody, którą chcemy zabezpieczyć, definiować pountcut to jedyną słuszną drogą było by pocięcie się. Zdefiniujmy sobie zatem adnotację <samp>@Secure</samp></p>
<p class="listing">Listing 5. Adnotacja <samp>Secure</samp></p>
<pre class="java" name="code">
package pl.koziolekweb.blog.aspectj;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface Secure {

}
</pre>
<p>Oznaczymy teraz za jej pomocą metodę <samp>Service.welcome(String)</samp> i klasę <samp>SomeService</samp>. Następnie zmieńmy nasz aspekt na taki jak poniżej:</p>
<p class="listing">Listing 6. Nowa wersja aspektu.</p>
<pre class="java" name="code">
package pl.koziolekweb.blog.aspectj;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class SecurityAspect {

	private NKWD nkwd = new NKWD();

	@Pointcut("execution( @Secure * *(..)) || call( * (@Secure *).*(..))")
	public void auth() {
	}

	@Before("auth()")
	public void authBefore() {
		System.out.println("NKWD działa");
		nkwd.auth();
	}

}
</pre>
<p>Uruchamiamy </p>
<p class="listing">Listing 7. Wynik działania programu</p>
<pre class="bash" name="code">
Witamy w systemie
NKWD działa
podaj hasło: dupa
Witaj Koziołek
NKWD działa
wiadomość
NKWD działa
Wartość hex: 29a
</pre>
<p>Jak widać wszystko zadziałało zgodnie z oczekiwaniami. Jedynym dużym wrzodem jest tutaj definicja podana w punkcie przecięcia, ale brak mi jeszcze wprawy by zapisać ładniej warunek. Z drugiej strony jest on moim zdaniem jaśniejszy, bo w kolejnych elementach wyrażenia warunkowego widać co odnosi się do metody, a co do typu.<br />
Ostatnią kwestia jest różnica pomiędzy <strong>execution</strong> i <strong>call</strong>. Generalnie żadna nie jest widoczna w działaniu. W przypadku <strong>execution</strong> kod aspektu wstawiany jest do ciała metody (na początku lub końcu). W przypadku <strong>call</strong> kod jest wstawiany w każdym miejscu wywołania.</p>
<h4>Podsumowanie</h4>
<p>Jak widać programowanie aspektowe daje ogromne możliwości, a odpowiednie zastosowanie jego elementów ułatwia życie.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/&amp;title=%40AspectJ+i+adnotacje+Java" title="dodaj '@AspectJ i adnotacje Java' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj '@AspectJ i adnotacje Java' do Del.icio.us" alt="dodaj '@AspectJ i adnotacje Java' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/&amp;title=%40AspectJ+i+adnotacje+Java" title="dodaj '@AspectJ i adnotacje Java' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj '@AspectJ i adnotacje Java' do digg" alt="dodaj '@AspectJ i adnotacje Java' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/" title="dodaj '@AspectJ i adnotacje Java' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj '@AspectJ i adnotacje Java' do Technorati" alt="dodaj '@AspectJ i adnotacje Java' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/&amp;title=%40AspectJ+i+adnotacje+Java" title="dodaj '@AspectJ i adnotacje Java' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj '@AspectJ i adnotacje Java' do Stumble Upon" alt="dodaj '@AspectJ i adnotacje Java' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/&amp;title=%40AspectJ+i+adnotacje+Java" title="dodaj '@AspectJ i adnotacje Java' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj '@AspectJ i adnotacje Java' do Google Bookmarks" alt="dodaj '@AspectJ i adnotacje Java' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/&amp;t=%40AspectJ+i+adnotacje+Java" title="dodaj '@AspectJ i adnotacje Java' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj '@AspectJ i adnotacje Java' do FaceBook" alt="dodaj '@AspectJ i adnotacje Java' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/&amp;title=%40AspectJ+i+adnotacje+Java" title="dodaj '@AspectJ i adnotacje Java' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj '@AspectJ i adnotacje Java' do wykop.pl" alt="dodaj '@AspectJ i adnotacje Java' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/12/28/aspectj-i-adnotacje-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AspectJ &#8211; pierwsze starcie</title>
		<link>http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/</link>
		<comments>http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 21:52:39 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[OCP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[S.O.L.I.D.ne programowanie]]></category>
		<category><![CDATA[SRP]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1513</guid>
		<description><![CDATA[      
      Zaczynamy mini kurs programowania aspektwego z ApectJ i Eclipse. Nie chcę wnikać w spinanie projektów z mavenem (tak z lenistwa), a zatem będzie tylko w eclipse. Instalacja softu Z tej strony pobieramy odpowiedni dla nas pakiecik i restartujemy Eclipse. Zakładam, że wiesz jak instalować plugin eclipsowy za pomocą Update Site. Jeżeli nie to sorry Winnetou. [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Zaczynamy mini kurs programowania aspektwego z ApectJ i Eclipse. Nie chcę wnikać w spinanie projektów z mavenem (tak z lenistwa), a zatem będzie tylko w eclipse.</p>
<h4>Instalacja softu</h4>
<p>Z <a href="http://www.eclipse.org/ajdt/downloads/">tej strony</a> pobieramy odpowiedni dla nas pakiecik i restartujemy Eclipse. Zakładam, że wiesz jak instalować plugin eclipsowy za pomocą Update Site. Jeżeli nie to sorry Winnetou. Kurs będzie mocno Eclipse only.<br />
Następnie tworzymy nowy projekt AspectJ. Zostaniemy zapytani czy chcemy włączyć mechanizm weaveringu i zrestartować Eclipse. Oczywiście włączamy go i restartujemy IDE.</p>
<h4>Podstawowe pojęcia</h4>
<p>W tradycyjnym modelu obiektowym gdy zaczynamy pisać program to okazuje się, że w pewnym momencie należy do naszego kodu dodać kilkanaście różnych ciekawych czy nie, ale wymaganych funkcjonalności. Zazwyczaj jest to logowanie, kontrola dostępu, jakieś duperele związane z profilowaniem. Robiąc to za pomocą klasycznych metod zazwyczaj łamiemy dwie zasady. Po pierwsze <a href="http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/">SRP</a> ponieważ nasza klasa zaczyna mieć wiele odpowiedzialności. A to logowanie, a to security, a tu jeszcze admin mówi, żeby włączyć profilowanie w jednym miejscu i natłuc raportów. Poza tym robi się burdel w kodzie. Oczywiście w pewnym momencie dochodzimy do wniosku, że większość z tych bajerów nie jest nam potrzebna i łamiemy <a href="http://koziolekweb.pl/2009/03/20/solidne-programowanie-czesc-2-czyli-spoufalamy-sie/">OCP</a>. Ponieważ by je wyłączyć zaczynamy grzebać w oryginalnym kodzie. Tu z pomocą przychodzą nam aspekty. Aspekt jest to moduł aplikacji zawierający jakąś funkcjonalność, która jest wtłaczana do kodu za pomocą kompilatora aspektowego. Aspekt jest opisany za pomocą specjalnego języka, na którego podstawie kompilator odpowiednio modyfikuje kod wynikowy w procesie kompilacji. Poniżej kilka ważnych pojęć<br />
Punkt dostępu &#8211; ang. Join Point &#8211; dowolny punkt w kodzie, w którym kompilator aspektowy może wstawić kod aspektu. To czym jest ten punkt zależy od konkretnej implementacji języka aspektowego. W przypadku AspectJ są to metody, klasy, pola.<br />
Punkt przecięcia &#8211; ang. Pointcut &#8211; konkretny punkt dostępu do którego stosowany jest dany aspekt.<br />
Porada &#8211; ang. advice &#8211; kod który jest wstawiany.<br />
Wiem, że osoby, które miały do czynienia z programowaniem aspektowym uznają ten opis za uproszczony, ale KISS MY ASS (Keep Is Simple Stupid. Mayby You Are Support Soft). </p>
<h4>Co to jest AspectJ?</h4>
<p>Znowu upraszczając jest to rozszerzenie języka Java o kilka słów kluczowych i mechanizm weaveringu, czyli właśnie wkompilowywania kodu. Inaczej rzecz ujmując jest to biblioteka, która zawiera specjalny kompilator, będący rozszerzeniem kompilatora javy o funkcjonalność jaką jest obsługa aspektów. Zawiera specjalnego agenta JVM, który może wykonać pracę kompilatora w trakcie ładowania kodu. Jest to zacne i przydatne rozwiązanie.<br />
AspectJ wspiera dwa rodzaje składni. Pliki .aj, które są &#8220;naturalne&#8221; w jego środowisku oraz mechanizm oparty o adnotacje i zwykłe klasy javy. Przy czym każdy prawidłowy plik java jest prawidłowym plikiem aspektowym. Koniec końców AspectJ jest tylko rozszerzeniem języka (trochę jak C++ do C), a nie czymś całkowicie nowym.</p>
<h4>Zajawka</h4>
<p>Dzisiejszą część poświęcimy tylko na prostą aplikację w tylu &#8220;hello world&#8221;, ale pozwoli ona załapać Ci jak działa programowanie aspektowe. Na początek mamy kod taki jak poniżej:</p>
<p class="listing">Listing 1. Bazowa aplikacja</p>
<pre name="code" class="java">
package pl.koziolekweb.blog.aspectj;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Service service = new Service();
		service.welcome();
		service.welcome("Koziołek");
	}

}
//....
package pl.koziolekweb.blog.aspectj;

public class Service {
	public void welcome() {
		System.out.println("Witamy w systemie");
	}

	public void welcome(String name) {
		System.out.println("Witaj " + name);
	}
}
</pre>
<p>Naszym zadaniem jest zabezpieczyć aplikację przed niepożądanymi wywołaniami. Posłuży nam do tego specjalna klasa <samp>NKWD</samp>:</p>
<p class="listing">Listing 2. Klasa <samp>NKWD</samp> &#8211; odpowiada za bezpieczeństwo</p>
<pre name="code" class="java">
package pl.koziolekweb.blog.aspectj;

import java.util.Scanner;

public class NKWD {

	private boolean isAuth = false;

	public void auth() {
		if (isAuth) {
			return;
		} else {
			System.out.print("podaj hasło: ");
			Scanner scanner = new Scanner(System.in);
			String password = scanner.next();
			if ("dupa".equals(password)) {
				isAuth = true;
			}
			else{
				throw new RuntimeException("Wypad na Łubiankę");
			}
		}
	}
}
</pre>
<p>Pytanie co zrobimy w klasycznym podejściu? Pewno wystarczy utworzyć fabrykę obiektów NKWD, która będzie dbała o to by do każdego wątku był przyporządkowany odpowiedni obiekt NKWD. Będziemy go pobierać w każdej metodzie i w razie czego sprawdzać&#8230; no cóż&#8230; chłopaki od php zapewne by na tym poprzestali, ale mają łatwiej, bo jest u nich funkcja <samp>require_once</samp> i przetwarzanie skryptu zatem można takie sztuki robić. My niestety używamy języka programowania i zastosujemy programowanie aspektowe.<br />
Stworzymy zatem aspekt, który będzie przed każdym wywołaniem metody <samp>welcome</samp> sprawdzał czy wszystko śmiga.</p>
<p class="listing">Listing 3. Nasz pierwszy aspekt
<pre name="code" class="java">
package pl.koziolekweb.blog.aspectj;

public aspect SecurityAspect {
	private NKWD nkwd = new NKWD();

	pointcut auth() : call( * Service.welcome(..));

	before() : auth() {
		System.out.println("NKWD działa");
		nkwd.auth();
	}
}
</pre>
<p>Kompilujemy i uruchamiamy jako aplikację AspectJ. Efekt:</p>
<p class="listing">Listing 4. wyniki działania naszego pierwszego aspektu</p>
<pre name="code" class="bash">
NKWD działa
podaj hasło: dupa
Witamy w systemie
NKWD działa
Witaj Koziołek
</pre>
<h4>Chwila ze składnią</h4>
<p>Za pomocą słowa <strong>pointcut</strong> definiujemy miejsce przecięcia. Format jest dość swobodny w przypadku AspectJ zazwyczaj używamy składni bardzo zbliżonej do UMLowego definiowania sygnatur metod. Znak <strong>*</strong> oznacza dowolne słowo, a <strong>..</strong> dowolną ilość słów.<br />
Słowo <strong>before</strong> wskazuje, że dana porada będzie uruchamiana przed wywołaniem dowolnej metody pasującej do wskazanego punktu przecięcia.</p>
<h4>Podsumowanie</h4>
<p>Czytam &#8220;AspectJ in Action&#8221; i mam nadzieję, że powstanie kacusiowa recenzja.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Del.icio.us" alt="dodaj 'AspectJ &#8211; pierwsze starcie' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do digg" alt="dodaj 'AspectJ &#8211; pierwsze starcie' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Technorati" alt="dodaj 'AspectJ &#8211; pierwsze starcie' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Stumble Upon" alt="dodaj 'AspectJ &#8211; pierwsze starcie' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do Google Bookmarks" alt="dodaj 'AspectJ &#8211; pierwsze starcie' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/&amp;t=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do FaceBook" alt="dodaj 'AspectJ &#8211; pierwsze starcie' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/&amp;title=AspectJ+%26%238211%3B+pierwsze+starcie" title="dodaj 'AspectJ &#8211; pierwsze starcie' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'AspectJ &#8211; pierwsze starcie' do wykop.pl" alt="dodaj 'AspectJ &#8211; pierwsze starcie' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/12/27/aspectj-pierwsze-starcie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>AspecJUnit i maven</title>
		<link>http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/</link>
		<comments>http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 21:23:28 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Testy]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=668</guid>
		<description><![CDATA[      
      Błąd typograficzny w temacie zamierzony&#8230; Dziś stanąłem przed poważnym problemem. Jak przetestować narzędzie do komunikacji z Google Translate zza proxy. Niby prosta rzecz. Wystarczy tylko przy odpalaniu mavena dać mu odpowiednie ustawienia. Tylko, że ja jestem cholernie leniwy (cnota programisty). Dlatego też poszukiwałem rozwiązania, które pozwoli mi zastąpić każdorazowe klepanie konfiguracji proxy. Własny plugin = [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Błąd typograficzny w temacie zamierzony&#8230;</p>
<p>Dziś stanąłem przed poważnym problemem. Jak przetestować narzędzie do komunikacji z Google Translate zza proxy. Niby prosta rzecz. Wystarczy tylko przy odpalaniu mavena dać mu odpowiednie ustawienia. Tylko, że ja jestem cholernie leniwy (cnota programisty). Dlatego też poszukiwałem rozwiązania, które pozwoli mi zastąpić każdorazowe klepanie konfiguracji proxy.</p>
<h4>Własny plugin = epic fail</h4>
<p>Co tu dużo mówić. Straciłem 2 godziny bo zapomniałem, że JUnit odpala się w ramach odizolowanego środowiska co oznacza, że nie może przejmować ustawień w stylu <samp>System.setProperty()</samp>. W każdym bądź razie wiem już jak pisać i testować pluginy do mavena. Zawsze coś.</p>
<h4>AspectJ to <a href="http://pl.wikipedia.org/wiki/Malleus_Maleficarum" target="_blank" title="From Wikipedia the definition of: Malleus Maleficarum" class="wikiterm" >Malleus Maleficarum</a><sup class="wikiicon" ><em>W</em></sup></h4>
<p>Idea wydaje się na pierwszy rzut granatu poroniona. Programowanie aspektowe jest w swej istocie dość skomplikowanym procesem, a w przypadku Javy to naprawdę wyższa szkoła jazdy na kucykach. Jednak jeżeli pomyślimy przez chwilę to okazuje się, że nie taki diabeł straszny. Szczególnie, że jeżeli weźmiemy pod uwagę fakt, że jeżeli źle coś napiszemy to okazuje się iż testy po prostu nie zadziałają.<br />
Na czym polega myk? Otóż wystarczy, że wstrzykniemy kod przed każdym wykonaniem metody <samp>before()</samp>. W sumie nie ma znaczenia fakt, że wydłuży to testy. Testy są po to by mieć czas na kawę, a nie po to by były szybkie.</p>
<h4>Praktyka</h4>
<p>Klasa testująca wygląda w następujący sposób:</p>
<p class="listing">Listing 1. Nieszczęśliwy test</p>
<pre name="code" class="java">
/**
 *
 */
package pl.koziolekweb.translator.engine;

import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import pl.koziolekweb.translator.engine.googleimpl.Language;
import pl.koziolekweb.translator.engine.googleimpl.TranslatorImpl;

/**
 * @author koziolek
 *
 *
 */
// Info: $Id: TranslatorTest.java 161 2009-03-16 22:26:47Z bjkuczynski $
public class TranslatorTest {

	public static Translator translator;

	public static final String PL_TEXT = "nie";
	public static final String EN_TEXT = "no";
	public static final Language DEFAULT_LANGUAGE = Language.POLISH;

	@Test
	public void testTranslateToNativeFromAuto() throws Throwable {
		Assert.assertEquals(PL_TEXT, translator.translate(PL_TEXT));
	}

	@Test
	public void testTranslateToNativeFromSet() throws Throwable {
		Assert.assertEquals(PL_TEXT, translator.translate(EN_TEXT,
				Language.ENGLISH));
	}

	@Test
	public void testTranslateToSetFromSet() throws Throwable {
		Assert.assertEquals(EN_TEXT, translator.translate(PL_TEXT,
				Language.POLISH, Language.ENGLISH));
	}

	@Before
	public void before() {
		translator = new TranslatorImpl(DEFAULT_LANGUAGE);
	}

	@After
	public void after() {
		translator = null;
	}
}
</pre>
<p>Metoda <samp>translate()</samp> wykonuje m.n. połączenie z jakimś zdalnym serwisem tłumaczącym. W tym przypadku jest to Google Translate. W aplikacji będą odpowiednie ustawienia, ale w czasie testów nie chcemy ich tworzyć. Jednocześnie nie chcemy ingerować w kod testów ani kombinować z dynamicznym ładowaniem ustawień w testach. Dlatego też piszemy aspekt, który rozwiązuje nam ten problem. Oto on:</p>
<p class="listing">Listing 2. Nieszczęśliwy aspekt</p>
<pre name="code" class="java">
package pl.koziolekweb.translator.engine;

import java.io.FileInputStream;
import java.util.Properties;

public aspect ProxyConfig {

	private String proxySet;
	private String proxyHost;
	private String proxyPort;

	public ProxyConfig() {
		Properties properties = new Properties();
		try{
		properties.load(new FileInputStream(
				"./src/test/resources/proxy.properties"));
		}
		catch(Exception e){
			throw new RuntimeException(e);
		}
		proxySet = properties.getProperty("proxySet");
		proxyHost = properties.getProperty("proxyHost");
		proxyPort = properties.getProperty("proxyPort");
	}

	pointcut config():
		execution( void pl.koziolekweb.translator.engine.*Test.before());

	before(): config() {
		System.out.println("[ASPECT] Configure Proxy: ");
		System.out.println("[ASPECT] Use Proxy   : " + proxySet);
		System.out.println("[ASPECT] Proxy Host  : " + proxyHost);
		System.out.println("[ASPECT] Proxy Port  : " + proxyPort);

		System.getProperties().put("proxySet", proxySet);
		System.getProperties().put("proxyHost", proxyHost);
		System.getProperties().put("proxyPort", proxyPort);
		System.out.println("[ASPECT] Proxy Configured ");
	}
}
</pre>
<p>Jak widać za trudne to nie jest. Nie powinno się też jakoś magicznie wywalać. Kolejny krok to konfiguracja w <samp>pom.xml</samp> kompilatora AspectJ.</p>
<p class="listing">Listing 3. Nieszczęśliwy <samp>pom.xml</samp></p>
<pre name="code" class="xml">
&lt;profiles&gt;
	&lt;profile&gt;
		&lt;id&gt;proxy&lt;/id&gt;
		&lt;build&gt;
			&lt;plugins&gt;
				&lt;plugin&gt;
					&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
					&lt;artifactId&gt;aspectj-maven-plugin&lt;/artifactId&gt;
					&lt;version&gt;1.1&lt;/version&gt;
					&lt;configuration&gt;
						&lt;source&gt;1.5&lt;/source&gt;
						&lt;target&gt;1.5&lt;/target&gt;
					&lt;/configuration&gt;
					&lt;executions&gt;
						&lt;execution&gt;
							&lt;id&gt;test&lt;/id&gt;
							&lt;phase&gt;test-compile&lt;/phase&gt;
							&lt;goals&gt;
								&lt;goal&gt;test-compile&lt;/goal&gt;
							&lt;/goals&gt;
						&lt;/execution&gt;
					&lt;/executions&gt;
				&lt;/plugin&gt;
			&lt;/plugins&gt;
		&lt;/build&gt;
	&lt;/profile&gt;
&lt;/profiles&gt;
</pre>
<p>I bangla. </p>
<h4>Podsumowanie</h4>
<p>Dlaczego tak kombinuję? Przecież skoro mam możliwość konfiguracji proxy w aplikacji to mogę wywołać metodę i skonfigurować je w testach. Tyle tylko, że jeżeli tak zrobię to uzależniam test od mechanizmu testowanego. Co jeżeli ustawianie proxy nie działa? Jeżeli tamte testy padną? Tu mam możliwość sprawdzenia czy wszystko działa za pomocą odpowiednich narzędzi. Odpowiedni dobór narzędzia umożliwił mi w tym przypadku maksymalizację zysków przy minimalnych kosztach. Istotne jest to, że konfigurację testów przerzucam poza testy. Całość jest nieinwazyjna i nie zakłóca &#8220;logiki biznesowej&#8221; testów.</p>
<p>//<br />
Poza tym szukałem pretekstu by poznać AspectJ i nauczyć się pisania pluginów do mavena. </p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/&amp;title=AspecJUnit+i+maven" title="dodaj 'AspecJUnit i maven' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'AspecJUnit i maven' do Del.icio.us" alt="dodaj 'AspecJUnit i maven' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/&amp;title=AspecJUnit+i+maven" title="dodaj 'AspecJUnit i maven' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'AspecJUnit i maven' do digg" alt="dodaj 'AspecJUnit i maven' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/" title="dodaj 'AspecJUnit i maven' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'AspecJUnit i maven' do Technorati" alt="dodaj 'AspecJUnit i maven' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/&amp;title=AspecJUnit+i+maven" title="dodaj 'AspecJUnit i maven' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'AspecJUnit i maven' do Stumble Upon" alt="dodaj 'AspecJUnit i maven' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/&amp;title=AspecJUnit+i+maven" title="dodaj 'AspecJUnit i maven' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'AspecJUnit i maven' do Google Bookmarks" alt="dodaj 'AspecJUnit i maven' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/&amp;t=AspecJUnit+i+maven" title="dodaj 'AspecJUnit i maven' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'AspecJUnit i maven' do FaceBook" alt="dodaj 'AspecJUnit i maven' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/&amp;title=AspecJUnit+i+maven" title="dodaj 'AspecJUnit i maven' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'AspecJUnit i maven' do wykop.pl" alt="dodaj 'AspecJUnit i maven' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2009/03/20/aspecjunit-i-maven/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

