Posts Tagged: ‘Extensibility API’

Quick-n-Dirty: Use your own Factory classes in XPages

18. Oktober 2012 Posted by Sven Hasselbach

Here is a easy way to use your own factory classes in XPages:

1. Create a file named “com.ibm.xsp.factories.properties” in the WEB-INF-Folder of your NSF

 

 

2. In this file, define the factory classes you want to use in the format<NAME>=<Java Class>

HelloWorldFactory=ch.hasselba.factory.HelloWorld

3. Create a java class, in this example ch.hasselba.factory.HelloWorld

package ch.hasselba.factory;

public class HelloWorld 
{
   public HelloWorld(){
      System.out.println("Hello World Factory alive!");
   }

   public String getMessage(){
      return "Hello World!";
   }

}

The factory classes you are adding require a constructor. They will be instantiated during runtime.

4. After saving your java class and opening a XPage you should see the message on the server console (perhaps you have to do a clean first).

This means that the Factory is now accessible and is ready to use. The class will only be instantiated once during runtime.

5. To use your Factory, you have to do a lookup first, before you can use it. This can be done using the com.ibm.xsp.factory.FactoryLookup class which can be accessed via the current application (Please read the notice in the ExtAPI documentation!).

Here is a SSJS code snippet:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
   <xp:label id="labelHelloWorld">
      <xp:this.value>
         <![CDATA[#{javascript:
            var app = facesContext.getApplication();
            var facLookUp = app.getFactoryLookup();
            var hwFac = facLookUp.getFactory("HelloWorldFactory");
            hwFac.getMessage();
         }]]>
      </xp:this.value>
   </xp:label>
</xp:view>

The main difference between a managed bean and this approach is, that the class is instantiated as soon the JSF application starts running, not if you access the bean in your code for the first time. The factory class can do what you want, f.e. run a thread or whatever. The result of the operations can be accessed via the  factory lookup.

P.S. Keep in mind that this article has been posted in the “Quick-n-Dirty” category.

XPages: Run your own Servlets

9. Juli 2012 Posted by Sven Hasselbach

A really interesting article about running your own servlets on domino server can be found here: http://www.ibm.com/developerworks/cn/lotus/xpage-servlet/index.html

It’s chinese, but you can translate f.e. with Google’s Translator.

With 8.5.3 I had have some problems because the required interface IServletFactory could not be resolved in DDE.

To get the example running, you have to add a JAR to your build path. Open Project properties, select “Java Build Path” and click “Add External JARs“:

Now you have to add the file “lwpd.domino.adapter.jar“. This can be found in the following folder:

<NOTES>\framework\shared\eclipse\plugins\com.ibm.domino.xsp.adapter_<VERSION>

The <VERSION> string depends on your current installation and Server-Version.

After adding this JAR to the build path, the compilation problems should be resolved.

XPages application events: Create your own ApplicationListener (2)

7. Juli 2012 Posted by Sven Hasselbach

There is another interface available which provides the additional method applicationRefreshed. This event is always raised if the method refresh() of the Application-Object is fired.

Instead of implement the interface described in the previous posting, you have to use the interface named com.ibm.xsp.application.events.ApplicationListener2.

package ch.hasselba.jsf.debug;

import com.ibm.xsp.application.ApplicationEx;
import com.ibm.xsp.application.events.ApplicationListener2;

public class MyApplicationListener implements ApplicationListener2 {

    public void applicationCreated(ApplicationEx arg0) {
        System.out.println("applicationCreated()");
        System.out.println("ID: " + arg0.getApplicationId());
     }

    public void applicationDestroyed(ApplicationEx arg0) {
        System.out.println("applicationDestroyed()");
        System.out.println("ID: " + arg0.getApplicationId());
    }

    public void applicationRefreshed(ApplicationEx arg0) {
        System.out.println("applicationRefreshed()");
        System.out.println("ID: " + arg0.getApplicationId());
    }

}

You can fire the refresh of the application manually. Here is a simple example how to do this:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
   <xp:button value="Label" id="button1">
      <xp:eventHandler event="onclick" submit="true"
         refreshMode="complete">
            <xp:this.action>
               <![CDATA[#{javascript:
                  facesContext.getApplication().refresh()
               }]]>
            </xp:this.action>
        </xp:eventHandler>
   </xp:button>
</xp:view>

By clicking the button, the refresh is fired:

XPages application events: Create your own ApplicationListener

7. Juli 2012 Posted by Sven Hasselbach

If you want to get a handle to application events and want to know if a XPages application is created or destroyed (which means the application was destroyed because of a time out), you can implement this by creating your own own application listener.

For this you have to do the following steps:

  1. Create a class which implements the ApplicationListener interface
  2. Activate the class in XPages runtime

To realise the first part, you have to create a class that implements the interface com.ibm.xsp.application.events.ApplicationListener. This interface has two methods: applicationCreated and applicationDestroyed (the method names should be self-describing enough).

Here is an example:

package ch.hasselba.jsf.debug;

import com.ibm.xsp.application.ApplicationEx;
import com.ibm.xsp.application.events.ApplicationListener;

public class MyApplicationListener implements ApplicationListener {

    public void applicationCreated(ApplicationEx arg0) {
        System.out.println("applicationCreated()");
        System.out.println("ID: " + arg0.getApplicationId());
    }

    public void applicationDestroyed(ApplicationEx arg0) {
        System.out.println("applicationDestroyed()");
        System.out.println("ID: " + arg0.getApplicationId());  
    }

}

