<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Blog Espeo Software</title>
	<atom:link href="http://espeo.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://espeo.wordpress.com</link>
	<description>O technologii i biznesie naszym zdaniem</description>
	<lastBuildDate>Tue, 08 Sep 2009 18:06:29 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='espeo.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Blog Espeo Software</title>
		<link>http://espeo.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://espeo.wordpress.com/osd.xml" title="Blog Espeo Software" />
	<atom:link rel='hub' href='http://espeo.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Google GIN, czyli dependency injection w GWT</title>
		<link>http://espeo.wordpress.com/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/</link>
		<comments>http://espeo.wordpress.com/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 15:05:48 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[gin]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=160</guid>
		<description><![CDATA[Wstęp Google GIN (GWT INjection) to stosunkowo młody projekt Google, wprowadzający do Google Web Toolkit możliwość wstrzykiwania zależności (ang. dependency injection). Oparty jest na Google Guice (o którym pisałem kilka tygodni temu) i zapewnia pewien podzbiór funkcjonalności tej biblioteki.  Po co więc GIN? Potrzeba wynika wprost ze specyfiki aplikacji tworzonych w GWT, która uniemożliwia zastosowanie [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=160&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Wstęp</h2>
<p><a href="http://code.google.com/p/google-gin/" target="_blank">Google GIN (GWT INjection)</a> to stosunkowo młody projekt Google, wprowadzający do <a href="http://code.google.com/webtoolkit/" target="_blank">Google Web Toolkit</a> możliwość wstrzykiwania zależności (ang. <em>dependency injection</em>). Oparty jest na <a href="http://code.google.com/p/google-guice/" target="_blank">Google Guice</a> (o którym <a href="http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/" target="_blank">pisałem kilka tygodni temu</a>) i zapewnia pewien podzbiór funkcjonalności tej biblioteki.  Po co więc GIN? Potrzeba wynika wprost ze specyfiki aplikacji tworzonych w GWT, która uniemożliwia zastosowanie &#8222;typowego&#8221; frameworka do wstrzykiwania zależności. Rozwinę ten temat za chwilę.</p>
<p>Póki co, nie ma możliwości pobrania skompilowanej biblioteki ze strony projektu (tak jak pisałem, jest to jeszcze wczesna faza rozwoju), więc pozostaje <em>check out</em> z publicznego repozytorium i własnoręczna kompilacja:</p>
<pre><pre class="brush: bash;">
svn checkout http://google-gin.googlecode.com/svn/trunk/ google-gin-read-only
cd google-gin-read-only
ant dist
</pre></pre>
<p>Zbudowanego JARa (<strong>./out/dist/gin.jar</strong>) oczywiście należy dołączyć do swojego projektu.</p>
<h2>Zaczynamy!</h2>
<p>Mamy już dostępne klasy GIN, więc można zaczynać. W regularnym Guice, po skonfigurowaniu zależności w klasie modułu i utworzeniu <strong>Injector</strong>a, obiekty pobiera się mniej więcej tak:</p>
<pre><pre class="brush: java;">
RegistrationService registrationService = injector.getInstance(RegistrationService.class);
</pre></pre>
<p>W GWT jednak powyższy kod nie zadziała. Żeby być ścisłym: nie zadziała w komponentach po stronie klienta (ang. <em>client-side</em>). Jak wiadomo, aplikacja GWT dzieli się na stronę klienta i stronę serwera. Po stronie serwera nie ma żadnego problemu ze wstrzykiwaniem zależności. Obiekty są instancjonowane w rzeczywistym JRE (najczęściej w kontenerze serwletów) i żyją &#8222;normalnym&#8221; Javowym życiem. Można używać Guice, Spring albo dowolnego innego rozwiązania do wstrzykiwania zależności i będzie działać. Po stronie klienta wygląda to jednak zupełnie inaczej, ponieważ kod Java jest kompilowany do JavaScript, więc JRE nie istnieje (jest jedynie w niewielkim zakresie emulowane przez bibliotekę GWT). Standardowe użycie Guice nie zadziała więc z dwóch powodów:</p>
<ul>
<li>Na poziomie JavaScript nie istnieją klasy.</li>
<li>Guice (podobnie jak większość tego typu rozwiązań) często korzysta z mechanizmu <em>reflection</em> Javy, który nie jest w ogóle emulowany w GWT.</li>
</ul>
<p>GIN stosuje więc inny sposób na zapewnienie wstrzykiwania zależności. Na początek należy zaimportować moduł GIN we własnym module GWT.</p>
<pre><pre class="brush: xml;">
&amp;amp;lt;module&amp;amp;gt;
  ...
  &amp;amp;lt;inherits name=&quot;com.google.gwt.inject.Inject&quot; /&amp;amp;gt;
  ...
&amp;amp;lt;/module&amp;amp;gt;
</pre></pre>
<p>Teraz funkcjonalność oferowana przez GIN jest dostępna w obrębie strony klienta aplikacji GWT. Dochodzimy jednak ponownie do momentu, gdy &#8222;jakoś&#8221; trzeba w końcu te zależności pobrać. W GIN używa się do tego specjalnej wersji <strong>Injector</strong>a &#8212; <strong>Ginjector</strong>a (który jednak de facto nie jest związany relacją dziedziczenia z tym pierwszym).</p>
<pre><pre class="brush: java;">
public interface ApplicationGinjector extends Ginjector {
    ApplicationPresenter getApplicationPresenter();
}
</pre></pre>
<p><strong>Ginjector</strong> powinien oferować tylko komponenty potrzebne na etapie inicjalizacji aplikacji. Przy ich pobieraniu zostaną zainicjowane ich zależności, a więc również zależności tych zależności itd. W ten sposób zostanie zbudowany cały graf obiektów, a zależności automatycznie powstrzykiwane. W tym przypadku, komponentem potrzebnym na samym początku działania aplikacji jest <strong>ApplicationPresenter</strong>, który wyświetla ekran startowy. Zależności definiuje się dokładnie tak jak w Guice, czyli za pomocą adnotacji <strong>@Inject</strong>.</p>
<p>Jak wiadomo, <strong>Injector</strong> potrzebuje również modułu, w którym zawarte są informacje na temat komponentów.</p>
<pre><pre class="brush: java;">
public class ApplicationClientModule extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(ApplicationPresenter.class);
        // other bindings...
    }
}
</pre></pre>
<p>Jak widać, moduł po stronie klienta w GWT dziedziczy z <strong>AbstractGinModule</strong>. Poza tym wszystko wygląda dokładnie jak w Guice. Istotnym niuansem związanym z modułami GIN jest fakt, że w przypadku nie odnalezienia powiązania dla klasy, automatycznie wywoływana jest dla niej metoda <strong>GWT.create()</strong>, przez co niektóre rzeczy (np. asynchroniczne interfejsy usług) będą działać nawet bez odpowiedniej deklaracji w klasie modułu.</p>
<p>Zdefiniowany moduł należy jeszcze skojarzyć z właściwym interfejsem <strong>Ginjector</strong> za pomocą adnotacji <strong>@GinModules</strong>.</p>
<pre><pre class="brush: java;">
@GinModules(ApplicationClientModule.class)
public interface ApplicationGinjector extends Ginjector {
    ApplicationPresenter getApplicationPresenter();
}
</pre></pre>
<p>W ten sposób, <strong>Ginjector</strong> jest w stanie skonfigurować całą aplikację na podstawie danych zawartych w określonym module. Aby to zrobić, należy go utworzyć za pomocą wywołania <strong>GWT.create()</strong> oraz pobrać początkowe obiekty.</p>
<pre><pre class="brush: java;">
public final class Application implements EntryPoint {
    public void onModuleLoad() {
        ApplicationGinjector injector = GWT.create(ApplicationGinjector.class);
        ApplicationPresenter applicationPresenter = injector.getApplicationPresenter();
        applicationPresenter.go(RootPanel.get());
    }
}
</pre></pre>
<p>W ten sposób, cała procedura wstrzykiwania zależności ma miejsce już w czasie kompilacji. Użycie GIN nie jest więc związane z żadnym dodatkowym narzutem przetwarzania. (Wyszłoby na to samo, gdybyśmy konfigurowali komponenty ręcznie.)</p>
<h2>Prawie jak Guice</h2>
<p>Z użyciem GIN jest związanych kilka niuansów, o czym wspomniałem już na samym początku. GIN to nie jest mimo wszystko to samo co Guice, tylko dla GWT. Najbardziej istotne różnice w stosunku do Guice to:</p>
<ul>
<li>Zamiast typów <strong>Module</strong> i <strong>AbstractModule</strong> są <strong>GinModule</strong> i <strong>AbstractGinModule</strong>.</li>
<li>Zamiast typu <strong>Injector</strong> jest <strong>Ginjector</strong> z adnotacją <strong>@GinModules</strong>.</li>
<li>Niemożliwe jest użycie powiązania <strong>toInstance()</strong> i prawdopodobnie nigdy nie będzie możliwe (ze względu na to, że GIN działa w czasie kompilacji, a nie wykonania).</li>
<li>Na chwilę obecną nie jest możliwe definiowanie własnych zasięgów.</li>
<li>Nie ma adnotacji <strong>@ImplementedBy</strong> oraz <strong>@ProvidedBy</strong>.</li>
<li>Brak obsługi zależności cyklicznych.</li>
<li>Brak wsparcia dla AOP.</li>
</ul>
<p>Warto jeszcze dodać, że istnieje sposób na współpracę z regularnym Guice za pomocą klasy <strong>GinModuleAdapter</strong>, dzięki której <strong>GinModule</strong> staje się dostępny jako zwykły <strong>Module</strong>. Można więc rozważyć utworzenie wspólnej części zależności w postaci <strong>GinModule</strong>. Ponadto, zrozumienie jak działa strona klienta w GWT na pewno pomoże uniknąć wielu potencjalnych problemów z GIN.</p>
<h2>Podsumowanie</h2>
<p>Jak widać, w GWT również można wygodnie wstrzykiwać zależności i to korzystając z bardzo przyjaznego API znanego z Guice. Mimo, że biblioteka ta jest jeszcze nieco niedojrzała i nie doczekała się nawet wersji 1.0, moim zdaniem warto się nią zainteresować i zastosować we własnych projektach w Google Web Toolkit. Używając jej przez ostatnie kilka miesięcy nie napotkałem żadnych problemów (w szczególności ze stabilnością), a znacząco ułatwiłem sobie pracę, rezygnując z ręcznego wstrzykiwania zależności. Myślę, że Google jeszcze nie raz zaskoczy nas różnymi ciekawymi dodatkami do GWT. Póki co, zapraszam na <a href="http://code.google.com/p/google-gin/" target="_blank">stronę domową projektu</a> oraz zachęcam do własnych eksperymentów z Google GIN.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/160/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=160&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2ce6b3b56cc32e86d35f1b7c53e989b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">michalkalinowskiespeo</media:title>
		</media:content>
	</item>
		<item>
		<title>Google Guice, dependency injection framework</title>
		<link>http://espeo.wordpress.com/2009/08/18/google-guice-dependency-injection-framework/</link>
		<comments>http://espeo.wordpress.com/2009/08/18/google-guice-dependency-injection-framework/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 15:30:46 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=138</guid>
		<description><![CDATA[Wstęp Google Guice to framework wspierający wstrzykiwanie zależności (ang. dependency injection) w aplikacjach Java. Można by powiedzieć: kolejny framework wspierający wstrzykiwanie zależności. Faktycznie, trzeba przyznać, że rynek Javowych rozwiązań tego typu jest dość mocno nasycony już od dłuższego czasu i oferuje pełen przekrój złożoności bibliotek, zaczynając od bardzo lekkich, takich jak choćby PicoContainer, a kończąc [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=138&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Wstęp</h2>
<p><a href="http://code.google.com/p/google-guice/" target="_blank">Google Guice</a> to framework wspierający wstrzykiwanie zależności (ang. <em>dependency injection</em>) w aplikacjach Java. Można by powiedzieć: kolejny framework wspierający wstrzykiwanie zależności. Faktycznie, trzeba przyznać, że rynek Javowych rozwiązań tego typu jest dość mocno nasycony już od dłuższego czasu i oferuje pełen przekrój złożoności bibliotek, zaczynając od bardzo lekkich, takich jak choćby <a href="http://www.picocontainer.org/" target="_blank">PicoContainer</a>, a kończąc na pełnych stosach rozwiązań Java Enterprise ze <a href="http://www.springsource.org/about" target="_blank">Springiem</a> na czele. Czy warto więc zawracać sobie głowę Guice&#8217;m? Moim zdaniem warto, bo zaproponowane przez Google&#8217;a rozwiązanie pokazuje nową jakość w implementacji wstrzykiwania zależności w aplikacjach Java, czyniąc ogromny użytek z typów generycznych oraz adnotacji. Guice jest przy tym lekki, ma proste API i bardzo szybko można się go nauczyć. Dlaczego warto to zrobić? Bo jest dobry. Kolesie z Google&#8217;a go używają. Musi być dobry. Poza tym, wygrał <a href="http://www.joltawards.com/history/winners.html" target="_blank">18th Jolt Award</a> w kategorii <em>Libraries, Frameworks and Components</em>. Musi być dobry.</p>
<h2>Podstawy</h2>
<p>W Guice występują dwie podstawowe konstrukcje opisujące wstrzykiwanie zależności. Pierwszą są moduły, które mówią <em>co należy wstrzyknąć</em>, a drugą jest adnotacja <strong>@Inject</strong>, która mówi <em>gdzie należy wstrzyknąć</em>. Proste. Zobaczmy jak to działa na przykładzie usługi rejestracji użytkowników.</p>
<p><pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    private final PersistanceManager persistanceManager;
    private final MailService mailService;

    @Inject
    public RegistrationServiceImpl(PersistanceManager persistanceManager, MailService mailService) {
        this.persistanceManager = persistanceManager;
        this.mailService = mailService;
    }

    public void register(User user) {
        ...
    }
}
</pre></p>
<p>Jak widać naszą usługę specyfikuje kontrakt <strong>RegistrationService</strong>. Mamy jego implementację w postaci klasy <strong>RegistrationServiceImpl</strong>, która wymaga do działania usługi trwałości danych (<strong>PersistanceManager</strong>) oraz usługi do wysyłania maili (<strong>MailService</strong>). Chcielibyśmy, aby odpowiednie implementacje tych usług zostały automatycznie wstrzyknięte za pomocą parametrów konstruktora (adnotacja <strong>@Inject</strong>) już na etapie tworzenia usługi rejestracji. Spróbujmy opisać zależności między interfejsami a ich konkretnymi realizacjami za pomocą modułu.</p>
<p><pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(RegistrationService.class).to(RegistrationServiceImpl.class);
        bind(PersistanceManager.class).to(HibernatePersistanceManager.class);
        bind(MailService.class).to(JavaMailService.class);
    }
}
</pre></p>
<p>Mamy nasz moduł. Jak widać, metoda <strong>configure()</strong> zawiera definicje kolejnych powiązań. Mamy więc usługę rejestracji określoną kontraktem <strong>RegistrationService</strong> z przypisaną naszą implementacją <strong>RegistrationServiceImpl</strong>. Mamy również usługę trwałości danych <strong>PersistanceManager</strong> zaimplementowaną w klasie <strong>HibernatePersistanceManager</strong>, która używa Hibernate&#8217;a do zapewnienia trwałości encji, oraz usługę <strong>MailService</strong> wraz z implementacją <strong>JavaMailService</strong> korzystającą z JavaMail do wysyłania poczty.</p>
<p>OK. Wystarczy już tylko użyć zdefiniowanego zespołu obiektów i przeprowadzić rejestrację użytkownika.</p>
<p><pre class="brush: java;">
public class UserRegistrationExample {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new MyModule());
        RegistrationService registrationService = injector.getInstance(RegistrationService.class);
        User user = new User(&quot;Michal&quot;, &quot;Kalinowski&quot;);
        registrationService.register(user);
    }
}
</pre></p>
<p>To wszystko. Działa. &#8222;Prawie&#8221; jak w Springu, tylko zamiast trochę przydługawego pliku XML mamy elegancką implementację interfejsu <strong>Module</strong> w Javie, a zamiast identyfikowania obiektów za pomocą jakichś napisów mamy referencje do rzeczywistych klas. Myślę, że nie muszę wspominać jak ułatwia to refactoring. Jedyne do czego można się &#8222;przyczepić&#8221; to inwazyjność framework&#8217;a (odniesienia do API we własnych klasach), ale coś za coś. Wygoda jest niesamowita. Swoją drogą, pomysł na tyle przypadł do gustu kolesiom od Springa, że sami piszą już coś podobnego; nazywa się to <a href="http://www.springsource.org/javaconfig" target="_blank">Spring JavaConfig</a> i powinno niedługo zostać oficjalnie wydane.</p>
<p>Oczywiście, proste powiązania interfejs &lt;=&gt; klasa i wstrzykiwanie zależności przez konstruktor to nie koniec możliwości Guice.</p>
<h2>Powiązania</h2>
<p>Oprócz prostych powiązań klasy z interfejsem, jest również kilka bardziej zaawansowanych konstrukcji.</p>
<p>Jedną z nich jest powiązanie adnotacją. Wyobraźmy sobie, że <strong>JavaMailService</strong> ma zostać użyty przez 2 różne usługi. Jedna z nich, nasz <strong>RegistrationService</strong>, do rozsyłania poczty powinna używać konta na Gmail&#8217;u, a inna &#8211; konta na Yahoo. Nic prostszego. Potrzebna nam dodatkowa adnotacja.</p>
<p><pre class="brush: java;">
@BindingAnnotation
@Target( { FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface Gmail {
}
</pre></p>
<p>Modyfikujemy nieznacznie konstruktor naszej usługi rejestracji.</p>
<p><pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject
    public RegistrationServiceImpl(PersistanceManager persistanceManager, @Gmail MailService mailService) {
        this.persistanceManager = persistanceManager;
        this.mailService = mailService;
    }
    ...
}
</pre></p>
<p>Oczywiście potrzebne jest również dodatkowe powiązanie w module.</p>
<p><pre class="brush: java;">
bind(MailService.class).annotatedWith(Gmail.class).to(GmailJavaMailService.class);
</pre></p>
<p>Widać więc, że w Guice powiązanie jednoznacznie definiuje dopiero para adnotacji oraz typu.</p>
<p>Idźmy dalej. Jest możliwość stworzenia powiązania z konkretną instancją danego typu.</p>
<p><pre class="brush: java;">
bind(String.class).annotatedWith(JdbcUri.class).toInstance(&quot;jdbc:mysql://localhost/application&quot;);
</pre></p>
<p><pre class="brush: java;">
public class HibernatePersistanceManager implements PersistanceManager {
    public HibernatePersistanceManager(@JdbcUri String jdbcConnectionString) {
         ...
    }
    ...
}
</pre></p>
<p>Cool, huh? Można również zdefiniować w module własną metodę tworzenia obiektu. Używa się do tego adnotacji <strong>@Provides</strong>.</p>
<p><pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        ...
    }

    @Provides
    PersistanceManager providePersistanceManager() {
        HibernatePersistanceManager persistanceManager = new HibernatePersistanceManager(&quot;jdbc:mysql://localhost/application&quot;);
        persistanceManager.initConnectionPool();
        return persistanceManager;
    }
}
</pre></p>
<p>Robi się bałagan w klasie modułu? Napiszmy zewnętrzne providery dla naszych komponentów.</p>
<p><pre class="brush: java;">
public class DatabasePersistanceManagerProvider implements Provider&lt;PersistanceManager&gt; {
    private final Connection connection;

    @Inject
    public DatabasePersistanceManagerProvider(Connection connection) {
        this.connection = connection;
    }

    public PersistanceManager get() {
        DatabasePersistanceManager persistanceManager = new DatabasePersistanceManager();
        persistanceManager.setConnection(connection);
        return persistanceManager;
    }
}
</pre></p>
<p>I jeszcze odpowiednie powiązanie.</p>
<p><pre class="brush: java;">
bind(PersistanceManager.class).toProvider(DatabasePersistanceManagerProvider.class);
</pre></p>
<p>Można nawet zdefiniować providera bezpośrednio w interfejsie.</p>
<p><pre class="brush: java;">
@ProvidedBy(DatabasePersistanceManagerProvider.class)
public interface PersistanceManager {
    ...
}
</pre></p>
<p>Warto zwrócić uwagę, że definicje powiązań w Guice &#8222;czytają się same&#8221;. Jest to ogromna zaleta tej biblioteki. Nie ma tu nawet co tłumaczyć.</p>
<h2>Zasięgi</h2>
<p>Domyślnie Guice dostarcza nową instancję klasy przy każdym zapytaniu do kontenera. Można jednak zażyczyć sobie za pomocą adnotacji <strong>@Singleton</strong>, by istniała dokładnie jedna instancja danego komponentu w obrębie całej aplikacji. W aplikacjach webowych, po dołączeniu odpowiedniego dodatku do deskryptora <strong>web.xml</strong>, można używać również zasięgu sesyjnego (<strong>@SessionScoped</strong>) oraz zasięgu pojedynczego żądania HTTP (<strong>@RequestScoped</strong>). Zasięgi można ustawiać na kilka sposobów. Można np. zrobić to na samej klasie.</p>
<p><pre class="brush: java;">
@Singleton
public class JavaMailService implements MailService {
    ...
}
</pre></p>
<p>Nic nie stoi na przeszkodzie, by ustawić zasięg na metodzie tworzącej obiekt w obrębie modułu.</p>
<p><pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        ...
    }

    @Provides @Singleton
    MailService provideMailService() {
        ...
    }
}
</pre></p>
<p>Oczywiście, zawsze można zrobić to po prostu w definicji powiązania.</p>
<p><pre class="brush: java;">
bind(MailService.class).to(JavaMailService.class).in(Singleton.class);
</pre></p>
<h2>Wstrzykiwanie</h2>
<p>W Guice dostępne są 3 standardowe metody wstrzykiwania zależności. Widzieliśmy już wstrzykiwanie przez konstruktor. Można również użyć do tego regularnej metody (niekoniecznie klasycznego settera).</p>
<p><pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject
    public void provideLogger(Logger logger) {
        ...
    }
    ...
}
</pre></p>
<p>Można również wstrzykiwać bezpośrednio do pola klasy, ale jest to zdecydowanie niezalecane.</p>
<p><pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject Logger logger;
    ...
}
</pre></p>
<p>Można w Guice również wstrzykiwać same providery.</p>
<p><pre class="brush: java;">
public interface Provider&lt;T&gt; {
  T get();
}
</pre></p>
<p>Zapewniają one dodatkową elastyczność polegającą na tym, że kontener zwraca instancję komponentu-zależności wraz z każdym wywołaniem metody <strong>get()</strong>, a nie tylko jednorazowo na etapie tworzenia grafu obiektów.</p>
<p><pre class="brush: java;">
public class DatabasePersistanceManager implements PersistanceManager {
    private final Provider&lt;Connection&gt; connectionProvider;

