<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>Gerald&apos;s Blog</title>
      <link>http://www.innoq.com/blog/gs/</link>
      <description>Rails vs. JavaEE</description>
      <language>de</language>
      <copyright>Copyright 2008</copyright>
      <lastBuildDate>Tue, 01 Apr 2008 12:52:34 +0100</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>Was ist JSF überhaupt?</title>
         <description><![CDATA[Auf Anfrage von <a href="http://www.innoq.com/blog/phaus/">Philipp</a>, damit ihm nicht langweilig wird, jetzt wo er fertig mit seiner Arbeit ist.

Hier ein Auszug, wie er vorraussichtlich auch in der Arbeit vorkommen wird.
Wer fachliche oder Rechtschreib-Fehler findet, hinterlasse bitte einen Kommentar!

<blockquote>
JSF

Für die Ausgabe von dynamischen HTML-Seiten eines Webservers verwendet man im Javaumfeld üblicher Weise JavaServer Pages (JSP). Damit wird die Einbettung von Javacode - und somit von dynamischem Inhalten - in HTML-Seiten ermöglicht. Die Vermischung von Java- und HTML-Code führt allerdings schnell zu einer unübersichtlichen Programmstruktur, die die Entwicklung deutlich verkompliziert.

Um die Entwicklung von Webseiten zu vereinfachen, wurden Web-Frameworks wie zum Beispiel Struts \cite{struts} oder eben JavaServer Faces (JSF) entwickelt. Beide benutzen das Model-View-Controller-Architekturmuster (MVC). In der Anwendung werden die Daten (model), die Präsentation (view) und die Programmsteuerung (controller) voneinander getrennt. JSF ist hauptsächlich für die Präsentation zuständig und verfolgt zusätzlich einen komponentenbasierten Ansatz. Bei komponentenbasierter Programmierung wird versucht die Anwendung in wiederverwendbare Komponenten zu unterteilen, um dann später diese Bausteine zu Anwendungen zusammenzusetzen.

Ein typisches Beispiel ist eine Tabelle, deren Eigenschaften in einem Objekt gespeichert sind und der man eine Liste der darzustellenden Objekte zuordnet. Diese Komponente fügt man dann in der Seite ein, immer wenn man eine Liste dieser Art verwenden möchte, anstatt den Quellcode der Tabelle selbst zu erstellen.

In dieser Arbeit wird JSF verwendet, da es im Gegensatz zu den anderen Frameworks standardisiert und Teil der Java EE 5 Spezifikation ist. JSF wird eine weite Verbreitung in Enterprise-Projekten nachgesagt und es heißt, JSF sei auch einfacher zu lernen als Struts.(siehe hierzu die Diskussion unter http://tech.groups.yahoo.com/group/novajug/message/9812)

Es gibt viele verschiedene Implementierungen und Komponenten-Bibliotheken wie zum Beispiel MyFaces von Apache, RichFaces von Exadel, ICEfaces von ICEsoft oder ADF Faces von Oracle. In dieser Arbeit wird jedoch die Referenzimplementierung von Sun verwendet, um unabhängig von Herstellern zu bleiben.

Der vollständige Verzicht auf ein Web-Framework und die Programmierung nur mit JSPs ist zwar möglich, wird aber den Möglichkeiten nicht gerecht, die man mit Java EE 5 hat. 
</blockquote>

Der Vollständigkeit halber will ich auch noch kurz Facelets erwähnen, die ich anstelle von JSP verwende:

<blockquote>
Facelets

JSP ist darauf ausgelegt dynamische Ausgaben zu generieren. JSF verwendet JSP jedoch zur Erstellung und Verwaltung von Komponenten. Die Kombination von JSP und JSF bringt somit ein paar Schwierigkeiten mit sich. Jedoch kann man auf JSPs verzichten und statt dessen eine andere Technologie verwenden. Facelets ist eine solche Technologie und wird als Open Source Projekt unter der Aufsicht von Sun entwickelt. Die Beliebtheit des Projektes hat dazu geführt, dass über eine Aufnahme von Facelets in der zukünftigen Spezifikation JSF 2.0 (JSR 314) diskutiert wurde. Facelets werden inzwischen zwar im JSR erwähnt, aber nicht komplett übernommen.

Es ist deutlich zu erkennen, dass JSF und Facelets ein gutes Team bilden und der komplette Verzicht auf JSP viele Vorteile bringt. Facelets bieten Templating (Die Aufteilung der Webseite in einzelne Bestandteile wie zum Beispiel Header, Navigation, Content und Footer), bessere Debugmöglichkeiten durch Fehlermeldungen mit genauer Angabe der Fehlerquelle, vereinfachte Erstellung von Komponenten und noch einige andere Features. Daher wird in dieser Arbeit auf JSP verzichtet und die aktuelle Version von Facelets verwendet.
</blockquote>

Nützliche Links:
<a href="http://java.sun.com/javaee/javaserverfaces/">http://java.sun.com/javaee/javaserverfaces/</a>
<a href="http://www.jsfcentral.com/">http://www.jsfcentral.com/</a>
<a href="http://www.ibm.com/developerworks/java/library/j-jsf1/">http://www.ibm.com/developerworks/java/library/j-jsf1/</a>
<a href="http://balusc.blogspot.com/">http://balusc.blogspot.com/</a>]]></description>
         <link>http://www.innoq.com/blog/gs/2008/04/was_ist_jsf_uberhaupt.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/04/was_ist_jsf_uberhaupt.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Facelets</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">JSF</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Links</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Masterarbeit</category>
        
         <pubDate>Tue, 01 Apr 2008 12:52:34 +0100</pubDate>
      </item>
            <item>
         <title>HOWTO test EJB3 with JUnit outside of the container</title>
         <description><![CDATA[<p>Since EJB 3.0, testing should be easy. And it IS much more simpler than with EJB 2.1, because you dont need to have an application server (AS) up and running</p>

<p>Chapter 12 in the book "Pro EJB 3: Java Persistence API" by Mike Keith and Merrick Schincariol was very useful for me.</p>

<p>I'm using Netbeans 6.0, EJB3, JPA and a MySQL-Datebase and i write integration tests. (as defined in the book above: focus on use-cases, decoupled from appserver, making full use of external resources such as database)</p>

<p>First of all i added the library JUnit (4.1) to my Netbeans-Project
You can then rightclick on a sourcefile and select > Tools > Create JUnit Tests</p>

<p>Using the Entity Manager<br>
If you're using the Entity Manager (EM) you must create one for your tests.
Because no AS is around, you need an EM Factory and for that you need a Persistence Provider. Add the library TopLink Essentials to the project.
Without the AS we cant use JTA datasource with JNDI, so i created a mysql testdatabase and added a persistence-unit for testpurposes. To use it i need the MySQL JDBC Driver-library in my project.<br> My persistence.xml looks like this:</p>

<blockquote><pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&gt;
  &lt;persistence-unit name="Project-ejbPU" transaction-type="JTA"&gt;
    &lt;jta-data-source&gt;jdbc/project_database_jndi_name&lt;/jta-data-source&gt;
  &lt;/persistence-unit&gt;
  &lt;persistence-unit name="ProjectTest-ejbPU" transaction-type="RESOURCE_LOCAL"&gt;
    &lt;class&gt;project.model.entity1&lt;/class&gt;
    &lt;class&gt;project.model.entity2&lt;/class&gt;
    &lt;class&gt;project.model.entity3&lt;/class&gt;
    &lt;class&gt;project.model.entity4&lt;/class&gt;
    &lt;class&gt;project.model.entity5&lt;/class&gt;
    &lt;properties&gt;
        &lt;property name="toplink.ddl-generation" value="create-tables"/&gt;
        &lt;property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver" /&gt;
        &lt;property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/project_test_db_name" /&gt;
        &lt;property name="toplink.jdbc.user" value="root"/&gt;
        &lt;property name="toplink.jdbc.password" value="xxx"/&gt;
     &lt;/properties&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;
</pre></blockquote>

<p>Note that the transaction-type should be RESOURCE_LOCAL and not JTA, because we dont want any trouble with JNDI-stuff ;)
I've been told that every entity has to be defined explicitly in the persistence.xml</p>

<p>Now you need to create and use the EM in your tests<br>
Change the setUp()-method in the testclass to the following:</p>

<blockquote><pre>
    @Before
    public void setUp() {
        yourbean.em = Persistence<br>.createEntityManagerFactory("ProjectTest-ejbPU")<br>.createEntityManager();
        // your own setUp-stuff
    }
</pre></blockquote>
Now you can write your tests as if your app is deployed in an AS.]]></description>
         <link>http://www.innoq.com/blog/gs/2008/03/howto_test_ejb3_with_junit_out.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/03/howto_test_ejb3_with_junit_out.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">EJB</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">howto</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">JPA</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Netbeans</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Tests</category>
        
         <pubDate>Thu, 20 Mar 2008 15:32:45 +0100</pubDate>
      </item>
            <item>
         <title>Testing Part2: Java EE</title>
         <description><![CDATA[So. Nun muss ich die Test nur noch für meine Java EE-Anwendung umsetzen. Dafür nimmt man erstmal JUnit und Netbeans hilft dabei. Aber ist das wirklich eine gute Wahl? Immerhin verwende ich JSF und da gibt es andere (bessere?) Möglichkeiten. JSFUnit(beta), JunitEE, Cactus, Selenium, ... und <del>wieder</del> <strong>immernoch</strong> brauche ich einen JSF-Experten!

Nützliche Links:
<a href="http://www.infoq.com/news/2007/12/jsf-testing-tools">http://www.infoq.com/news/2007/12/jsf-testing-tools</a>
<a href="http://junit.sourceforge.net/doc/cookbook/cookbook.htm">http://junit.sourceforge.net/doc/cookbook/cookbook.htm</a>
<a href="http://www.junitee.org/">http://www.junitee.org/</a>

Ein gutes Netbeans-Tutorial für Netbeans habe ich nicht gefunden, aber eigentlich ist das auch nicht nötig. Legt man einen TestCase an (rechtsklick auf die Klasse, für die man den TestCase haben will &gt; Tools &gt; Create JUnit Tests), so kann man zwichen JUnit 3.x oder 4.x wählen, dann noch welche Tests man haben will und die Tests werden im TestPackage erstellt. Also im Prinzip hat man hier - wie bei Rails - Testdummies, die man dann reparieren muss. Das mache ich dann jetzt mal.

Soweit so gut. Allerdings sind diese erstmal nur fürs Backend. Um die WebApp zu testen bräuchte ich HttpUnit oder ähnliches.

UPDATE: Soweit gar nicht gut, weil man nicht einfach EJBs testen kann, da diese ja im AppServer laufen müssen. Man muss also einen Testdienst implementieren, der dann tests in der deployten Anwendung ausführen kann. Oder man nimmt JUnitEE oder Cactus oder...?? Ich finde es erstaunlich wie wenig sinnvolle Hilfe man zu diesem Thema findet. EJBs testen sollte doch eigentlich ziemlich wichtig sein.... Zitat: "Although this [JUnit Testing] works well for most standalone applications, it becomes outrageously complicated when you test code -- like an EJB -- that runs in an application server."

btw: Den Fehler im Rails-Testing habe ich immernoch nicht gelöst. Siehe <a href="http://www.innoq.com/blog/gs/2008/03/testing_part1_rails.html">Blogeintrag von gestern</a>. Bin über Kommentare dankbar.]]></description>
         <link>http://www.innoq.com/blog/gs/2008/03/testing_part2_java_ee.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/03/testing_part2_java_ee.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Links</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Tests</category>
        
         <pubDate>Thu, 06 Mar 2008 15:00:07 +0100</pubDate>
      </item>
            <item>
         <title>Testing Part1: Rails</title>
         <description><![CDATA[Bisher habe ich mich davor gedrückt Tests zu schreiben, aber da komme ich nicht länger drumherum.

Das sinnvollste wird wohl sein, alles was ich von Hand teste, mit automatische Tests abzudecken. Customer und Rating anlegen, Fakten eintragen, löschen, usw...

Da ich mich mit Tests noch nicht so auskenne, fange ich dieses Mal mit Rails an, da hier der Einstieg ins Testing einfacher scheint.
Hier erstmal ein paar nützliche Links:
<a href="http://manuals.rubyonrails.com/read/book/5">http://manuals.rubyonrails.com/read/book/5</a>
<a href="http://nubyonrails.com/articles/ruby-rails-test-rails-cheat-sheet">http://nubyonrails.com/articles/ruby-rails-test-rails-cheat-sheet</a>

Nun bringt ein Blick in das Buch "The Railsway" doch Zweifel, ob ich nicht besser das plugin RSpec zum Testen verwenden sollte. So würde ich damit den eigentlichen vorgesehenen Weg von Rails verlassen und das sollte in meinem Vergleich eigentlich nicht passieren. Ich werde mich also mit den mitgelieferten Testmöglichkeiten auseinandersetzen.

Rails hat automatisch schon einige Tests angelegt und da dort zB die später hinzugefügte Validierung noch nicht berücksichtigt wird, bekam ich beim ersten Durchlauf auch jede Menge Fehler.

Die habe ich jetzt repariert, aber es bleiben 2 Tests übrig, die einfach nicht funktionieren wollen. Da brauche ich mal eure Hilfe, denn ich komme einfach nicht weiter...

Also... Hier ein Test, der funktioniert:
<blockquote>  def test_should_destroy_rating
    assert_difference('Rating.count', -1) do
      delete :destroy, :id => ratings(:one).id
    end
    assert_redirected_to ratings_path
  end</blockquote>

Die Fixture dazu:
<blockquote>one:
  date: 2008-01-10 02:30:05
  rating: 5000
  status: COMPLETED
  customer: one</blockquote>

Die DB-Tabelle sieht so aus:
 <blockquote>   create_table :ratings do |t|
      t.datetime :date
      t.integer :rating
      t.string :status
      t.references :customer
      t.timestamps
    end</blockquote>

Alles wunderbar und jetzt der Test, der nicht funktioniert:
<blockquote>  def test_should_destroy_fact_type
    assert_difference('FactType.count', -1) do
      delete :destroy, :id => fact_types(:fact_type_1).id
    end
    assert_redirected_to fact_types_path
  end</blockquote>

Die Fixture dazu (im moment als csv, habe es aber auch schon als yaml gehabt. gleicher fehler:
<blockquote>id,factCategory_id,title,question,question_type
1,2,"Alter des Kunden","Wie alt ist der Kunde?","FREE"</blockquote>

Die DB-Tabelle sieht so aus:
 <blockquote>    create_table :fact_types do |t|
      t.string :title
      t.text :question
      t.string :question_type
      t.references :factCategory
      t.timestamps
    end</blockquote>

Die Fehlermeldung ist:
 <blockquote>MySQL Error: #42S22Unknown column 'facts.fact_type_id' in 'where clause': SELECT * FROM `facts` WHERE (facts.fact_type_id = 1)</blockquote>

Das kann auch nicht funktionieren, weil anstatt "fact_type_id" müsste rails einfach nur die column "id" in der where-clause verwenden. Beim rating klappt das doch auch!? Warum hier nicht? Den einzigen Unterschied den ich sehe ist der Unterstrich im Tabellennamen...
Was übersehe ich?]]></description>
         <link>http://www.innoq.com/blog/gs/2008/03/testing_part1_rails.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/03/testing_part1_rails.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Links</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Tests</category>
        
         <pubDate>Wed, 05 Mar 2008 11:53:11 +0100</pubDate>
      </item>
            <item>
         <title>Aufbau der Arbeit</title>
         <description><![CDATA[Ein Überblick ist nie verkehrt und hier folgt einer über den Aubau meiner Arbeit also known as kommentiertes Inhaltverzeichnis:

<ol>
<li>Einleitung</li>
<ol>
<li>Motivation<br/>Warum mache ich das Ganze?</li>
<li>Problemstellung<br/>Und wo liegt das Problem?</li>
<li>Aufbau</li>
</ol>
<li>Grundlagen</li>
<ol>
<li>Web Engineering</li>
<li>Metriken<br/>Was sind Metriken und welche verwende ich?</li>
<li>Programmiersprachen<br/>Wo gibt es Unterschiede und warum ist das relevant?</li>
</ol>
<li>Die Entwicklungsumgebungen</li>
<ol>
<li>Java EE</li>
<ol>
<li>Java<br/>Hauptmerkmale der Sprache</li>
<li>Zielsetzung<br/>Wozu ist JavaEE gedacht?</li>
<li>Konzept<br/>Hier wird auf den Application Server eingegangen</li>
<li>Komponenten<br/>Hier werden die Komponenten beschrieben, die ich verwende</li>
<li>Werkzeuge<br/>...und hier die Werkzeuge (Netbeans)</li>
</ol>
<li>Ruby on Rails</li>
<ol>
<li>Ruby<br/>Hauptmerkmale der Sprache</li>
<li>Zielsetzung<br/>Was will Rails erreichen?</li>
<li>Komponenten<br/>Welche Komponenten beinhaltet Rails?</li>
<li>Struktur<br/>MVC und so</li>
<li>Werkzeuge<br/>Aptana/Konsole/Vielleicht ein Blick auf Netbeans</li>
</ol>
<li>Ein erster Vergleich<br/>Ausarbeitung der markantesten Unterschiede. Bewertung aber erst in Kapitel 5</li>
</ol>
<li>Beispielanwendung</li>
<ol>
<li>Rating<br/>Was ist überhaupt ein Rating?</li>
<li>Grundversion</li>
<ol>
<li>Anforderungen</li>
<li>Vorarbeiten<br/>Datenmodellierung</li>
<li>Umsetzung<br/>Hier ist noch offen, wie der Abschnitt aussehen soll. s.u.</li>
</ol>
<li>Erste Erweiterung</li>
<ol>
<li>Anforderungen</li>
<li>Umsetzung</li>
</ol>
<li>Zweite Erweiterung</li>
<ol>
<li>Anforderungen</li>
<li>Umsetzung</li>
</ol>
</ol>
<li>Auswertung</li>
<ol>
<li>Metriken<br/>Die gesammelten Daten werden analysiert</li>
<li>Besondere Aspekte</li>
<li>Eindruck<br/>subjektive Bewertung</li>
</ol>
<li>Fazit</li>
<ol>
<li>Zusammenfassung</li>
<li>Fazit</li>
<li>Ausblick</li>
</ol>
</ol>

Je nach Zeit sind auch noch mehrere Iterationen denkbar.
Bei dem Abschnitt "Umsetzung" ist noch unklar, ob ich besser zuerst die Umsetzung in JavaEE und dann in Rails beschreiben soll oder einzelne Punkte nehmen soll wie zB Validierung und jeweils beschreibe wie es in beiden umgesetzt wird. Dann springt man immer hin und her zwischen Rails und JavaEE, aber hat dafür einen direkteren Vergleich. Was meint ihr ist für den Leser besser?

Das letzte Kapitel heißt "Fazit" und ein Abschnitt darunter auch "Fazit". Fällt jemandem ein besserer Titel für eins von beiden ein?]]></description>
         <link>http://www.innoq.com/blog/gs/2008/02/aufbau_der_arbeit.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/02/aufbau_der_arbeit.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Masterarbeit</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Zwischenstand</category>
        
         <pubDate>Wed, 20 Feb 2008 14:22:31 +0100</pubDate>
      </item>
            <item>
         <title>Vom Schreiben und Texten</title>
         <description><![CDATA[Zur Zeite schreibe ich so gut es geht alles Bisherige zusammen. Die Grundlagen (ruby&java, rails&javaee, web-engineering, metriken, usw) und die Erkenntnisse aus der Programmierung der Grundversion auszuformulieren ist garnicht so einfach. Ich dachte, ich schreibe das einfach so runter, aber es zieht sich alles sehr und ich komme nicht so schnell voran, wie ich das gerne hätte. Aber wann ist das auch schon der Fall.. ;) 

Jedenfalls habe ich inzwischen einige Absätze geschrieben und die Struktur der Arbeit nimmt langsam Formen an. Ich weiß jetzt nicht, wie ich das hier oder am Freitag zeigen kann. Vielleicht poste ich einfach mal das Inhaltsverzeichnis oder so.

Nebenbei habe ich in der Rails-Version die Validierung reingesetzt und vielleicht errinnert sich noch einer, dass ich mich bei <a href="http://www.innoq.com/blog/gs/2007/11/javaee_nichts_fur_schwache_ner.html">JSF gefreut hatte</a>, dass es so einfach ist, einen Validator zu schreiben. Tja im Vergleich zu Rails ist es bei JSF aber immernoch fürchterlich umständlich und auch logisch wirds an die falsche Stelle programmiert - nämlich in die view anstatt ins model.

Außerdem habe ich endlich den <a href="http://www.innoq.com/blog/gs/2008/01/kaferplage.html">Destroy-Bug</a> behoben. Die Lösung besteht darin, nicht den Fact direkt zu speichern, sondern den Fact im Rating zu ändern und dann das Rating abzuspeichern, wodruch dann mit dem cascading auch der Fact abgespeichert wird. Aber wie schon vor einiger Zeit gesagt, würde ich da gerne mal ein längeres Gespräch mit einem JavaEE/JSF-Profi reden um herauszufinden ob das denn alles so seine Richtigkeit hat, wie ich das programmiere...

Am Freitag habe ich Halbzeit und dann sollte ich auch mal mit der zweiten Iteration anfangen. Ich bin meiner Meinung nach nicht in der Zeit und brauche mehr Motivation/Arschtritte.... Nur zu!]]></description>
         <link>http://www.innoq.com/blog/gs/2008/02/vom_schreiben_und_texten.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/02/vom_schreiben_und_texten.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Zwischenstand</category>
        
         <pubDate>Wed, 06 Feb 2008 17:55:44 +0100</pubDate>
      </item>
            <item>
         <title>API gefällig?</title>
         <description><![CDATA[Ich habe gerade <a href="http://www.gotapi.com">http://www.gotapi.com</a> entdeckt und finde es großartig!
Einfach ausprobieren!]]></description>
         <link>http://www.innoq.com/blog/gs/2008/01/api_gefallig.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/01/api_gefallig.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Links</category>
        
         <pubDate>Wed, 30 Jan 2008 15:55:38 +0100</pubDate>
      </item>
            <item>
         <title>Wie es ist und wie es sein sollte...</title>
         <description><![CDATA[Das schwierigste an Rails ist mitunter, dass man es "schön" machen will, dem "Rails-way" entsprechend. So gibt es ein paar Sachen, die kann man irgendwie programmieren, aber die man natürlich einfach und elegant lösen will. So wie es sein sollte. Da kann man dann auch schonmal gut Zeit mit Suchen nach der besten Lösung verbringen...

Wie ihr wisst, arbeite ich gerade an der Rails-Version der Anwendung und da ich ganz gut voran kam, habe ich in den letzten Tagen nicht wirklich intensiv gearbeitet. Aber der Counter da rechts zählt unbarmherzig weiter runter, also Schluss mit lustig und weiterarbeiten.

Für "Pagination" (gibts da ein anständiges deutsches Wort für?) verwende ich das plugin will_paginate und das funktioniert auch einwandfrei. Ich frage mich jedoch wie ich damit eine Collection "paginaten" kann, die nicht als Abfrage aus der Datenbank kommt. Geht das? Anscheinend baut will_paginate auf find(:all) auf und verändert nur das Array so, dass es auch Informationen zu aktuellen Seite enthält.

Interessanter Weise habe ich ein paar Dinge entdeckt, die man in JavaEE konfigurieren konnte und ich in Rails selber programmieren muss außer es gibt ein plugin... (oder gibts nen Trick/"Rails-way"?)
Gibt es zum Beispiel in Rails etwas äquivalentes zu der Angabe der Customer-Rating-Beziehung "@OneToMany(cascade = CascadeType.REMOVE ...."? D.h. wenn ich einen <em>Customer</em> lösche, werden automatisch auch alle <em>Ratings</em> zu diesem <em>Customer</em> gelöscht. 
In Rails würde ich jetzt in der <em>destroy</em>-Methode im customer-controller dafür sorgen, dass auch alle <em>Ratings</em> gelöscht werden. Gibt es einen eleganten Weg dies zu erledigen, oder muss ich tatsächlich jedes <em>Rating</em> (und dann natürlich auch jeden <em>Fact</em> eines <em>Ratings</em>) durchgehen und löschen?

(Nochmal grob zur Erinnerung: customer -hasmany-> ratings -hasmany-> facts -belongsto-> factType)

Ein anderes Problem ist zur Zeit die Umsetzung der Rating-Detail-Ansicht. Hier hatte ich in JavaEE eine Liste aller Fakttypen angelegt und dann angezeigt ob in diesem Rating der Fakt eingetragen wurde oder noch leer ist. (Dort hatte ich die Collection von Facts des Ratings aus der Datenbank und habe dann für alle nicht vorhandenen FactTypen Einträge hinzugefügt. Die Darstellung der überarbeiteten Collection samt pagination hat dann die entsprechende JSF-Komponente übernommen.)

Tja, wie löse ich das jetzt mit Rails? Insbesondere mit pagination? Ich bräuchte im Prinzip alle facts des ratings und dies mit einem right outer join verknüpft mit fact_types. Also so, dass von jedem FactType ein Fact für das Rating aufgelistet wird, ob es nun schon eingetragen ist oder nicht. (deshalb outer join)
Ob das nun verständlich war, wage ich zu bezweifeln.
Aber ich habe eine Idee und werde das auch sogleich mal angehen...]]></description>
         <link>http://www.innoq.com/blog/gs/2008/01/wie_es_ist_und_wie_es_sein_sol.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/01/wie_es_ist_und_wie_es_sein_sol.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Rails</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Zwischenstand</category>
        
         <pubDate>Tue, 22 Jan 2008 22:24:50 +0100</pubDate>
      </item>
            <item>
         <title>Rails 2.0 ftw</title>
         <description><![CDATA[Nachdem ich in JavaEE zu kämpfen hatte, ist Rails doch irgendwie angenehmer. Manchmal muss man suchen, wie man das dem-"rails-way"-entsprechend zu machen hat. Aber wenn man das dann gefunden hat, wie der Befehl heißt oder wo was wie heißen muss, damit einfach alles sofort geht, dann ist es auch logisch und man kann es sich gut merken. 
Jedenfalls ist das Erstellen eines ersten Prototypen um einiges leichter - besonders mit scaffold.
Sehr geholfen hat mir dabei das Rails 2.0 Scaffold Tutorial <a href="http://www.rubyplus.org/episodes/17-Rolling-with-Ruby-on-Rails-Revised-Rails-2-.html" target="_blank">Rolling-with-Ruby-on-Rails-Revised</a>. Leider muss man sich für den Download anmelden, aber das war es mir wert. ;)

Das Design anzupassen war auch nicht schwer und so sehen beide Anwendungen sich schon sehr ähnlich. Wie ich die Navigation in Rails vernünftig definiere muss ich noch rausfinden, aber ich errinnere mich dunkel, dass das relativ einfach war. 

Es macht auf jeden Fall mehr Spaß, aber gerade deshalb verliere ich grade zusehens an Disziplin. Wenn man mehr in weniger Zeit schafft, kann man sich die restliche Zeit ja auch frei nehmen... *hust* Gefährliches Spiel....]]></description>
         <link>http://www.innoq.com/blog/gs/2008/01/rails_20_ftw.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/01/rails_20_ftw.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Links</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Rails</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Zwischenstand</category>
        
         <pubDate>Fri, 18 Jan 2008 14:27:08 +0100</pubDate>
      </item>
            <item>
         <title>Käferplage</title>
         <description>Ein Bug behoben, da hat sich schon der nächste eingenistet....

Wird etwas gelöscht oder hinzugefügt, gibt es jetzt keine Inkonsistenzen mehr zwischen EJB und Webapplication, was mich allerdings einen Datenbankaufruf mehr kostet, der IMHO eingespart werden könnte. Zur Zeit weiß ich aber keine bessere Lösung. 
Doch nun tritt folgender Fehler auf: Erstelle ich ein Rating und gebe dazu ein paar Facts ein, kann ich das Rating nicht mehr löschen. Die Datenbank meckert, obwohl ich Cascading an habe. Wenn ich zuerst die Facts lösche, dann das Rating klappt es. Das war zu erwarten. Aber richtig merkwürdig wird es, wenn ich die Anwendung neu starte. Dann kann ich das Rating löschen, zusammen mit allen dazugehörigen Facts. 

</description>
         <link>http://www.innoq.com/blog/gs/2008/01/kaferplage.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/01/kaferplage.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Frust</category>
        
         <pubDate>Wed, 09 Jan 2008 17:09:07 +0100</pubDate>
      </item>
            <item>
         <title>Im neuen Jahr angekommen</title>
         <description>Endlich gibts von mir auch mal wieder einen Blogeintrag. In den vergangenen Tagen musste ich ein paar Sachen für die Uni erledigen und konnte daher nicht allzuviel an der Masterarbeit arbeiten. Trotzdem gibt es seit dem letzten Blogeintrag natürlich Fortschritte:

Den Darstellungsfehler gibt es nicht mehr, allerdings weiß ich nicht mehr genau wie ich ihn beseitigt habe. Allerdings wusste ich ja auch nicht genau wie er überhaupt entstehen konnte. ;)

