RSS

Category Archives: IBM

JSON Arrray parsing with com.ibm.commons.util.io.json.JsonJavaFactory

I’m currently developing the backendservices for our new absenceplanner. We submit all data to a rest service (CustomRestService in the ExtLib). So this service should be able to parse an array of json data. The data has the following format:

{
“dates”:[
{“div”:”dt20120827″,”dt”:”27.08.2012″,”metadata”:{“absenceType”:”Holiday”,”allDay”:true}},
{“div”:”dt20120829″,”dt”:”29.08.2012″,”metadata”:{“absenceType”:”Compensation”,”allDay”:true}}
],
“reqTitle”:”meine wohlverdienten ferien”,
“method”:”request.submit”
}

To parse the stream in to a JsonJavaObject I’ve used:

JsonJavaFactory factory = JsonJavaFactory.instanceEx;
Reader r = request.getReader();
json = (JsonJavaObject) JsonParser.fromJson(factory, r);
String strMethod = json.getString(“method”);

It’s very easy to extract all properties. An object can also be accessed with json.getJsonObject(“name”) . But no arrays. There is no getter.

But, how did others (like the ExtLib programmers) solve this? With this question I’ve read the code of the “twitter parsing” in the sbt of the ExtLib. And I found the solution in the com.ibm.xsp.extlib.sbt.services.client.DataNavigator class, which guides me to the following code:

 

Object arrDates = factory.getProperty(json, “dates”);
for (Iterator<Object> itDate = factory.iterateArrayValues(arrDates); itDate.hasNext();) {

JsonJavaObject jsDate = (JsonJavaObject)itDate.next();
//-> here do all the funny stuff with the jsDate object.
}

Thanks to Philippe Riand (IBM) for sharing your code. Its so inspiring to read your code.

 
6 Comments

Posted by on September 11, 2012 in Java, XPages

 

Tags: , , , ,

Documents and Spreadsheets with XPages – the Idea (Part I)

In several projects we are faced with the request to export data to a spreadsheet (mostly excel) or build a document for ms-word. So our development team requested the following: “Build an extension that helps us generate word documents or export datasets to spreadsheets”.
After some research, I found a project called Apache POI.

Apache POI covers all the stories, which we try to implement. So let’s begin with the first story: “Generating a new ms-word document”.
The story is very simple, but also very powerful. In our example the starting point is a document like the OpenNTF Contributor License Agreement. This document is needed for a company to contribute code to OpenNTF. Typically, this document has some lines (fields), which you have to fill in with your values.  Let’s try to automate this process. We will build a form in the XPages application, where you can fill in your company name, address and other things. Then we modify the standard OpenNTF form a little bit, as you can see on the screenshot below:


In your XPages form we implement the new POI Document element and then we do some wiring:

  1. We define where the modified OpenNTF Licence Agreement is. This could be a file resource in the application, or a document accessible via view and a predefined key.
  2. Defining “Bookmarks”:
    As you see on the word document, we have defined several “<<NAME OF BOOKMARK>>” tags in the text. This text must be in the same style, so they are in the same “run” Element on the document.
  3. In our “POI Document” – Control could we now define a bookmark for each <<…>> element, which contains the name and a value.
  4. As you see, the value can be computed (so a binding to a viewScope variable is possible)
  5. We define a “download” button and connect the onClick event on a new action called “Generate Document”

The user can now fill in their values on the page and generate a customized word document.  Developers are able to build in applications to produce customized documents in a very short time.
In the next blog entries, we will show you how we have build an extension of this function.

 

Tags: , , , ,

myWebGate – Social Software Development Process – Lessons learned.

During the lotussphere 2012 I was inspired to build our myWebGate Framework totaly new from scratch. The powere and the energy of the ibm developers and system architects has forced me to rethink my mindset about the whole XPages technologie. But rewriting a one year old framwork, with over a hunder days of manpower investigated, to have the same new made?

A crule idea but our executive board gave us the order to do this, under the focus of training, learning and transforming our development approach. It was a great time.

Yesterday we released the version 1.1 of myWebGate. This version completes some open user stories (see the release notes here) and it also completes a very new way of working together.