Now to step two, the activation of the class. To do this, you have to add a special configuration file to your application:

  1. Switch to “Java” perspective
  2. Create a new folder “META-INF” in the “Code/Java” section
  3. Create a sub folder “services
  4. Create a file named “com.ibm.xsp.core.events.ApplicationListener
  5. In this file you add the full name of your MyApplicationListener class (including the package name):

The file structure should now look like this in Java perspective:

If you switch back to Domino perspective, the structure in the “Code/Java” looks like this:

You can now verify that all works correctly by opening a XPage and have a look on your server console:

[The application timeout was set to one minute.]

LotusScript in XPages (3): Quick-n-Dirty-Aktivierung

10. April 2012 Posted by Sven Hasselbach

LotusScript in XPages

Dies ist der dritte Teil des Artikels “LotusScript in XPages”. Der erste Teil befindet sich hier, der zweite Teil hier.

 

Die Quick-n-Dirty-Aktivierung

Damit die BindingFactory verwendet werden kann, müsste eigentlich ein Plugin erstellt werden, doch es gibt auch eine “Abkürzung”, denn die Factory kann auch über einen angepassten ViewHandler in XPages verwendet werden. Dies ist beim Testen / Entwickeln eine sehr praktische Angelegenheit, da sich dadurch der Aufwand deutlich verringern lässt (Vielen Dank an dieser Stelle an Jesse Gallagher für seine Idee).

Der ViewHandler ist einfach aufgebaut und sieht wie folgt aus:

package ch.hasselba.xpages.jsf.el;

import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import com.ibm.xsp.application.ApplicationEx;
import com.ibm.xsp.factory.FactoryLookup;

public class LSViewHandler extends
   com.ibm.xsp.application.ViewHandlerExImpl {
    public LSViewHandler(ViewHandler paramHandler) {
        super(paramHandler);
    }

    @SuppressWarnings({ "deprecation" })
    @Override
    public UIViewRoot createView(FacesContext context,
       String paramString) {
        ApplicationEx app = (ApplicationEx) context.getApplication();
        FactoryLookup facts = app.getFactoryLookup();

        LSBindingFactory lsfac = new LSBindingFactory();
        if(facts.getFactory(lsfac.getPrefix()) == null) {
            facts.setFactory(lsfac.getPrefix(), lsfac);
        }

        return super.createView(context, paramString);
    }

}

Der aktuellen Application-Instanz wird hierbei die BindingFactory im createView() hinzugefügt, wenn diese noch nicht vorhanden ist, danach wird die ursprüngliche createView()-Methode der erweiterten Klasse com.ibm.xsp.application.ViewHandlerExImpl aufgerufen.

Dann muss nur noch die faces-config.xml modifiziert und der neue ViewHandler eingetragen werden:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
  <application>
    <view-handler>ch.hasselba.xpages.jsf.el.LSViewHandler</view-handler>
  </application>
</faces-config>

Nun kann in der XPage mit dem neuen “lotusscript”-Tag experimentiert werden. Da der Designer den neuen Tag nicht kennt, wird immer eine Warnung ausgegeben werden bzw. die Syntax mit einem Ausufezeichen markiert:

Dies stellt aber (zumindest unter 8.5.3) kein Problem dar, ist aber erst durch eine “saubere” Plugin-Lösung behebbar.

In den nächsten Teilen wird die Plugin-Variante vorgestellt, und ein paar Erweiterungsmöglichkeiten für den LotusScript-Wrapper gezeigt.

LotusScript in XPages (2): LotusScript-Wrapper

8. April 2012 Posted by Sven Hasselbach

LotusScript in XPages

Dies ist der zweite Teil des Artikels “LotusScript in XPages”. Der erste Teil befindet sich hier.

 

Der LotusScript-Wrapper

Um dynamischen LotusScript-Code auszuführen, bietet sich die Execute()-Funktion an: Mit der Funktion lässt sich fast der gesamte Umfang der LotusScript-eigenen Backendfunktionalität nutzen, also auch Scriptlibraries einbinden uvm.

Leider steht diese Methode jedoch nicht  in Java direkt zur Verfügung (im Gegensatz zur Session.evaluate()-Methode für @Formelsprache), so dass nur der Umweg bleibt, die Funktion durch Aufruf eines LotusScript-Agenten zu verwenden, und das Ergebnis an die XPage zurück zu liefern. Dabei wird der auszuführende LotusScript-Code und das Ergebnis der Operation über ein temporäres NotesDokument via DocumentContext hin- und hergereicht.

Hier die Klasse “LSExceutor”, die die nötigen Hilfsfunktionen bereitstellt:

package ch.hasselba.xpages.jsf.el;

import javax.faces.context.FacesContext;
import java.util.Vector;
import lotus.domino.Agent;
import lotus.domino.Database;
import lotus.domino.Document;

public class LSExecutor {
    private final static String agentName  = "(LSExecutor)";
    private final static String fieldLSResult = "LSResult";
    private final static String fieldLSCode = "LSCode";

