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

<channel>
	<title>BeagleOutOfBoundsException &#187; Java</title>
	<atom:link href="http://www.nw-software.com/category/software-entwicklung/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nw-software.com</link>
	<description>Ein Beagle durchbricht die Grenzen schneller als ein Index.</description>
	<lastBuildDate>Wed, 31 Aug 2011 08:44:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>GWT: Code Splitting mit ProviderBundle</title>
		<link>http://www.nw-software.com/2011/08/gwt-code-splitting-mit-providerbundle/</link>
		<comments>http://www.nw-software.com/2011/08/gwt-code-splitting-mit-providerbundle/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 08:44:52 +0000</pubDate>
		<dc:creator>Niko Will</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[codesplit]]></category>
		<category><![CDATA[codesplitting]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[gwtp]]></category>
		<category><![CDATA[mvp]]></category>
		<category><![CDATA[presenter]]></category>
		<category><![CDATA[providerbundle]]></category>
		<category><![CDATA[proxy]]></category>

		<guid isPermaLink="false">http://www.nw-software.com/?p=263</guid>
		<description><![CDATA[Möchte hier mal wieder kurz was notieren, damit ich es selber nicht vergesse ;) Code Splitting von GWT ist eine tolle Sache. Da ich kein Guru bin werde ich mal versuchen das in meinen laienhaften Worten zu erklären. GWT liefert alles was man programmiert an den Client aus, da das teilweise sehr viel sein kann [...]]]></description>
			<content:encoded><![CDATA[<p>Möchte hier mal wieder kurz was notieren, damit ich es selber nicht vergesse ;)</p>
<p>Code Splitting von GWT ist eine tolle Sache. Da ich kein Guru bin werde ich mal versuchen das in meinen laienhaften Worten zu erklären. GWT liefert alles was man programmiert an den Client aus, da das teilweise sehr viel sein kann wurde Code Splitting eingeführt. Presenter, deren Proxies mit der ProxyCodeSplit Annotation versehen sind werden erst vom Server nachgeladen, sobald diese das erste mal mit Inject verwendet werden. Dadurch kann der Client den GWT Code schneller laden, da dort nur die notwendigen Sachen hinterlegt werden. Der Code von Presentern die nicht von Anfang an benötigt werden, wird also erst bei deren erster Verwendung vom Server zum Client übertragen.</p>
<p>Diese Möglichkeit lässt es sinnvoll erscheinen, im gesamten Anwendungscode bzw. soviel wie möglich, Code Splitting zu verwenden. Ein zusätzlicher Vorteil ist, die Funktionalität der einzelnen Klassen kann schön klein gehalten werden, da der Presenter notwendige Klassen injiziert bekommen kann. Die Sache hat nur einen Haken: Das Nachladen benötigt erstens etwas Zeit und zweitens muss für jeden gesplitteten Code eine Anfrage an den Server gestellt werden. Jede Anfrage benötigt durch den Overhead noch zusätzlich Zeit, außerdem bearbeiten Browser i.d.R. nur zwei Anfragen an eine Domain gleichzeitig. Wird also ein Presenter angezeigt, der selber mehrere gesplittete Teile enthält, kann dies den Benutzereindruck trüben.</p>
<p>Die Lösung hierfür haben die Entwickler von GWT mit Provider Bundles geschaffen. In einem ProviderBundle legt man alle zusammenhängende Teile fest, die gemeinsam nachgeladen werden sollen. In der Anwendung an der ich gerade arbeite verwenden wir das, um bestimmte Aktionen auszulagern, die von mehreren Presentern verwendet werden können. Dadurch kann jede Aktion in einem übersichtlichen Class File programmiert werden das zudem noch in einer entsprechenden Package Hirarchie für eine leichtere Wartbarkeit abgelegt werden kann. Für jeden Presenter gibt es dann ein ProviderBundle das festlegt, welche Actions mit dem Presenter geladen werden sollen. Code Splitting und Provier Bundles können aber auch anders verwendet werden.</p>
<p>Die GWT bzw. GWTP Dokumentation erklärt das Vorgehen leider (noch) nicht. Für viele mag sich die Verwendung auch aus den Kommentaren der <a href="http://code.google.com/p/gwt-platform/source/browse/gwtp-core/gwtp-clients-common/src/main/java/com/gwtplatform/common/client/ProviderBundle.java">ProviderBundle</a> Klasse erschließen, ich hatte hierbei jedoch einige Anlaufschwierigkeiten. Daher möchte ich hier mal kurz die Vorgehensweise skizzieren:</p>
<pre class="brush: java">
public class ShowGalleriesA extends UiAction {
	...
}
</pre>
<p>Das ist die Action Klasse. Die Implementierung ist für den Mechanismus nicht wichtig, daher hab ich sie weg gelassen. Man muss hier eigentlich nur beachten, das es nichts zu beachten gibt ;)<br />
Es ist eine ganz gewöhnliche Java Klasse, es sind keine Annotations oder ähnliches notwendig (außer natürlich das was für die Funktion der Klasse benötigt wird). Auch UiAction, die Basisklasse, enthält nichts was mit dem Code Splitting zu tun hat.</p>
<pre class="brush: java">
public class DashboardPr extends PlacePresenter<DashboardIf, DashboardPr.MyProxy> {

