Nachdem ich ja mittlerweile schon längere Zeit ein iPhone besitze, habe ich vergangene Woche eine kleines Java-Bibliothek für eine Growl-Anbindung geschrieben. Mit der iPhone-App Prowl kann man Nachrichten über einen kostenlosen Internetservice versenden, die dann wie eine SMS auf dem Telefon angezeigt werden.

Mit einer solchen Anbindung kann man sich z.B. (kostenlos!) benachrichtigen lassen, wenn beim Monitoring im Rechenzentrum ein Server ausgefallen ist, man könnte an Termine erinnert werden oder anderen Personen die Möglichkeit bieten, günstig eine Nachricht auf das Telefon schicken zu lassen.

Ich habe nun in Java eine kleine Bibliothek geschrieben, mit der man solche Anwendungen leicht entwickeln kann. Vielleicht hat ja jemand Interesse es einzusetzen. Ich habe die Bibliothek als ZIP angehängt. Es handelt sich um Version 0.1, da es die erste Veröffentlichung ist. Ich hoffe auf viel Feedback (bitte unten in den Kommentaren hinterlassen).

Hier ein kurzes Beispielprogramm, wie die Bibliothek bedient wird. Momentan habe ich leider noch keine ausführliche Dokumentation zu der Lib, aber vielleicht kommt das ja noch, wenn ich entsprechendes Feedback bekomme.

public static void main(String[] args) throws JgrliException {
  String apiKey = "<API-Key>";
  String applicationName = "Application name";
  String eventName = "Event name";
  String description = "Description";

  System.out.println("Creating client with API key "" + apiKey + """);
  JgrliClient JgrliClient = new JgrliClient(apiKey);

  System.out.println("Calling Prowl with application name "" + applicationName + "", event "" + eventName + "", description "" + description + """);
  JgrliResult result = JgrliClient.add(applicationName, eventName, description);
  if (result instanceof JgrliSuccessResult) {
    JgrliSuccessResult successResult = (JgrliSuccessResult) result;
    System.out.println("Successfully sent message!");
    System.out.println("Status code is " + successResult.getErrorCode().getCode());
    System.out.println(successResult.getRemaining() + " calls left");
    System.out.println("Reset date is " + new SimpleDateFormat().format(successResult.getResetDate()));
  } else if (result instanceof JgrliErrorResult) {
    JgrliErrorResult errorResult = (JgrliErrorResult) result;
    System.out.println("An error occured during call!");
    System.out.println("Error code is " + errorResult.getErrorCode().getCode());
    System.out.println("Error message is " + errorResult.getErrorMessage());
  } else {
    System.out.println("Unknown result type!");
  }
}

Download

Ich habe die Quelltexte in zwei Versionen abgelegt: mit benötigten Libraries und ohne.

Will man in JSP-Dateien Attribute verwenden, die man zuvor in der Tiles-Konfigurationsdatei oder im Preparer verwendet hat, so kann man sich die Werte über ein Tag <tiles:importAttribute/> in den EL-Kontext holen, so dass man darüber auf die Attribute zugreifen kann. Hat man also in einem Preparer etwas geschrieben wie

 

[...]
@Override
public void execute(TilesRequestContext tilesRequestContext, AttributeContext attributeContext) {
  attributeContext.putAttribute("meinString", new Attribute(meinString));
}
[...]

so kann man in einem JSP folgendermaßen darauf zugreifen:

[...]
<tiles:importAttributes/>
[...]
Dies ist mein String: ${meinString}
[...]

Manch einer mag sich gewundert haben, warum Preparer nicht wie unter http://tiles.apache.org/tutorial/advanced/preparer.html dokumentiert ausgeführt werden. Das liegt daran, dass die Dokumentation nicht ganz komplett ist. Hier eine kurze Anleitung, was Ihr tun müsst, um die Preparer tatsächlich zum laufen zu bekommen:

  1. Legt einen Preparer an, der das Interface org.apache.tiles.preparer.ViewPreparer implementiert:
    public class WelcomePreparer implements ViewPreparer { ...}
  2. Dieser Preparer (die Klasse) bekommt eine Annotation @Service:
    @Service
    public class WelcomePreparer implements ViewPreparer { ...}
  3. In der Definition des Views gebt Ihr den entsprechenden Preparer an:
    <definition name="welcome" template="/WEB-INF/tiles/welcome.jsp" preparer="welcomePreparer">
  4. In derSpring-Konfiguration für die Tiles muss eine neue PreparerFactoryClass angegeben werden, damit die Preparer tatsächlich aufgerufen werden können:
    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
      {...}
      <property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.Spring BeanPreparerFactory"/>
    </bean>

Voilá!