Die Seite hat jetzt eine akzeptable Farbgebung. (Warum endet das bei mir immer in Blautönen?)

Es werden alle Anforderungen erfüllt, so dass man Customer suchen/betrachten/bearbeiten/hinzufügen kann; deren Ratings bearbeiten/hinzufügen/löschen kann; bei den Ratings Fakten hinzufügen/löschen kann.

Außerdem kann man Fakttypen hinzufügen/bearbeiten und diese in Kategorien einordnen, wobei man natürlich auch neue Kategorien (und beliebig viele Ebenen Unterkategorien) anlegen kann. Hier lässt die Benutzerfreundlichkeit zu wünschen übrig, aber es geht halt.. ;)

Alle Auflistungen werden per Pagination zerlegt, wenn sie zu groß sind. Der Wert wieviele Zeilen auf einer Seite erscheinen sollen ist im Moment Hardcoded, aber könnte man auch durch den Benutzer änderbar machen.

Die Suche nach einem Customer geht über die ID oder über den Namen. Zur Zeit kann man als wildcards die mysqltypischen wildcards benutzen wie zB &apos;%&apos;, was nicht so optimal ist. 

Aber es gibt noch Probleme...
Manche Änderungen, wie zB das hinzufügen von Fakten oder löschen, werden nicht richtig angezeigt. Es wird zwar in die Datenbank richtig eingetragen, aber in der Webapplication nicht aktualisiert. Das werde ich versuchen heute zu lösen. Später mehr....