    public static Vector execLotusScriptCode( final String lscode ){
        try{
            Database curDB =  (Database) getVariableValue("database");
            Document doc = curDB.createDocument();
            String hlp = lscode.replace( "\n", "\t" );
            doc.appendItemValue( fieldLSCode, hlp );
            Agent agent = curDB.getAgent(  agentName );
            agent.runWithDocumentContext( doc );
            return doc.getItemValue( fieldLSResult );

        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

     public static Object getVariableValue(String varName) {
         FacesContext context = FacesContext.getCurrentInstance();
         return context.getApplication().getVariableResolver().
          resolveVariable(context, varName);
     }
}

Die statische Methode execLotusScriptCode() wird in den Bindings verwendet, die in Teil 1 beschrieben wurden. Durch den Umstand, dass die runWithDocumentContext()-Methode auf das Ende der Agentenausführung wartet, ist eine sequentielle Verarbeitung gewährleistet.

Der Agent ist ebenfalls recht einfach aufgebaut:

%REM
    Agent LSExecutor
    Created Apr 6, 2012 by Sven Hasselbach/Sven Hasselbach
    Description: LSExecutor agent is a mapper for executing
                 LotusScript code from XPages
%END REM
Option Public
Option Declare

Const fieldLSCode = "LSCode"
Const fieldLSResult = "LSResult"

Dim returnValue
Sub Initialize
    Dim session As New NotesSession
    Dim doc As NotesDocument
    Dim lsCode, tmp , ret

    Set doc = session.Documentcontext
    lsCode = doc.Getitemvalue( fieldLSCode )
    tmp = Evaluate( | @ReplaceSubstring( "| & _
        lsCode(0) & |"; @Char(9) ; @Char(10) ) | )

    ret = Execute( tmp(0) )
    doc.Replaceitemvalue fieldLSResult , returnValue

End Sub

Um auf das Ergebnis der Berechnung zurückgreifen zu können, muss eine globale Variable verwendet werden, da die Execute()-Funktion selbst keine Rückgabemöglichkeit bietet (siehe Domino Designer Hilfe). In diesem Fall ist es “returnValue”, dessen Wert in das via DocumentContext übergebene Dokument geschrieben wird. Entsprechend muss der LotusScript-Code angepasst sein, siehe dazu auch die Beispiele am Anfang des 1. Teils des Artikels. Hier zeigt sich eine Schwachstelle: Es können keine Objekte zwischen Java und LotusScript übergeben werden; ein Zugriff auf z.B. den FacesContext ist in LotusScript nicht möglich. Soll eine DocumentCollection zurück geliefert werden, muss dieses als Array von DocumentUniversalIds geschehen usw.

Der Agent muss im Namen des Benutzers laufen, daher muss der “Run as Web user”-Haken gesetzt sein:

Im dritten Teil wird eine Quick-n-Dirty-Variante gezeigt, die BindingFactory bekannt zu machen.

 

Anmerkung:

An dieser Stelle sei nocheinmal ausdrücklich darauf hingewiesen, das der hier gezeigte Code sich maximal im “Alpha”-Status befindet.

LotusScript in XPages (1): Basics

7. April 2012 Posted by Sven Hasselbach

LotusScript in XPages

Wäre es nicht schön, wenn man in XPages direkt mit Lotus Script arbeiten könnte? Wenn es einen Weg gäbe, mit der sich Lotus Script-Code direkt in der XPage einbetten liesse, und wie folgt zu verwenden wäre?

Prinzipiell ist das möglich, aber der hier dargestellte Weg ist eher als Workaround anzusehen und wird das Alpha-Stadium wohl eher nicht verlassen. Aber es lässt sich anhand dieser Anleitung zeigen, wie man XPages flexibel erweitern und weitere Interpreter-Sprachen der XPages-Engine hinzufügen kann.

Was mit der hier vorgestellten Lösung jedoch möglich ist, kann man in dieser kleinen Beispiel-XPage sehen:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

   <xp:label id="label1">
      <xp:this.value>
         <![CDATA[#{lotusscript:returnValue=-1 }]]>
      </xp:this.value>
   </xp:label>
   <xp:br/>
   <xp:br/>
   <xp:label id="label2">
      <xp:this.value><![CDATA[${lotusscript:
         Dim session as New NotesSession
         Dim db as NotesDatabase
         Set db = session.CurrentDatabase

         returnValue = db.AllDocuments.getFirstDocument.UniversalID
      }]]></xp:this.value>
   </xp:label>
</xp:view>

In der XPage kann der neue Tag “lotusscript:” verwendet und beliebiger LotusScript-Code direkt in die XPage eingebettet werden. Das Ergebnis im Browser sieht dann wie folgt aus:

Soviel vorab, nun zu erst einmal zu den Basics…

Grundlagen: Method-Bindings & Value-Bindings

Um einen neuen Tag für XPages bereitzustellen, müssen zu aller erst Bindings für Methoden- und für Werte-Zuweisungen erstellt werden. Die beiden Binding-Arten unterscheiden sich – grob formuliert* – wie folgt: Value-Bindings werden überall dort verwendet, wo ein Wert einer Komponente zugewiesen wird und (wie der Name erahnen lässt) eine value-Eigenschaft exitsiert. Dies ist bei praktisch allen UIKomponenten der Fall. Method-Bindings hingegen kommen bei der Zuweisung bei samtlichen Events ins Spiel: Der SSJS-Code eines BeforePageLoad-Events wird mit einem Method-Binding gesetzt, oder der Code bei Button-Events usw.

Die Value-Binding-Klasse, die für die hier geschilderten Zwecke benötigt wird, sieht wie folgt aus:

package ch.hasselba.xpages.jsf.el;

import com.ibm.xsp.binding.ValueBindingEx;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.PropertyNotFoundException;

public class LSValueBinding extends ValueBindingEx {
    private String data;

    public LSValueBinding(String content) {
        this.data = data;
    }

    @Override
    public Object getValue(FacesContext context)
        throws EvaluationException, PropertyNotFoundException {
            return LSExecutor.execLotusScriptCode( data );
    }

    @Override
    public void setValue(FacesContext context, Object obj)
       throws EvaluationException, PropertyNotFoundException {}

    @Override
    public boolean isReadOnly(FacesContext context)
        throws EvaluationException, PropertyNotFoundException {
            return true;
    }

    @SuppressWarnings("unchecked")
    @Override
    public Class getType(FacesContext context)
        throws EvaluationException, PropertyNotFoundException {
            return Object.class;
    }
}

Das Value-Binding erweitert die Klasse com.ibm.xsp.binding.ValueBindingEx und überschreibt deren Eigenschaften, wo es nötig ist. Im Konstruktor der Klasse findet die Wertezuweisung statt; es wird hier der Teil, der in der XPage nach dem “lotusscript:” folgt, übergeben. Auch mehrzeiliger Code in der XPage wird als einfacher String durchgereich, getrennt durch Zeilenumbrüche.

Um an den Wert des Bindings zu gelangen, wird während der Verarbeitung durch das JSF Framework die Methode getValue() aufgerufen; dies ist die Stelle, an der die Daten des Value-Bindings verarbeitet werden, und wie man hier sehen kann, findet der Aufruf des LotusScript-Codes genau an dieser Stelle statt.

Das notwendige Method-Binding ist so ähnlich aufgebaut:

package ch.hasselba.xpages.jsf.el;

import com.ibm.xsp.binding.MethodBindingEx;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.MethodNotFoundException;

public class LSMethodBinding extends MethodBindingEx {
    private String data;

    public LSMethodBinding () {
        super();
    }

    public LSMethodBinding (String expr) {
        super();
        this.data = expr;
    }

    @Override
    public Object invoke(FacesContext context, Object[] obj)
        throws EvaluationException, MethodNotFoundException {
            return LSExecutor.execLotusScriptCode( content );
    }
    @SuppressWarnings("unchecked")
    @Override
    public Class getType(FacesContext context)
        throws MethodNotFoundException {
            return null;
    }
}

Hier wird wie Klasse com.ibm.xsp.binding.MethodBindingEx erweitert und wenn nötig überschrieben. Anders als bei Value-Binding erfolgt der “Abruf” der Daten eines Method-Bindings durch das JSF Framework nicht durch getValue(), sondern durch die Methode invoke(). Hierbei können theoretisch noch Parameter übergeben werden, die für die Verarbeitung relevant sein könnten. In diesem Fall kann dies aber getrost ignoriert werden.

Zu guter Letzt müssen die beiden Bindings in eine BindingFactory-Klasse zusammen geführt und mit dem “lotusscript“-Tag verbunden werden:

package ch.hasselba.xpages.jsf.el;

import com.ibm.xsp.util.ValueBindingUtil;
import com.ibm.xsp.binding.BindingFactory;
import javax.faces.application.Application;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;

public class LSBindingFactory implements BindingFactory {

    public String getPrefix() {
        return "lotusscript";
    }

    @SuppressWarnings("unchecked")
    public MethodBinding createMethodBinding(
         Application app, String expr, Class[] obj) {
        String script = ValueBindingUtil.parseSimpleExpression(expr);
        return new LSMethodBinding(script);
    }

    public ValueBinding createValueBinding(Application app, String expr) {
        String script = ValueBindingUtil.parseSimpleExpression( expr );
        return new LSValueBinding(script);
    }
}

Die Klasse erweitert com.ibm.xsp.binding.BindingFactory und ist die “Weiterleitung” innerhalb des JSF-Frameworks: Die Methode getPrefix() liefert den String zurück, für den diese BindingFactory zuständig ist; es ist praktisch jeder Bezeichner verwendbar, nur id und javascript sind bereits verwendet.

Während der Verarbeitung der Bindings such das JSF-Framework zur Laufzeit nach der passenden Factory. Dabei werden alle bekannten Factories nach dem passenden Prefix durchsucht, weshalb die BindingFactory dem Framework noch bekannt gemacht werden muss, um verwendet werden zu können.

Im zweiten Teil wird eine Quick-n-Dirty-Variante gezeigt, die BindingFactory bekannt zu machen und der LotusScript-Wrapper wird vorgestellt.

*: Anmerkung:

Aus Sicht der JSF-Spezifikation ist der Unterschied zwischen Value-Binding und Method-Binding etwas komplexer, als hier dargestellt.

Erfahrungsbericht: Notes Entwickler Camp 2012

28. März 2012 Posted by airwolf89

Ja, schöne Dinge vergehen viel zu schnell. Heute war der letzte Tag des Notes Entwickler Camps 2012. Ich möchte an dieser Stelle meine Erfahrungen teilen und jedem ans Herz legen zu überlegen dort auch mal teilzunehmen.

Tag 1

Nach einer größtenteils unproblematischen Anreise kamen mein Kollege Sven Hasselbach und ich in Gelsenkirchen im Maritim Hotel an. Das Hotel war völlig in Ordnung, nichts über die Maße luxuriöses, aber zu meckern gab’s auch nichts.

Pünktlich um 10:30 Uhr startete das Camp mit der Begrüßung durch Rudi Knegt, dem Initiator und Veranstalter des Camps, welcher scheinbar immer gut gelaunt zu sein scheint =)

Anschließend teilte Philippe Riand in einer Präsentation mit, was in Zukunft in Sachen ICS, Social Business und XPages tun wird. Ein Kommentar, mit Live-Demo stach besonders heraus. Nämlich dass es bald einen richtigen Serverside Javascript Debugger geben wird. Dies wurde durch einen spontanen Begeisterungsausbruch der ca. 230 Teilnehmer kurz unterbrochen.
Quintessenz der Vorstellung war denke ich, dass sich IBM in Zukunft, wie zu erwarten war, auf den Bereich Social Business und XPages konzentrieren wird. Serverside Javascript soll sich zu Lingua Franca entwickeln, denn es wird an vielen Schnittstellen zu anderen Systemen, beispielsweise auch Sharepoint gearbeitet und soll zukünftig eine generische Schnittstelle für eine Vielzahl von Web-Anwendungen bereitstellen.

Anschließend gab es wie immer das kurze “Speed-Agendaing” (wahrscheinlich ein Produkt der von Rudi Knegt zum Leben erweckten Sprache “Rudisch”), in welchem die Referenten ein kurzen Abriss über die anstehenden Präsentationen gaben, um dem Teilnehmer die Entscheidung zu erleichtern an welchem von den 5 gleichzeitigen Sessions man denn teilnehmen sollte.

Ich entschied mich für die Session von Detlev Pöttgen von Midpoints, welche von Widgets, Livetext und Plugins handelte. In dieser Session stellte er die Einsatzmöglichkeiten und die Handhabung von Widgets dar. Wie man eines anlegt, wie man selbst welche mit Hilfe von Plugins erstellt und wie man sie unter den Usern verteilt. Letzteres kam leider aufgrund vieler Fragen ein wenig zu kurz, doch es gab über dieses Thema am nächsten Tag noch eine Session die sich auschließlich mit diesem Thema beschäftigte, von daher nicht so schlimm. Außerdem wurde ein konkretes Pluging gezeigt, welches intern beim Referenten genutzt wird. Es war ein Plugin, welches bei Markierung einer E-Mail Daten über den Absender aufruft und anzeigt welche Tickets und Aufträge dieses Kunden noch offen sind. Coole Idee.

Mein Fazit dazu: Eine sehr schöne Technologie, die meinerseits und bei mir in der Firma bisher ziemlich kurz kam. Jedoch sieht man alleine an den Plugins, welche wir für die Entwicklung verwenden, was damit möglich ist. Auch bieten sie eine schöne Schnittstelle mit denen man auf Web-Anwendungen zugreifen kann, auch auf XPages. Ich werde mir in Zukunft auf jeden Fall mal genauer anschauen was man damit machen kann und schauen dass wir das unseren Kunden anbieten können.

Parallel hielt Ulrich Krause einen Vortrag über die Grundlagen der XPages Entwicklung, Rocky Oliver über die bis heute große Macht von Lotusscript, Manfred Meise einen Vortrag über Security in Notes, sowohl auf Admin, als auch auf Entwickler Seite, was selbst erfahrenen Notes Entwicklern noch das ein oder andere erneut ins Gedächtnis rief bzw. klar gemacht hat, was Security angeht. Manuel Nientit. Zeigte in seiner Hands-On Session praktisch wie man in Javascript einsteigt.

Nach der Kaffepause ging es für mich mit dem Vortrag von Niklas Heidloff weiter, in welchem er kurz die schönsten Projekte auf OpenNTF vorstellte. Dabei zeigte er ein paar interne Zahlen von OpenNTF, beispielsweise dass fast jeden Tag ein neues Projekt auf OpenNTF hochgeladen wird und mittlerweile über 800 Projekte beherbergt. Er ging auf eine Vielzahl von Projekten ein, dessen Erwähnung diesen ohnehin schon viel zu langen Post sprengen würde. Zum größten Teil die wirklich gut gelungenen Projekte für die beiden vergangenen Development Contests und nutzte gleich die Chance den auf dritten Development Contest aufmerksam zu machen. Er zeigte sich stolz auf die Community wie viele Projekte jeden Monat neu hochgeladen werden und welche Qualität diese vorweisen können. Auch kündigte er an dass bereits an einem Plugin gearbeitet wird, mit dem man auf die veröffentlichten XSnippets direkt aus dem Domino Designer zugreifen kann.

Mein Fazit dazu: Man sollte auf jeden Fall einmal ein wenig Zeit investieren sich die Projekte auf OpenNTF anzuschauen und zu evaluieren welche man davon verwenden kann. Ich möchte fast schon garantieren dass für jeden das ein oder andere Projekt interessant sein wird. Auch ich werde, in Zukunft, versuchen mich dort ein wenig mehr einzubringen und XSnippets zu posten und auch mal das ein oder andere Control oder sogar Projekt zu veröffentlichen.

Parallel hielt Matthew Fyleman einen Vortrag darüber wie man bestehende Notes Applikationen am besten in XPages Anwendungen verwandelt. Gerd Hildebrandt zeigte in seinem Vortrag dass LotusScript noch lange nicht tot ist. Christian Habermüller zeigte wie man am besten Workflows analysiert und dokumentiert und dabei auch ein wenig über den Tellerrand des Entwicklerhorizonts schaut. Das Hands-On von Thomas Schneider über Composite Applications fiel leider aufgrund eines Unfalls in der Familie aus. Gute Besserung an dieser Stelle.

Das Abendprogramm bestand dann aus “Speed-Demoing” bei welchem jeder der ein interessantes Problem oder Konzept vorzustellen hatte, 5 bis 10 Minuten Zeit bekam dies mit einer kurzen Präsentation zu zeigen. Anschließend gab es eine offene Fragerunde, in welcher jeder seine Problemchen auf die man während der Entwicklung traf vorstellen und mit allen Teilnehmern diskutieren konnte. Bei diesen Fragerunden, welche jeden Abend stattfanden, wurde eine Vielzahl von Problemen auch direkt gelöst oder zumindest Herangehensweisen vorgeschlagen, was einige Entwickler, denke ich, ziemlich glücklich gemacht haben dürfte. Allerdings ist mir in diesen Veranstaltungen bewusst geworden, wie wenige Leute sich so intensiv mit XPages beschäftigen, so wie ich das bei mir auf Arbeit tue. Der Großteil der Probleme waren allgemeine Probleme mit Notes (im Klassischen Notes Umfeld) oder Probleme mit Lotusscript oder Formelsprache.
Danach gab es dann, moderiert von Gregory Engels, Präsentations-Karaoke.

Anschließend wurden die Teilnehmer von den Veranstaltern dazu genötigt bis 22:30 Uhr die Bier- und Weinreserven des Hotels zu vernichten. Bei dieser überaus unangenehmen Aufgabe wurde viel gefachsimpelt, Erfahrungen ausgetauscht und Bekanntschaften geschlossen und Kontakte geknüpft. Als dann gegen 2 Uhr die letzte Bar im Hotel schloss ging dann auch der letzte Notes-Entwickler glücklich ins Bett und freute sich auf den nächsten Tag.

Tag 2

Pünktlich um 08:10 Uhr startete man dann mit einigen Organisatorischen Dingen und Speed-Agendaing zu den aktuellen Präsentationen in den neuen Tag. Danach machten sich die Teilnehmer, motiviert und ausgeschlafen wie man das nach dem vorherigen Abend erwarten würde auf zu den Sessions.

Ich besuchte die Präsentation von Ulrich Krause in welcher er die Extension Library, wie sie funktioniert, wie man sie installiert und wie man sie verwendet ausführlich beschrieb. Dabei stellte er auch das eine oder andere Modul aus der Extension Library ein. Auch wurden ein paar allgemeine Themen rund um die neuen Features in 8.5.3 vorgestellt. Auch Themen wie Themes wurden angesprochen. Nebenbei wurden natürlich viele Fragen beantwortet.

Mein Fazit: Wie schon vorher für mich feststand wird es für mich, freiwillig, keine Entwicklung mehr ohne die Extension Library geben. Dazu gibt es einfach zu viele geniale Module in der Library welche sich perfekt für die Entwicklung eigener Anwendungen eignen, als dass man sie ignorieren könnte. Außerdem, da durch das Upgrade Pack 1 die Extension Library, in leicht abgespeckter Version, nun vollständig von der IBM supported wird, gibt es nun keinen Grund mehr für Notes Admins sich dagegen zu wehren die “ach so böse openSource Software” auf den eigenen Notes Servern zu installieren.

Parallel hielt Werner Motzet einen Vortrag über agile Software- und Projektmanagementmethoden und gab einige Tipps über eine effizientere Projektführung im Notes Umfeld. Jürgen Kunert stellte vor wie man Richtig(er) kommuniziert, ein Vortrag über Kommunikationsmittel und wie man sie im Entwicklungsumfeld besser nutzen kann. Matthias Schneider stellte den Lotus Protector von IBM ein wenig genauer vor und erläuterte wie man ihn einsetzen und selbst erweitern und anpassen kann. Howard Greenberg lehrte in einer Hands-On Session den Einstieg in die XPages Entwicklung.

Anschliessend besuchte ich die Session von Manfred Meise, in welcher er detailliert die Einsatzmöglichkeiten von Themes darstellte und einen Einstieg in diese Thematik gab. Für mich war leider wenig neues dabei, trotzdem ein interessanter Vortrag.

Mein Fazit: Mit Themes hatte ich mich ja bereits zuvor beschäftigt. Ich wurde jedoch darin bestätigt dass es keinen Grund sie nicht einzusetzen, da sie einem einfach sehr viele Möglichkeiten geben die grafische Gestaltung seiner Anwendungen effektiv aufzubauen und zu verwalten.

Parallel hielt Gregory Engels einen Vortrag, genannt “Ich weiß was du diesen Sommer tun wirst”, in welchem er einen Blick in die Kristallkugel warf und darstellte wie es wahrscheinlich mit Notes und den XPages weitergehen wird und was sich hinter den einzelnen Schlagwörtern, mit welchen die IBM auf der LotusSphere um sich warf, verbirgt und was man damit alles machen könnte. Phil Riand und Niklas Heidloff komprimierten den Inhalt einer Wochenfüllenden Vorstellung über die Features von 8.5.3, der Extension Library, JDBC Datasources, REST Schnittstellen, OAuth, der XPages Workflowengine XFlow, OSGi Tasklets und Plugins. Ich hörte von Teilnehmern die mit Kopfschmerzen und einem von Ideen überquellenden Hirn aus dieser Präsentation herausgingen. Ein Kollege von Thomas Schneider war so freundlich sich mit der Präsentation über Webservices unter Notes auseinanderzusetzen, sodass sie doch noch stattfinden konnte. Vielen Dank für die Anstrengungen. Howard Greenberg setzte sein Hands-On über den Einstieg in XPages fort.

Nach der Mittagspause und einem dringend benötigten, aber viel zu kurzen Mittagsschlaf, besuchte ich die Session von Rocky Oliver, in welcher er über die gute alte Formelsprache referierte und Einsatzmöglichkeiten und das immer noch enorme Potential herausstellte und die wichtigsten Befehle vorstellte und zeigte dass manche Befehle doch mehr können als manch einer denkt. Auch über Stolperfallen und Schwierigkeiten wurden einige Worte verloren. Allerdings gab es auch ein Kapitel wie man Formelsprache in Serverside Javascript einsetzt.

Mein Fazit: Für mich sehr nützlich, da ich ja direkt mit der XPages Entwicklung eingestiegen bin und daher noch die ein oder andere Lücke in Standard Notes Entwicklung habe.

Parallel hielt Niklas Heidloff einen Vortrag wie man XPages Applikationen social macht und ging dabei auf die Möglichkeiten des Social Enablers ein, welcher es aber leider nicht in das Upgrade Pack 1 geschafft hat. Christian Habermüller referierte über agile Methoden im IT-Projektmanagement. Bernhard Köhler hielt einen Vortrag über das leidige Thema wenn man als Entwickler Altlasten erbt und sich mit der Herausforderung konfrontiert sieht alte, historisch gewachsene Anwendungen zu erweitern. Detlev Pöttgen zeigte in seiner Hands-on Session wie man Plugins und Widgets in einer Notes Infrastruktur verteilen kann.

Anschließend besuchte ich den Vortrag von René Winkelmeyer, welcher vorstellte wie man eigene Extensions mit der Extensibility API (!= Extension Library) entwickelt und eigene Module (wie in der Extension Library) entwickelt und installiert. Dabei zeigte er wie man sich eine Entwicklungsumgebung aufsetzt um diese Extensions auf dem Domino Server installiert. Mit dieser Session nahm er einigen Entwicklern, darunter auch mir, die Angst vor diesem Thema, welches nach eigener Aussage von René Winkelmeyer “… nichts für kleine Mädchen ist…”

Mein Fazit: Anhand der Extension Library sieht man ja wie mächtig diese Technologie ist. Extension sind einfach die beste Möglichkeit wiederverwendbare Module zu entwickeln. Mit diesem Thema werde ich mich zukünftig auf jeden Fall auseinandersetzen und hoffentlich auch ein paar Erfolge erzielen. Ich bin ja schließlich kein kleines Mädchen…. =)

Parallel hielt Frank van der Linden wie man das unmögliche mit XPages möglich macht. Dabei ging er auf Themen ein die nur sehr schwer mit Standard Notes Mitteln vor den Xpages umzusetzen waren und nun möglich geworden sind. Matthias Schneider zeigte wie man mit mobilen Anwendungen auf Notes-Daten zugreifen kann. Dabei stellte er zahlreiche Werkzeuge für mobile Anwendungsentwicklung vor, wie z.B die Extension Library, den Lotus Traveler und den Notes Application Player vor. Karsten Lehmann stellte den Einsatz von weiteren NoSQL-Datenbanken und deren Einsatzmöglichkeiten im Notes-Umfeld vor. Peter Klett gab in seiner Hands-On Session einen Einstieg in LotusScript.

Im Abendprogramm gab es wieder eine offene Fragerunde, Speed-Demoing und eine Verlosung in der Dinge wie eine Nintendo Wii, ein Monitor, fernsteuerbare Hubschrauber, Geek-Toys, Entwickler-Treibstoff (Sekt und Wein) und einige T-Shirts von TLCC verlost wurden.
Anschließend wurden wir wieder gezwungen die verbliebenen Bier- und Wein Vorräte des Hotel zu vernichten. Eine Aufgabe der zahlreiche Entwickler widerstrebend aber pflichtbewusst nachgingen und dabei wieder viel fachsimpelten und Erfahrungen austauschten.

Tag 3

Der Endspurt des Entwicklercamps wurde wieder mit organisatorischen Dingen und Speed-Agendaing eingeläutet.

Für mich ging es weiter mit Versionskontrolle im Domino Designer mithilfe von GIT/ eGIT, vorgestellt von Holger Chudek. Hier zeigte er welche Möglichkeiten es im Domino Designer für Versionskontrolle gibt, welche Stolperfallen es gibt und wie man ein solches System einrichten und benutzen kann.

Mein Fazit: Ein sehr schönes Tool, welches natürlich Vor- und Nachteile mit sich bringen kann. Da es in meiner Firma sowieso angedacht war so etwas im Entwicklungsbereich zu verwenden, war dieser Vortrag natürlich sehr hilfreich und aufschlussreich und half bereits einigen Stolpersteinen im vornherein zu umgehen.

Parallel hielt Bernd Hort einen Vortrag über Java-Entwicklung im Notes-Umfeld, in welchem er die Einsatzmöglichkeiten in Agenten, Servlets, Libraries und XPages darstellte. Frank van der Linden hielt einen Vortrag über den Activity Stream und das Social Business Toolkit der IBM, in welchem er darauf einging wie man es verwendet und einsetzten kann. Bernhard Köhler ging in seinem Vortrag “Notes und die Zeit” darauf ein wie man die immer wieder auftretenden Probleme mit Zeit-Daten im Notes-Umfeld in den Griff kriegt. Matthias Schneider zeigte im Hands-On wie man mit mobiler Applikationsentwicklung beginnt.

In der letzten Session lauschte ich den Ausführungen von Richard Sharpe, in welchen er darstellte wie man mobile Applikationen mithilfe der Extension Library entwickelt und gab einige sehr hilfreiche Tipps und nahm vielen Entwicklern die Angst vor diesem Themengebiet.

Mein Fazit: Mobile Applikationsentwicklung ist eigentlich nicht so schwer wie man es sich vielleicht vorstellt. Vor allem mit JQuery hat ein sehr wertvolles und mächtiges Werkzeug an der Hand. Ich werde in Zukunft auf jeden Fall keine Schweissausbrüche bekommen wenn Kunden mal so etwas fordern.

Parallel hielt Matthias Bierl einen Vortrag über die Einsatzmöglichkeiten des Dojo Toolkits zu verfügung, auch abseits der XPages Entwicklung. Peter Klett zeigte Eindrucksvoll wie man im Notes Umfeld Riesenprojekte (nach eigener Aussage ein System mit über 30 Mio. Dokumenten in über 5.500 Datenbanken, was nur ein Projekt von vielen ist) aufsetzen und verwalten kann und räumte mit dem Vorurteil auf dass es mit Notes nicht möglich sei große Systeme zu betreiben. Andreas Artner stellte Schnittstellenentwicklung mit dem Tivoli Directoty Integrator vor und zeigte dass sich hinter diesem Tool mehr verbirgt als der Name glauben lässt. René Winkelmeyer zeigte in einem Hands-On wie man sich eine Entwicklungsumgebung für die Entwicklung mit der Extensibility API aufsetzt und ließ die Teilnehmer erste Erfahrungen in diesem Thema sammeln.

Anschließend startete, während meiner Teilnahme an den kostenlos angebotenen Zertifizierungstests, ein Vortrag von Werner Motzet, in welchem er in sehr interessanter und witziger Art und Weise auf sein Leiden aufmerksam machte, welches er durchleben muss seit seine Firma auf Microsoft Produkte (Outlook und Exchange) umgestiegen ist. Allerdings war dieser Vortrag nicht (nur) eine Hass-Tirade gegen Microsoft Produkte, sondern hinterfragte konstruktiv und kritisch die Unternehmenskultur, das Marketingverhalten und Verhaltensweisen von IBM und Microsoft. Hier stellte er einige sehr wichtige und interessante Fragen, die einige Entwickler nachdenklich stimmten. Damit dies auch bei der IBM passiert kündigte er an auf der nächsten DNUG eine Podiumsdiskussion mit IBM anzustoßen, in welchem Fragen wie Zukunft einiger Produkte, Unternehmenszukunft und Marketingverhalten geklärt werden sollen.

Damit war das Entwicklercamp 2012 vorbei und die Teilnehmer machten sich wieder auf den Heimweg, mit den Köpfen voller Ideen, den Taschen voller Visitenkarten neu geschlossener Kontakte und dem Finger im Terminkalender um nach freier Zeit zu suchen die nötig ist sich mit all den neuen Themen und Ideen auch auseinandersetzen zu können.

Mein Fazit zum Entwicklercamp:

Es macht Spass
Es lohnt sich
Es ist wertvoll

Wenn es in meiner Macht liegt werde ich definitiv wieder teilnehmen. Es waren sehr interessante Themen dabei, von denen ich leider nur einen kleinen Teil mitbekommen konnte. Man konnte sich mit anderen Entwicklern austauschen und Erfahrungen sammeln und tauschen. Auch sehr wertvoll war die Ecke, in welcher man seinen Laptop anschließen konnte um mit anderen Teilnehmern Themen anschaulich besprechen konnte und versuchen neue Ideen und Lösungen für Probleme zu finden. Genau darum ging es auch bei dieser Veranstaltung, welche von Entwicklern für Entwickler gemacht ist, hier geht es nicht darum Technologien oder Dienstleistungen zu verkaufen, sondern um gegenseitig neue Ideen und Lösungen zu entdecken und zu erlernen. Von daher sehr wertvoll für jeden Entwickler, der nicht einfach nur seinen Job macht, sondern das liebt was er tut.

An dieser Stelle nochmal vielen Dank an die Veranstalter, die Referenten und auch an den Sponsor Teamstudio.


Einsortiert unter:Notes & XPages Tagged: Andreas Artner, Android, Apple, Bernd Hort, Bernhard Köhler, Blog, Christian Habermueller, Composite Applications, Datasource, Debugger, Detlev Pöttgen, Development Contest, DNUG, Dojo, Eclipse, eGIT, Extensibility API, ExtLib, Formel, Formula, Frank van der Linden, Gerd Hildebrandt, Gergory Engels, GIT, Holger Chudek, Howard Greenberg, ibm, ICS, Java, Jürgen Kuhnert, JDBC, JQuery, Karsten Lehmann, Livetext, Lotus Protector, Lotus Traveler, Lotusscript, LotusSphere, Manfred Meise, Manuel Nientit, Matthew Fyleman, Matthias Bierl, Matthias Schneider, Mobile, Module, Niklas Heidloff, NoSQL, Notes, Notes 8.5.3, Notes Application Player, Notes Entwickler Camp 2012, OAuth, OpenNTF, OSGi, Peter Klett, Philippe Riand, Plugin, Presentation Karaoke, Rene Winkelmeyer, REST, Richard Sharpe, RKJSoft, Rocky Oliver, Rudi Knegt, Security, Serverside Javascript, Servlet, Social Business, Social Business Toolkit, Social Enabler, Stolperfalle, Tasklet, Teamstudio, Themes, Thomas Schneider, Tivoli Directory Integrator, TLCC, Tools, Ulrich Krause, Werner Motzet, Widget, XFLow, XPages, XSnippets