Montag, 10. Dezember 2012

Nie wieder keinen Shim-mer!

Tangram wie viele Systeme besteht aus zwei Elementen: dem Code, der sowohl das Model als auch das Verhalten (den Controller) beschreibt und der View Schicht mit ihren Templates. Ich nenne das im Moment zwei Element, weil sie mit unterschiedlichen Techniken bedient werden: Code ist bei uns typischerweise in Java geschrieben und die Templates in JSP.
Schnell ist man dabei, Ergänzungen zu den Templates wie CSS und JavaScript im Repository anzulegen, damit man sie schnell und einfach ohne Deployment ändern kann. In Tangram Websites war das nicht dadurch gegeben, daß Deployments ein großer Aufwand sind, sie ware auch für die kleinen Sites und das einfache Deployment mit der Google App Engine, schlicht gelegentlich in dem Moment wo es notwendig war technisch nicht durchführbar.
Wenn man dann die Elemente CSS und JavaScript im Repository hat, will man schnell das Template auch dort haben. Das ist im Tangram mit Apache Velocity umgesetzt und ist schnell zur bevorzugten Technik geworden, sodaß JSP-Templates nur noch für die mitgelieferten Teile wie den Editor eine Rolle spielen, nicht aber für die Webanwendungen selbst.
Beim Schreiben der Templates stößt man dann aber unweigerlich immer wieder an die Limitierung der Implementierungsteile in Java, da diese ja fest im Deployment verankert sind.
Also wurde im Tangram Groovy integriert, daß als dynamische Sprache in die Java Welt integriert ist und somit sehr gut in das Szenario paßt.
Mit Groovy kann man in Tangram sehr einfach Funktionen auf Basis des Models zu den Java-Klassen hinzufügen. Da diese Codes im Repository als kleine Erweiterungen gedacht sind, heißen sie Shims. Diese kleinen Shims können zu jeder Klasse definiert werden, indem man einen Code mit dem MimeType "application/x-grooy" erstellt und als Annotation den Namen der Java-Klasse wählt, zu der dieser Code hinzugefügt werden soll.
Der Code selbst implementiert das Interface Shim oder ViewShim, wobei der Unterschied nur ist, daß ein ViewShim auch mit den Informationen des aktuellen Request versorgt wird und damit in den Bereich fällt, in dem Tangram nicht mehr cachen kann.

package org.tangram.solution.web.shims;

import javax.servlet.http.HttpServletRequest;

import org.tangram.logic.AbstractShim;
import org.tangram.gae.solution.Topic;

public class TopicShim extends AbstractShim<Topic> {

    public TopicShim(Topic topic) {
        super(topic);
    } // TopicShim()
   
    public String getNonsense() {
      return "Hallo";
    } // getNonsense()
   
    public String getReverseTitle() {
      return new StringBuilder(delegate.title).reverse().toString();
    } // getReverseTitle()
   
} // TopicShim


Der Inhalt dieses Shims ist relativ sinnlos, zeigt aber das Wesentliche: Wir muß die Groovy-Klasse aufgebaut sein, und wie greift man über den Delegate auf die jeweilige Instanz der Java-Klasse zu.
Bleibt nur noch eine Frage zu klären: Wie kommt man dann an diesen Code heran? Zusammen mit den Instanzen der Java-Klassen wird in Tangram jeweils eine Instanz der View-Klasse angelegt und unter dem Klassen-Namen ohne Package-Angabe den Templates zur Verfügung gestellt.
Im Apache Velocity Template im Repository - JSP haben wir ja für die Anwendung selbst längst zu den Akten gelegt - sähe das dann so aus:

  <h1>$TopicShim.reverseTitle | $self.title</h1>

Keine Kommentare:

Kommentar veröffentlichen