	@ProxyCodeSplitBundle(bundleClass = DashboardBundle.class, id = DashboardBundle.ID_DashboardPresenter)
	@NameToken(NameTokens.dashboard)
	public interface MyProxy extends ProxyPlace<DashboardPr> {
	}

	@Inject
	public DashboardPr(
            DashboardIf view,
            MyProxy proxy,
            final ShowGalleriesA aShowGalleries) {
		super(view, proxy);

		setActions(aShowGalleries);
	}
	...
}
</pre>
<p>Der Presenter hingegen ist schon interessanter. Die normalerweise verwendete @ProxyCodeSplit Annotation wird durch @ProxyCodeSplitBundle ersetzt. In den Parametern der Annotation muss angegeben werden welche Klasse das Bundle definiert und welche ID daraus der des annotierten Proxies entspricht. Siehe Definition des Provider Bundles:</p>
<pre class="brush: java">
public class DashboardBundle extends ProviderBundle {
	public final static int ID_DashboardPresenter = 0;
	public final static int ID_ActionShowGalleries = 1;
	public final static int BUNDLE_SIZE = 2;

	@Inject
	public DashboardBundle(
			final Provider<DashboardPr> dashboardPresenter,
			final Provider<ShowGalleriesA> actionShowGalleries) {
		super(BUNDLE_SIZE);

		providers[ID_DashboardPresenter] = dashboardPresenter;
		providers[ID_ActionShowGalleries] = actionShowGalleries;
	}
}
</pre>
<p>Sollte eigentlich relativ selbsterklärend sein ;)<br />
Alle Teile des Bundles (die also zusammen geladen werden sollen) werden mit @Inject dem Konstruktor übergeben und in einem Feld providers der Basisklasse ProviderBundle hinterlegt. Wichtig ist hierbei, dass die Größe des providers Array dem Superklassen Konstruktor richtig mitgegeben wird. Am einfachsten macht man das über die gezeigten (und auch von Google empfohlenen) statischen Konstanten mit denen man dann auch auf die jeweiligen IDs der einzelnen Teile des Bundles verweisen kann (siehe Parameter der @ProxyCodeSplitBundle Annotation in der Presenter Klasse).</p>
<p>Nun müssen im Ginjector die AsyncProvider für die Einzelteile definiert werden, damit das Injizieren funktioniert:</p>
<pre class="brush: java">
public interface MyGinjector extends Ginjector {
	...
	AsyncProvider<DashboardPr> getCustomerDetailPresenter();
	AsyncProvider<ShowGalleriesA> getShowGalleriesAction();
	AsyncProvider<DashboardBundle> getDashboardBundle();
	...
}
</pre>
<p>Und schon wird die Aktion automatisch mit dem Presenter geladen. Einfach oder? ^^</p>
<img src="http://www.nw-software.com/?ak_action=api_record_view&id=263&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.nw-software.com/2011/08/gwt-code-splitting-mit-providerbundle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unit Tests von EJBs (mit JPA) mittels Embedded Glassfish v3 in NetBeans 6.8 und Maven</title>
		<link>http://www.nw-software.com/2010/02/unit-tests-von-ejbs-mit-jpa-mittels-embedded-glassfish-v3-in-netbeans-6-8-und-maven/</link>
		<comments>http://www.nw-software.com/2010/02/unit-tests-von-ejbs-mit-jpa-mittels-embedded-glassfish-v3-in-netbeans-6-8-und-maven/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 18:38:31 +0000</pubDate>
		<dc:creator>Niko Will</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.nw-software.com/?p=192</guid>
		<description><![CDATA[Unit Tests sind in Java EE Anwendungen nicht so einfach zu realisieren, da die EJBs im EJB Container ablaufen. Daher gibt es seit 3.1 so genannte Embedded EJB Container. Darüber gibt es auch wieder einige tolle Blog Einträge, doch leider hat mich keiner der vorhanden direkt zum Erfolg geführt, deshalb hier mal meine Anleitung. Wie [...]]]></description>
			<content:encoded><![CDATA[<p>Unit Tests sind in Java EE Anwendungen nicht so einfach zu realisieren, da die EJBs im EJB Container ablaufen. Daher gibt es seit 3.1 so genannte Embedded EJB Container. Darüber gibt es auch wieder einige tolle Blog Einträge, doch leider hat mich keiner der vorhanden direkt zum Erfolg geführt, deshalb hier mal meine Anleitung.</p>
<p>Wie der Titel schon sagt verwende ich NetBeans 6.8 mit Glassfish v3 und Maven für meine Java EE 6 Anwendung. Wie es sich gehört wird fleißig Einsatz von JPA gemacht. Hier wird  mal vorausgesetzt, dass die Anwendung schon brav Kontakt zur Datenbank aufgenommen hat, in meinem Fall MySQL, sprich alle JDBC Pools und Connections wurden erfolgreich angelegt. Somit können wir später direkt die Konfiguration der Domains des richtigen Glassfish Application Servers in unserem Embedded Container verwenden um mittels JPA auf die Datenbank zu zu greifen. Wer lieber zum Testen eine seperate Datenbank nehmen möchte kann <a href="http://ctpjava.blogspot.com/2009/10/unit-testing-ejbs-and-jpa-with.html">hier</a> nachlesen wie er da vorgehen muss.</p>
<p>Als erstes muss die embedded Version des Glassfishes in Maven eingebunden werden. Hier ergab sich bereits mein erstes Problem, da sich die Repositories und der notwendige Dependency Eintrag nicht so einfach im Internet finden lassen. Deshalb hier die Abhängigkeit:</p>
<pre class="brush: xml">&lt;dependency&gt;
  &lt;groupId&gt;org.glassfish.extras&lt;/groupId&gt;
  &lt;artifactId&gt;glassfish-embedded-all&lt;/artifactId&gt;
  &lt;version&gt;3.0&lt;/version&gt;
  &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;</pre>
<pre class="brush: xml">&lt;dependency&gt;
  &lt;groupId&gt;javax&lt;/groupId&gt;
  &lt;artifactId&gt;javaee-api&lt;/artifactId&gt;
  &lt;version&gt;6.0&lt;/version&gt;
  &lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;</pre>
<p>Der untere Eintrag wird für den Container zwar nicht benötigt, wird hier aber dennoch erwähnt, da es wichtig ist, das der embedded Glassfish Eintrag vor diesem in der pom.xml erscheint, da es sonst zu Fehlermeldungen beim Testen und Deployen kommen kann.<br />
Der zugehörige Repository Eintrag lautet wie folgt:</p>
<pre class="brush: xml">&lt;repository&gt;
  &lt;id&gt;embedded-glassfish&lt;/id&gt;
  &lt;name&gt;Embedded Glassfish Maven Repository&lt;/name&gt;
  &lt;url&gt;http://download.java.net/maven/glassfish&lt;/url&gt;
&lt;/repository&gt;</pre>
<p>Nun sollten diese Abhängigkeiten erstmal durch ein Build besorgt werden um zu sehen ob hier alles geklappt hat. Achtung! die embedded Version des Glassfish hat knapp 45MB, das Herunterladen kann also etwas dauern (wenn man wie ich nur ne 768kBit/s Leitung hat).</p>
<p>Nun kümmern wir uns um die Unit Tests. Dazu poste ich euch hier einen komplett funktionsfähigen Test den ich im Anschluss versuche zu erläutern. Da ich nämlich keinen kompletten Test in anderen Blogs finden konnte, sondern nur Codeschnipsel, hatte ich am Anfang noch mit einigen Exceptions zu kämpfen (naja, ich programmiere erst seit ein paar Wochen in Java, was will man erwarten).</p>
<pre class="brush: java">package sample.test.controller;

import sample.controller.UserEntityFacade;
import sample.model.UserEntity;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.ejb.embeddable.EJBContainer;
import javax.naming.Context;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.Assert;

public class UserEntityFacadeFixture {

    public UserEntityFacadeFixture() {
    }

    public static EJBContainer container;
    public static Context context;
    public static UserEntityFacade facade;

    @BeforeClass
    public static void setUpClass() throws Exception {
        Map properties = new HashMap();
        properties.put(EJBContainer.MODULES, new File("target/classes"));
        properties.put("org.glassfish.ejb.embedded.glassfish.installation.root", "/Applications/NetBeans/sges-v3/glassfish");
        container = EJBContainer.createEJBContainer(properties);
        context = container.getContext();
        facade = (UserEntityFacade)context.lookup("java:global/classes/UserEntityFacade");
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
        context.close();
        container.close();
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    @Test
    public void CreateUserEntity() {
        UserEntity user = new UserEntity();
        user.setUsername("jack");
        user.setPassword("jack");

        int count = facade.count();
        facade.create(user);
        Assert.assertEquals(count + 1, facade.count());
    }
}</pre>
<p>Hauptaugenmerk muss hier natürlich auf die Initialisierung des Containers gelegt werden. Dazu werden statische Variablen angelegt um den Container beim Start des Tests zu Starten und für alle Tests zur Verfügung zu haben. Am Ende der Tests wird der Container und der Context wieder geschlossen. Man beachte auch den import Bereich, da ich bei simpler Angabe von &#8220;public static Context context;&#8221; in einigen Codeschnipseln nämlich nicht rauslesen konnte das es sich dabei um den &#8220;javax.naming.Context&#8221; handeln soll. Aber wahrscheinlich ist das allen Java Experten klar.</p>
<p>Beim Erstellen des Containers wird der <em>createEJBContainer</em> Mehtode hier eine Hashmap mit Einstellungen übergeben. Dies ist an dieser Stelle wichtig, da wir JPA verwenden und daher das Verzeichnis vom Glassfish mit angeben müssen, damit der EJB Container die Konfiguration der JDBC Resourcen aus dessen Konfiguration lesen kann. Wird kein JPA verwendet, können die Einstellungen ganz entfallen, sprich es wird kein Parameter übergeben.</p>
<p>Anschließend holt man sich den Context und frägt daraus seine EJBs an. An dieser Stelle hatte ich auch wieder zu kämpfen. Mir war nicht ganz klar wie sich der JNDI Name aufbaut. Beim JBOSS hätte ich jetzt immerhin gewusst wo ich diesen nachschauen kann. Bei TheServerSide werden <a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB31-Part5">die mit EJB 3.1 eingeführten globalen JNDI Namen</a> zwar erläutert, doch damit ließen sich meine Beans dennoch nicht auffinden. Nach langem Suchen bin ich dann auf die einfache und funktionierende Version oben gestoßen. Dabei ist der vordere Teil fest und nur der Name der Bean angehängt. Wenn mir jemand diesen Sachverhalt genauer erklären kann darf er sich in den Kommentaren dazu gerne auslassen ;-)</p>
<p>Der Rest des Listings dürfte hoffentlich keine Schwierigkeiten bereiten. Der Vollständigkeit halber hier noch die Blog Posts, die mir hierbei sehr hilfreich waren:</p>
<p>[1] <a href="http://blogs.sun.com/alexismp/entry/testing_ejb_3_1_s">Using the EJBContainer API with or without Maven (but with GlassFish v3)</a><br />
[2] <a href="http://ctpjava.blogspot.com/2009/10/unit-testing-ejbs-and-jpa-with.html"><span style="font-weight: normal;">Unit Testing EJBs and JPA with Embeddable GlassFish</span></a><br />
[3] <a href="http://www.adam-bien.com/roller/abien/entry/embedding_ejb_3_1_container">EMBEDDING EJB 3.1 CONTAINER INTO YOUR UNIT TESTS &#8211; BOOT TIME: 5 SECONDS</a><br />
[4] <a href="http://www.adam-bien.com/roller/abien/entry/how_to_unit_test_ejb">HOW TO UNIT-TEST EJB 3 &#8230;IN 0.8 SECONDS [SOURCE CODE INCLUDED]</a><br />
[5] <a href="http://javahowto.blogspot.com/2009/12/ejb-lite-testing-with-junit-and.html">EJB Lite testing with JUnit and embeddable container</a></p>
<img src="http://www.nw-software.com/?ak_action=api_record_view&id=192&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.nw-software.com/2010/02/unit-tests-von-ejbs-mit-jpa-mittels-embedded-glassfish-v3-in-netbeans-6-8-und-maven/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Java CLASSPATH unter Mac OS X: Wie verheirate ich MySQL und Glassfish</title>
		<link>http://www.nw-software.com/2010/02/java-classpath-unter-mac-os-x/</link>
		<comments>http://www.nw-software.com/2010/02/java-classpath-unter-mac-os-x/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 15:54:29 +0000</pubDate>
		<dc:creator>Niko Will</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.nw-software.com/?p=179</guid>
		<description><![CDATA[Bei meinen ersten Schritten mit Java auf dem Mac zu programmieren bin ich gleich mal derbe auf die Fresse gefallen. Gut, es war vielleicht auch nicht die beste Idee gleich mit einer Maven Enterprise Application anzufangen, aber hey, wer nichts wagt der nicht gewinnt. Größtes Problem hierbei war MySQL und Glassfish v3 zur Zusammenarbeit zu [...]]]></description>
			<content:encoded><![CDATA[<p>Bei meinen ersten Schritten mit Java auf dem Mac zu programmieren bin ich gleich mal derbe auf die Fresse gefallen. Gut, es war vielleicht auch nicht die beste Idee gleich mit einer Maven Enterprise Application anzufangen, aber hey, wer nichts wagt der nicht gewinnt. Größtes Problem hierbei war MySQL und Glassfish v3 zur Zusammenarbeit zu bewegen. Alle Tutorials reden immer davon eine Datenbankverbindung in NetBeans anzulegen, die Tabellen zu erstellen und eine Persistence Unit für MySQL dem Projekt hinzuzufügen. Bis dahin auch toll und sicherlich nicht falsch, nur bringt das alles nichts wenn man zuvor nicht MySQL und Glassfish verheiratet was soviel heißt wie einen MySQL Connection Pool in der Glassfish Adminconsole anzulegen. Für alle Idioten da draußen die, wie ich ;-), nicht wissen wie man da hin kommt, einfach im Browser http://localhost:4848 eingeben während Glassfish läuft. Eine gute Anleitung zur Hochzeit findet man <a href="http://gardiary.wordpress.com/2009/07/30/create-jdbc-connection-pool-and-resource-in-glassfish/">hier</a> und <a href="http://www.innoq.com/blog/gs/2007/10/howto_get_jsasglassfish_with_m.html">hier</a>.</p>
<p>Doch das eigentliche Problem trat bei mir ganz am Anfang der Anleitung auf. Man muss den MySQL Connector für Java im CLASSPATH hinterlegen. Nun reicht es dabei unter Windows schon aus den Connector im Glassfish Verzeichnis in lib zu positionieren, was auf dem Mac unseren geliebten Application Server aber noch lange nicht zufrieden stellt. Nach langem Stöbern bei Onkel Google bin ich über den Beitrag <a href="http://book.javanb.com/mac-os-x-for-java-geeks/0596004001_macxjvgks-chp-2-sect-2.html">Mac OS X for Java Geeks</a> gestolpert, der mir die CLASSPATH Geschichte des Betriebssystems näher zu bringen versuchte. Allerdings hat auch das Ablegen der Connector JAR Datei im Extension Ordner des Java Verzeichnisses nur wenig Erfolg gezeigt.</p>
<p>Erst in einem Forum Post hab ich die für mich funktionierende Lösung tatsächlich gefunden. Innerhalb von NetBeans kann man die CLASSPATH Variablen verwalten. Dazu geht man im Menü auf &#8220;Tools&#8221; und anschließend auf &#8220;Libraries&#8221;. Links findet man eine Liste die in Class- und Server Libraries aufgeteilt ist. Unter Server ist schließlich ein Eintrag &#8220;Java-EE-GlassFish-v3&#8243;. Nach anwählen kann man sich im Fenster rechts die enthaltenen Bibliotheken ansehen. Nach kurzem durchforsten fällt auf das diese alle unter &#8220;/Applications/NetBeans/sges-v3/glassfish/modules/&#8221; liegen. Also habe ich kurzerhand den MySQL Connector da rein geschmissen und hier als Library mittels &#8220;Add JAR/Folder&#8230;&#8221; hinzugefügt. Im Anschluss noch kurz Glassfish neugestartet und schon funktioniert der Ping auf den MySQL Connection Pool wie gewünscht. Nun kann mit den oben genannten Tutorials weiter verfahren werden um MySQL zum Connection Pool hinzu zu fügen.</p>
<img src="http://www.nw-software.com/?ak_action=api_record_view&id=179&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.nw-software.com/2010/02/java-classpath-unter-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