    @Inject
    public DatabasePersistanceManager(Provider&lt;Connection&gt; connectionProvider) {
        this.connectionProvider = connectionProvider;
    }

    public void persist(Object entity) {
        Connection connection = connectionProvider.get();
        ... // do something with provided connection
    }
}
</pre></p>
<p>Jakie to może mieć zastosowanie? Różne, przeróżne. Możemy potrzebować wielu instancji tego samego komponentu. Możemy zechcieć pomieszać komponenty różnych zasięgów (np. wstrzykiwanie danych użytkownika utrzymywanych w sesji HTTP do komponentu z zasięgiem Singleton). Możemy wreszcie użyć późnego ładowania (ang. <em>lazy loading</em>), jeśli konstruowanie komponentu-zależności jest kosztowne, a nie musi być wykonywane za każdym razem.</p>
<h2>Czy to wszystko?</h2>
<p>Oczywiście, omówiono tylko część możliwości Guice, aczkolwiek prawdopodobnie wystarczy to w 90% zastosowań. Widać więc, jak szybko można tę technologię przyswoić. Więcej informacji można odnaleźć w <a href="http://code.google.com/p/google-guice/wiki/Motivation" target="_blank">dokumentacji</a> biblioteki. Znajduje się tam m.in. omówienie wsparcia dla programowania aspektowego oraz opis integracji Guice z rozwiązaniami webowymi. Warto tam zajrzeć.</p>
<h2>Podsumowanie</h2>
<p>Google Guice wydaje się stanowić bardzo ciekawą ofertę jako framework do wstrzykiwania zależności. Jeśli nie potrzebujemy bardzo kompleksowego rozwiązania takiego jak np. Spring, Guice powinien być w zupełności wystarczający. Jest bardzo lekki, prosty i ma niezwykle szybką krzywą uczenia. Dokładne przeczytanie tego posta powinno pozwolić na rozpoczęcie pracy, a w razie problemów zawsze pozostaje dokumentacja. Guice znacznie uprzyjemnia pracę programisty, pozwalając opisywać zależności i szczegóły ich wstrzykiwania za pomocą kodu Java &#8222;ozdobionego&#8221; adnotacjami i typami generycznymi, z zachowaniem jednocześnie deklaratywnego charakteru tego opisu. Jest to niewątpliwie znaczny krok do przodu. Uważam, że w dobrym kierunku.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/138/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=138&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2009/08/18/google-guice-dependency-injection-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2ce6b3b56cc32e86d35f1b7c53e989b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">michalkalinowskiespeo</media:title>
		</media:content>
	</item>
		<item>
		<title>Ignorowanie metadanych różnych IDE w SVN</title>
		<link>http://espeo.wordpress.com/2009/05/03/ignorowanie-metadanych-roznych-ide-w-svn/</link>
		<comments>http://espeo.wordpress.com/2009/05/03/ignorowanie-metadanych-roznych-ide-w-svn/#comments</comments>
		<pubDate>Sun, 03 May 2009 18:59:17 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[intellij idea]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=133</guid>
		<description><![CDATA[Dzisiaj krótka, aczkolwiek przydatna (mam nadzieję) notatka. Problem (choć raczej kosmetyczny), który napotkałem w trakcie realizacji bieżącego projektu, to pojawianie się w repozytorium SVN różnych &#8222;dziwnych&#8221; katalogów i plików, nie związanych bezpośrednio z projektem. Szybko udało mi się ustalić, że są to metadane generowane przez IDE inne niż Eclipse. Wcześniej, pracując w projektach, gdzie jedynym [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=133&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj krótka, aczkolwiek przydatna (mam nadzieję) notatka. Problem (choć raczej kosmetyczny), który napotkałem w trakcie realizacji bieżącego projektu, to pojawianie się w repozytorium SVN różnych &#8222;dziwnych&#8221; katalogów i plików, nie związanych bezpośrednio z projektem. Szybko udało mi się ustalić, że są to metadane generowane przez IDE inne niż Eclipse. Wcześniej, pracując w projektach, gdzie jedynym używanym IDE był Eclipse, automatycznie dopisywałem:</p>
<p><pre class="brush: bash;">
.classpath
.project
.settings
.wtpmodules
</pre></p>
<p>do atrybutu <strong>svn:ignore</strong> katalogu każdego projektu w ramach przestrzeni roboczej (ang. <em>workspace</em>) i było po problemie. Aktualnie mamy w zespole jednego NetBeans&#8217;owca i do powyższej listy trzeba było dopisać jeszcze:</p>
<p><pre class="brush: bash;">
nbproject
</pre></p>
<p>Postanowiłem jednak przy okazji skonstruować kompletną listę wpisów do <strong>svn:ignore</strong>, która zawiera metadane 3 głównych IDE (Eclipse, NetBeans, IntelliJ IDEA). Dodatkowo dodałem <strong>target</strong>, jako standardowy katalog wyjściowy Maven&#8217;a oraz maskę <strong>*.log</strong>, bo takie pliki czasem również pojawiają się w repo. Mam nadzieję, że ta lista okaże się dla kogoś przydatna. Wygląda na to, że wystarczy ją &#8222;z góry&#8221; zaaplikować do wszystkich katalogów projektowych i mieć problem z głowy <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  .</p>
<p>Ostateczna wartości atrybutu <strong>svn:ignore</strong>:</p>
<p><pre class="brush: bash;">
target
*.log
.classpath
.project
.settings
.wtpmodules
nbproject
*.ipr
*.iws
*.iml
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/133/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=133&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2009/05/03/ignorowanie-metadanych-roznych-ide-w-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2ce6b3b56cc32e86d35f1b7c53e989b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">michalkalinowskiespeo</media:title>
		</media:content>
	</item>
		<item>
		<title>Debug aplikacji internetowych w środowisku Eclipse</title>
		<link>http://espeo.wordpress.com/2009/04/10/debug-aplikacji-internetowych-w-srodowisku-eclipse/</link>
		<comments>http://espeo.wordpress.com/2009/04/10/debug-aplikacji-internetowych-w-srodowisku-eclipse/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 12:28:43 +0000</pubDate>
		<dc:creator>robomaniac</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=59</guid>
		<description><![CDATA[Na pewno nie jeden programista w swoim wesołym życiu miał takie chwile, kiedy przeklinał swój komputer, bił swoją klawiaturę, a w między czasie nerwowo obgryzał paznokcie. Owszem programowanie może dostarczać wiele przyjemności (serio?), ale niestety idylla kończy się w momencie, gdy zachowanie programu przekracza oczekiwania jego autora &#8211; czasem wręcz im zaprzecza. Z taką sytuacją [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=59&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Na pewno nie jeden programista w swoim wesołym życiu miał takie chwile, kiedy przeklinał swój komputer, bił swoją klawiaturę, a w między czasie nerwowo obgryzał paznokcie. Owszem programowanie może dostarczać wiele przyjemności (serio?), ale niestety idylla kończy się w momencie, gdy zachowanie programu przekracza oczekiwania jego autora &#8211; czasem wręcz im zaprzecza. Z taką sytuacją do czynienia miał z pewnością każdy nas (tak Developerzy &#8211; to o nas mowa). Przyczyn zaistniałej sytuacji może być wiele, zazwyczaj wiążą się z błędami (bugs) posianymi w kodzie źródłowym, czasem wynikają z trudności zrozumienia działania programu (zwłaszcza jeśli jesteśmy jego spadkobiercami). Owszem nawet jeśli dysponujemy takimi środkami jak testy jednostkowe, dokumentacja, przeglądy kodu &#8230; ta lista może być dłuższa &#8211; nie oszukujmy się &#8211; prześledzenie działania aplikacji, w szczególnym przypadku <a href="http://pl.wikipedia.org/wiki/Debugowanie">debugowanie</a> to jedna z bardziej przydatnych umiejętności &#8222;zdenerwowanego&#8221; programisty. W ten sposób chciałem wprowadzić Was w tematykę i przekonać, że będzie Wam towarzyszyć w wielu bardzo życiowych sytuacjach a czasem po prostu uratuje Wam &#8222;życie&#8221;.</p>
<p>W przypadku standardowych (lokalnych) programów ich uruchomienie, a tym samym debugging  nie rodzi większych trudności. W przypadku aplikacji webowych, dla których wymagana jest obecność środowiska takiego jak serwer aplikacji, sprawa ulega komplikacji. Ponieważ sam temat może być bardzo rozległy, przyjmijmy zatem pewne założenia:</p>
<ul>
<li>środowisko programistyczne (IDE) &#8211; Eclipse</li>
<li>uruchomienie aplikacji w środowisku serwerowym (serwer aplikacji, kontener) &#8211; ograniczymy się do: <a href="http://tomcat.apache.org">Apache Tomcat</a>, <a href="https://glassfish.dev.java.net">Glassfish</a>, <a href="http://www.jboss.org/jbossas">Jboss</a></li>
</ul>
<p>Ze względu na różne możliwe podejścia, dalsza część materiału pogrupowana została na 3 części, co oczywiście jest wyłącznie subiektywną decyzją autora.</p>
<p>1. <strong>Wykorzystanie wtyczek (plugins)</strong><br />
Jeśli posiadasz środowisko Eclipse dla Java EE (pierwsza pozycja na <a href="http://www.eclipse.org/downloads">liście</a>) lub co najmniej wtyczkę <em>Web Standard Tools</em>, to sprawa jest stosunkowo banalna.</p>
<ul>
<li>Otwórz widok <em>Servers</em> (<em>Window -&gt; Show View -&gt; Other -&gt; Servers</em>)</li>
<li>Zdefiniuj nowy serwer wybierając opcję <em>New-&gt; Server</em>. Jeśli na liście nie ma takiego serwera jakiego oczekujesz możesz spróbować <em>Download additional server adapters</em></li>
<p><a href="http://espeo.files.wordpress.com/2009/02/glass-wst1.png"><img class="alignnone size-medium wp-image-89" title="glass-wst1" src="http://espeo.files.wordpress.com/2009/02/glass-wst1.png?w=300&#038;h=277" alt="glass-wst1" width="300" height="277" /></a></p>
<li>Kolejne kroki są bardzo intuicyjne: specyfikujesz środowisko uruchomienia serwera podając ścieżkę do katalogu z serwerem, podajesz parametry dla danego typu serwera (np. adres, porty, itp.)</li>
<li>Jeśli wszystko będzie w porządku to na liście serwerów pojawi się nowy wpis. Warto zauważyć, że pojawia się również nowa konfiguracja uruchomienia w menu <em>Run</em> i <em>Debug</em> zatytułowana tak samo jak serwerowy wpis.</li>
<p><a href="http://espeo.files.wordpress.com/2009/02/glass-wst2.png"><img class="alignnone size-medium wp-image-91" title="glass-wst2" src="http://espeo.files.wordpress.com/2009/02/glass-wst2.png?w=300&#038;h=98" alt="glass-wst2" width="300" height="98" /></a></p>
<li>Istnieje również możliwość dostosowania stworzonej konfiguracji serwera, wystarczy wybrać wpis i wykonać dwuklik.<br />
W przypadku serwera Glassfish opcje konfiguracyjne wyglądają następująco:</li>
<p><a href="http://espeo.files.wordpress.com/2009/04/glass-wst-conf.png"><img class="alignnone size-medium wp-image-115" title="glass-wst-conf" src="http://espeo.files.wordpress.com/2009/04/glass-wst-conf.png?w=300&#038;h=168" alt="glass-wst-conf" width="300" height="168" /></a></p>
<li>Jeśli szukasz szczegółowych informacji jako przykład może posłużyć<br />
<a href="https://glassfishplugins.dev.java.net/eclipse33/index.html">tutorial</a> dla Glassfisha. Analogicznie przebiega sposób konfiguracji dla innych serwerów.</li>
<li>W przypadku posługiwania się wtyczkami możemy też skorzystać z innych dostępnych rozwiązań.<br />
Bardzo popularnym pluginem dla serwera Apache Tomcat jest <a href="http://www.eclipsetotale.com/tomcatPlugin.html">Sysdeo</a><br />
Posiada wiele opcji konfiguracyjnych, jest przyjazny dla użytkownika i dodaje kolorowe Kociaki. <img title="sysdeo-cats" src="http://espeo.files.wordpress.com/2009/04/sysdeo-cats.png?w=79&#038;h=23" alt="sysdeo-cats" width="79" height="23" /><br />
Na pewno warto wypróbować.</li>
</ul>
<p>2. <strong>Uruchomienie serwera jak zwykłej aplikacji Java.</strong><br />
Ta propozycja skierowana jest główniej dla tej części Społeczności Programistów, która sceptycznie i z dużą dozą nieufności patrzy na gotowe rozwiązania.<br />
Jeśli programowanie aplikacji zaczynasz np. od zastanawiania się nad pisaniem własnego kompilatora, to bardzo prawdopodobne, że wykorzystanie pluginów,<br />
będzie dla Ciebie zbyt ograniczające i niesatysfakcjonujące. Powodem może też być frustracja wynikająca z problemów z ich obsługą.</p>
<p>Tak czy inaczej w zaistniałej sytuacji rozwiązaniem wydaję się być utworzenie własnej konfiguracji uruchomienia serwera. Jako przykład przedstawię sposób tworzenia konfiguracji uruchomienia dla serwera Apache Tomcat. (Podpowiedź, pluginy zazwyczaj udostępniają możliwość wygenerowania takiej konfiguracji lub po prostu ją tworzą)</p>
<ul>
<li>W menu <em>Run</em> wybierz opcję <em>Run Configurations</em>. Utwórz nową konfigurację typu <em>Java Application</em>. Jako klasę startową (posiadającą metodę main) wybierz:<br />
<em>org.apache.catalina.startup.Bootstrap</em><br />
<a href="http://espeo.files.wordpress.com/2009/04/debug_main.png"><img class="alignnone size-medium wp-image-119" title="debug_main" src="http://espeo.files.wordpress.com/2009/04/debug_main.png?w=300&#038;h=239" alt="debug_main" width="300" height="239" /></a></li>
<li>Na kolejnej zakładce możesz podać argumenty z jakimi ma zostać uruchomiony serwer. Podstawowe jakie najczęściej się używa to:
<ul>Wymagane:</p>
<li>-Dcatalina.home=&#8221;D:\apache-tomcat-5.5.26&#8243;</li>
<li>-Dcatalina.base=&#8221;D:\apache-tomcat-5.5.26&#8243;</li>
</ul>
<ul>Dodatkowe:</p>
<li>-Djava.endorsed.dirs=&#8221;D:\apache-tomcat-5.5.26\common\endorsed&#8221;</li>
<li>-Djava.io.tmpdir=&#8221;D:\apache-tomcat-5.5.26\temp&#8221;</li>
<li>-Xms256m -Xmx512m</li>
<li>-XX:MaxPermSize=128m</li>
</ul>
<p><a href="http://espeo.files.wordpress.com/2009/04/arguments.png"><img class="alignnone size-medium wp-image-120" title="arguments" src="http://espeo.files.wordpress.com/2009/04/arguments.png?w=300&#038;h=227" alt="arguments" width="300" height="227" /></a></li>
<li>Na zakładce <em>Classpath</em> należy skonfigurować ścieżkę klas, poprzez dołączenie biblioteki <em>bootstrap.jar</em>, która znajduje się podkatalogu <em>bin</em> zainstalowanego serwera (np. D:\apache-tomcat-5.5.26\bin)</li>
<li>Kolejna zakładka <em>Source</em> służy wskazaniu jakie źródła mają być rozpoznawane przez debuggera. Czyli po prostu dodajesz te projekty, które Cię interesują. I to praktycznie tyle. Pamiętaj o zachowaniu wprowadzonych zmian (przycisk <em>Apply</em>)</li>
</ul>
<p>3. <strong>Debug zdalny (remote debug)</strong><br />
Ciekawą możliwością jest śledzenie działania serwera w sposób zdalny. Aby Eclipse był w stanie obsługiwać debug serwera potrzebne są 2 konfiguracje.<br />
Po pierwsze serwer musi być skonfigurowany tak, aby pozwalał na debug. Po drugie konieczne jest utworzenie w <em>Eclipsie</em> konfiguracji dla <em>Remote Java Application</em></p>
<ul>
<li>Konfiguracja serwera może sprowadzić się do odnalezienia pliku konfiguracyjnego i aktywacji trybu debug. Na przykład dla serwera JBoss wystarczy w pliku skryptowym <em>run</em> odkomenotwać odpowiedni wiersz:<br />
<em>set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y %JAVA_OPTS%</em></li>
<li>W środowisku Eclipse tworzymy konfigurację <em>Remote Java Application</em> której parametry (adres, port) muszą pokrywać się z ustawieniami serwera. Na zakładace <em>Source</em> podobnie jak to omawialiśmy wyżej dołączamy projekty, których źródła chcemy prześledzić</li>
<p><a href="http://espeo.files.wordpress.com/2009/04/jboss-remote1.png"><img class="alignnone size-medium wp-image-124" title="jboss-remote" src="http://espeo.files.wordpress.com/2009/04/jboss-remote1.png?w=300&#038;h=238" alt="jboss-remote" width="300" height="238" /></a></p>
<li>Oczywiście zdalne debugowanie działa również w przypadku, gdy serwer mamy na tej samej maszynie na której pracujemy</li>
<li>Przydatne informacje można znaleźć tutaj:
<ul>
<li><a href="http://java.sys-con.com/node/44918">Eclipse Special: Remote Debugging Tomcat &amp; JBoss Apps with Eclipse</a></li>
<li><a href="http://www-02.imixs.com:8081/roller/ralphsjavablog/entry/debugging_glassfish_with_eclipse">Debugging a servlet with tomcat and Eclipse tutorial </a></li>
<li><a href="http://www.wikijava.org/wiki/Debugging_a_servlet_with_tomcat_and_Eclipse_tutorial">Debugging Glassfish with Eclipse</a></li>
</ul>
</li>
</ul>
<p>I to by było na tyle Moi Drodzy. Obfitego Debugowania!!!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/59/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=59&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2009/04/10/debug-aplikacji-internetowych-w-srodowisku-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/243ef3e61211d2ce58c5bd25369133e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">robomaniac</media:title>
		</media:content>

		<media:content url="http://espeo.files.wordpress.com/2009/02/glass-wst1.png?w=300" medium="image">
			<media:title type="html">glass-wst1</media:title>
		</media:content>

		<media:content url="http://espeo.files.wordpress.com/2009/02/glass-wst2.png?w=300" medium="image">
			<media:title type="html">glass-wst2</media:title>
		</media:content>

		<media:content url="http://espeo.files.wordpress.com/2009/04/glass-wst-conf.png?w=300" medium="image">
			<media:title type="html">glass-wst-conf</media:title>
		</media:content>

		<media:content url="http://espeo.files.wordpress.com/2009/04/sysdeo-cats.png" medium="image">
			<media:title type="html">sysdeo-cats</media:title>
		</media:content>

		<media:content url="http://espeo.files.wordpress.com/2009/04/debug_main.png?w=300" medium="image">
			<media:title type="html">debug_main</media:title>
		</media:content>

		<media:content url="http://espeo.files.wordpress.com/2009/04/arguments.png?w=300" medium="image">
			<media:title type="html">arguments</media:title>
		</media:content>

		<media:content url="http://espeo.files.wordpress.com/2009/04/jboss-remote1.png?w=300" medium="image">
			<media:title type="html">jboss-remote</media:title>
		</media:content>
	</item>
		<item>
		<title>Mate Flex Framework</title>
		<link>http://espeo.wordpress.com/2009/02/13/mate-flex-framework/</link>
		<comments>http://espeo.wordpress.com/2009/02/13/mate-flex-framework/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 17:03:41 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[mate]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=95</guid>
		<description><![CDATA[Mate (wym. mate, nie mejt) jest Fleksowym frameworkiem, opartym na tagach (ang. tag-based) i sterowanym zdarzeniami (ang. event-driven). Używamy go w jednym z naszych projektów już od kilku miesięcy i z perspektywy tego czasu, chciałbym parę słów o nim napisać. Celem Mate jest zaproponowanie prostego i skutecznego mechanizmu zorganizowania przepływu sterowania (ang. control flow) w [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=95&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a title="Mate Flex Framework" href="http://mate.asfusion.com/" target="_blank">Mate</a> (wym. <em>mate</em>, nie <em>mejt</em>) jest Fleksowym frameworkiem, opartym na tagach (ang. <em>tag-based</em>) i sterowanym zdarzeniami (ang. <em>event-driven</em>). Używamy go w jednym z naszych projektów już od kilku miesięcy i z perspektywy tego czasu, chciałbym parę słów o nim napisać.</p>
<p>Celem Mate jest zaproponowanie prostego i skutecznego mechanizmu zorganizowania przepływu sterowania (ang. <em>control flow</em>) w stylu MVC, z wykorzystaniem eventów Fleksa. Jest to jedna z głównych zalet Mate: zostaje wykorzystany już istniejący, sprawdzony i naturalny dla Fleksa mechanizm komunikacji między warstwami aplikacji. Framework nie wprowadza własnych rozwiązań, jeśli nie ma takiej potrzeby, co wspiera niezależność tworzonych modułów programowych.</p>
<p>Mate jest całkowicie przezroczysty z punktu widzenia aplikacji. Nie ma żadnych odniesień do klas frameworka zarówno w komponentach widoku, jak również biznesowych. Naturalnie, warstwa kontrolerów (w sensie MVC), musi być już powiązana z konkretną biblioteką i tak też jest w tym przypadku. Zastosowano jednak dość ciekawe rozwiązanie, polegające na zapisywaniu logiki sterowania w postaci tzw. map zdarzeń (ang. <em>event map</em>) definiowanych za pomocą XML. Określają one sekwencje poleceń do wykonania w odpowiedzi na wystąpienie konkretnych eventów. Przykładowo, nasza klasa zdarzenia mogłaby wyglądać tak:</p>
<pre>package pl.espeo
{
    import flash.events.Event;

    public class AuthEvent extends Event
    {
        public static const LOGIN:String = "loginAuthEvent";

        public var username:String;
        public var password:String;

        public function AuthEvent(type:String, bubbles:Boolean = true, cancelable:Boolean = false)
        {
            super(type, bubbles, cancelable);
        }
    }
}</pre>
<p>Blok przetwarzania dla tego zdarzenia mógłby wyglądać tak:</p>
<pre>&lt;EventMap ...&gt;

    &lt;EventHandlers type="{AuthEvent.LOGIN}"&gt;

        &lt;RemoteObjectInvoker instance="{authService}"
            method="loginRemoteMethod" arguments="{[event.username, event.password]}"&gt;

            &lt;resultHandlers&gt;

                &lt;MethodInvoker generator="{AuthManager}"
                    method="loginLocalMethod" arguments="{resultObject}"/&gt;

            &lt;/resultHandlers&gt;

        &lt;/RemoteObjectInvoker&gt;

    &lt;/EventHandlers&gt;

&lt;/EventMap&gt;</pre>
<p>Jeśli gdziekolwiek w naszej aplikacji zostanie &#8222;wyrzucony&#8221; event o typie <code>AuthEvent.LOGIN</code>, zostanie wykonany odpowiedni kod z mapy zdarzeń, który w tym przypadku wywołuje metodę <code>loginRemoteMethod</code> zdalnego obiektu <code>authService</code>, przekazując 2 argumenty: <code>username</code> oraz <code>password</code>. Po otrzymaniu wyniku tego wywołania, zostanie on następnie przekazany jako argument metody <code>loginLocalMethod</code> obiektu klasy <code>AuthManager</code>, która zrealizuje jakąś logikę związaną z obsługą wyniku logowania. Takie podejście często określa się mianem MVCS, gdzie to dodatkowe S oznacza Service. Mate promuje taką architekturę, oferując znaczniki obsługujące nie tylko zdalne obiekty, ale również WebService&#8217;y oraz dowolne inne usługi HTTP (np. w konwencji REST). Diagram przepływu sterowania w opisanym scenariuszu wygląda tak:</p>
<p><img class="alignnone size-full wp-image-110" title="mate_one_way_communication" src="http://espeo.files.wordpress.com/2009/02/mate_one_way_communication.png?w=450" alt="mate_one_way_communication"   /></p>
<p>Jest to przypadek stosunkowo prosty. Możliwości Mate w zakresie kontroli przepływu sterowania są znacznie bardziej rozbudowane; jest np. możliwość zdefiniowania metody obsługi błędów zdalnych usług albo wywołanie odpowiednich metod logiki widoku w zależności od wyniku wykonania metod logiki biznesowej. Jeśli konieczne jest zaimplementowanie czegoś naprawdę skomplikowanego, na co tagi Mate mogą nie pozwolić, zawsze można napisać własną metodę w ActionScript i wydelegować przetwarzanie do niej. Możliwości są tutaj w zasadzie nieograniczone. Kolejny wielki plus Mate: bardzo duża elastyczność.</p>
<p>Oprócz realizacji architektury MVC(S), Mate zapewnia również implementację mechanizmu wstrzykiwania zależności (ang. <em>dependency injection</em>). Ponownie, nie ma tutaj ingerencji we właściwy kod logiki biznesowej czy widoku; zależności do wstrzyknięcia definiuje się w mapach zdarzeń. Mate oferuje tutaj jedynie sposób deklaratywnego opisu powiązań między obiektami. Właściwe wstrzykiwanie jest po stronie Fleksa i jego atrybutu <code>[Bindable]</code>. To kolejny przykład nieinwazyjności tego frameworka. Jeśli platforma programowa realizuje jakąś funkcjonalność dobrze, po co to powielać? Spójrzmy, jak łatwo w Mate wstrzykuje się obiekt bieżącej sesji (pole <code>currentSession</code> obiektu klasy <code>SessionManager</code>) do menedżera autoryzacji (pole <code>session</code> obiektu klasy <code>AuthManager</code>):</p>
<pre>&lt;EventMap ...&gt;

    &lt;Injectors target="{AuthManager}"&gt;

        &lt;PropertyInjector source="{SessionManager}"
            sourceKey="currentSession" targetKey="session" /&gt;

    &lt;/Injectors&gt;

&lt;/EventMap&gt;</pre>
<p>Podsumowując, Mate to naprawdę świetny pomysł na wprowadzenie do własnego projektu dobrej, spójnej architektury MVC. Promuje najlepsze praktyki rozwiązywania typowych problemów, występujących w każdej aplikacji, np. problemu zależności między komponentami z rozwiązaniem w postaci wstrzykiwania zależności. Zapewnia ogromną elastyczność, pozwalając w elegancki sposób wspomóc framework własnym kodem w ActionScript, jeżeli dostarczone tagi okażą się niewystarczające. Jest przy tym całkowicie nieinwazyjny, przez co komponenty widoku i logiki biznesowej mogą być ponownie wykorzystane.</p>
<p>Mimo młodego wieku, Mate oferuje naprawdę dużą funkcjonalność, która jest cały czas rozszerzana. Śledząc stronę projektu i jego forum, można przekonać się, że projekt żyje, jest rozwijany, a społeczność zadowolonych programistów-użytkowników Mate nieustannie się powiększa. Myślę, że warto się nim zainteresować. Już teraz jest bardzo poważnym konkurentem takich rozwiązań jak <a title="Cairngorm" href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm" target="_blank">Cairngorm</a> czy <a title="PureMVC" href="http://puremvc.org/" target="_blank">PureMVC</a>. Jeśli projekt nie wytraci impetu to może już niedługo być najchętniej wybieranym frameworkiem dla nowopowstających projektów Fleksowych.</p>
<p>Gorąco zachęcam do odwiedzenia strony domowej projektu:<br />
<a title="http://mate.asfusion.com/" href="http://mate.asfusion.com/" target="_blank">http://mate.asfusion.com/</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/95/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=95&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2009/02/13/mate-flex-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2ce6b3b56cc32e86d35f1b7c53e989b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">michalkalinowskiespeo</media:title>
		</media:content>

		<media:content url="http://espeo.files.wordpress.com/2009/02/mate_one_way_communication.png" medium="image">
			<media:title type="html">mate_one_way_communication</media:title>
		</media:content>
	</item>
		<item>
		<title>Integracja Spring Flex</title>
		<link>http://espeo.wordpress.com/2009/02/05/integracja-spring-flex/</link>
		<comments>http://espeo.wordpress.com/2009/02/05/integracja-spring-flex/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 15:50:41 +0000</pubDate>
		<dc:creator>jakubmalecki</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[blazeds]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=54</guid>
		<description><![CDATA[Ostatnimi czasy dużą popularność przy tworzeniu bogatych aplikacji internetowych (RIA) zdobywa podejście, w którym warstwę widoku pisze się z użyciem Fleksa lub innej technologii ułatwiającej budowanie interfejsów, a warstwy logiki biznesowej i dostępu do danych implementuje się przy pomocy Javy. Dodatkowo Java jest bardzo często wspierana przez bardzo popularne frameworki – Spring oraz Hibernate. Do [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=54&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ostatnimi czasy dużą popularność przy tworzeniu bogatych aplikacji internetowych (RIA) zdobywa podejście, w którym warstwę widoku pisze się z użyciem Fleksa lub innej technologii ułatwiającej budowanie interfejsów, a warstwy logiki biznesowej i dostępu do danych implementuje się przy pomocy Javy. Dodatkowo Java jest bardzo często wspierana przez bardzo popularne frameworki – Spring oraz Hibernate.</p>
<p>Do łączenia aplikacji klienckiej napisanej we Fleksie z aplikacją serwerową napisaną w Javie zazwyczaj używa się darmowego BlazeDS lub komercyjnego LiveCycle ES, oba te narzędzia są autorstwa firmy Adobe i udostępniają wiele ciekawych możliwości. Chyba najszybszym i najlepszym sposobem połączenia Fleksa z Javą jest wykorzystanie tzw. remote objects. Jest to po prostu zdalne wywoływanie metod obiektów napisanych w Javie z poziomu Fleksa, cała komunikacja odbywa się przy użyciu bardzo wydajnego, binarnego protokołu AMF (Action Message Format).</p>
<p>Dotychczas, aby z poziomu Fleksa skorzystać z beanów tworzonych przez Springa z użyciem wstrzykiwania zależności, należało wykonać wiele niekoniecznie prostych i oczywistych operacji. Domyślnie sam BlazeDS tworzy skonfigurowane w jego plikach obiekty, co w tym przypadku było działaniem niepożądanym. Trzeba było skonfigurować odpowiednią fabrykę dla BlazeDS, tak aby pozwolił on zająć się tworzeniem odpowiednich obiektów kontenerowi Springa. Były to dość złożone operacje i potrafiły spowodować pojawienie się wielu siwych włosów nawet u doświadczonych developerów.</p>
<p>Sytuacja diametralnie zmieniła się pod koniec zeszłego roku, gdy SpringSource wypuściło na światło dzienne nowy projekt – Spring BlazeDS Integration. Na razie jest to jeszcze dość świeży projekt, jednak pozwala już na użycie beanów tworzonych przez Springa w aplikacjach napisanych we Fleksie przy stosunkowo niewielkim wysiłku. W najbliższych planach jest m.in. implementacja mechanizmu Spring Security, bardzo pożądanego przez developerów tworzących aplikacje Fleksowe.</p>
<p>Aktualnie, przy użyciu Spring BlazeDS Integration, udostępnienie obiektów tworzonych przez Springa sprowadza się do kilku prostych kroków:</p>
<p>1.Po stronie Javy:</p>
<p>a) ustawienie odpowiedniego listenera w pliku <em>web.xml</em>:</p>
<div>
<pre>&lt;listener&gt;
	&lt;listener-class&gt;flex.messaging.HttpFlexSession&lt;/listener-class&gt;
&lt;/listener&gt;</pre>
</div>
<p>b) praktycznie standardowa konfiguracja springowego servletu w pliku <em>web.xml</em>:</p>
<div>
<pre>&lt;!-- The front controller of this Spring Web application --&gt;
&lt;servlet&gt;
	&lt;servlet-name&gt;Spring MVC Dispatcher Servlet&lt;/servlet-name&gt;
	&lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
	&lt;init-param&gt;
		&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
		&lt;param-value&gt;/WEB-INF/config/web-application-config.xml&lt;/param-value&gt;
	&lt;/init-param&gt;
	&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;  

&lt;!-- Map all /spring requests to the DispatcherServlet for handling --&gt;
&lt;servlet-mapping&gt;
	&lt;servlet-name&gt;Spring MVC Dispatcher Servlet&lt;/servlet-name&gt;
	&lt;url-pattern&gt;/spring/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</pre>
</div>
<p>c) dodanie odpowiedniego MessageBrokera w pliku konfiguracyjnym podanym powyżej jako parametr (<em>web-application-config.xml</em>):</p>
<div>
<pre>&lt;!-- Bootstraps and exposes the BlazeDS MessageBroker --&gt;
&lt;bean id="mySpringManagedMessageBroker"
	class="org.springframework.flex.messaging.MessageBrokerFactoryBean" /&gt;</pre>
</div>
<p>Będzie on używał pliku konfiguracyjnego BlazeDS z domyślnego miejsca (<em>WEB-INF/flex/services-config.xml</em>). Aby zmienić to miejsce, należy dodać do powyższego beana następujący parametr:</p>
<div>
<pre>&lt;property name="servicesConfigPath" value="classpath*:services-config.xml" /&gt;</pre>
</div>
<p>d) dodanie mapowania do MessageBrokera z BlazeDS (również w <em>web-application-config.xml</em>):</p>
<div>
<pre>&lt;!-- Maps request paths at /messagebroker to the BlazeDS MessageBroker --&gt;
&lt;bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt;
	&lt;property name="mappings"&gt;
        	&lt;value&gt;
                	/messagebroker/*=mySpringManagedMessageBroker
            	&lt;/value&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
</div>
<p>e) dodanie kanału odpowiadającego powyższej konfiguracji w pliku <em>services-config.xml</em>:</p>
<div>
<pre>&lt;channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel"&gt;
	&lt;endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf"
		class="flex.messaging.endpoints.AMFEndpoint"/&gt;
	&lt;properties&gt;
		&lt;polling-enabled&gt;false&lt;/polling-enabled&gt;
	&lt;/properties&gt;
&lt;/channel-definition&gt;</pre>
</div>
<p>f) przykładowa definicja obiektu, który ma zostać wystawiony Fleksowi (znowu <em>web-application-config.xml</em>):</p>
<div>
<pre>&lt;!-- Implementation of HelloService --&gt;
&lt;bean id="blazeHelloService" class="pl.espeo.blog.HelloServiceImpl" &gt;
&lt;/bean&gt;

&lt;!-- Expose the blazeHelloService bean for BlazeDS remoting --&gt;
&lt;bean id="helloService"
	class="org.springframework.flex.messaging.remoting.FlexRemotingServiceExporter"&gt;
	&lt;property name="messageBroker" ref="mySpringManagedMessageBroker"/&gt;
	&lt;property name="service" ref="blazeHelloService"/&gt;
&lt;/bean&gt;</pre>
</div>
<p>Po takim skonfigurowaniu z poziomu Fleksa powinien być dostępny obiekt o nazwie „helloService” jako remote object.</p>
<p>2.Po stronie Fleksa:</p>
<p>a) odpowiednia konfiguracja do współpracy z BlazeDS – ustawienie projektu do korzystania ze standardowego pliku <em>services-config.xml</em></p>
<p>b) obiekt „helloService” użyty we Fleksie:</p>
<div>
<pre>&lt;mx:RemoteObject id="helloSrv" destination="helloService"/&gt;</pre>
</div>
<p>Po prawidłowym ustawieniu plików konfiguracyjnych w obu aplikacjach można bezproblemowo cieszyć się springowymi beanami dostępnymi z poziomu Fleksa. Dokumentację dotyczącą projektu Spring BlazeDS Integration można przeczytać na stronie projektu:</p>
<p><a href="http://www.springsource.org/spring-flex">http://www.springsource.org/spring-flex</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=54&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2009/02/05/integracja-spring-flex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/169261e155583eac66a461ee3ee039f1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jakubmalecki</media:title>
		</media:content>
	</item>
		<item>
		<title>Actionscript i tworzenie bibliotek zasobów</title>
		<link>http://espeo.wordpress.com/2009/02/04/actionscript-i-tworzenie-bibliotek-zasobow/</link>
		<comments>http://espeo.wordpress.com/2009/02/04/actionscript-i-tworzenie-bibliotek-zasobow/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 12:21:22 +0000</pubDate>
		<dc:creator>Paweł Gdula</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[action script]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://http://blog.espeo.pl/?p=27</guid>
		<description><![CDATA[Nie trudno wyobrazić sobie sytuację, kiedy w naszej aplikacji Flash/Flex chcielibyśmy wyprowadzić pewne zasoby na zewnątrz programu w celu łatwej ich podmiany/update. Przykładem może być np. pole w naszej nowej super grze, lub sprite przeciwnika z tej samej mega produkcji. Taki element programu będzie opisywany zarówno przez jego wizualna reprezentację jak i przez zestaw parametrów. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=27&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nie trudno wyobrazić sobie sytuację, kiedy w naszej aplikacji Flash/Flex chcielibyśmy wyprowadzić pewne zasoby na zewnątrz programu w celu łatwej ich podmiany/update. Przykładem może być np. pole w naszej nowej super grze, lub sprite przeciwnika z tej samej mega produkcji. Taki element programu będzie opisywany zarówno przez jego wizualna reprezentację jak i przez zestaw parametrów.</p>
<p>W naszej aplikacji nie chcemy znać definicji tych obiektów, chcemy załadować kontener swf zawierający taki obiekt do głównej aplikacji i uzyskać dostęp do zasobów. Do dzieła!</p>
<p>Nasza prosta aplikacja będzie miała za zadanie wzywanie bohaterów którzy uratują świat przed nieuniknioną zagładą. Przygotujmy interface dla takiego bohatera:</p>
<pre>package pl.espeo.hero
{
    import flash.display.Bitmap;

    public interface IHero
    {
         function getName():String;

         function getImage():Bitmap;
    }
}</pre>
<p>Jak widać jedyne co nasz bohater będzie potrafił to powiedzieć jak się nazywa i dać nam swoją pamiątkową fotografię. Dodajmy klasę po której nasi poszczególni bohaterowie będą dziedziczyć:</p>
<div style="overflow:auto;">
<pre>package pl.espeo.hero
{
	import flash.display.Bitmap;
	import flash.display.Sprite;

	public class SuperHero extends implements IHero
	{
		protected var heroName:String;

		protected var heroImage:Bitmap;

		public function SuperHero(heroName:String, heroImage:Bitmap)
		{
			super();
			this.heroName = heroName;
			this.heroImage = heroImage;

		}

		public function getName():String
		{
			return heroName;
		} 

		public function getImage():Bitmap
		{
			return heroImage;
		}
	}
}</pre>
</div>
<p>Czas przedstawić  naszych zbawców. Pierwszy z nich to nikt inny jak Rambo:</p>
<div style="overflow:auto;">
<pre>package
{

	import pl.espeo.hero.SuperHero;

	public class Hero extends SuperHero
	{
		[Embed(source="assets/rambo.jpg")]
		private var EmbedImage:Class;

		public function Hero()
		{
			super('Rambo', new EmbedImage());
		}
	}
}</pre>
</div>
<p>Tak przygotowanego bohatera kompilujemy do pliku swf. To samo robimy z naszym następnym bohaterem, Kapitanem Planetą:</p>
<div style="overflow:auto;">
<pre>package
{

	import pl.espeo.hero.SuperHero;

	public class Hero extends SuperHero
	{
		[Embed(source="assets/captain_planet.jpg")]
		private var EmbedImage:Class;

		public function Hero()
		{
			super('Captain Planet', new EmbedImage());
		}
	}
}</pre>
</div>
<p>Mamy więc naszych bohaterów, czas przygotować dla nich podium oraz opracować sposób komunikacji z nimi. Aby nasza komunikacja przebiegała poprawnie, oraz aby nie przywołać zwykłego śmiertelnika w naszej aplikacji będziemy potrzebowali interfacu pl.espeo.hero.IHero. Czas przygotować formę komunikacji z naszym bohaterem:</p>
<div style="overflow:auto;">
<pre>package pl.espeo.hero
{
	import flash.display.Loader;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.net.URLRequest;

	public class HeroSummoner extends EventDispatcher
	{
		public static const CAPTAIN_PLANET:String = 'CaptainPlanet';

		public static const RAMBO:String = 'Rambo';

		private var loader:Loader = new Loader();

		public function HeroSummoner()
		{
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteEventHandler);
		}

		public function callHero(heroName:String):void
		{
			loader.load(new URLRequest('assets/' + heroName + '.swf'));
		}

		private function loaderCompleteEventHandler(event:Event):void
		{
			var Hero:Class = event.target.applicationDomain.getDefinition('Hero') as Class;
                        var heroEvent:HeroEvent = new HeroEvent(HeroEvent.SUMMONED);
                        heroEvent.hero = new Hero();
                        dispatchEvent(heroEvent);
		}
	}
}</pre>
</div>
<p>dzięki tak przygotowanej klasie, zostaniemy poinformowani eventem  HeroEvent że nasz bohater jest już na miejscu.</p>
<div style="overflow:auto;">
<pre>package pl.espeo.hero
{
	import flash.events.Event;

	public class HeroEvent extends Event
	{
		public static const SUMMONED:String = 'pl.espeo.hero.HeroEventSummoned';

		public var hero:IHero;

		public function HeroEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}

	}
}</pre>
</div>
<p>Tak może to wyglądać w aplikacji flex:</p>
<div style="overflow:auto;">
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()"&gt;
  &lt;mx:Script&gt;
    &lt;![CDATA[
       import pl.espeo.hero.HeroEvent;
       import pl.espeo.hero.HeroSummoner;
       import mx.collections.ArrayCollection;
       import pl.espeo.hero.IHero;

       public static const NO_HERO:uint = 0;

       [Bindable]
       private var heroes:ArrayCollection = new ArrayCollection([{label:'There is no hero!', data:NO_HERO},
								 {label:'First hero', data:HeroSummoner.CAPTAIN_PLANET},
     								 {label:'Second hero', data:HeroSummoner.RAMBO}]); 

       private var heroSummoner:HeroSummoner = new HeroSummoner();                   													 

       private function init():void
       {
          heroSummoner.addEventListener(HeroEvent.SUMMONED, welcomeMyHero);
       }

       private function summonHero(event:Event):void
       {
            var hero:* = ComboBox(event.target).selectedItem.data;

            if (hero == NO_HERO)
            {
            	return;
            }

            heroSummoner.callHero(hero);
	}

        private function welcomeMyHero(event:HeroEvent):void
	{
  	   heroPanel.status = event.hero.getName();
	   heroImage.source = event.hero.getImage();
	}
      ]]&gt;
    &lt;/mx:Script&gt;
  &lt;mx:HBox&gt;
    &lt;mx: Panel id="heroPanel" x="10" y="10" width="400" height="400" layout="absolute"&gt;
      &lt;mx:Image id="heroImage" x="0" y="0"&gt;&lt;/mx:Image&gt;
    &lt;/mx: Panel&gt;
    &lt;mx:ComboBox id="heroesList" dataProvider="{heroes}" change="{summonHero(event)}"/&gt;
  &lt;/mx:HBox&gt;
&lt;/mx:Application&gt;</pre>
</div>
<p>Dzięki tak przygotowanym obiektom możemy zbudować elastyczny system z zasobami zamkniętymi w łatwych do podmiany plikach. Dodając do tego prosty program narzędziowy wykorzystujący kompilator mxmlc możemy stworzyć furtkę, dzięki której przygotowanie kolejnych elementów nie będzie wymagało ingerencji programisty.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/27/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=27&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2009/02/04/actionscript-i-tworzenie-bibliotek-zasobow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0f875864e0886158a6127c172a5ae6fd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">gdulus</media:title>
		</media:content>
	</item>
		<item>
		<title>Integracja Grails z Flex</title>
		<link>http://espeo.wordpress.com/2008/10/08/integracja-grails-z-flex/</link>
		<comments>http://espeo.wordpress.com/2008/10/08/integracja-grails-z-flex/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 17:18:39 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[blazeds]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[grails]]></category>

		<guid isPermaLink="false">http://espeo.wordpress.com/?p=13</guid>
		<description><![CDATA[Ci, którzy śledzą &#8222;życie&#8221; technologii Grails, prawdopodobnie zauważyli kształtujący się od pewnego czasu trend wykorzystania tandemu Grails oraz Flex do budowy systemów internetowych. Nie jest to póki co trend dominujący w świecie Grails i prawdopodobnie nim nie będzie. Z całą pewnością jednak jest dość ciekawym pomysłem na wytwarzanie RIA (ang. Rich Internet Application). Zasadnicza koncepcja [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=13&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ci, którzy śledzą &#8222;życie&#8221; technologii Grails, prawdopodobnie zauważyli kształtujący się od pewnego czasu trend wykorzystania tandemu Grails oraz Flex do budowy systemów internetowych. Nie jest to póki co trend dominujący w świecie Grails i prawdopodobnie nim nie będzie. Z całą pewnością jednak jest dość ciekawym pomysłem na wytwarzanie RIA (ang. Rich Internet Application).</p>
<p>Zasadnicza koncepcja jest prosta: użyć Flex jako front-end, Grails jako back-end i zintegrować jedno z drugim. Brzmi łatwo, ale bardziej doświadczeni developerzy (szczególni Ci, zajmujący się systemami rozproszonymi) zapewne dostali właśnie dreszczy, widząc magiczne słowo: &#8222;zintegrować&#8221;. Mam dobrą wiadomość: w tym przypadku integracja obu technologii jest łatwa, szybka i przyjemna. Wydaje mi się, że jest to jedna z głównych przyczyn rosnącej popularności omawianego rozwiązania.</p>
<p>Na początek warto zastanowić się po co właściwie nam Grails + Flex. Można przecież zbudować aplikację internetową w Grails od początku do końca, podobnie zresztą jak we Flex. Użycie kombinacji obu technologii ma sens w przypadku, gdy robimy RIA, ale implementację logiki biznesowej chcielibyśmy pozostawić na serwerze, a także, dodatkowo, chcemy to wszystko wykonać w możliwie dobrych technologiach, które całą sprawę nam ułatwią, a nie utrudnią i zapewnią, przy okazji, realizację kilku wymagań niefunkcjonalnych (jak choćby duża przenośność), na których na pewno nam zależy. Grails + Flex = dokładnie to. Flex jest świetną technologią, która oferuje nam pełną potęgę graficzną Flash&#8217;a, ale w formie przyjaznej programiście (a nie grafikowi). Grails natomiast pozwala wykorzystać w całości moc platformy Java EE (czyli również jej bogactwo bibliotek, framework&#8217;ów oraz innych narzędzi), czyniąc jednak programowanie łatwiejszym i szybszym dzięki takim cechom jak choćby zasady DRY (Don’t Repeat Yourself &#8211; Nie powtarzaj się) i Convention Over Configuration (Konwencja ponad konfigurację), język programowania Groovy czy technologie Spring i Hibernate podane &#8222;na tacy&#8221;, bez żadnego dodatkowego wkładu pracy w konfigurację itp. Więcej na ten temat przeczytać można we <a href="http://blog.espeo.pl/2008/02/28/groovy-i-grails-rewolucja-czy-ewolucja-javy-cz2/">wcześniejszym wpisie Pawła</a>.</p>
<p>Teraz czas na właściwą integrację. Po stronie Grails nie musimy właściwie nic robić, bo wszystko załatwia <a href="http://grails.org/Flex+Plugin">jeden plug-in</a>. Wystarczy go zainstalować, wydając z konsoli (w katalogu głównym projektu Grails) polecenie:</p>
<pre>grails install-plugin flex</pre>
<p>oraz dodać w klasie usługowej (ang. service), która implementuje logikę biznesową, którą chcemy udostępnić aplikacji Flex, jedno pole statyczne:</p>
<pre>static expose = ['flex-remoting']</pre>
<p>i to wszystko! Usługa będzie od teraz udostępniona. Powiedzmy, że wygląda ona tak:</p>
<pre>class HelloService {
    static expose = ['flex-remoting']
    def hello() {
        return "Hello World!"
    }
}</pre>
<p>W aplikacji Flex wystarczy powołać obiekt <code>RemoteObject</code>:</p>
<pre>&lt;mx:RemoteObject id="myService" destination="helloService"/&gt;</pre>
<p>by móc korzystać z naszej usługi. Przykładowa aplikacja może wyglądać tak:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&gt;
    &lt;mx:RemoteObject id="myService" destination="helloService"/&gt;
    &lt;mx:Button label="Hello" click="myService.hello()"/&gt;
    &lt;mx:TextInput text="{myService.hello.lastResult}"/&gt;
&lt;/mx:Application&gt;</pre>
<p>Nic dodać, nic ująć. Zero konfiguracji. To po prostu działa&#8230; i już!</p>
<p>Ale właściwie&#8230; jak to działa? Otóż nie ma tu żadnej &#8222;magii&#8221;, wbrew temu co widać na pierwszy rzut oka. &#8222;Pod maską&#8221; siedzi magiczny komponent BlazeDS i odrobina Convention Over Configuration. BlazeDS jest technologią serwerową, która obsługuje styk Grails &lt;=&gt; Flex (a tak naprawdę to Java &lt;=&gt; ActionScript) poprzez implementację mechanizmu RPC, tak jak to pokazano wyżej. Przez &#8222;obsługuje&#8221; rozumiem wszystko, co jest potrzebne do zdalnego wywołania metody logiki biznesowej: udostępnienie usługi w sieci (pod konkretnym URL), ustalenie protokołu komunikacyjnego ponad warstwą HTTP oraz zapewnienie konwersji typów między światem Java, a światem ActionScript. Część &#8222;magii&#8221;, jak sądzę, została już wyjaśniona. Idźmy dalej. Przenieśmy naszą aplikację Flex do osobnego projektu, czyli rozdzielmy całość na projekt Grails i projekt Flex. Okaże się, że nagle wszystko przestało działać, co zresztą nie dziwi, bo niby skąd aplikacja Flex ma mieć pojęcie co zrobić z:</p>
<pre>&lt;mx:RemoteObject id="myService" destination="helloService"/&gt;</pre>
<p>skoro nie wie gdzie jest <code>helloService</code> (przypominam, że aplikacja Grails jest już osobnym projektem). Oto rozwiązanie: uruchamiamy naszą aplikację Grails poleceniem:</p>
<pre>grails run-app</pre>
<p>i (zakładając, że aplikacja jest dostępna pod adresem <code>http://localhost:8080/hello</code>) modyfikujemy powyższą definicję obiektu <code>RemoteObject</code>:</p>
<pre>&lt;mx:RemoteObject id="myService" destination="helloService"
    endpoint="http://localhost:8080/hello/messagebroker/amf"/&gt;</pre>
<p>Mamy URL, pod którym udostępnione są nasze obiekty usługowe, i mamy &#8222;magika&#8221; łączącego świat typów Java ze światem typów ActionScript, którym są biblioteki BlazeDS. Dodam tylko (żeby nie pozostawić żadnych wątpliwości), że protokołem komunikacyjnym nad warstwą HTTP jest AMF (ang. ActionScript Message Format), którym &#8222;rozmawiają&#8221; aplikacja Flex (wykonująca zdalne wywołanie metody) i BlazeDS (uruchamiający na żądanie metody logiki biznesowej i zwracający ich rezultat).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=13&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2008/10/08/integracja-grails-z-flex/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2ce6b3b56cc32e86d35f1b7c53e989b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">michalkalinowskiespeo</media:title>
		</media:content>
	</item>
		<item>
		<title>Groovy i Grails &#8211; rewolucja czy ewolucja Javy? cz.2</title>
		<link>http://espeo.wordpress.com/2008/02/28/groovy-i-grails-rewolucja-czy-ewolucja-javy-cz2/</link>
		<comments>http://espeo.wordpress.com/2008/02/28/groovy-i-grails-rewolucja-czy-ewolucja-javy-cz2/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 22:33:06 +0000</pubDate>
		<dc:creator>pawel</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://espeo.wordpress.com/?p=12</guid>
		<description><![CDATA[Czyli ta druga częśc w której zastanawiam się po co, komu i dlaczego jest Grails. Jak wspomniałem wcześniej Grails jest framework&#8217;iem wzorowanym na Ruby on Rails, jako bazę wykorzystującym język Groovy. Po swoim poprzedniku przejął podstawowe zasady: DRY (Don&#8217;t Repeat Yourself &#8211; Nie powtarzaj się) Convention Over Configuration (Konwencja ponad konfigurację) Co stanowi o dodatkowej [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=12&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Czyli ta druga częśc w której zastanawiam się po co, komu i dlaczego jest Grails.</p>
<p>Jak wspomniałem wcześniej Grails jest framework&#8217;iem wzorowanym na Ruby on Rails, jako bazę wykorzystującym język Groovy. Po swoim poprzedniku przejął podstawowe zasady:</p>
<ul>
<li>DRY (Don&#8217;t Repeat Yourself &#8211; Nie powtarzaj się)</li>
<li>Convention Over Configuration (Konwencja ponad konfigurację)</li>
</ul>
<p>Co stanowi o dodatkowej sile Grails&#8217;a to wykorzystanie dla popularnych i mających bardzo dobrą opinię bibliotek Javovych: Spring Framework, Hibernate, Sitemesh. Dla użytkownika końcowego mogą byc one niewidoczne, ukryte za interjefsami napisanymi w Groovy, ułatwiającymi ich używanie i redukującymi ilośc potrzebnej kofiguracji (to jest właśnie siła wspomnianej wcześniej zasady!). W każdym momencie możliwe jest jednak pełne ich wykorzystanie oraz samodzielna konfiguracja.</p>
<p>W skrócie więc Grails = elastycznośc Groovy  + moc bibliotek Javy</p>
<p>Jak to wygląda w praktyce? Prosty przykład, wydajemy polecenia:<br />
<code><br />
grails create-app<br />
grails create-domain-class [nazwaKlasy] , edytujemy stworzony plik .groovy dodając odpowiednie pola<br />
grails generate-all<br />
grails run-app<br />
</code></p>
<p>&#8230; i możemy już w przeglądarce uruchomic aplikację, ze stronkami do dodawania nowych instancji dla stworzonej klasy, edycji i usuwania. Stworzone mamy kontrolery wykorzystujące Spring&#8217;a, mapowania Hibernate&#8217;owe, strony GSP (podobne do JSP), dane zapisywane są też już do bazy i parę jeszcze użytecznych plików. Ciekawe ile zajęłoby zrobiebienie takiej funkcjonalności w Javie&#8230;</p>
<p>Co dodatkowo stanowi o sile Grails jest system plugin&#8217;ów. Sprawnie działająca społecznośc skupiona wokół projektu tworzy coraz to nowe pluginy (aktualnie około 40) pozwalające na współpracę m.in. z Flex&#8217;em, JSF, GWT, Acegi, OpenLaszlo, Yahoo UI, i wieloma innymi technologiami.</p>
<p>Z punktu widzenia programisty szybkośc tworzenie aplikacji wzrasta więc niesamowicie a dodatkowo to wciąż jest Java (no i troche Groovy). Kolejna rewolucja? Znowu tak, o tym projekcie jest już teraz głośno, będzie jeszcze bardziej.</p>
<p>W następnej części cyklu postaram się przedstawic jakie plusy może miec stosowanie Groovy / Grails w tzw. prawdziwym świecie czyli dlaczego klienci biznesowi mogą byc tym wszystkim zainteresowani.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/espeo.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/espeo.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=12&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2008/02/28/groovy-i-grails-rewolucja-czy-ewolucja-javy-cz2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1543d5fb3b89e1b4f8ea2ac459e7bfc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pawelrogowicz</media:title>
		</media:content>
	</item>
		<item>
		<title>Groovy i Grails &#8211; rewolucja czy ewolucja Javy? cz.1</title>
		<link>http://espeo.wordpress.com/2008/02/22/groovy-i-grails-rewolucja-czy-ewolucja-javy-cz1/</link>
		<comments>http://espeo.wordpress.com/2008/02/22/groovy-i-grails-rewolucja-czy-ewolucja-javy-cz1/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 17:05:23 +0000</pubDate>
		<dc:creator>pawel</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://espeo.wordpress.com/?p=11</guid>
		<description><![CDATA[Witaj świecie! W pierwszym cyklu wpisów na blogu chciałem poświęcic kilka słów dwóm technologiom o którym od jakiegoś już czasu głośno na blogach poświęconych Javie, mianowicie językowi Groovy oraz opartemu na nim framework&#8217;owi Grails. W skrócie dla tych co ostatnie pół roku (przynajmniej) przespali: Groovy jest to dynamiczny język programowania, działający na JVM i bardzo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=11&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Witaj świecie!</p>
<p>W pierwszym cyklu wpisów na blogu chciałem poświęcic kilka słów dwóm technologiom o którym od jakiegoś już czasu głośno na blogach poświęconych Javie, mianowicie językowi Groovy oraz opartemu na nim framework&#8217;owi Grails. W skrócie dla tych co ostatnie pół roku (przynajmniej) przespali: Groovy jest to dynamiczny język programowania, działający na JVM i bardzo dobrze integrujący się z Java (dzięki temu, że jest kompilowany do postaci bytecode), natomiast Grails to framework zworowany na Ruby on Rails, służący do budowy aplikacji webowych opartych na modelu MVC (model-widok-sterownik), wykorzystujący m.in. Groovy, Spring Framework, Hibernate. Tyle tytułem wstępu, przejdźmy do detali.</p>
<p align="left">Groovy jako język programowania jest obecny od kilku lat, jednak dopiero teraz nastąpił drastyczny wzrost jego popularności. Można to przypisywac kilku przyczynom, jednak moim zdaniem największy wpływ miały na to Ruby i RoR, które pokazały, że język skryptowy może w niektórych zastosowaniach przewyższac język kompilowany. Przynajmniej tak wyglądała moja historia, po pierwsze usłyszałem o Ruby, zacząłem czytac na ten temat i w ten sposób znalazłem Groovy, który ma dużo podobieństw jednak przewyższa Ruby w jednej zasadniczej sprawie &#8211; współpracy z Javą, która jest jednak <a href="http://www.tiobe.com/index.html?tiobe_index" title="wciąż">wciąż</a> najpowszechniej stosowanym językiem programowania. Co Groovy daje więc programiście? Jest językiem skryptowym, zawiera domknięcia (ang. closures), właściwości (ang. properties), możliwośc stosowanie niezdefiniowanych typów, ułatwia zasadniczo tworzenie i parsowanie XML, tworzenie komponentów Swinga, pisanie testów jednostkowych (ang. unit tests). Można takich udogodnień wymienic jeszcze dużo, jednak najlepsze w w tym wszystkim jest to, że możemy w dowolnym momencie przełączac sie pomiędzy kodem napisanym w Groovy i w Javie i wywoływac jeden z drugiego. Przynajmniej dla mnie wygląda to rewelacyjnie. Nie przyłączyłbym sie może jeszcze do <a href="http://java.dzone.com/news/groovy-will-replace-java-langu" title="stwierdzeniem">stwierdzenia</a> ,że w przeciągu 2-3 lat Groovy całkowicie zastąpi Javę ale na pewno jego udział będzie coraz większy i w niektórych zastosowaniach dominujący. Rewolucja? Dla mnie tak, dla innych śledzących rozwój Groovy od dłuższego czasu zapewne naturalny krok w ewolucji Javy. Czy z punku widzenia programisty Javy warto się uczyc Groovy? Moim zdaniem zdecydowanie i wręcz trzeba.</p>
<p>Jeśli chce ktoś przetestowac Groovy i dowiedziec się więcej polecam <a href="http://groovy.codehaus.org/" title="oficjalną stronę">oficjalną stronę</a> projektu oraz swietną książke <a href="http://www.amazon.com/Groovy-Action-Dierk-Koenig/dp/1932394842/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1203699274&amp;sr=8-1" title="Groovy in Action">Groovy in Action</a>, dostępną na razie jedynie po angielsku.</p>
<p>c.d.n. W następnej cześci opiszę zapowiadany framework Grails.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/espeo.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/espeo.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/espeo.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/espeo.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/espeo.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/espeo.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/espeo.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/espeo.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/espeo.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/espeo.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/espeo.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/espeo.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/espeo.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/espeo.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/espeo.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/espeo.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=espeo.wordpress.com&amp;blog=2906516&amp;post=11&amp;subd=espeo&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://espeo.wordpress.com/2008/02/22/groovy-i-grails-rewolucja-czy-ewolucja-javy-cz1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1543d5fb3b89e1b4f8ea2ac459e7bfc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pawelrogowicz</media:title>
		</media:content>
	</item>
	</channel>
</rss>