Our whole myWebGate development team was at the project start something we called consulting ninijas. High skilled and very talented in any aspect of development and administration of lotus notes domino. At the project start my co-pilot Peter Luder and I decide to change the model. Not a typical vertical approach: We transformed the team to a horizontal development approach. Richard became the role of our UI Guru, Peter does the project controlling and my job was the architecture. Barbara, Arthur and Marco are focused on serveral businessprocesses in the myWebGate Framwork.

This leads us to a better teamplay. Interaction was mandatory and every piece of code we build must fit. This pressure and this model of work, has effected any discussion. Normally you would expect more inefficiency, but it was vice versa. Focussing of the core competence and the delivering of brilliant work, leads to an unexpected effort and more features in the initial release as planned. And also a lot more in release 1.1.

Learn more about myWebGate -> Read This (german) and the documentation (english).

 
Leave a comment

Posted by on June 26, 2012 in Building Process, myWebGate, SCRUM, XPages

 

Tags: , , ,

Accessing Beans from Java Code in XPages (learned by Reading the SourceCode of the ExtensionLibrary)

Hello Java and XPages Fans

During our work for the myWebGate 2.0 OpenNTF Edition i was faced with a very simple Problem. I had to access a public method in one of our managed beans. This managed beans are designed to act as session facade. So the bean name is directory bean and the scope is session. The ClassName is based on our internal guidlines DirectorySessionFasade.

In this class, is a method called getMySelf() witch gives me some information about my current user in context of the myWebGate Framework. The powerfull thing about managed beans is, that the object exists only one time baed on the scope, in this case one time each session.

For our activtystream implementation I have to acces this getMySelf() methode, because all my relations are stored in the returning object. A short google search doesnt help, but I rember that I’ve ready a pattern in the ExtensionLibrary, that maby can help. An voilaz there it was, written by Phillip Riand, I found some thing that I changed to this for my situation:

public static final String BEAN_NAME = “directoryBean”; //$NON-NLS-1$
    
public static DirectorySessionFacade get(FacesContext context) {
        DirectorySessionFacade bean = (DirectorySessionFacade)context.getApplication().getVariableResolver().resolveVariable(context, BEAN_NAME);
        return bean;
    }
    
    public static DirectorySessionFacade get() {
        return get(FacesContext.getCurrentInstance());
    }

