<?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; Maven</title>
	<atom:link href="http://koziolekweb.pl/category/java/maven/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>Wed, 01 Feb 2012 14:56:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</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>Scala i Selenium miłe złego początki&#8230; cz. I</title>
		<link>http://koziolekweb.pl/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/</link>
		<comments>http://koziolekweb.pl/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 14:06:58 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[maven-scala-plugin]]></category>
		<category><![CDATA[Selenium]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2077</guid>
		<description><![CDATA[&#8230; a koniec średnio radosny. Na początek będzie trochę o zestawianiu środowiska, czyli o rzeczach, które trzeba niestety zrobić i nie są one zbyt przyjemne dla naszej psychiki. W moim przypadku mam za zadanie przygotować lekki i wygodny framework do testowania naszych aplikacji webowych. Ogólne założenia: Pozwala na testowanie wszystkich (naszych) aplikacji. Pozwala na pisanie [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; a koniec średnio radosny.</p>
<p>Na początek będzie trochę o zestawianiu środowiska, czyli o rzeczach, które trzeba niestety zrobić i nie są one zbyt przyjemne dla naszej psychiki. </p>
<p>W moim przypadku mam za zadanie przygotować lekki i wygodny framework do testowania naszych aplikacji webowych. Ogólne założenia:</p>
<ul>
<li>Pozwala na testowanie wszystkich (naszych) aplikacji.</li>
<li>Pozwala na pisanie testów z zachowaniem języka domeny.</li>
<li>Jest stosunkowo nieskomplikowany i łatwy w użyciu.</li>
</ul>
<p>Ostatni punkt jest umowny o oznacza mniej więcej tyle, że API nie powinno mieć więcej niż kilka klas i odpowiadać mniej więcej elementom wizualnym w UI aplikacji oraz mapować akcje użytkownika na jakieś metody czy obiekty.</p>
<p>Kolejna rzecz to ten nieszczęsny &#8220;język domeny&#8221;, który w tym przypadku oznacza mniej więcej tyle co:<br />
Dla obiektów:</p>
<ul>
<li>Aplikacja dzieli się na ekrany.</li>
<li>Ekran jest formularzem <b>albo</b> listą.</li>
<li>Formularz zawiera pola.</li>
<li>Lista zawiera rekordy.</li>
</ul>
<p>Dla akcji:</p>
<ul>
<li>Do aplikacji można się zalogować i wylogować.</li>
<li>Ekran można otworzyć lub wysłać.</li>
<li>Pole można odczytać i można w nim pisać.</li>
<li>Listę można odczytać.</li>
</ul>
<p>Czyli jest nieźle. Można sobie na tej podstawie wybudować jakieś ogólne wyobrażenie tego co będzie zawierać ta maszynka. </p>
<p>Czas na naszą narzędziownię. Będzie ona oparta o gotowe rozwiązania wspierające tworzenie testów aplikacji webowych. Zatem na pokładzie witamy:</p>
<ul>
<li><a href="http://seleniumhq.org/">Selenium</a> &#8211; framework testów webowych.</li>
<li><a href="http://seleniumhq.org/projects/ide/">Selenium IDE for FireFox</a> &#8211; plugin do FF.</li>
<li><a href="http://getfirebug.com/">Firebug</a> &#8211; kolejny plugin do FF ułatwia pracę z kodem HTML i ma m.n. obsługę xPath.</li>
<li><a href="http://testng.org/">TestNG</a> &#8211; silnik testów w javie, będzie nam to wszystko zbierał do kupy.</li>
<li><a href="http://www.scala-lang.org/">Scala</a> &#8211; język w jakim to wszystko napiszemy.</li>
<li><a href="http://www.eclipse.org/downloads/packages/release/indigo/m6">Eclipse Indigo</a> &#8211; nasze IDE.</li>
<li><a href="http://maven.apache.org/">Maven</a> &#8211; budowanie, zarządzanie, wkurwianie to jego domena</li>
</ul>
<p>Tu dochodzimy do głównej części dzisiejszego wpisu, czyli jak spiąć Eclipse ze Scalą (i Selenium). O ile integracja z Selenium polega w tym przypadku na podpięciu w <samp>pom.xml</samp>:</p>
<p class="listing">Listing 1. zależności od Selenium</p>
<pre class="xml" name="code">
<dependency>
	<groupId>org.seleniumhq.selenium</groupId>
	<artifactId>selenium</artifactId>
	<version>LATEST</version>
	<type>pom</type>
</dependency></pre>
<p>i cierpliwym poczekaniu, aż wszystko się ściągnie to ze Scalą jest kilka wrzodów.</p>
<h4>Scala IDE</h4>
<p>Bardzo fajne rozwiązanie dla programistów pracujących w Eclipse, którzy chcą używać Scali. Tyle tylko, że w wersji stabilnej z obsługą Scali 2.8.0 jest moim skromnym zdaniem kompletnie nieprzydatne. Wynika to z dwóch rzeczy. Po pierwsze sam kompilator Scali wymaga dość dużo RAMu i Eclipse musi mieć w opcjach wpisane co najmniej 1024m. Trzeba pogrzebać w <samp>eclipse.ini</samp> i poustawiać <samp>-Xmx</samp> oraz <samp>-Xms</samp>. Po drugie plugin wykorzystuje swój weavering, który ma tendencję deadlocków. Rozwiązaniem jest znowuż edycja <samp>ecclipse.ini</samp>:</p>
<p class="listing">Listing 2. workaround do deadlocków Scala IDE</p>
<pre class="bash" name="code">
 -XX:+UnlockDiagnosticVMOptions
 -XX:+UnsyncloadClass
 -Dosgi.classloader.lock=classname
</pre>
<p>tyle tylko, że jest to rozwiązanie klasy &#8220;będzie się cięło rzadziej, ale będzie&#8221;.<br />
Rozwiązaniem pierwszego problemu jest za to wykorzystanie Scali 2.9.0RC2 i odpowiedniej wersji IDE, czyli bety 2.0.0. W celu oszczędzenia sobie ciężkiego urazu psychicznego polecam w tym przypadku instalację manualną przez rozpakowanie paczki z pluginem do <samp>dropins</samp> i olanie update site. W razie czego można się łatwo wrzodu pozbyć.</p>
<p>Na koniec konfiguracja pluginu scali do mavena, który pozwala na uniknięcie instalacji Scali w systemie (czasami przydatne):</p>
<p class="listing">Listing 3. Konfiguracja <samp>pom.xml</samp></p>
<pre class="xml" name="code">
<!-- w build.plugins -->
<plugin>
	<groupId>org.scala-tools</groupId>
	<artifactId>maven-scala-plugin</artifactId>
	<version>LATEST</version>
	<executions>
		<execution>
			<goals>
				<goal>compile</goal>
				<goal>testCompile</goal>
			</goals>
		</execution>
	</executions>
	<configuration>
		<scalaVersion>${scala.version}</scalaVersion>
	</configuration>
</plugin>
<!-- i dalej w depenedency -->
<dependency>
	<groupId>org.scala-lang</groupId>
	<artifactId>scala-library</artifactId>
	<version>${scala.version}</version>
</dependency>
<dependency>
	<groupId>org.scalatest</groupId>
	<artifactId>scalatest</artifactId>
	<version>1.3</version>
</dependency>
</pre>
<p>Tu mała uwaga na temat Eclipse. Pytanie jeżeli w projekcie definiujemy <samp>scala.version</samp> i mamy je też skonfigurowane w <samp>settings.xml</samp>, to które zostanie wykorzystane? Zdrowy rozsądek podpowiada, że to z <samp>pom.xml</samp> jak to ma miejsce w przypadku chociażby pluginów. No niestety zdrowy rozsądek należy odłożyć i dzięki temu odkrywamy, że zmienne w <samp>pom.xml</samp> są nadpisywane przez te z <samp>settings.xml</samp>.<br />
Mam tu jeszcze Scala Test, czyli takiego DSLa do testów. Przyda się.</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/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/&amp;title=Scala+i+Selenium+mi%C5%82e+z%C5%82ego+pocz%C4%85tki%26%238230%3B+cz.+I" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do Del.icio.us" alt="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' 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/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/&amp;title=Scala+i+Selenium+mi%C5%82e+z%C5%82ego+pocz%C4%85tki%26%238230%3B+cz.+I" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do digg" alt="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' 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/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do Technorati" alt="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' 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/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/&amp;title=Scala+i+Selenium+mi%C5%82e+z%C5%82ego+pocz%C4%85tki%26%238230%3B+cz.+I" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do Stumble Upon" alt="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' 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/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/&amp;title=Scala+i+Selenium+mi%C5%82e+z%C5%82ego+pocz%C4%85tki%26%238230%3B+cz.+I" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do Google Bookmarks" alt="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' 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/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/&amp;t=Scala+i+Selenium+mi%C5%82e+z%C5%82ego+pocz%C4%85tki%26%238230%3B+cz.+I" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do FaceBook" alt="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' 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/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/&amp;title=Scala+i+Selenium+mi%C5%82e+z%C5%82ego+pocz%C4%85tki%26%238230%3B+cz.+I" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do wykop.pl" alt="dodaj 'Scala i Selenium miłe złego początki&#8230; cz. I' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2011/04/27/scala-i-selenium-mile-zlego-poczatki-cz-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Przykłady z java4people</title>
		<link>http://koziolekweb.pl/2011/04/20/przyklady-z-java4people/</link>
		<comments>http://koziolekweb.pl/2011/04/20/przyklady-z-java4people/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 19:20:35 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java4People 2011]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Vaadin]]></category>
		<category><![CDATA[Guice]]></category>
		<category><![CDATA[Java4People]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2072</guid>
		<description><![CDATA[Udostępnione na githubie pod adresem git://github.com/Koziolek/java4people-vaadin-examples.git. Można ściągnąć opędzić mavenem i gotowe. vaadin-clean Zawiera kod różnych komponentów. W przypadku uruchomienia profilu gwt udostępniona zostanie funkcjonalność związana z menu kontekstowym w zakładce &#8220;własne komponenty&#8221;. Kod z dokumentacją! vaadin-guice Przykładowy projekt integracyjny Vaadin i guice. Brak komentarzy. vaadin-scala Durnostojka demonstrująca, że da się użyć scali. Brak komentarzy. [...]]]></description>
			<content:encoded><![CDATA[<p>Udostępnione na githubie pod adresem <a href="https://github.com/Koziolek/java4people-vaadin-examples">git://github.com/Koziolek/java4people-vaadin-examples.git</a>. Można ściągnąć opędzić mavenem i gotowe.</p>
<h5>vaadin-clean</h5>
<p>Zawiera kod różnych komponentów. W przypadku uruchomienia profilu gwt udostępniona zostanie funkcjonalność związana z menu kontekstowym w zakładce &#8220;własne komponenty&#8221;. Kod z dokumentacją!</p>
<h5>vaadin-guice</h5>
<p>Przykładowy projekt integracyjny Vaadin i guice. Brak komentarzy.</p>
<h5>vaadin-scala</h5>
<p>Durnostojka demonstrująca, że da się użyć scali. Brak komentarzy.</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/2011/04/20/przyklady-z-java4people/&amp;title=Przyk%C5%82ady+z+java4people" title="dodaj 'Przykłady z java4people' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Przykłady z java4people' do Del.icio.us" alt="dodaj 'Przykłady z java4people' 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/2011/04/20/przyklady-z-java4people/&amp;title=Przyk%C5%82ady+z+java4people" title="dodaj 'Przykłady z java4people' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Przykłady z java4people' do digg" alt="dodaj 'Przykłady z java4people' 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/2011/04/20/przyklady-z-java4people/" title="dodaj 'Przykłady z java4people' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Przykłady z java4people' do Technorati" alt="dodaj 'Przykłady z java4people' 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/2011/04/20/przyklady-z-java4people/&amp;title=Przyk%C5%82ady+z+java4people" title="dodaj 'Przykłady z java4people' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Przykłady z java4people' do Stumble Upon" alt="dodaj 'Przykłady z java4people' 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/2011/04/20/przyklady-z-java4people/&amp;title=Przyk%C5%82ady+z+java4people" title="dodaj 'Przykłady z java4people' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Przykłady z java4people' do Google Bookmarks" alt="dodaj 'Przykłady z java4people' 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/2011/04/20/przyklady-z-java4people/&amp;t=Przyk%C5%82ady+z+java4people" title="dodaj 'Przykłady z java4people' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Przykłady z java4people' do FaceBook" alt="dodaj 'Przykłady z java4people' 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/2011/04/20/przyklady-z-java4people/&amp;title=Przyk%C5%82ady+z+java4people" title="dodaj 'Przykłady z java4people' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Przykłady z java4people' do wykop.pl" alt="dodaj 'Przykłady z java4people' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2011/04/20/przyklady-z-java4people/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Walka z Mavenem 2.2.1</title>
		<link>http://koziolekweb.pl/2011/04/19/walka-z-mavenem-2-2-1/</link>
		<comments>http://koziolekweb.pl/2011/04/19/walka-z-mavenem-2-2-1/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 12:42:35 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2069</guid>
		<description><![CDATA[Kiedyś wysypał mi się maven. Sprawę odpuściłem, bo jakoś mi to nie przeszkadzało. Do czasu&#8230; Jako, że plugin do Scali wymaga Mavena w wersji 2.2.1 zatem trzeba było zrobić mały update. Update tradycyjny poprzez podmianę jarów nic nie dał. Błąd ten sam co wtedy. Mały wkurw&#8230; bo nie zrobiłem backupa, ale w sumie nie ma [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koziolekweb.pl/2009/03/25/maven-210-wydany/">Kiedyś wysypał mi się maven</a>. Sprawę odpuściłem, bo jakoś mi to nie przeszkadzało. Do czasu&#8230; Jako, że <a href="http://scala-tools.org/mvnsites/maven-scala-plugin/">plugin do Scali</a> wymaga Mavena w wersji 2.2.1 zatem trzeba było zrobić mały update. Update tradycyjny poprzez podmianę jarów nic nie dał. Błąd ten sam co wtedy.</p>
<p>Mały wkurw&#8230; bo nie zrobiłem backupa, ale w sumie nie ma o co, bo mam starą wersję gdzieś na backup-dysku.</p>
<p>Wywaliłem wszystko do cna zachowując tylko konfigurację &#8211; plik <samp>settings.xml</samp>. Rozpakowałem na świeżo i 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/2011/04/19/walka-z-mavenem-2-2-1/&amp;title=Walka+z+Mavenem+2.2.1" title="dodaj 'Walka z Mavenem 2.2.1' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Walka z Mavenem 2.2.1' do Del.icio.us" alt="dodaj 'Walka z Mavenem 2.2.1' 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/2011/04/19/walka-z-mavenem-2-2-1/&amp;title=Walka+z+Mavenem+2.2.1" title="dodaj 'Walka z Mavenem 2.2.1' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Walka z Mavenem 2.2.1' do digg" alt="dodaj 'Walka z Mavenem 2.2.1' 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/2011/04/19/walka-z-mavenem-2-2-1/" title="dodaj 'Walka z Mavenem 2.2.1' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Walka z Mavenem 2.2.1' do Technorati" alt="dodaj 'Walka z Mavenem 2.2.1' 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/2011/04/19/walka-z-mavenem-2-2-1/&amp;title=Walka+z+Mavenem+2.2.1" title="dodaj 'Walka z Mavenem 2.2.1' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Walka z Mavenem 2.2.1' do Stumble Upon" alt="dodaj 'Walka z Mavenem 2.2.1' 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/2011/04/19/walka-z-mavenem-2-2-1/&amp;title=Walka+z+Mavenem+2.2.1" title="dodaj 'Walka z Mavenem 2.2.1' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Walka z Mavenem 2.2.1' do Google Bookmarks" alt="dodaj 'Walka z Mavenem 2.2.1' 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/2011/04/19/walka-z-mavenem-2-2-1/&amp;t=Walka+z+Mavenem+2.2.1" title="dodaj 'Walka z Mavenem 2.2.1' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Walka z Mavenem 2.2.1' do FaceBook" alt="dodaj 'Walka z Mavenem 2.2.1' 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/2011/04/19/walka-z-mavenem-2-2-1/&amp;title=Walka+z+Mavenem+2.2.1" title="dodaj 'Walka z Mavenem 2.2.1' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Walka z Mavenem 2.2.1' do wykop.pl" alt="dodaj 'Walka z Mavenem 2.2.1' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2011/04/19/walka-z-mavenem-2-2-1/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Integracja Vaadin + Guice z ICEPush</title>
		<link>http://koziolekweb.pl/2011/03/24/integracja-vaadin-guice-z-icepush/</link>
		<comments>http://koziolekweb.pl/2011/03/24/integracja-vaadin-guice-z-icepush/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 14:11:50 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Vaadin]]></category>
		<category><![CDATA[Guice]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2047</guid>
		<description><![CDATA[Wczoraj osiągnąłem niewielki sukces integrując zestaw Vaadin + Guice z IcePush. Celem takiego połączenia jest uzyskanie możliwości aktualizacji UI przez zdarzenia generowane na serwerze, a nie tylko dzięki interakcji po stronie klienta. Jest to o tyle ważne, że w klasycznych rozwiązaniach (nawet AJAX) można aktualizować GUI tylko w wyniku akcji po stronie klienta. Jest to [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj osiągnąłem niewielki sukces integrując zestaw Vaadin + Guice z IcePush. Celem takiego połączenia jest uzyskanie możliwości aktualizacji UI przez zdarzenia generowane na serwerze, a nie tylko dzięki interakcji po stronie klienta. Jest to o tyle ważne, że w klasycznych rozwiązaniach (nawet AJAX) można aktualizować GUI tylko w wyniku akcji po stronie klienta. Jest to wyjątkowo upierdliwe jeżeli chcemy stworzyć rozwiązanie zbliżone funkcjonalnością do klasycznych okienek.<br />
Dodatkowym problemem jest nietypowy sposób zarządzania modułami przez Google Guice Servlet Extension. Rozwiązanie to działa w oparciu o filtr i w praktyce wymaga wyeliminowania mapowania serwletów z pliku <samp>web.xml</samp>. Jednocześnie ICEPush wymaga podłączenia specjalnego serwletu, który będzie podtrzymywał połączenie klient-serwer.</p>
<h4>Przygotowania i konfiguracja środowiska</h4>
<p>Konfiguracja środowiska będzie przebiegać w kilku krokach. Ważną rzeczą jest by dodanie funkcjonalności ICEPush nastąpiło w momencie gdy będzie to już naprawdę niezbędne. Wynika to z konieczności każdorazowego kompilowania kodu za pomocą kompilatora GWT. To powoduje, że proces wydłuża się i to na tyle, że można spokojnie pójść na kawę. Jeżeli jednak chcecie dodać ICEPush już na obecnym etapie to warto zastosować pewien trik, który za chwilę omówię. </p>
<p>Pierwszym krokiem w konfiguracji środowiska jest stworzenie pakietu <samp>org.icepush.gwt</samp> i umieszczenie w nim pliku <samp>ICEpush.gwt.xml</samp>.</p>
<p class="listing">Listing 1. <samp>ICEpush.gwt.xml</samp>
<pre name="code" class="xml"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd">
<module>
    <inherits name="com.vaadin.terminal.gwt.DefaultWidgetSet" />
    <inherits name="org.vaadin.artur.icepush.IcepushaddonWidgetset" />
    <inherits name="pl.koziolekweb.vaadin.guice.widgetset.MyAppWidgetSet" />
</module></pre>
<p>Następnie musimy stworzyć pakiet <samp>pl.koziolekweb.vaadin.guice.widgetset</samp> zawierający plik <samp>MyAppWidgetSet.gwt.xml</samp>.</p>
<p class="listing">Listing 2. <samp>MyAppWidgetSet.gwt.xml</samp>
<pre name="code" class="xml"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
    "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN"
    "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd">
<module>
	<inherits name="com.vaadin.terminal.gwt.DefaultWidgetSet" />
	<inherits name="org.vaadin.artur.icepush.IcepushaddonWidgetset" />
	<inherits name="org.icepush.gwt.ICEpush" />
</module></pre>
<p>Na tym kończy się pierwszy standardowy etap konfiguracji. Drugi etap to edycja pliku <samp>pom.xml</samp> w celu dodania zależności zarówno do ICEPush jak i pluginów kompilatora GWT oraz managera widgetsetów Vaadin. </p>
<p class="listing">Listing 3. <samp>pom.xml</samp> &#8211; pluginy
<pre name="code" class="xml">
<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>gwt-maven-plugin</artifactId>
	<version>2.1.0-1</version>
	<configuration>
		<webappDirectory>${project.build.directory}/${project.build.finalName}/VAADIN/widgetsets</webappDirectory>
		<extraJvmArgs>-Xmx512M -Xss1024k</extraJvmArgs>
		<runTarget>test</runTarget>
		<hostedWebapp>${project.build.directory}/${project.build.finalName}</hostedWebapp>
		<noServer>true</noServer>                                                                                 
<port>8080</port>
		<soyc>false</soyc>
	</configuration>
	<executions>
		<execution>
			<goals>
				<goal>resources</goal>
				<goal>compile</goal>
			</goals>
		</execution>
	</executions>
</plugin>
<plugin>
	<groupId>com.vaadin</groupId>
	<artifactId>vaadin-maven-plugin</artifactId>
	<version>1.0.1</version>
	<executions>
		<execution>
			<configuration>
			</configuration>
			<goals>
				<goal>update-widgetset</goal>
			</goals>
		</execution>
	</executions>
</plugin></pre>
<p class="listing">Listing 4. <samp>pom.xml</samp> &#8211; zależności ICEPush
<pre name="code" class="xml"><dependency>
	<groupId>org.vaadin.addons</groupId>
	<artifactId>icepush</artifactId>
	<version>0.2.1</version>
</dependency>
<dependency>
	<groupId>org.icepush</groupId>
	<artifactId>icepush</artifactId>
	<version>2.0</version>
</dependency>
<dependency>
	<groupId>org.icepush</groupId>
	<artifactId>icepush-gwt</artifactId>
	<version>2.0</version>
</dependency>
<dependency>
	<groupId>com.google.gwt</groupId>
	<artifactId>gwt-user</artifactId>
	<version>2.1.1</version>
	<scope>provided</scope>
</dependency></pre>
<p>Z taką konfiguracją możemy już działać z ICEPush w zwykłej aplikacji Vaadin. Należy co prawda dodać jeszcze odpowiedni serwlet do naszego <samp>web.xml</samp>, ale o tym na <a href="http://vaadin.com/directory#addon/icepush">stronie dodatku</a>.</p>
<p>Czas na dodanie konfiguracji Guice. Jest to kolejny przyjemny etap prac konfiguracyjnych. Tu sprawa zaczyna się jednak komplikować, bo i ile konfiguracja w pliku <samp>pom.xml</samp></p>
<p class="listing">Listing 5. <samp>pom.xml</samp> &#8211; zależności Guice
<pre name="code" class="xml"><dependency>
	<groupId>com.google.inject</groupId>
	<artifactId>guice</artifactId>
	<version>2.0</version>
</dependency>
<dependency>
	<groupId>com.google.inject.extensions</groupId>
	<artifactId>guice-servlet</artifactId>
	<version>2.0</version>
</dependency>
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>servlet-api</artifactId>
	<version>2.5</version>
</dependency></pre>
<p>to dalej zaczynają się drobne schody.<br />
Po pierwsze Guice przejmuje zarządzanie serwletami od kontenera. To oznacza usunięcie z <samp>web.xml</samp> mapowania serwletów i zastąpienie ich konfiguracją filtra z Guice.</p>
<p class="listing">Listing 6. <samp>web.xml</samp> &#8211; konfiguracja Guice
<pre name="code" class="xml"><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>Vaadin-Guice-ICEPush application</display-name>
	<context-param>
		<description>Vaadin production mode</description>
<param-name>productionMode</param-name>
<param-value>false</param-value>
	</context-param>

	<filter>
		<filter-name>guiceFilter</filter-name>
		<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>guiceFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
<listener>
<listener-class>pl.koziolekweb.vaadin.guice.servlet.VaadinGuiceConfiguration</listener-class>
	</listener>
</web-app></pre>
<p>Następnie należy samodzielnie zaimplementować listener, który utworzy nam injector Guice:</p>
<p class="listing">Listing 7. Implementacja listenera Guice
<pre name="code" class="java">package pl.koziolekweb.vaadin.guice.servlet;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;

public class VaadinGuiceConfiguration extends GuiceServletContextListener {

	@Override
	protected Injector getInjector() {
		return Guice.createInjector(new MyServletModule());
	}

}
</pre>
<p>Na koniec trzeba utworzyć moduł Guice:</p>
<p class="listing">Listing 8. Implementacja modułu Guice
<pre name="code" class="java">package pl.koziolekweb.vaadin.guice.servlet;

import java.util.HashMap;
import java.util.Map;

import pl.koziolekweb.vaadin.guice.ApplicationRoot;
import pl.koziolekweb.vaadin.guice.modules.books.model.dao.BookDao;
import pl.koziolekweb.vaadin.guice.modules.books.model.dao.SimpleBookDao;
import pl.koziolekweb.vaadin.guice.modules.books.presenter.ListBookPresenter;
import pl.koziolekweb.vaadin.guice.modules.books.presenter.ListBookPresenterImpl;
import pl.koziolekweb.vaadin.guice.modules.books.view.ListBookView;
import pl.koziolekweb.vaadin.guice.modules.books.view.ListBookViewImpl;

import com.google.inject.servlet.ServletModule;
import com.google.inject.servlet.ServletScopes;
import com.vaadin.Application;

public class MyServletModule extends ServletModule {

	@Override
	protected void configureServlets() {
		Map<String, String> params = new HashMap<String, String>();

		serve("/*").with(GuiceApplicationServlet.class, params);

		bind(Application.class).to(ApplicationRoot.class).in(ServletScopes.SESSION);

		bind(ListBookView.class).to(ListBookViewImpl.class);
		bind(BookDao.class).to(SimpleBookDao.class);
		bind(ListBookPresenter.class).to(ListBookPresenterImpl.class);

	}
}</pre>
<p>Na tym etapie należy chwilę się zatrzymać i zastanowić co tu się dzieje. W momencie nadejścia żądania uruchamiany jest filtr guice, który wyszukuje sobie istniejące injectory zawierające <samp>ServletModule</samp> i w zależności co mu skonfigurujemy w ramach takiego modułu oraz w zależności od ścieżki z żądania zostanie odpalony odpowiedni serwlet. Injectory są trzymane w ramach kontekstu aplikacji, a dodaje je tam implementacja <samp>GuiceServletContextListener</samp>.</p>
<p>No właśnie tu dochodzimy do najciekawszego elementu czyli spinania Guice z ICEPush. Jeżeli chcemy korzystać z samego Guice w Vaadin to tworzymy własny serwlet rozszerzający <samp>AbstractApplicationServlet</samp> i tyle.</p>
<p class="listing">Listing 9. Implementacja <samp>AbstractApplicationServlet</samp> dla Guice
<pre name="code" class="java">package pl.koziolekweb.vaadin.guice.servlet;

import java.io.IOException;

import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;

import com.vaadin.Application;
import com.vaadin.terminal.gwt.server.AbstractApplicationServlet;

@SuppressWarnings("serial")
@Singleton
public class GuiceApplicationServlet extends AbstractApplicationServlet {

	private final Provider<Application> applicationProvider;

	@Inject
	public GuiceApplicationServlet(Provider<Application> applicationProvider) {
		this.applicationProvider = applicationProvider;
	}

	@Override
	protected Class<? extends Application> getApplicationClass() throws ClassNotFoundException {
		return Application.class;
	}

	@Override
	protected Application getNewApplication(HttpServletRequest request) throws ServletException {
		return applicationProvider.get();
	}
}</pre>
<p>Jednak jeżeli chcemy dodać obsługę ICEPush to musimy jakość ją włączyć do naszego serwletu. Metoda najprostsza i jednocześnie nie najlepsza to skopiowanie zawartości oryginalnego serwletu do naszego serwletu Guice. Inaczej się niestety nie da. Zatem po zmianach nasz serwlet będzie wyglądał tak:</p>
<p class="listing">Listing 10. Implementacja <samp>AbstractApplicationServlet</samp> dla Guice z ICEPush
<pre name="code" class="java">package pl.koziolekweb.vaadin.guice.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.icepush.servlet.MainServlet;
import org.vaadin.artur.icepush.ICEPush;
import org.vaadin.artur.icepush.JavascriptProvider;

import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;

import com.vaadin.Application;
import com.vaadin.terminal.gwt.server.AbstractApplicationServlet;

@SuppressWarnings("serial")
@Singleton
public class GuiceApplicationServlet extends AbstractApplicationServlet {

	private final Provider<Application> applicationProvider;

	private MainServlet ICEPushServlet;

	private JavascriptProvider javascriptProvider;

	@Inject
	public GuiceApplicationServlet(Provider<Application> applicationProvider) {
		this.applicationProvider = applicationProvider;
	}

	@Override
	public void destroy() {
		super.destroy();
		ICEPushServlet.shutdown();
	}

	@Override
	public void init(ServletConfig servletConfig) throws ServletException {
		try {
			super.init(servletConfig);
		} catch (ServletException e) {
			if (e.getMessage().equals(
					"Application not specified in servlet parameters")) {
				// Ignore if application is not specified to allow the same
				// servlet to be used for only push in portals
			} else {
				throw e;
			}
		}
		ICEPushServlet = new MainServlet(servletConfig.getServletContext());

		try {
			javascriptProvider = new JavascriptProvider(getServletContext().getContextPath());
			ICEPush.setCodeJavascriptLocation(javascriptProvider.getCodeLocation());
		} catch (IOException e) {
			throw new ServletException("Error initializing JavascriptProvider",e);
		}
	}

	@Override
	protected Class<? extends Application> getApplicationClass()
			throws ClassNotFoundException {
		return Application.class;
	}

	@Override
	protected Application getNewApplication(HttpServletRequest request)
			throws ServletException {
		return applicationProvider.get();
	}

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String pathInfo = request.getPathInfo();
		if (pathInfo != null
				&#038;&#038; pathInfo.equals("/" + javascriptProvider.getCodeName())) {
			// Serve icepush.js
			serveIcePushCode(request, response);
			return;
		}

		if (request.getRequestURI().endsWith(".icepush")) {
			// Push request
			try {
				ICEPushServlet.service(request, response);
			} catch (Exception e) {
				throw new ServletException(e);
			}
		} else {
			// Vaadin request
			super.service(request, response);
		}
	}

	private void serveIcePushCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String icepushJavscript = javascriptProvider.getJavaScript();
		response.setHeader("Content-Type", "text/javascript");
		response.getOutputStream().write(icepushJavscript.getBytes());
	}
}
</pre>
<h4>Użycie ICEPush oraz sztuczki i kruczki</h4>
<p>Jeżeli koniecznie potrzebujesz używać w kodzie ICEPush, ale nie chesz mieć na karku kompilatora GWT można zrobić mały bypass. Po co? Czasami jest tak, że po zakodowaniu modułu ciężko jest dokonywac jakiś zmian. Łatwo za to jest zmienić konfigurację. Co też i zrobimy.<br />
Na początek przygotujemy sobie mały interfejsik, który posłuży nam jako adapter do usługi comet.</p>
<p class="listing">Listing 11. Interfejs <samp>CometService</samp>
<pre name="code" class="java">package pl.koziolekweb.vaadin.guice;

import com.vaadin.ui.ComponentContainer;

public interface CometService {

	public void addToContainer(ComponentContainer componentContainer);

	public void push();

}</pre>
<p>O ile znaczenie metody <samp>push()</samp> jest oczywiste, to metoda <samp>addToContainer</samp> może być trochę tajemnicza. Otoż by móc używać ICEPush należy dodać go do okna aplikacji. My odwrócimy ten schemat dzięki czemu będziemy mieć kontrolę nad tym co dodajemy do aplikacji. Jest to szczególnie wygodne jeżeli chcemy dodać pseudo usługę, bo wtedy można umieścić na stronie info, że ICEPush jest, ale go nie ma.<br />
Zaimplementujmy zatem nasz mock serwis:</p>
<p class="listing">Listing 12. Klasa <samp>FakeCometService</samp>
<pre name="code" class="java">package pl.koziolekweb.vaadin.guice;

import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.Label;

public class FakeCometService implements CometService {

	public void addToContainer(ComponentContainer componentContainer) {
		componentContainer.addComponent(new Label("Fake CometService in use"));
	}

	public void push() {
		System.out.println("call push");
	}
}</pre>
<p>Pamiętaj by przenieść konfigurację kompilatora GWT do osobnego profilu mavena. Inaczej i tak będziesz pijał kilka kaw ekstra w oczekiwaniu na zakończenie kompilacji.<br />
Oczywiście przyda się też i właściwa implementacja:</p>
<p class="listing">Listing 13. Klasa <samp>ICEPushCometService</samp>
<pre name="code" class="java">package pl.koziolekweb.vaadin.guice;

import org.vaadin.artur.icepush.ICEPush;

import com.vaadin.ui.ComponentContainer;

public class IcePushCometService implements CometService {

	private ICEPush icePush;

	public IcePushCometService() {
		icePush = new ICEPush();
	}

	public void addToContainer(ComponentContainer componentContainer) {
		componentContainer.addComponent(icePush);
	}

	public void push() {
		icePush.push();
	}

}</pre>
<p>Użycie jest bardzo proste. Przykładowa konfiguracja modułu:</p>
<p class="listing">Listing 13. <samp>MyServletModule</samp>
<pre name="code" class="java">package pl.koziolekweb.vaadin.guice.servlet;

import java.util.HashMap;
import java.util.Map;

import pl.koziolekweb.vaadin.guice.ApplicationRoot;
import pl.koziolekweb.vaadin.guice.CometService;
import pl.koziolekweb.vaadin.guice.IcePushCometService;
import pl.koziolekweb.vaadin.guice.modules.books.model.dao.BookDao;
import pl.koziolekweb.vaadin.guice.modules.books.model.dao.SimpleBookDao;
import pl.koziolekweb.vaadin.guice.modules.books.presenter.ListBookPresenter;
import pl.koziolekweb.vaadin.guice.modules.books.presenter.ListBookPresenterImpl;
import pl.koziolekweb.vaadin.guice.modules.books.view.ListBookView;
import pl.koziolekweb.vaadin.guice.modules.books.view.ListBookViewImpl;

import com.google.inject.servlet.ServletModule;
import com.google.inject.servlet.ServletScopes;
import com.vaadin.Application;

public class MyServletModule extends ServletModule {

	@Override
	protected void configureServlets() {
		Map<String, String> params = new HashMap<String, String>();
		params.put("widgetset",	"pl.koziolekweb.vaadin.guice.widgetset.MyAppWidgetSet");
		serve("/*").with(GuiceApplicationServlet.class, params);

		bind(Application.class).to(ApplicationRoot.class).in(
				ServletScopes.SESSION);

		//bind(CometService.class).to(FakeCometService.class);
		bind(CometService.class).to(IcePushCometService.class).in(ServletScopes.SESSION);
		bind(ListBookView.class).to(ListBookViewImpl.class);
		bind(BookDao.class).to(SimpleBookDao.class);
		bind(ListBookPresenter.class).to(ListBookPresenterImpl.class);

	}
}</pre>
<p>Trzeba tylko dodać parametr z nazwą naszego widgetseta do konfiguracji serwletu. Zakres sesyjny dla rzeczywistego serwisu uchroni nas przed zapchaniem łącza w przypadku kilku aktualizacji występujących na raz.</p>
<h4>Rozwinięcia twórcze</h4>
<p>Mam kilka pomysłów na twórcze rozwinięcie tego rozwiązania. Przede wszystkim można dodać kolejki by serwis pobierał nowe informacje z kolejki i w przypadku dużego natłoku wywołań metody <samp>push</samp> nie zaspamował łącza. Po drugie integracja z  GWTCanvas i tworzenie wykresów w czasie rzeczywistym. Po trzecie moja wersja JBisona, która będzie śledzić http różnych serwerów.</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/2011/03/24/integracja-vaadin-guice-z-icepush/&amp;title=Integracja+Vaadin+%2B+Guice+z+ICEPush" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do Del.icio.us" alt="dodaj 'Integracja Vaadin + Guice z ICEPush' 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/2011/03/24/integracja-vaadin-guice-z-icepush/&amp;title=Integracja+Vaadin+%2B+Guice+z+ICEPush" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do digg" alt="dodaj 'Integracja Vaadin + Guice z ICEPush' 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/2011/03/24/integracja-vaadin-guice-z-icepush/" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do Technorati" alt="dodaj 'Integracja Vaadin + Guice z ICEPush' 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/2011/03/24/integracja-vaadin-guice-z-icepush/&amp;title=Integracja+Vaadin+%2B+Guice+z+ICEPush" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do Stumble Upon" alt="dodaj 'Integracja Vaadin + Guice z ICEPush' 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/2011/03/24/integracja-vaadin-guice-z-icepush/&amp;title=Integracja+Vaadin+%2B+Guice+z+ICEPush" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do Google Bookmarks" alt="dodaj 'Integracja Vaadin + Guice z ICEPush' 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/2011/03/24/integracja-vaadin-guice-z-icepush/&amp;t=Integracja+Vaadin+%2B+Guice+z+ICEPush" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do FaceBook" alt="dodaj 'Integracja Vaadin + Guice z ICEPush' 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/2011/03/24/integracja-vaadin-guice-z-icepush/&amp;title=Integracja+Vaadin+%2B+Guice+z+ICEPush" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Integracja Vaadin + Guice z ICEPush' do wykop.pl" alt="dodaj 'Integracja Vaadin + Guice z ICEPush' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2011/03/24/integracja-vaadin-guice-z-icepush/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>V jak Vaadin rozdział 1 pre alpha 1</title>
		<link>http://koziolekweb.pl/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/</link>
		<comments>http://koziolekweb.pl/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 21:02:57 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Vaadin]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[scribd]]></category>
		<category><![CDATA[V jak Vaadin]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1976</guid>
		<description><![CDATA[Skupiłem się w sobie i tak oto można już przeczytać pierwszy rozdział mojej książki o Vaadin. Roboczy tytuł &#8220;V jak Vaadin&#8221;. Wersja pre alpha 1 oznacz ni mniej ni więcej, że nie jest to w żaden sposób sprawdzone. Mogą być orty, mogłem się zakałapućkać w opisach oraz, że szata graficzna jest delikatnie mówiąc o kant [...]]]></description>
			<content:encoded><![CDATA[<p>Skupiłem się w sobie i tak oto można już przeczytać pierwszy rozdział mojej książki o Vaadin. Roboczy tytuł &#8220;V jak Vaadin&#8221;. Wersja pre alpha 1 oznacz ni mniej ni więcej, że nie jest to w żaden sposób sprawdzone. Mogą być orty, mogłem się zakałapućkać w opisach oraz, że szata graficzna jest delikatnie mówiąc o kant dupy potłuc. Ale jest!</p>
<p>W tym rozdziale omawiam instalację Vaadin jako samodzielnego jara, archetypu Maven oraz jako pluginu dla Eclipse i NetBeans. </p>
<p><a title="View V jak Vaadin rozdział 1 pre alpha 1 on Scribd" href="http://www.scribd.com/doc/48180896/V-jak-Vaadin-rozdział-1-pre-alpha-1" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;">V jak Vaadin rozdział 1 pre alpha 1</a> <object id="doc_743971339977908" name="doc_743971339977908" height="600" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" ><param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"><param name="wmode" value="opaque"><param name="bgcolor" value="#ffffff"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><param name="FlashVars" value="document_id=48180896&#038;access_key=key-1inlljj23c9c1i9u5zn1&#038;page=1&#038;viewMode=list"><embed id="doc_743971339977908" name="doc_743971339977908" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=48180896&#038;access_key=key-1inlljj23c9c1i9u5zn1&#038;page=1&#038;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="600" width="100%" wmode="opaque" bgcolor="#ffffff"></embed></object></p>
<p>Całość jest hostowana na http://www.scribd.com/</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/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/&amp;title=V+jak+Vaadin+rozdzia%C5%82+1+pre+alpha+1" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do Del.icio.us" alt="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' 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/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/&amp;title=V+jak+Vaadin+rozdzia%C5%82+1+pre+alpha+1" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do digg" alt="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' 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/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do Technorati" alt="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' 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/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/&amp;title=V+jak+Vaadin+rozdzia%C5%82+1+pre+alpha+1" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do Stumble Upon" alt="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' 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/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/&amp;title=V+jak+Vaadin+rozdzia%C5%82+1+pre+alpha+1" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do Google Bookmarks" alt="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' 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/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/&amp;t=V+jak+Vaadin+rozdzia%C5%82+1+pre+alpha+1" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do FaceBook" alt="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' 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/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/&amp;title=V+jak+Vaadin+rozdzia%C5%82+1+pre+alpha+1" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do wykop.pl" alt="dodaj 'V jak Vaadin rozdział 1 pre alpha 1' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2011/02/04/v-jak-vaadin-rozdzial-1-pre-alpha-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami</title>
		<link>http://koziolekweb.pl/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/</link>
		<comments>http://koziolekweb.pl/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 18:11:23 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[chakierowanie]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1959</guid>
		<description><![CDATA[Pewien czas temu natknąłem się na tekst poświęcony sposobom komunikacji klient-bank w mBanku. Autorka słusznie wykazuje, że obsługa w mBanku jest co najmniej upierdliwa, a narzędzie jakim jest korespondencja wewnętrzna nie jest odpowiednio wykorzystane, ale też wysuwa niesłuszną moim zdaniem tezę co do komunikacji za pomocą emaila. Specjalnie dla niej króciutka prezentacja możliwości manipulowania nagłówkami [...]]]></description>
			<content:encoded><![CDATA[<p>Pewien czas temu natknąłem się na <a href="http://betweenblankpages.wordpress.com/2011/01/13/jest-sposob-na-bank/">tekst</a> poświęcony sposobom komunikacji klient-bank w mBanku. Autorka słusznie wykazuje, że obsługa w mBanku jest co najmniej upierdliwa, a narzędzie jakim jest korespondencja wewnętrzna nie jest odpowiednio wykorzystane, ale też wysuwa niesłuszną moim zdaniem tezę co do komunikacji za pomocą emaila.<br />
Specjalnie dla niej króciutka prezentacja możliwości manipulowania nagłówkami oraz kilku sztuczek &#8220;livehacking&#8221; i &#8220;socialhacking&#8221;. Całość w Javie.</p>
<h4>Przygotowania</h4>
<p>W pierwszej kolejności instalujemy sobie serwer poczty. Ja wybrałem postfixa.</p>
<p class="listing">Listing 1. instalacja Postfixa</p>
<pre class="bash" name="code">
$ sudo apt-get install postfix
Czytanie list pakietów... Gotowe
Budowanie drzewa zależności
Odczyt informacji o stanie... Gotowe
Sugerowane pakiety:
  procmail postfix-mysql postfix-pgsql postfix-ldap postfix-pcre sasl2-bin resolvconf postfix-cdb
Zostaną zainstalowane następujące NOWE pakiety:
  postfix
0 aktualizowanych, 1 nowo instalowanych, 0 usuwanych i 0 nieaktualizowanych.
Konieczne pobranie 1321kB archiwów.
Po tej operacji zostanie dodatkowo użyte 3273kB miejsca na dysku.
Pob: 1 http://pl.archive.ubuntu.com/ubuntu/ lucid/main postfix 2.7.0-1 [1321kB]
Pobrano 1321kB w 1s (901kB/s)
Prekonfiguracja pakietów ...
Zaznaczenie poprzednio niezaznaczonego pakietu postfix.
(Odczytywanie bazy danych ... 347594 plików i katalogów obecnie zainstalowanych.)
Rozpakowanie postfix (z .../postfix_2.7.0-1_i386.deb) ...
Przetwarzanie wyzwalaczy dla ureadahead...
ureadahead will be reprofiled on next reboot
Przetwarzanie wyzwalaczy dla ufw...
Przetwarzanie wyzwalaczy dla man-db...
Konfigurowanie postfix (2.7.0-1) ...
Dodawanie grupy `postfix' (GID 131)...
Gotowe.
Dodawanie użytkownika systemowego `postfix' (UID 126)...
Dodawanie nowego użytkownika `postfix' (UID 126) w grupie `postfix'...
Nie utworzono katalogu domowego `/var/spool/postfix'.
Creating /etc/postfix/dynamicmaps.cf
Adding tcp map entry to /etc/postfix/dynamicmaps.cf
Dodawanie grupy `postdrop' (GID 132)...
Gotowe.
setting myhostname: koziolek-desktop
setting alias maps
setting alias database
mailname is not a fully qualified domain name.  Not changing /etc/mailname.
setting destinations: koziolek-desktop, localhost.localdomain, , localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 0
setting recipient_delimiter: +
setting inet_interfaces: all
/etc/aliases does not exist, creating it.
WARNING: /etc/aliases exists, but does not have a root alias.

Postfix is now set up with a default configuration.  If you need to make
changes, edit
/etc/postfix/main.cf (and others) as needed.  To view Postfix configuration
values, see postconf(1).

After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.

Running newaliases
 * Stopping Postfix Mail Transport Agent postfix                                                                                                      [ OK ]
 * Starting Postfix Mail Transport Agent postfix                                                                                                      [ OK ] 

Przetwarzanie wyzwalaczy dla libc-bin...
ldconfig deferred processing now taking place
</pre>
<p>I tyle. W trakcie instalacji zostaniemy poproszeni o podanie nazwy domeny, ale serwer posłuży nam tylko jako punkt zaczepienia do sieci i domena nie jest istotna.<br />
Następnie tworzymy za pomocą mavena projekt java:</p>
<p class="listing">Listing 2. <samp>pom.xml</samp></p>
<pre class="xml" name="code">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>pl.koziolekweb.tutorial</groupId>
	<artifactId>mail-hacking</artifactId>
	<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

	<name>mail-hacking</name>
	<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
<plugins>
<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.6</version>
				<configuration>
					<suiteXmlFiles>
						<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
					</suiteXmlFiles>
				</configuration>
			</plugin>
<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
				<version>2.8</version>
				<configuration>
					<downloadSources>true</downloadSources>
					<downloadJavaDocs>true</downloadJavaDocs>
					<workspace>./</workspace>
				</configuration>
				<executions>
					<execution>
						<id>eclipse</id>
<phase>clean</phase>
						<goals>
							<goal>clean</goal>
							<goal>eclipse</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.testng</groupId>
			<artifactId>testng</artifactId>
			<version>LATEST</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-all</artifactId>
			<version>1.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4</version>
		</dependency>
	</dependencies>
</project>
</pre>
<p>jako zależność dodajemy <samp>javax.mail</samp> i podpinamy do Eclipse.</p>
<h4>Programowanie</h4>
<h5>Teoria</h5>
<p>W uproszczeniu każda wiadomość email składa się z nagłówków i treści &#8211; ciała. Treść wiadomo zawiera treść. Znacznie interesujące są dla nas nagłówki. Zawierają one informacje kontrolne i sterujące takie jak nadawca, odbiorca, odbiorcy, listy CC i BCC, załączniki, ale też nagłówek Sender, który informuje o tym kto technicznie nadał wiadomość (zawiera informacje o użytkowniku serwera poczty) oraz Reply-To, który wskazuje do kogo będzie wysyłana odpowiedź.</p>
<h5>Socialhaking</h5>
<p>Kevin Mitnick esencję przedstawionej tu metody zawarł w tytule swojej książki &#8220;Sztuka podstępu. Łamałem ludzi, nie hasła&#8221;. Cała sztuka opiera się o pewne zachowania użytkownika. W zasadzie o jedno&#8230; czy naciskają &#8220;odpowiedz&#8221; patrzysz do kogo idzie odpowiedź i czy adres email zgadza się z adresem nadawcy? Coś czuję, że od dziś zaczniesz hehehe&#8230;.</p>
<h5>Praktyka</h5>
<p>Do &#8220;chakierowania&#8221; użyję prostego programu napisanego w javie z wykorzystaniem <a href="http://www.oracle.com/technetwork/java/index-jsp-139225.html">Java Mail API</a>.</p>
<p class="listing">Listing 3. Nasze super narzędzie&#8230;</p>
<pre class="java" name="code">
package pl.koziolekweb.tutorial;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class App {
	public static void main(String[] args) throws AddressException,
			MessagingException {
		String from = "Jaś Kowalski <jas@kowalski.pl>";
		String to = "jełop@mójBank.pl";
		String replyTo = "devil@evil.hell";
		Properties props = System.getProperties();
		Session session = Session.getDefaultInstance(props, null);
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(from));
		message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
		message.addHeader("Reply-To", replyTo);
		message.addHeader("Content-Type", " text/plain; charset=UTF-8");
		message.setSubject("Pytanie");
		message.setText("Czy wykonano już przelew?");
		Transport.send(message);
	}
}
</pre>
<p>sprawdź samemu zmieniając adres TO na swojego maila. </p>
<p>Co ciekawe wiele klientów email nie sprawdza nagłówków i trzeba samodzielnie sprawdzić czy to gdzie wysyłamy zgodne jest z tym skąd dostajemy&#8230;</p>
<h4>Schemat ataku</h4>
<p>Schemat ataku jest tu bajecznie prosty. Atakujący wysyła maila z &#8220;lewymi&#8221; nagłówkami w którym pyta o duperelę. Warto by była to rzeczywista duperela np. czy wysłano już zamówioną kartę&#8230; Następnie w ramach konwersacji mailowej pytamy się czy osoba z obsługi nie była by tak miła i nie pomogła wykonać jeszcze jedną drobną operację&#8230; zmianę adresu korespondencyjnego&#8230; prawda, że duperela. Następnie zmuszamy ofiarę do zablokowania karty i zgłoszenia zapotrzebowania na nową&#8230; zgadnijcie gdzie trafi karta&#8230; Wraz z PINem w osobnym liście&#8230;<br />
Oczywiście musimy trafić na bankiera idiotę, ale nie jest to trudne&#8230;</p>
<h4>Schematy obrony</h4>
<h5>Podpis cyfrowy</h5>
<p>Prosty i stosunkowo tani sposób obrony. Niekwalifikowany podpis można wyrobić sobie samemu. Bankowi przesyłamy klucz publiczny, a wiadomości podpisujemy z wykorzystaniem klucza prywatnego. Podpis kwalifikowany jest droższy, ale ma tą dodatkową zaletę, że można go wykorzystać jeszcze w kilku innych celach oraz, że daje możliwość wysyłania wiadomości z dowolnego komputera wyposażonego w czytnik kart chipowych (w teorii).</p>
<h5>Weryfikacja nagłówków</h5>
<p>Po stronie banku serwer poczty sprawdza czy nagłówek From i Reply-To są takie same. Metoda dobra o tyle, że klient nie musi nic robić. Wadą jest jej stosunkowo łatwe ominięcie poprzez błędy serwerów pocztowych. </p>
<h5>Wewnętrzny system email</h5>
<p>Postfix, ale też i inne serwery pozwalają na konfigurację w ten sposób, że cały ruch będzie odbywał się wewnątrz danej instancji serwera. Klient wykorzystuje wtedy specjalne bankowe konto mailowe. Metoda całkiem dobra, ale równie dobrze można wykorzystać jakiś wewnętrzny system wiadomości.</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/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/&amp;title=Chwila+z+Java+Mail%2C+czyli+dlaczego+maile+nie+s%C5%82u%C5%BC%C4%85+do+rozm%C3%B3w+z+bankami" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do Del.icio.us" alt="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' 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/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/&amp;title=Chwila+z+Java+Mail%2C+czyli+dlaczego+maile+nie+s%C5%82u%C5%BC%C4%85+do+rozm%C3%B3w+z+bankami" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do digg" alt="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' 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/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do Technorati" alt="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' 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/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/&amp;title=Chwila+z+Java+Mail%2C+czyli+dlaczego+maile+nie+s%C5%82u%C5%BC%C4%85+do+rozm%C3%B3w+z+bankami" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do Stumble Upon" alt="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' 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/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/&amp;title=Chwila+z+Java+Mail%2C+czyli+dlaczego+maile+nie+s%C5%82u%C5%BC%C4%85+do+rozm%C3%B3w+z+bankami" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do Google Bookmarks" alt="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' 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/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/&amp;t=Chwila+z+Java+Mail%2C+czyli+dlaczego+maile+nie+s%C5%82u%C5%BC%C4%85+do+rozm%C3%B3w+z+bankami" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do FaceBook" alt="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' 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/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/&amp;title=Chwila+z+Java+Mail%2C+czyli+dlaczego+maile+nie+s%C5%82u%C5%BC%C4%85+do+rozm%C3%B3w+z+bankami" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do wykop.pl" alt="dodaj 'Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2011/01/15/chwila-z-java-mail-czyli-dlaczego-maile-nie-sluza-do-rozmow-z-bankami/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak wyłączyć przeszukiwanie workspace w maven 2</title>
		<link>http://koziolekweb.pl/2010/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/</link>
		<comments>http://koziolekweb.pl/2010/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 14:49:51 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[maven-eclipse-plugin]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1913</guid>
		<description><![CDATA[Taki mały feature dla eclipsowego pluginu do mavena. Jeżeli dacie eclipse:eclipse to maven domyślnie przeszuka drzewo katalogów &#8220;w górę&#8221; tylko po to by zamiast ścieżki do repo dać ścieżki do projektów od których zależy wasz projekt. Fajnie? No nie do końca. Jeżeli projekt od którego zależycie jest zamknięty lub z jakiegoś powodu nie ma go [...]]]></description>
			<content:encoded><![CDATA[<p>Taki mały feature dla eclipsowego pluginu do mavena. Jeżeli dacie <samp>eclipse:eclipse</samp> to maven domyślnie przeszuka drzewo katalogów &#8220;w górę&#8221; tylko po to by zamiast ścieżki do repo dać ścieżki do projektów od których zależy wasz projekt. Fajnie? No nie do końca. Jeżeli projekt od którego zależycie jest zamknięty lub z jakiegoś powodu nie ma go na liście projektów w Eclipse to po odświeżeniu projektu głównego pojawią się te fajne czerwone krzyżyki&#8230; no nie fajnie.<br />
Rozwiązanie:</p>
<p class="listing">Listing 1. Wyłączenie przeszukiwania workspace</p>
<pre class="xml" name="code">
<plugin>

	<groupId>org.apache.maven.plugins</groupId>  

	<artifactId>maven-eclipse-plugin</artifactId>

	<version>2.8</version>                       

	<configuration>                              

		<downloadSources>true</downloadSources>  

		<downloadJavaDocs>true</downloadJavaDocs>

		<workspace>./</workspace>                

	</configuration>                             

	<executions>                                 

		<execution>                              

			<id>eclipse</id>                     
<phase>clean</phase>

			<goals>                              

				<goal>clean</goal>               

				<goal>eclipse</goal>             

			</goals>                             

		</execution>                             

	</executions>                                
</plugin>
</pre>
<p>Wystarczy wskazać jako korzeń workspace bieżący katalog.</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/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/&amp;title=Jak+wy%C5%82%C4%85czy%C4%87+przeszukiwanie+workspace+w+maven+2" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do Del.icio.us" alt="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' 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/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/&amp;title=Jak+wy%C5%82%C4%85czy%C4%87+przeszukiwanie+workspace+w+maven+2" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do digg" alt="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' 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/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do Technorati" alt="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' 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/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/&amp;title=Jak+wy%C5%82%C4%85czy%C4%87+przeszukiwanie+workspace+w+maven+2" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do Stumble Upon" alt="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' 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/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/&amp;title=Jak+wy%C5%82%C4%85czy%C4%87+przeszukiwanie+workspace+w+maven+2" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do Google Bookmarks" alt="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' 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/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/&amp;t=Jak+wy%C5%82%C4%85czy%C4%87+przeszukiwanie+workspace+w+maven+2" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do FaceBook" alt="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' 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/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/&amp;title=Jak+wy%C5%82%C4%85czy%C4%87+przeszukiwanie+workspace+w+maven+2" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do wykop.pl" alt="dodaj 'Jak wyłączyć przeszukiwanie workspace w maven 2' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2010/11/11/jak-wylaczyc-przeszukiwanie-workspace-w-maven-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Spring Logger Service, przykładowy procesor adnotacji w Springu</title>
		<link>http://koziolekweb.pl/2010/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/</link>
		<comments>http://koziolekweb.pl/2010/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 14:55:59 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[moreunit]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1907</guid>
		<description><![CDATA[Działa od Springa 2.0.X w górę. Jedną z rzeczy, które wkurzają w Springu jest konieczność pisania kilometrowych plików XML nawet wtedy gdy wiadomo, że dana funkcjonalność jest zazwyczaj dobrze zdefiniowana i jednolita w całym systemie. Wtedy aż prosi się o dodanie jej poprzez adnotację i to najlepiej taką, która jasno mówi z jakim rodzajem usługi [...]]]></description>
			<content:encoded><![CDATA[<p>Działa od Springa 2.0.X w górę.</p>
<p>Jedną z rzeczy, które wkurzają w Springu jest konieczność pisania kilometrowych plików XML nawet wtedy gdy wiadomo, że dana funkcjonalność jest zazwyczaj dobrze zdefiniowana i jednolita w całym systemie. Wtedy aż prosi się o dodanie jej poprzez adnotację i to najlepiej taką, która jasno mówi z jakim rodzajem usługi mamy do czynienia. Przykładem takiej usługi jest logowanie.</p>
<p>Większość programistów do usranej śmierci pisze w klasach wymagających logowania coś w stylu:</p>
<p class="listing">Listing 1. tworzenie loggera</p>
<pre class="java" name="code">
private Logger log = LoggerFactory.getLogger(MyClass.class);
</pre>
<p>Nawet jeżeli używamy springa to zazwyczaj konfiguracja loggera jest opisana za pomocą wpisu <samp>properties</samp> w definicji beana. O ile prościej jest zrobić tak:</p>
<p class="listing">Listing 2. tworzenie loggera za pomocą adnotacji</p>
<pre class="java" name="code">
@LogService
private Logger log
</pre>
<p>No to lecim&#8230;</p>
<h4>Własny procesor adnotacji</h4>
<p>Na początek zdefiniujmy sobie adnotację:</p>
<p class="listing">Listing 3. Adnotacja usługi dziennika zdarzeń</p>
<pre class="java" name="code">
package pl.koziolekweb.loggerservice;

import java.lang.annotation.Documented;
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.FIELD)
@Documented
public @interface LogService {

	public static enum LoggerType {
		log4j, sfl4j, commonsLogger, javaSeLogging;
	}

	LoggerType loggerType() default LoggerType.javaSeLogging;

}</pre>
<p>Wewnętrzny typ enum reprezentuje najpopularniejsze loggery na rynku. Domyślnie ustawiłem typ tak by korzystać z loggera JSE.<br />
Oczywiście jeżeli jakiś debil poda typ różny od typu pola  to jego problem <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h5>Testy</h5>
<p>Jako, że Spring wręcz prosi by korzystać z TDD to i oto mamy zestaw testów:</p>
<p class="listing">Listing 4. Testy, testy i jeszcze raz testy&#8230;</p>
<pre class="java" name="code">
package pl.koziolekweb.loggerservice;

import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.fail;

import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class LogServicePostProcessorTest {

	private LogServicePostProcessor logServicePostProcessor;

	@BeforeMethod
	protected void setUp() throws Exception {
		logServicePostProcessor = new LogServicePostProcessor();
	}

	@AfterMethod
	protected void tearDown() throws Exception {
		logServicePostProcessor = null;
	}

	@Test
	public void testPostProcessBeforeInitialization() {
		testJSE();
		testSfl4J();
		testCommons();
		testLog4j();
	}

	@Test(expectedExceptions = { IllegalArgumentException.class })
	public void testPostProcessBeforeInitializationWrongAnnotationType() {
		BadLogBean badLogBean = new BadLogBean();
		logServicePostProcessor.postProcessBeforeInitialization(badLogBean, "");
		fail("IllegalArgumentException should be threw");
	}

	@Test
	public void testLog4j() {
		Log4jLogBean log4jBean = new Log4jLogBean();
		logServicePostProcessor.postProcessBeforeInitialization(log4jBean, "");
		assertNotNull(log4jBean.getLogger());
	}

	@Test
	public void testCommons() {
		CommonsLogBean commonsBean = new CommonsLogBean();
		logServicePostProcessor.postProcessBeforeInitialization(commonsBean, "");
		assertNotNull(commonsBean.getLogger());

	}

	@Test
	public void testJSE() {
		JSELogBean jseBean = new JSELogBean();
		logServicePostProcessor.postProcessBeforeInitialization(jseBean, "");
		assertNotNull(jseBean.getLogger());
	}

	@Test
	public void testSfl4J() {
		Sfl4jLogBean sfl4jLogBean = new Sfl4jLogBean();
		logServicePostProcessor.postProcessBeforeInitialization(sfl4jLogBean, "");
		assertNotNull(sfl4jLogBean.getLogger());
	}

}
</pre>
<p>Metoda &#8220;uwspólniająca&#8221; testy  to tylko taki mały helper dla pluginu <a href="http://moreunit.sourceforge.net/">moreUnit</a>. Wiąże on test z metodą po nazwie, a nie wywołaniu co zmusza do robienia tego typu udziwnień.</p>
<h5>Implementacja właściwa</h5>
<p>Teraz czas na właściwą implementację klasy <samp>LogServicePostProcessor</samp>:</p>
<p class="listing">Listing 5. <samp>LogServicePostProcessor</samp>, czyli nasz procesorek</p>
<pre class="java" name="code">
package pl.koziolekweb.loggerservice;

import java.lang.reflect.Field;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.ReflectionUtils.FieldCallback;

import pl.koziolekweb.loggerservice.LogService.LoggerType;

public class LogServicePostProcessor implements BeanPostProcessor {

	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
		ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
			public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
				LogService logServiceAnnotation = field.getAnnotation(LogService.class);
				if (logServiceAnnotation != null) {
					LoggerType loggerType = logServiceAnnotation.loggerType();
					switch (loggerType) {
					case javaSeLogging:
						setJavaSeLoggerService(bean, field);
						break;
					case log4j:
						setLog4jService(bean, field);
						break;
					case sfl4j:
						setSfl4jService(bean, field);
						break;
					case commonsLogger:
						setCommonsLoggerService(bean, field);
						break;
					default:
						setByType(bean, field);
						break;
					}
				}
			}

		});
		return bean;
	}

	private void setByType(Object bean, Field field) throws IllegalAccessException {
		Class<?> type = field.getType();
		if (type.equals(Log.class))
			setCommonsLoggerService(bean, field);
		if (type.equals(java.util.logging.Logger.class))
			setJavaSeLoggerService(bean, field);
		if (type.equals(org.apache.log4j.Logger.class))
			setLog4jService(bean, field);
		if (type.equals(Logger.class))
			setSfl4jService(bean, field);
	}

	private void setCommonsLoggerService(final Object bean, Field field) throws IllegalAccessException {
		Log log = LogFactory.getLog(bean.getClass());
		setLogger(bean, field, log);
	}

	private void setJavaSeLoggerService(final Object bean, Field field) throws IllegalAccessException {
		java.util.logging.Logger log = java.util.logging.Logger.getLogger(bean.getClass().getName());
		setLogger(bean, field, log);
	}

	private void setLog4jService(final Object bean, Field field) throws IllegalAccessException {
		org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(bean.getClass());
		setLogger(bean, field, log);
	}

	private void setLogger(final Object bean, Field field, Object log) throws IllegalAccessException {
		boolean orginalAccessFlag = field.isAccessible();
		if (!orginalAccessFlag) {
			field.setAccessible(true);
		}
		field.set(bean, log);
		field.setAccessible(orginalAccessFlag);
	}

	private void setSfl4jService(final Object bean, Field field) throws IllegalAccessException {
		Logger log = LoggerFactory.getLogger(bean.getClass());
		setLogger(bean, field, log);
	}

}</pre>
<p>Jak widać implementacja ma konstrukcję zbliżoną do konstrukcji cepa. Kilka ifów plus obsługa debilizmów i własnych rozszerzeń typów przez użyszkodnika. Takie państwo w państwie <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Przydatne jeżeli komuś zamarzy się dodawanie nowych typów loggerów.</p>
<h5>Użycie w pliku <samp>xml</samp></h5>
<p>By użyć tego rozwiązania w pliku XML springa wystarczy dodać wpis:</p>
<p class="listing">Listing 6. Użycie w konfiguracji Springa</p>
<pre class="xml" name="code">
<bean class="pl.koziolekweb.loggerservice.LogServicePostProcessor"/>
</pre>
<p>Nawet ID nie trzeba podawać. </p>
<h4>Podsumowanie i informacje o dostępie</h4>
<p>Projekt jest hostowany na <a href="http://code.google.com/p/koziolek-logger/">Google Code</a>.<br />
Licencja GPLv3. Sorry Winnetou inaczej nie będzie.<br />
Budowany za pomocą Maven2.<br />
To wszystko powinno działać do końca tego tygodnia, bo już ciężkiej kurwicy dostaję z pluginem SVN do Eclipse.<br />
Wszystkie informacje oraz przykłady użycia, jak ktoś nie umie czytać testów będą na stronie projektu.</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/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/&amp;title=Spring+Logger+Service%2C+przyk%C5%82adowy+procesor+adnotacji+w+Springu" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do Del.icio.us" alt="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' 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/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/&amp;title=Spring+Logger+Service%2C+przyk%C5%82adowy+procesor+adnotacji+w+Springu" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do digg" alt="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' 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/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do Technorati" alt="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' 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/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/&amp;title=Spring+Logger+Service%2C+przyk%C5%82adowy+procesor+adnotacji+w+Springu" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do Stumble Upon" alt="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' 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/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/&amp;title=Spring+Logger+Service%2C+przyk%C5%82adowy+procesor+adnotacji+w+Springu" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do Google Bookmarks" alt="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' 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/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/&amp;t=Spring+Logger+Service%2C+przyk%C5%82adowy+procesor+adnotacji+w+Springu" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do FaceBook" alt="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' 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/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/&amp;title=Spring+Logger+Service%2C+przyk%C5%82adowy+procesor+adnotacji+w+Springu" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do wykop.pl" alt="dodaj 'Spring Logger Service, przykładowy procesor adnotacji w Springu' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2010/11/07/spring-logger-service-przykladowy-procesor-adnotacji-w-springu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vaadin jako klient webservice I: Przygotowanie projektu</title>
		<link>http://koziolekweb.pl/2010/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/</link>
		<comments>http://koziolekweb.pl/2010/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 12:25:43 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Sieć]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[Vaadin]]></category>
		<category><![CDATA[Web services]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1884</guid>
		<description><![CDATA[Witam w pierwszej części przewodnika &#8220;Vaadin jako klient webservice&#8221;. W tej części zajmiemy się przygotowaniem projektu. Jest to ważny etap ponieważ pozwoli on nam na zrozumienie jak działa aplikacja oraz przy okazji poznamy pewne sztuczki związane z optymalizacją aplikacji Vaadin za pomocą Springa. Cały proces przygotowania można podzielić na kilka etapów. Przygotowanie pom.xml Dodatkowa konfiguracja [...]]]></description>
			<content:encoded><![CDATA[<p>Witam w pierwszej części przewodnika &#8220;Vaadin jako klient webservice&#8221;. W tej części zajmiemy się przygotowaniem projektu. Jest to ważny etap ponieważ pozwoli on nam na zrozumienie jak działa aplikacja oraz przy okazji poznamy pewne sztuczki związane z optymalizacją aplikacji Vaadin za pomocą Springa.<br />
Cały proces przygotowania można podzielić na kilka etapów.</p>
<ul style="list-style-type:decimal">
<li>Przygotowanie <samp>pom.xml</samp></li>
<li>Dodatkowa konfiguracja Vaadin</li>
<li>Podstawowa konfiguracja Springa i JPA</li>
<li>Wygenerowanie klienta WS za pomocą Axis</li>
<li>Posprzątanie wygenerowanych klas i ich konfiguracja jako beanów Springa</li>
</ul>
<p>Kroki są podane w najwygodniejszej, moim skromnym zdaniem, kolejności. Najlepiej wykonywać je na raz (w ramach jednej sesji kodowania), ponieważ brak któregokolwiek, w przypadku naszej aplikacji, będzie powodował dość nieprzyjemny fail.<br />
Zaczynamy&#8230;</p>
<h4>Przygotowanie <samp>pom.xml</samp></h4>
<p>Z linii poleceń generujemy projekt Vaadin. Następnie dodajemy niezbędne zależności do Sprina, JPA2, Hibernate, bazy danych (postgres) oraz dodatkowo wykorzystywany w tym konkretnym miejscu ICEPush. Komponent Vaadin pozwalający na wykonywanie żądań typu push z serwera do przeglądarki (tzw. Comet). To ostatnie rozwiązanie wymaga pobrania komponentu z ICEPush-gwt ze strony <a href="http://www.icepush.org//">icepush.org</a>. Całość na licencji MPL no i trzeba się rejestrować. Jeżeli chcemy korzystać z tego komponentu należy dodatkowo skonfigurować Vaadin.</p>
<h4>Dodatkowa konfiguracja Vaadin</h4>
<p>Komponent ICEPush wymaga dwóch rzeczy. Po pierwsze należy wymienić klasę servletu obsługującego naszą aplikację. Nowa postać pliku <samp>web.xml</samp>:</p>
<p class="listing">Listing 1. <samp>web.xml</samp> skonfigurowany dla ICEPush</p>
<pre name="code" class="xml">
<servlet>
		<servlet-name>Vaadin Application Servlet</servlet-name>
		<servlet-class>org.vaadin.artur.icepush.ICEPushServlet</servlet-class>
		<init-param>
			<description>Vaadin application class to start</description>
<param-name>application</param-name>
<param-value>pl.koziolekweb.vaadin.codecompiler.MyVaadinApplication</param-value>
		</init-param>
		<init-param>
<param-name>widgetset</param-name>
<param-value>pl.koziolekweb.vaadin.codecompiler.widgetset.MyAppWidgetSet</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
</pre>
<p>Piękne to nie jest, ale działa. Kolejnym krokiem jest stworzenie pliku <samp>MyAppWidgetSet.gwt.xml</samp> w wybranym pakiecie. Którym dokładnie? Wszystko jedno, bo to tylko sprawa organizacyjna. Plik ten powinien wyglądać w następujący sposób:</p>
<p class="listing">Listing 2. <samp>MyAppWidgetSet.gwt.xml</samp> skonfigurowany dla ICEPush</p>
<pre name="code" class="xml">
<module>
	<inherits name="com.vaadin.terminal.gwt.DefaultWidgetSet" />
	<inherits name="org.icepush.gwt.ICEpush" />
	<inherits name="org.vaadin.artur.icepush.IcepushaddonWidgetset" />
	<set-property name="user.agent" value="gecko" />
</module>
</pre>
<p>Ostatni wpis należy usunąć gdy chcemy budować aplikację produkcyjnie. Przy testowaniu lokalnym znacznie przyspiesza pracę. </p>
<p>Czyli podsumowując te dwa etapy. Mamy projekt Vaadin z dodatkowymi modułami, które go <samp>pom.xml</samp> wygląda tak:</p>
<p class="listing">Listing 3. <samp>pom.xml</samp> skonfigurowany dla projektu</p>
<pre name="code" class="xml">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>pl.koziolekweb.vaadin.codecompiler</groupId>
	<artifactId>code-compiler</artifactId>
<packaging>war</packaging>
	<version>0.1</version>
	<name>Vaadin Web Application</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring.version>3.0.3.RELEASE</spring.version>
	</properties>

	<build>
<plugins>
<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.6</version>
				<configuration>
					<suiteXmlFiles>
						<suiteXmlFile>src/test/testng.xml</suiteXmlFile>
					</suiteXmlFiles>
				</configuration>
			</plugin>
<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
				<version>2.8</version>
				<configuration>
					<downloadSources>true</downloadSources>
					<downloadJavaDoc>true</downloadJavaDoc>
				</configuration>
				<executions>
					<execution>
						<id>eclipse</id>
<phase>clean</phase>
						<goals>
							<goal>clean</goal>
							<goal>eclipse</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>maven-jetty-plugin</artifactId>
				<version>6.1.24</version>
				<configuration>
					<stopPort>9966</stopPort>
					<stopKey>code-compiler</stopKey>
					<scanIntervalSeconds>0</scanIntervalSeconds>
					<webAppConfig>
						<contextPath>/code-compiler</contextPath>
						<baseResource implementation="org.mortbay.resource.ResourceCollection">
							<resourcesAsCSV>src/main/webapp,${project.build.directory}/${project.build.finalName}</resourcesAsCSV>
						</baseResource>
					</webAppConfig>
				</configuration>
			</plugin>
<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>gwt-maven-plugin</artifactId>
				<version>1.3-SNAPSHOT</version>
				<configuration>
					<webappDirectory>${project.build.directory}/${project.build.finalName}/VAADIN/widgetsets</webappDirectory>
					<extraJvmArgs>-Xmx512M -Xss1024k</extraJvmArgs>
					<runTarget>clean</runTarget>
					<hostedWebapp>${project.build.directory}/${project.build.finalName}</hostedWebapp>
					<noServer>true</noServer>
<port>8080</port>
					<soyc>false</soyc>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>resources</goal>
							<goal>compile</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
<plugin>
				<groupId>com.vaadin</groupId>
				<artifactId>vaadin-maven-plugin</artifactId>
				<version>1.0.1</version>
				<executions>
					<execution>
						<goals>
							<goal>update-widgetset</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>vaadin-snapshots</id>
			<url>http://oss.sonatype.org/content/repositories/vaadin-snapshots/</url>
			<releases>
				<enabled>false</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>vaadin-addons</id>
			<url>http://maven.vaadin.com/vaadin-addons</url>
		</repository>
		<repository>
			<id>jboss</id>
			<url>http://repository.jboss.org/maven2</url>
		</repository>
	</repositories>

	<dependencies>
		<!-- Vaadin -->
		<dependency>
			<groupId>com.vaadin</groupId>
			<artifactId>vaadin</artifactId>
			<version>6.4.7</version>
		</dependency>
		<dependency>
			<groupId>org.vaadin.addons</groupId>
			<artifactId>icepush</artifactId>
			<version>0.2.0</version>
		</dependency>
		<dependency>
			<groupId>org.icepush</groupId>
			<artifactId>icepush</artifactId>
			<version>2.0</version>
		</dependency>
		<dependency>
			<groupId>org.icepush</groupId>
			<artifactId>icepush-gwt</artifactId>
			<version>2.0</version>
		</dependency>
		<dependency>
			<groupId>com.google.gwt</groupId>
			<artifactId>gwt-user</artifactId>
			<version>2.0.4</version>
			<scope>provided</scope>
		</dependency>

		<!-- WS -->
		<dependency>
			<groupId>axis</groupId>
			<artifactId>axis</artifactId>
			<version>1.4</version>
		</dependency>

		<!-- JPA -->
		<dependency>
			<groupId>org.hibernate.java-persistence</groupId>
			<artifactId>jpa-api</artifactId>
			<version>2.0-cr-1</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>3.5.0-Beta-2</version>
		</dependency>
		<dependency>
			<groupId>postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>8.4-702.jdbc4</version>
		</dependency>

		<!-- spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.4.2</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.4.2</version>
		</dependency>

		<!-- test -->
		<dependency>
			<groupId>org.testng</groupId>
			<artifactId>testng</artifactId>
			<version>LATEST</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-all</artifactId>
			<version>1.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>
</pre>
<h4>Podstawowa konfiguracja Springa i JPA</h4>
<p>Przejdźmy teraz do konfiguracji Springa i JPA. Na konfigurację składa się kilka plików. Jednak zanim je pokażę to muszę omówić to jak wygląda classpath w obecnym stanie aplikacji. Otóż jeżeli chcemy prawidłowo skonfigurować aplikację do współpracy z JPA to będziemy musieli stworzyć plik <samp>META-INF/persistance.xml<samp>. Problem tkwi w tym, gdzie jest prawidłowe położenie katalogu <samp>META-INF<samp>. Okazuje się, że w musi się on znajdować w <samp>${project.base}/src/main/webapp/WEB-INF/classes/META-INF/<samp>. Można to obejść odpowiednio konfigurując <samp>resource-plugin</samp>. Ja jednak nie miałem na to siły.<br />
Oto lista plików konfiguracyjnych:</p>
<ul>
<li><samp>persistance.xml</samp> &#8211; konfiguracja JPA.</li>
<li><samp>service.properties</samp> &#8211; konfiguracje różne, których nie chcemy w pliku springa.</li>
<li><samp>spring.xml</samp> &#8211; konfiguracja springa.</li>
<li><samp>log4j.xml</samp> &#8211; konfiguracja log4j.</li>
</ul>
<p>Jadąc po kolei.</p>
<h5><samp>persistance.xml</samp></h5>
<p>W wersji dla Postgresa. Pamiętajcie by mieć już założoną bazę danyc.</p>
<p class="listing">Listing 4. <samp>persistance.xml</samp> wersja postgresowa</p>
<pre name="code" class="xml">
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="codecompilerPU"
		transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.connection.password" value="******"/>
<property name="hibernate.connection.username" value="******"/>
		</properties>
	</persistence-unit>
</persistence>
</pre>
<p>Później do tego pliku będziemy dopisywać mapowane klasy. To już jednak twój problem by o tym pamiętać <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h5><samp>service.properties</samp></h5>
<p>Czyli różne ustawienia, które warto mieć gdzieś pod ręką, ale nie koniecznie w pliku springowym. </p>
<p class="listing">Listing 5. <samp>service.properties</samp></p>
<pre name="code" class="php">
ideone.user=******
ideone.pass=******
</pre>
<p>Mam tu na razie tylko informacje o danych dostępowych do serwisu.</p>
<h5><samp>spring.xml</samp></h5>
<p>Konfiguracja springa. Najważniejszy element układanki. Też będzie rósł, ale będę wam mówił co dodałem</p>
<p class="listing">Listing 6. <samp>spring.xml</samp></p>
<pre name="code" class="xml">
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-3.0.xsd  http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<!-- holding properties for database connectivity / -->
	<context:property-placeholder location="classpath:service.properties" />
	<!-- enabling annotation driven configuration / -->
	<context:annotation-config />
	<context:component-scan base-package="pl.koziolekweb.vaadin.codecompiler" />
	<tx:annotation-driven transaction-manager="transactionManager" />

	<bean
		class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource"
		p:driverClassName="org.postgresql.Driver" p:url="jdbc:postgresql://localhost:5432/codecompiler" />

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
		p:entityManagerFactory-ref="entityManagerFactory" />

	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
		p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
<property name="loadTimeWeaver">
			<bean
				class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
		</property>
<property name="persistenceUnitName" value="codecompilerPU"></property>
	</bean>
	<bean id="jpaAdapter"
		class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</beans>
</pre>
<p>Na razie tyle wystarczy.</p>
<h5><samp>log4j.xml</samp></h5>
<p>Wbrew pozorom istotny plik. Jak coś nie bangla i nie sypie błędami to właśnie tu można poszukać przyczyny. </p>
<p class="listing">Listing 7. <samp>log4j.xml</samp> wersja postgresowa</p>
<pre name="code" class="xml">
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
		</layout>
	</appender>

	<root>
<priority value="info" />
		<appender-ref ref="console" />
	</root>

	<logger name="org.springframework.web.context.ContextLoader">
		<level value="info" />
		<appender-ref ref="console" />
	</logger>
</log4j:configuration>
</pre>
<h4>Wygenerowanie klienta WS za pomocą Axis</h4>
<p>Zrób to w Eclipse. W zasadzie tyle. Adres pliku <samp>wsdl</samp> znajdziesz w dokumentacji lub jak sam go tworzysz to wiesz gdzie jest.</p>
<h4>Posprzątanie wygenerowanych klas i ich konfiguracja jako beanów Springa</h4>
<p>Wygenerowane klasy mają zapewne brzytkie nazwy i jeszcze gorsze pakiety. Generalnie usuwamy podkreślenia z nazw, a całosć przenosimy do jakiegoś rozsądnego pakietu. Kolejnym etapem jest dopisanie konfiguracji do pliku <samp>spring.xml</samp>:</p>
<p class="listing">Listing 8. Konfiguracja API Ideone w springu</p>
<pre name="code" class="xml">
	<!-- Ideone API beans -->
	<bean id="ideoneServiceUser" class="pl.koziolekweb.vaadin.codecompiler.data.ServiceUser">
		<constructor-arg value="${ideone.user}" />
		<constructor-arg value="${ideone.pass}" />
	</bean>

	<bean id="ideoneServicePortFactory"
		class="pl.koziolekweb.vaadin.codecompiler.com.ideone.api.IdeoneServiceServiceLocator">
	</bean>

	<bean id="ideoneServicePort"
		class="pl.koziolekweb.vaadin.codecompiler.com.ideone.api.IdeoneServicePort"
		factory-bean="ideoneServicePortFactory" factory-method="getIdeoneServicePort">
	</bean>
</pre>
<p>Oczywiście pytanie jak wygląda <samp>ServiceUser</samp>:</p>
<p class="listing">Listing 8. <samp>ServiceUser</samp> dane do logowania</p>
<pre name="code" class="java">
package pl.koziolekweb.vaadin.codecompiler.data;

public class ServiceUser {

	public final String user;
	public final String pass;

	public ServiceUser(String user, String pass) {
		super();
		this.user = user;
		this.pass = pass;
	}

	public String getUser() {
		return user;
	}

	public String getPass() {
		return pass;
	}

}
</pre>
<p>No i mamy konfigurację&#8230;</p>
<h4>Optymalizacja za pomocą Springa</h4>
<p>Drugą rzeczą jaką się dziś zajmiemy jest &#8220;optymalizacja&#8221; aplikacji Vaadin za pomocą Springa. Przez optymalizację rozumiem tu ograniczenie ilości pamięci zużywanej przez Vaadin.<br />
Na początek musimy przypomnieć sobie informacje o tym jak Spring tworzy instancje poszczególnych ziaren. Jedyne co nas interesuje to informacja, że domyślnie każde ziarno jest singletonem. Ta informacja jest ważna z kilku powodów. Po pierwsze musimy pamiętać, że spring nie wie, że pracuje w trybie web oraz, że warto by było gdyby niektóre komponenty dostarczał świeże. Samodzielnie musimy zagwarantować takie zachowanie poprzez odpowiednią konfigurację. Po drugie skoro wiemy, że komponenty GUI powinny być dostarczane na świeżo musimy zobaczyć, które z nich mogą być współdzielone pomiędzy użytkownikami. Zazwyczaj są to komponenty statyczne, których treść nie jest edytowana i nie zależy od stanu sesji użytkownika. Na przykład stopka. Po trzecie należy wiedzieć i pamiętać, że Vaadin przechowuje stan ekranu po stronie serwera! Zatem jeżeli 100 użytkowników otworzy 100 okien (sesji http) to otrzyma np. 100 obiektów stopki. Niby nic, ale dużo. Po stronie serwera będą leżeć identyczne, niemodyfikowalne obiekty w dużych ilościach. Zatem można spokojnie zamienić je na jeden współedzielony obiekt. Spring zadba by nie stała mu się krzywda np. usunięcie z pamięci. </p>
<p>Przykład będzie w kolejnej części w której połączymy się z WS, wywołamy testową metodę oraz zaczniemy budować UI.</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/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/&amp;title=Vaadin+jako+klient+webservice+I%3A+Przygotowanie+projektu" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do Del.icio.us" alt="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' 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/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/&amp;title=Vaadin+jako+klient+webservice+I%3A+Przygotowanie+projektu" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do digg" alt="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' 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/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do Technorati" alt="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' 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/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/&amp;title=Vaadin+jako+klient+webservice+I%3A+Przygotowanie+projektu" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do Stumble Upon" alt="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' 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/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/&amp;title=Vaadin+jako+klient+webservice+I%3A+Przygotowanie+projektu" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do Google Bookmarks" alt="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' 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/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/&amp;t=Vaadin+jako+klient+webservice+I%3A+Przygotowanie+projektu" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do FaceBook" alt="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' 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/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/&amp;title=Vaadin+jako+klient+webservice+I%3A+Przygotowanie+projektu" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do wykop.pl" alt="dodaj 'Vaadin jako klient webservice I: Przygotowanie projektu' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2010/10/30/vaadin-jako-klient-webservice-i-przygotowanie-projektu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne</title>
		<link>http://koziolekweb.pl/2010/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/</link>
		<comments>http://koziolekweb.pl/2010/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 18:09:27 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[J5EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[Vaadin]]></category>
		<category><![CDATA[Web services]]></category>
		<category><![CDATA[Jetty]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=1882</guid>
		<description><![CDATA[Zapowiada się dłuższy tekst i zanim do niego przejdę chciałbym przygotować was mentalnie na to czym będziemy się zajmować. Przy okazji jednego z poprzednich wpisów pojawiło się pytanie o wydajność Vaadin. Jest to dość istotne jeżeli przyjmiemy, że nasza aplikacja powinna być skalowalna. Kwestia wydajności tego typu rozwiązań jest zawsze dyskusyjna. Bo czymże jest wydajność? [...]]]></description>
			<content:encoded><![CDATA[<p>Zapowiada się dłuższy tekst i zanim do niego przejdę chciałbym przygotować was mentalnie na to czym będziemy się zajmować.</p>
<p>Przy okazji jednego z <a href="http://koziolekweb.pl/2010/10/20/vaadin-jfreechart-i-dlaczego-nie-gae/#comments">poprzednich wpisów</a> pojawiło się pytanie o wydajność Vaadin. Jest to dość istotne jeżeli przyjmiemy, że nasza aplikacja powinna być skalowalna. Kwestia wydajności tego typu rozwiązań jest zawsze dyskusyjna. Bo czymże jest wydajność? Jak ją mierzyć w odniesieniu do aplikacji dostarczających web-GUI? Niewątpliwie najważniejszym czynnikiem jest szybkość odpowiedzi na żądania. Na tym polu Vaadin sprawuje się bardzo dobrze, ale by tak było muszą zostać spełnione pewne warunki.</p>
<h4>Vaadin to interfejs</h4>
<p>Po pierwsze aplikacja jest tylko dostawcą GUI. Logika biznesowa ogranicza się do minimalnego minimum. Aplikacja ma być tylko <b>interfejsem</b> pozwalającym na wywoływanie metod interfejsów biznesowych. Najlepiej w postaci całkowicie asynchronicznego dostępu do komponentów. To uzyskujemy dzięki zastosowaniu technologii AJAX.<br />
Po drugie sposób dostępu do interfejsów biznesowych powinien być łatwo &#8220;przepinalny&#8221;. Oznacza to, że aplikacja będzie wykorzystywać różne usługi i komponenty biznesowe pobierając informacje o nich za pomocą jakiegoś interfejsu fabrykującego. Interfejs taki powinien pozwalać na przesłonięcie rzeczywistej implementacji nie tylko na poziomie &#8220;jak to jest zrobione&#8221;, ale też na poziomie &#8220;w czym to jest zrobione&#8221; inaczej mówiąc jeżeli zgłaszam się po jakiś interfejs to mnie nie obchodzi czy uzyskam komponent EJB, bean Springa czy endpoint webservice. W praktyce jedyną rzeczą jaka powinna mnie obchodzić powinno być tylko podanie prawidłowej nazwy komponentu. I to nazwy domenowej, a nie wskazania na źródło! Przykład takiej implementacji pokazałem w poście o integracji <a href="http://koziolekweb.pl/2010/03/28/vaadin-i-integracja-ze-springiem-2-0-x/">Vaadin ze Springiem</a>.<br />
Po trzecie należy pamiętać o ograniczeniach wynikających z samej natury aplikacji webowych. Nie należy płakać, że przy 50requestach na minutę zawierających ciężkie zapytania np. raporty z bazy danych nasz serwer padł. Jeżeli jest to serwer typu 111 &#8211; 1 rdzeń, 1GB ram, 1połączenie do bazy to nie należy się dziwić. Pod tym względem należy zachowywać czujność rewolucyjną i w razie czego dostawiać kolejne maszyny. Niestety era aplikacji biznesowych, które mieściły się w 64kb RAM odeszła do lamusa.</p>
<p>Zatem jeżeli chcemy pisać wydajne aplikacje w Vaadin należy pamiętać, że jest to narzędzie do budowy interfejsu graficznego i takim powinno pozostać. Należy też wziąć pod uwagę, że web-GUI zazwyczaj nie jest najcięższym obliczeniowo elementem, ale dobrze napisane można pominąć w rozważaniach o pojedynczym scenariuszu. Zazwyczaj problemy leżą gdzieś w logice biznesowej, a ta jest wyprowadzona z GUI.</p>
<h4>Niezbędne przygotowania dla naszej aplikacji</h4>
<p>Chcąc stworzyć aplikację &#8211; klienta WebService musimy poczynić pewne przygotowania. Po pierwsze musimy mieć WS. Ja wykorzystam API udostępnione przez <a href="http://Ideone.com">Ideone.com</a>, które to pozwala na zdalną kompilację kodu w jednym z wielu dostępnych języków. Całość śmiga pod kontrolą Gentoo, zatem mamy do dyspozycji wszystkie kompilatory dostępne w tej dystrybucji. Jeżeli zatem chcesz przerabiać dokładnie mój przykład zarejestruj się na <a href="http://Ideone.com">Ideone.com</a>(bezpłatnie) i skonfiguruj sobie dostęp do API.<br />
Po drugie musicie uzbroić się w cierpliwość. Będę chciał pokazać kompletny projekt, a to jest dużo kodu. Będę korzystał ze Springa3, JPA 2 i Hibernate 3.5. Platformą budującą będzie Maven 3. Całość uruchomię na serwerze Jetty. </p>
<p>Do miłego <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </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/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/&amp;title=Aplikacja+Vaadin+jako+klient+webservices+%26%238211%3B+s%C5%82owo+wst%C4%99pne" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do Del.icio.us" alt="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' 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/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/&amp;title=Aplikacja+Vaadin+jako+klient+webservices+%26%238211%3B+s%C5%82owo+wst%C4%99pne" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do digg" alt="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' 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/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do Technorati" alt="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' 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/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/&amp;title=Aplikacja+Vaadin+jako+klient+webservices+%26%238211%3B+s%C5%82owo+wst%C4%99pne" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do Stumble Upon" alt="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' 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/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/&amp;title=Aplikacja+Vaadin+jako+klient+webservices+%26%238211%3B+s%C5%82owo+wst%C4%99pne" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do Google Bookmarks" alt="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' 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/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/&amp;t=Aplikacja+Vaadin+jako+klient+webservices+%26%238211%3B+s%C5%82owo+wst%C4%99pne" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do FaceBook" alt="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' 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/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/&amp;title=Aplikacja+Vaadin+jako+klient+webservices+%26%238211%3B+s%C5%82owo+wst%C4%99pne" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do wykop.pl" alt="dodaj 'Aplikacja Vaadin jako klient webservices &#8211; słowo wstępne' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2010/10/29/aplikacja-vaadin-jako-klient-webservices-slowo-wstepne/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