</description>
         <link>http://www.innoq.com/blog/gs/2008/01/im_neuen_jahr_angekommen.html</link>
         <guid>http://www.innoq.com/blog/gs/2008/01/im_neuen_jahr_angekommen.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Zwischenstand</category>
        
         <pubDate>Wed, 09 Jan 2008 10:40:08 +0100</pubDate>
      </item>
            <item>
         <title>Ein neues Gesicht für JSF mit Facelets</title>
         <description><![CDATA[Mit <a href="https://facelets.dev.java.net/">Facelets</a>, einem "JavaServer Faces View Definition Framework", ist es mir jetzt möglich JSP quasi völlig zu ignorieren und meine Seiten mit (x)html zu bauen. (Keine "verbatim"-tags mehr oder andere Störquellen.)
Nebenbei habe ich jetzt endlich eine Layout-Seite, die selbiges festlegt und ich definiere auf den anderen Seiten nur noch den Inhalt für die einzelnen, in der Layout-Seite festgelegten Bereiche. So kann man am Layout arbeiten ohne auf jeder Seite etwas ändern zu müssen. "Ja und?.." fragt sich da der Rails-Entwickler "..ist doch normal!" Tja, vorher ging das nicht. Es gibt bei JSP zwar die Möglichkeit sogenannten subviews mit include-tags einzubinden, jedoch ist das mit JSF zusammen die reinste Qual dort dann auch noch dynamischen Inhalt reinzupacken und den jeweiligen Kontext noch richtig zu behandeln.
Es war zwar etwas Arbeit nachträglich alles umzuändern, aber ich denke das hat sich gelohnt, sonst wäre die JavaEE-Version der Anwendung von vorneherein nicht mehr vernünftig wartbar gewesen.


Nachtrag: Seit der Umstellung habe ich jedoch einen Darstellungsfehler im Firefox. Dort wird jetzt der Hintergrund über und unter dem DIV mit dem Inhalt weiß dargestellt, obwohl er eigentlich schwarz sein sollte. Rechts und links neben dem DIV stimmt's allerdings noch und der Hintergrund ist schwarz. Im Internet Explorer wird es korrekt angezeigt. An html und css kann es eigentlich nicht liegen, jedenfalls kann ich dort keinen Fehler finden, wenn ich mir den HTML-Quellcode ansehe. Im Moment bin ich ratlos.]]></description>
         <link>http://www.innoq.com/blog/gs/2007/12/ein_neues_gesicht_fur_jsf_mit.html</link>
         <guid>http://www.innoq.com/blog/gs/2007/12/ein_neues_gesicht_fur_jsf_mit.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Facelets</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">JSF</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Zwischenstand</category>
        
         <pubDate>Thu, 13 Dec 2007 15:48:03 +0100</pubDate>
      </item>
            <item>
         <title>NoOOXML</title>
         <description><![CDATA[Mal was ganz anderes...

Seit der Diskussion um Software-Patente lass ich mich vom <a href="http://www.ffii.de/" target="_blank">FFII e.V.</a> über Aktionen informieren und vor einiger Zeit hat mich eine Mail erreicht, die mich über Microsofts OOXML informierte. Letztens kam noch einmal eine Mail, die mich über den aktuellen Stand informierte und da hab ich gedacht weise ich euch auch mal auf die <a href="http://www.noooxml.org/">Problematik</a> und die <a href="http://www.noooxml.org/petition-de">Petition</a> hin.

<blockquote>
"Unsere Anstrengungen auf die OOXML (Office Open XML) Standardisierung Einfluss zu nehmen, waren bislang höchst erfolgreich. Im Februar wollen wir die 100.000 Unterschriften-Marke erreichen, wenn in Genf das fünftägige Ballot Resolution Meeting (BRM) zur Behandlung der eingereichten Kommentare und endgültigen Abstimmung über OOXML stattfindet.

Microsoft versucht mit allen Mitteln seinen "Standard" ohne fundamentale Änderungen verabschieden zu lassen, trotz tausender offiziell vorgebrachter Kommentare über technische Mängel und der Existenz von ISO 26300:2006 (OpenDocument, ODF) als angemessenen Nachfolger für die proprietären Microsoftformate (doc, ppt und xls) im Bürobereich."
- FFI e.V
</blockquote>


Besucht <a href="http://www.noooxml.org">http://www.noooxml.org</a> um mehr zu erfahren.]]></description>
         <link>http://www.innoq.com/blog/gs/2007/12/noooxml.html</link>
         <guid>http://www.innoq.com/blog/gs/2007/12/noooxml.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Offtopic</category>
        
         <pubDate>Mon, 10 Dec 2007 13:07:21 +0100</pubDate>
      </item>
            <item>
         <title>Rails 2 released!?! [UPDATE]</title>
         <description><![CDATA[Ryan Daigle schreibt:

<blockquote>
<a href="http://ryandaigle.com/articles/2007/12/7/rails-2-0-final-released-summary-of-features">Rails 2.0 Final Released! </a>
</blockquote>

Aber im Kommentar steht schon, dass es wohl doch noch nicht so weit ist... Aber es steht zumindest kurz bevor...

Update:
<a href="http://weblog.rubyonrails.com/2007/12/7/rails-2-0-it-s-done">jetzt aber!</a>]]></description>
         <link>http://www.innoq.com/blog/gs/2007/12/rails_2_released.html</link>
         <guid>http://www.innoq.com/blog/gs/2007/12/rails_2_released.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Rails</category>
        
         <pubDate>Fri, 07 Dec 2007 15:20:21 +0100</pubDate>
      </item>
            <item>
         <title>Aktueller Stand</title>
         <description>Noch kurz, was ich gerade mache: 
Die Customer, FactCategories, FactTypes eintragen, editieren etc ist implementiert.
Ich bin nun an den Controllern und den Formularen zum Eintragen der Ratings und Facts dran, was durch die komische Parameterübergabe und Controllerwechsel recht problematisch ist.

Beispiel: Wenn ich mir die Details eines Customers ansehe, möchte ich auf der gleichen Seite eine Liste mit Ratings haben, die zum Customer gehört. Hab ich sogar hinbekommen, aber wenn ich jetzt versuche aus der Liste heraus die Details eines Ratings aufzurufen oder zu editieren, dann übergebe ich als Parameter die Id des Ratings an den RatingController. Soweit so gut, aber jetzt muss man den Parameter aus dem FacesContext fischen und beim ersten Versuch das vernünftig umzusetzen ist so einiges schief gegangen. Ein Beispiel, wie man sowas in JSF löst habe ich noch nicht gefunden und meine bisherige Lösung hat dann auch gleich drei neue Probleme ausgelöst...

Sowas kostet leider viel Zeit und bis Freitag wollte ich eigentlich die erste Version der Ratingapp in JavaEE lauffähig haben. Da glaube ich inzwischen nicht mehr dran...
Wenn ich einen Wunsch frei hätte, würde ich mir einen JavaEE/JSF Profi wünschen, der mir mal ein paar Fragen beantwortet... Freiwillige vor! ;)</description>
         <link>http://www.innoq.com/blog/gs/2007/12/aktueller_stand.html</link>
         <guid>http://www.innoq.com/blog/gs/2007/12/aktueller_stand.html</guid>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Frust</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">JSF</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Zwischenstand</category>
        
         <pubDate>Tue, 04 Dec 2007 18:37:59 +0100</pubDate>
      </item>
      
   </channel>
</rss>