This simple codesnipped gives you the capability to execute DirectorySessionFacade.get().getMySelf(). The DirectorySessionFacade.get() Code calls the get( FacesContext context() and there the inmemory Variable directoryBean can be accessed.

What a simple construct to access the same instance in java as in the SSJS and XPAGES. Thanks to IBM for sharing the ExtensionLibrary as OpenSource.

 

myWebGate Building Process – Dojo und Templates

Das Benutzerverzeichnis ist ein Kernteil des myWebGate Framworks. Um dem Benutzer ein besonderes Erlebnis bei der Bedienung zu bieten, ist das Benutzerverzeichnis als “OnePage” Applikation designet. D.h. wir präsentieren alle Inhalte dynamisch. Die Daten werden via REST API direkt vom Server gelesen und dann on the Fly gerendert.

JSON 2 HTML Renderer gibts wie Sand am Meer. Unser Ehrgeiz war aber, dass wir das Problem mittels DOJO lösen (naja auch einige Lizenzfragen sind dann einfach geklärt). Leider ist es mit DOJO so, wie mit manchem genialen Projekt. Irgendwie hat der Dokumentator frei gehabt. Erschwerend kommt dazu, dass im Gebrauch mit XPages noch ein paar Dinge zu beachten sind.

Also zuerst das Kleingedruckte (oder wie krieg ich so ein Design hin, wie es Rechts zu sehen ist).

  1. Wir haben das HTML Template als PAGE erfasst und dort den Contentype auf HTML gesetzt.
  2. Das HTML Template darf nur 1 Root Element haben, sonst hat DOJO ein Problem
  3. Das neue DOJO Modul muss mittels
    <xp:dojoModulePath url=”biz.webgate.mywebgate.person”
    prefix=”mywebgate.Person”>
            </xp:dojoModulePath>
    eingebunden werden.

Tja und dann ist alles ziemlich simpel. Wir erstellen eine Javascript Client -Library, die wir biz.webgate.mywebgate.person.js nenne und schreiben dort folgenden Code rein:

Mittels dojo.provide definieren wir, was dieses File liefert, dojo.require definiert was wir alles brauchen, hier ist dojox.dtl._Templated die Rendering Enginge, die auf django basiert. Im dojo.declare geschieht die Magie. Mittel der cache Anweisung lesen wir das HTML File ein und peron:null erweitert unser Widget um ein neues Objekt.

In der Funktion openPersonTab() fügen wir dann die Person ein. Dabei greifen wir auf ein Spezielles TAB Objekt zu, dass uns das dynamische generieren der Tabs erlaubt. Die Variable xhrArgs definiert den Zugriff auf unser REST Service und lädt von dort das Personen Objekt. Der effektive Aufruf geschicht dann mit dojo.xhrGet(…), aber im Objekt haben wir auch die Verarbeitung des Resultats definiert. load wird dann aufgerufen, wenn wir erfolgreich die Daten abgegriffen haben. Innerhalb dieser Funktion initalisieren wir ein neues Widget und geben die data (das ist das Person Objekt vom Rest Service) direkt an das Widget weiter. dojox.dtl._Template redert dann das Template. Und durch placeAt() hängen wir das Renderresulat an das richtige Ort.

Blicken wir noch in das HTML Template:

Der Zugriff erfolgt über die {{person.____ }} Anweisungen. Wie man aus dem Code erkennen kann sind sowohl IF abfragen, wie auch for Schleifen möglich. Der Sprachumfang von DJANGO wird hier detailiert beschrieben.

Der REST Service liefert übrigens folgenden Code zurück:

Dieses Konstrukt lässt es nun zu, dass wir ohne Rendering Aufgabe für den Server die verschiedensten Personen öffnen:

Der vollständige Code wird im Juni auf openNTF veröffentlicht und ist unter der Apache Lizenz verfügbar.

 

Warum FAST Prototyping nicht RAD (Rapid Application Development) ist… und warum wir lieber SCRUM einsetzen

Innerhalb der WebGate Consulting AG, meinem Arbeitgeber, sind wir es gewohnt, wichtige Themen kontrovers zu diskutieren. Dabei werden natürlich auch Argumente von Spezialisten ins Feld geführt. Eine solche Diskussion hat mich zu folgendem Video geführt:

Natürlich bin ich nicht mit allem Einverstanden, was Herr Goslin innerhalb dieses Videos sagt, aber vieles davon hat mich zum Nachdenken angeregt. Vorallem die Aussage, dass ein Prototyp weggeschmissen wird, und danach wird nochmals neu begonnen. Gemäss James Gossling ist das Ziel eines Prototyps zu sehen, ob etwas so funktionieren kann, während Entwicklung mit Architektur und Engineering zu tun hat.

Ich glaube, dass wir gerade in der Notes / Domino Welt bezüglich FAST Prototyping und RAD einen grossen Fehler gemacht hatten. Betrachtet man RAD nämlich unter der Lupe, so sind im RAD sehr viele Ähnlichkeiten zu SCRUM zu entdecken. Und dabei geht es NICHT darum einen Prototypen zu bauen, sonderen Elemente um Element wird lauffähige Software entwickelt. Auch wenn dem Endkunden in kurzen Zyklen jeweils ein lauffähiges Element seiner Software gezeigt wird, sollte bei RAD vom Endprodukt her entwickelt werden.

Nun wird aber schon in der Beschreibung von RAD das Wort Prototype verwendet, was nicht sehr förderlich ist. Das Problem beim Prototype ist, dass “Abkürzungen” gemacht werden. So werden zum Beispiel Schichten vermischt oder gar übersprungen. Error Handling wird nicht implementiert und noch vieles weiteres wird nicht korrekt umgesetzt. Das gleiche Problem ergibt sich auch den vielen CodeSnippets, die im Internet herumschwirren. Die Snippets zeigen eine isolierte Funktionsweise eines Elementes auf. Auch hier werden einfach starke Vereinfachungen gemacht.

Wer jetzt bereits bei SCRUM nachgeschaut hat, fragt sich sicher, was denn anderst ist als bei RAD. Nun für mich ist eines der signifikaten Elemente, dass der Fokus auf den Stories des Users liegt. In kurzen Sätzen (3 Zeiler) definiert der Kunde, was er will. Und er gewichtet, was er haben will. Der Architekt der Software hingegen ermittelt die Abhängigkeiten der Stories und kann so aufgrund der Kundengewichtung ermitteln, welche Stories wie miteinander zusammen hängen. Das iterationsbasierte Vorgehen liefert dem Kunden lauffähige Software mit abgeschlossenen Userstories. Und abgeschossen heisst eben: ABGESCHLOSSEN. Kein Prototype, sondern es ist für die Userstorie alles umgesetzt und es wurde (da auch hier der Scope auf dem Endzustand ist) eine saubere Architektur und korrekte Entwicklungsprinzipien umgesetzt.

Mit dem Fokus auf die Userstory wird automatisch auch der Fokus auf den Kundennutzen gelegt. Ich glaube dies hilft auch in der Offertphase. Die Frage ist dann nämlich ganz simpel, ist die Umsetzung der Userstories die Offerte wert? Ist mein Nutzen so gross, dass ich sehr gerne das Geld ausgebe?

 

Tags: , , , ,

N-Tier Struktur mit IBM Domino

In der modernen Software Architektur ist das Schichtenmodell (N-Tier) Standard und weit verbreitet. Die Vorteile liegen auf der Hand, da die Trennung von Präsentation, Logik und Datenhaltung auch eine horizontale Entwicklung begünstigt.
Die traditionelle Lotus Notes / Domino Entwicklung hat die Trennung von Präsentation, Logik und Datenhaltung bis jetzt nicht gefördert. Durch das Fast-Prototyping wurden sogar bewusst die Schichten übersprungen und die vertikale Entwicklung, sowie knappe Budgets haben eine saubere Trennung der Schichten stark behindert. Die logische Konsequenz war, dass Domino den Ruf bekam, nicht modern zu sein, keine N-Tier Struktur zu unterstützen. Automatisch wurde somit Domino von Architekten, die N-Tier als Muss-Anforderung definierten, gestrichen. Und dies zu Unrecht. Ich habe während meiner Programmiererzeit schon viele Anwendungen gesehen, die keine N-Tier Struktur besassen, aber auf Plattformen liefen, die als N-Tier Plattformen galten. Genau so habe ich einige Domino Anwendungen gesehen, die das N-Tier Architektur Prinzip passgenau umgesetzt hatten.
Mit dem neuen Relese 8.5.3 geht aber IBM konsequent den Schritt weiter, um diesen Missstand zu bekämpfen. XPages impliziert eigentlich eine N-Tier Struktur. Es ist jetzt nicht nur möglich Applikationen nach den N-Tier Architektur Prinzipien auf zu bauen, nein es ist sogar gewünscht.

Aber wie erreichen wir das? Hier einige Ideen dazu:

1. Verstehen, was Präsentation, Businesslogik und Datenhaltung bedeutet
2. Horizontale Entwicklung fördern
3. Definierte Schnittstellen zum Datenaustausch zwischen den Ebenen nutzen (zb. Präsentation zu Logik via JSON/REST, Logik zu NSF Store via NotesAPI)

Und vor allem darüber sprechen (und zwar mit dem neuen Vocabular)

 
Leave a comment

Posted by on February 18, 2012 in Domino, Java, XPages

 

Tags: , ,

IBM Domino ist in der Neuzeit angekommen

An einem Kurs für Fachvorgesetzte von Auszubildenden habe ich folgenden Satz aufgeschnappt und mir verinnerlicht: “Ihr müsst Euren Absolventen keine Prüfungsaufgabe in Form von ‘vergleiche Programmiersprache A mit B und bewerte welche besser ist’ stellen. Das Resultat ist von Anfang an klar”. Gespannt hatte ich auf die Antwort gewartet. Nach einer dramatischen Pause, dann die Erlösung: “Es ist immer die Sprache, die der Absolvent am Besten beherrscht”.
Eigentlich einleuchtend, und trotzdem absolut signifikant für die folgenden Ausführungen. Mir ist bewusst, dass ich vielen Lotus Notes Jüngern der alten Garde jetzt ziemlich Kopfschmerzen bereite, aber ich habe gelernt, dass der Blick in den Spiegel dann notwendig ist, wenn es nicht gut läuft.
Blicken wir ganz kurz in den Spiegel. Der Markt im Lotus Notes Sektor ist abnehmend. Neue, junge Entwickler zu finden, ist extrem schwierig und viele Verkaufsargumente für Lotus Notes Projekte sind hinfällig. Und wo liegt das Problem? “Schlechtes IBM Marketing” höre ich immer wieder, oder “Feature X, Funktion Y wurde nicht realisiert”. Nein das Problem ist leider 30cm vom Spiegel entfernt. Wir haben verpasst, dass die einmalige Sonderstellung von Lotus Notes / Domino von der Zukunft überholt wurde. Wir hatten über DesignPattern, MVC und 3 Tier Strukturen gelacht. Uns über Datenbankanbindungen amüsiert, Versionsabhängikeiten bewitzelt und uns hinter der Einmaligkeit von Lotus Notes versteckt, wenn es um neuartige Programmierung ging.
Und damit ist ein grosse Graben entstanden. Welche Programmiersprache ist die Beste? Die die ich gerade am Besten kann. An den Universitäten und Berufsschulen wurde JAVA, PHP und Integrationen mit mySQL unterrichtet. Junge Menschen lernten von der Basis her objektorientiert Programmieren, Businesslogik vom PresentationLayer zu trennen und das Thema Datenhaltung war in den Händen der RDBMS Fanatiker. Anstelle sich dieser Realität zu stellen, und das gute an den Denkstrukturen zu adaptieren, haben wir es als “Nicht Relevant” abgetan…. bis jetzt!

Aber der Domino Server ist in der Neuzeit angekommen. Vermutungen, die ich hatte, wurden an der Lotussphere bestätigt. Liebe Freunde, der Domino Server ist ein toller JAVA Application Server geworden, ohne die Schwerfälligkeit von Datenbankanbindung, komplexer Administration und unhandlichem Deployment. Nein, einfach ein RockSolid Server, der ein OSGi Layer hat, mit XPages ein auf JSF basierendes Presentation Framework, die Businesslogik kann in der Applikation direkt als JAVA Klassen abgelegt werden und dazu noch der beste dokumentorientierte Store, den man sich vorstellen kann.

Wenn wir jetzt noch das Vocabular der Neuzeit lernen und unseren Kunden selbstsicher die neuartige Architektur, sowie die Zukunftssicherheit des gesamten Framework erklären können, wird diese Plattform wieder hochattraktiv für junge, motivierte und innovative Entwickler. Und welcher Server ist der beste Server? Natürlich der Server, den ich am besten kenne.

Und eigentlich müsste das der Domino Server sein:
– Userverwaltung, Rollen und Rechtekonzept: DONE und bis auf Datenlayerimplementiert
– Anbindung an Storage: DONE (inkl. genialer Suchenginge)
– 3 Tier Struktur: Presentationlayer: XPages, BusinessLogik: JAVA, Storage: NSF
– Graphischer Desigern: Vorhanden.

Die Liste der Killerfeatures könnte ich noch erweitern (zb. offene Standards), aber passen wir das Vocabular an und sprechen wir die Sprache der Informatikmassen.

 
Leave a comment

Posted by on February 12, 2012 in Domino, Java, XPages

 

Persönliche Lotussphere Nachlese

Ja sie ist vorbei die LS 2012. Meine erste Lotussphere, die ich erleben durfte. Von meinen Arbeitskollegen wurde ich auf das Erlebnis vorbereitet und es wurde von den guten alten Tagen gesprochen. Immer wieder wurde ich von meinem Chef während der Lotussphere mittels “Achtung du bist jetzt Brainwashed” auf den Umstand der riesigen Begeisterung aufmerksam gemacht. Darum ist es wohl auch gut, dass jetzt über eine Woche vergangen ist, wir zu dritt durch Florida gereist sind, und wir Abstand gewinnen konnten, bis ich jetzt meine persönliche Nachlese schreibe.
Und trotzdem fällt meine Nachlese sehr positiv aus. Positiv in dem Sinne, dass IBM die Transformation von Lotus Notes und Domino sehr aktiv vorantreibt. Aber betrachten wir einmal das Big Picture. Während von 10 Jahren die Lotussphere der Ort für Lotus Notes/Domino Fans war, hat sich die Situation ganz stark verändert. Im Zentrum stand dieses Jahr (wie auch schon in vergangen Jahren) nicht ein Produkt oder ein Brand, sondern eine Denkweise. Vor einem Jahr wurde SocialBusiness als Zukunft proklamiert und dieses Jahr hat sich diese Denkweise etabliert. Laut Ronnie Maffa steht dabei vor allem der Mensch im Zentrum und alle Bemühungen in der Art und Weise wie Software, Social Software funktionieren soll, ist inspiriert von dem Verständnis des Menschen. So war es auch nicht verwunderlich, dass während dem Ausblick auf die Zukunft von IBM Connections der Mensch und nicht die Features des nächsten Releases wichtig waren.
“Wer den Menschen versteht, versteht auch, was wir als nächstes tun werden”, so Maffa.
Aber auf der anderen Seite scheint sich auch eine technische Revolution anzubahnen. Seid 4 Jahren wurde, wenn man den Releasezahlen glaubt von 8.5.0 bis 8.5.3 nur Minorreleases der Domino Plattform produziert. Schaut man aber dem Motor unter die Haube, entdeckt man einen radikalen Umbau. Nicht nur das, mit der Integration des XPages Framworks ist auch massive Veränderung im Bereich der Entwicklungsmethodik entstanden. Neue Releases und Erweiterungen zum XPageframework werden auf der Communityplattform von OpenNTF produziert und getestet. Alles was für die Plattform Lotus Domino wertvoll ist, wird dabei direkt mittels Upgradepack in kurzen Intervallen zum Produkt hinzugefügt und bekommt somit den Support von IBM. Dabei bleiben diese Elemente weiterhin OpenSource, d.h. Verbesserungen können durch die Community gemeldet werden und werden auch integriert.
Es gibt aber noch eine weitere Revolution. Pete Janzen, Produktmanager des Lotus Domino Designer wurde gefragt, was mit den Feature Request der Community die bezüglich den “alten” Lotus Notes Elemente gestellt wurden. Hätten die überhaupt eine Chance, bzw. könnte IBM nicht einmal ein paar Entwickler für das abstellen und nicht nur immer für das XPage Framework. Seine Antwort war sehr diplomatisch, seine Gestik und Mimik aber nicht. Ich versuche es einmal so auszudrücken: Jede Verbesserung, die XPage und dem neuen OSGi Kernel etwas bringen, kommen in den C++ Kernel rein. Das hat Pete Janzen so NICHT GESAGT, aber das habe ich bei verschiedenen Gesprächen und Sessions so rausgehört und interpretiert.
Wenn wir übrigens die Verbesserungen der letzten Releases angucken, dann scheint sich dies zu decken. Wenn wir schon bei OSGi sind, mir scheint, dass es IBM gelungen ist, innerhalb von wenigen Releaszyklen den Domino Server mit einem unheimlich starken Framework zu versehen, dass für die Zukunft wohl keine Fragen mehr offen lässt. Oder sagen wir es doch einfach mal salopp: Der Domino Server ist ein solid-rock-enterprise “JAVA” Server, mit einer mächtigen dokumentorientierte Datenstorage, der eine einfaches Deployment von Applikationen ermöglicht.
Für mich war die Message aus technologischer Sicht ziemlich deutlich: Java und XPages steht über allem!

 
Leave a comment

Posted by on January 29, 2012 in Domino, Java, XPages