Posts Tagged: ‘Vaadin’

2018 kann losgehen

2. Februar 2018 Posted by Stephan Kopp

Ich weiß es ist schon Februar, aber ich hatte die letzten 3 Wochen Urlaub und starte sozusagen erst jetzt so richtig ins neue Jahr. Ich bin kein Freund von guten Vorsätzen, primär weil ich mich eh selten daran halte. Trotzdem hat natürlich jeder so seine Vorstellungen und Wünsche an ein neues Jahr und blickt auf das Vergangene zurück.

Beruflicher Wandel

Mein Berufsleben habe ich als Lotus Notes Entwickler gestartet, das ist mittlerweile schon ein paar Jährchen her. Vor einigen Jahren, als das Ende dieser Ära abzusehen war, habe ich angefangen mich auch mit anderen Dingen zu beschäftigen. Nach einigen Experimenten bin ich dann bei Java, dem Vaadin und Spring Boot Framework gelandet. Rückblickend kann ich sagen, dass ich letztes Jahr nun erstmals mehr Zeit mit diesen neuen Themen verbracht habe und weniger mit Lotus Notes. Das Thema Notes/Domino wird mich natürlich auch weiterhin begleiten, aber ich denke der Fokus wird sich weiter darauf konzentrieren, die Kunden bestmöglich bei der Ablösung zu beraten.

Mein persönlicher Wunsch für dieses Jahr ist es, diese Projekte, die sich komplett jenseits der altbekannten Lotus Notes Welt bewegen weiter auszubauen. Die neuen Themen, Technologien und Konzepte wie Microservices, APIs, etc. machen mir viel mehr Spaß. Das sind herausfordernde Projekte und man hat die Gelegenheit sich in neue Themen und Ideen einzuarbeiten.

IBM Notes/Domino 10

Der Verkauf der Produkt Sparte hat einige Leute in der Community in helle Aufregung versetzt und positive Erwartungen und Hoffnungen geweckt. Persönlich hat mich das alles allerdings nicht überzeugt. Es ist eine naheliegende Entscheidung von IBM, aber die Hoffnung, dass mit Notes 10 jetzt eine echte Weiterentwicklung auf uns zukommt kann ich nicht teilen. Meiner Meinung nach ist das allerhöchstens eine Produktpflege, um den Kunden ein wenig den Druck von den Schultern zu nehmen, Notes möglichst schnell abzulösen. Das kommt allerdings einige Jahre zu spät und die meisten haben das Thema „End of Lotus Notes“ schon fest auf der Agenda.

Soll jetzt nicht heißen, dass ich Kunden jede Investition in die Plattform versuche auszureden. Wer weiter darauf setzen will, hat jetzt einen validen Fahrplan für die nächsten Jahre und kann bestehende Applikationen mit gutem Gewissen weiterentwickeln. Ich persönlich setze meinen Fokus aber nicht mehr auf Lotus Notes, sondern will mich weiterentwickeln und mich um interessantere Themen kümmern.

Work Life Balance

Das ist ein sehr überstrapazierter Begriff, aber für mich hat das Thema einen hohen Stellenwert. Ich arbeite um zu leben, aber ich lebe nicht nur um zu arbeiten. Natürlich stecke ich viel Zeit und Mühe in meinen Job, aber kann meine Freizeit und Urlaub auch sehr genießen. Der Start in das Jahr 2018 mit einer ausgedehnten Asien Reise war hierfür ein guter Anfang und sicher nicht meine letzte Auszeit dieses Jahr.

Das neue Jahr kann also kommen und ich bin gespannt, was mich erwartet.

2018 kann losgehen

2. Februar 2018 Posted by Stephan Kopp

Ich weiß es ist schon Februar, aber ich hatte die letzten 3 Wochen Urlaub und starte sozusagen erst jetzt so richtig ins neue Jahr. Ich bin kein Freund von guten Vorsätzen, primär weil ich mich eh selten daran halte. Trotzdem hat natürlich jeder so seine Vorstellungen und Wünsche an ein neues Jahr und blickt auf das Vergangene zurück.

Beruflicher Wandel

Mein Berufsleben habe ich als Lotus Notes Entwickler gestartet, das ist mittlerweile schon ein paar Jährchen her. Vor einigen Jahren, als das Ende dieser Ära abzusehen war, habe ich angefangen mich auch mit anderen Dingen zu beschäftigen. Nach einigen Experimenten bin ich dann bei Java, dem Vaadin und Spring Boot Framework gelandet. Rückblickend kann ich sagen, dass ich letztes Jahr nun erstmals mehr Zeit mit diesen neuen Themen verbracht habe und weniger mit Lotus Notes. Das Thema Notes/Domino wird mich natürlich auch weiterhin begleiten, aber ich denke der Fokus wird sich weiter darauf konzentrieren, die Kunden bestmöglich bei der Ablösung zu beraten.

Mein persönlicher Wunsch für dieses Jahr ist es, diese Projekte, die sich komplett jenseits der altbekannten Lotus Notes Welt bewegen weiter auszubauen. Die neuen Themen, Technologien und Konzepte wie Microservices, APIs, etc. machen mir viel mehr Spaß. Das sind herausfordernde Projekte und man hat die Gelegenheit sich in neue Themen und Ideen einzuarbeiten.

IBM Notes/Domino 10

Der Verkauf der Produkt Sparte hat einige Leute in der Community in helle Aufregung versetzt und positive Erwartungen und Hoffnungen geweckt. Persönlich hat mich das alles allerdings nicht überzeugt. Es ist eine naheliegende Entscheidung von IBM, aber die Hoffnung, dass mit Notes 10 jetzt eine echte Weiterentwicklung auf uns zukommt kann ich nicht teilen. Meiner Meinung nach ist das allerhöchstens eine Produktpflege, um den Kunden ein wenig den Druck von den Schultern zu nehmen, Notes möglichst schnell abzulösen. Das kommt allerdings einige Jahre zu spät und die meisten haben das Thema „End of Lotus Notes“ schon fest auf der Agenda.

Soll jetzt nicht heißen, dass ich Kunden jede Investition in die Plattform versuche auszureden. Wer weiter darauf setzen will, hat jetzt einen validen Fahrplan für die nächsten Jahre und kann bestehende Applikationen mit gutem Gewissen weiterentwickeln. Ich persönlich setze meinen Fokus aber nicht mehr auf Lotus Notes, sondern will mich weiterentwickeln und mich um interessantere Themen kümmern.

Work Life Balance

Das ist ein sehr überstrapazierter Begriff, aber für mich hat das Thema einen hohen Stellenwert. Ich arbeite um zu leben, aber ich lebe nicht nur um zu arbeiten. Natürlich stecke ich viel Zeit und Mühe in meinen Job, aber kann meine Freizeit und Urlaub auch sehr genießen. Der Start in das Jahr 2018 mit einer ausgedehnten Asien Reise war hierfür ein guter Anfang und sicher nicht meine letzte Auszeit dieses Jahr.

Das neue Jahr kann also kommen und ich bin gespannt, was mich erwartet.

Notes application modernization with Vaadin :: A step-by-step beginner tutorial

1. März 2017 Posted by Stephan Kopp

Modernization of IBM Notes/Domino applications should be done outside of the Notes/Domino universe, which means in the first step to create a non-xpage frontend and connect it to your existing Notes application. I’m currently working in multiple projects with Vaadin and I’ve created a step-by-step tutorial as a beginners guide to start with Domino application modernization using REST, Spring Boot and Vaadin.

It is not a deep dive into all involved technologies and frameworks. The intention was to create a step-by-step guide for a classic Domino developer now looking forward to modernize applications with new technologies. Not discussing every single topic and technology in detail, just something to get startet und to get a working example without much effort.

If you have questions or in case of any problems and errors, don’t hesitate to contact me!

Start with the tutorial here, or just download the application from the repository.

 


Filed under: Development

Die Zukunft von Notes Applikationen: Domino als Backend: JA / XPage oder Notes Client als Frontend: NEIN

24. Februar 2017 Posted by Stephan Kopp

Dieses Jahr und auch letztes Jahr schon, war ich nichtmehr auf der IBM Connect. Meine Einschätzung aus der Ferne: Ich habe auch dieses Jahr nicht viel verpasst… Dank Volker Weber habe ich die wichtigsten News über den Slack Team Space verfolgt, den er angelegt hatte (Infos findet ihr hier).

Meine Einschätzung über die Zukunft von Notes Applikationen hat sich im Grunde bestätigt. IBM wird die Plattform Domino soweit am Leben erhalten, dass die Applikationen dort im Hintergrund noch viele Jahre betrieben werden können. Mit den Frontends sollte man sich aber mittel- bis langfristig vom Notes Client und XPage Umsetzungen weg bewegen. Die Zukunft der Applikationen liegt im Browser und dort sollte man auf OpenSource Technologien setzen.

Es gibt viele Hersteller auf dem Markt, die hierfür mehr oder weniger sinnvolle Lösungen anbieten. IBM hat auf der Konferenz einige davon hervorgehoben, lässt die Partner Lösungswege zur Modernisierung aufzeigen und konzentriert sich selbst auf die Wartung der Plattform.

Jeder Entwickler kann aber auch ohne solche Komplettlösungen dieses Konzept selbst umsetzen. Die Oberfläche einer Applikation für den Browser entwicklen, z.B. mit Angular, Vaadin oder ähnlichen Frameworks. Die bestehenden Notes Applikationen über APIs ansprechen, steuern und bereits vorhandene Funktionen weiter verwenden. Damit verabschiedet man sich nach und nach vom Notes Client und betreibt den Domino Server langfristig nur noch als Datenbank System und Applikationsserver.

Ich sehe das als sinnvollen Weg um die bestehenden Applikationen zu modernisieren. Viele davon sind Business kritisch und nur mit sehr hohem Aufwand und Risiko komplett zu ersetzen.


Filed under: Development, IBM Notes/Domino

Es war einmal ein Lotus Notes Entwickler – Alles hat irgendwann ein Ende

21. Dezember 2016 Posted by Stephan Kopp

Ok, etwas überspitzt, aber dennoch wahr. Notes wird mich und Andere noch lange begleiten, aber bis zu meiner Rente schaffe ich es damit sicherlich nicht.

IBM hat meiner Meinung nach leider kein wirkliches Interesse die Plattform weiter zu entwickeln. So lange es geht, werden die bestehenden Kunden mit „Feature Packs“ noch bei der Stange gehalten, aber mehr nicht. Auch IBM Verse on premise wird daran nichts ändern. Deshalb sollte sich jeder über die Zeit danach Gedanken zu machen.

Wohin mit den ganzen Applikationen? Wirklich alles neu entwickeln? Alles nach Sharepoint oder sonst wohin „migrieren“? Ein solches Projekt ist ein Monster, das kaum jemand angehen und schon garnicht bezahlen möchte.

Ich bin kein Fan des „R.I.P. and Replace“ Ansatzes, den viele bevorzugen. Bei einfachen Applikationen und irgendwelchen Standard Anwendungsfällen mag soetwas machbar und sinnvoll sein. Wir sollten uns aber bei komplexen Applikationen eher ganz gezielt diese zwei Fragen stellen:

  1. Was können wir neu entwickeln um einen Mehrwert für die jeweilige Anwendung zu bieten?
  2. Wie können wir das mit „nicht Notes” Technologien machen und es an die bestehende Applikation anbinden?

In letzter Zeit habe ich mich sehr viel mit REST Schnittstellen und Webservices beschäftigt und auch ein wenig mit Vaadin und Spring Boot. Diese Technologien bieten im Grunde alles, was wir benötigen um beide Fragen zu beantworten.

Nachfolgend ein kleines Szenario, bei dem wir diesen Ansatz konkret umsetzen konnten. Es ging um eine bestehende Notes Applikation, die verwendet wird um andere Applikationen in ein Langzeit Archiv zu verschieben sobald sie nichtmehr verwendet werden. Hierfür sollte ein Webinterface entwickelt werden.

  • Wir benötigen ein Browser Interface, aber der Entwickler (ich) hat kein Händchen für HTML und CSS:  Vaadin
  • Ein Application Server jenseits von Domino ist nicht vorhanden und auch nicht erwünscht: Spring Boot
  • Bestehende Daten und Funktionen aus Notes Applikationen sollen eingebunden werden: REST API oder Webservices

Entstanden ist ein recht ansehnliches Webinterface, das Daten aus einer Notes Applikation darstellt und auch Funktionalitäten aus dieser Applikation ansteuern kann. Hierzu wurden einige bestehende Funktionen als Webservices zur Verfügung gestellt und eingebunden.

archiving-selfservice-01 archiving-selfservice-02

Dieser Ansatz gefällt mir persönlich am besten und zwar aus folgenden Gründen:

  1. Der Aufwand und damit die Kosten sind überschaubar.
  2. Die Anwender haben sofort etwas davon, da wir uns zunächst auf neue Funktionen konzentrieren und nicht erst langwierig das nachbauen müssen, was eh schon vorhanden ist.
  3. Langfristig wird sicher auch irgendwann die Notes Applikation abgelöst, aber vorerst kann man seine Investition schützen und muss nicht bei Null anfangen.
  4. Sind nach und nach immer mehr Funktionen aus Notes hinaus gewandert, kann irgendwann auch der Data Store z.B. auf eine Mongo DB, Couch DB oder was auch immer umgestellt werden.
  5. Das Knowhow der eigenen Entwickler, Admins oder Partner entwickelt sich weiter.

Ich will damit nicht sagen, dass wir alle Notes Applikation in diesem Stil migrieren sollten. Es ist nur ein Beispiel, das in unserem Fall gut funktioniert hat. In anderen Fällen machen andere Technologien vielleicht mehr Sinn. Falls eine Application Server Infrastruktur vorhanden ist, kann diese auch mit verwendet werden und man kann auf Spring Boot verzichten.

Was ich sagen will ist, dass ich jedem Notes Entwickler sehr empfehle sich aktiv in den Entscheidungsprozess einzubringen, was zukünftig mit den Notes Applikationen geschehen soll. Ansonsten wird diese Entscheidung woanders getroffen und oft landen dann mit dem Produkt auch die zugehörigen Personen auf dem Abstellgleis und das wollen wir ja alle nicht.


Filed under: Development, IBM Notes/Domino, Vaadin

Domino Gruppen Management mit Hilfe von Webservices und einer Vaadin Applikation

11. September 2016 Posted by Stephan Kopp

Letzte Woche habe ich geschrieben, dass ich mich mit dem Vaadin Framework ein wenig auseinandersetzen wollte. Mittlerweile bin ich schon so weit, dass ich meine erste Applikation für einen Kunden beinahe fertig habe. Das war nur eine kleine Applikation, die einige Daten aus einer Domino Applikation darstellt und einen Status per Webservice wieder zurück in die Applikation schreiben kann. Das war nichts großartiges, hat mir aber Gelegenheit gegeben, mich mit der Materie näher zu befassen. Das Ergebnis hat mich überzeugt, sodass wir auch gleich die nächste Anforderung über diesen Weg umsetzen werden.


Das Ziel

Wir arbeiten für einen Kunden, der momentan weg von Notes migriert (wie so viele). Da eine komplette Abschaltung jedoch vermutlich noch Jahre oder Jahrzehnte dauern wird, benötigt der Kunde eine Möglichkeit, die bislang vorhandene Lösung um Gruppen im Domino Adressbuch zu verwalten, durch eine Self Service Web Applikation zu ersetzen.

Die Idee

Um möglichst flexibel für zukünftige Szenarien zu sein, wollten wir die Applikation Zweigeteilt implementieren. Der erste Teil besteht aus einer Domino Applikation, die die eigentliche Verwaltung der Gruppen übernimmt. Also das eigentliche ändern der Gruppen im Adressbuch, Validierung, Rechte Verwaltung, etc. Diese Funktionalität soll per Webservice zur Verfügung gestellt werden um sie aus externen Systemen komfortabel bedienen zu können. Die Schnittstelle soll dabei aber einfach genug sein, um sie verwenden zu können, ohne zu viel Know-How über das Domino Backend haben zu müssen. Es sollen also z.B. automatisch verschachtelte Gruppen erzeugt werden, wenn wir an irgendwelche Grenzen laufen, ohne dass ich selbst an so etwas denken muss. Ebenso sollten die Gruppen Mitglieder anhand ihrer SMTP Adresse verwaltet werden können, ohne dass der Vollhierarchische Notes Name bekannt sein muss.

Für diese Schnittstelle entwickeln wir dann auch ein unabhängiges Web Frontend, um die Gruppen Verwaltung komplett in einem Browser vornehmen zu können. Hierfür verwenden wir eine Standalone Vaadin Applikation. Die Vaadin Applikation könnte man auch als OSGi Plugin auf den Domino Server installieren, aber die eigenständige Variante befreit uns von jeglicher Abhängigkeit von Server Versionen, Zugriffsrechten oder ähnlichem. Die Authentifizierung wird direkt gegen das Active Directory gemacht, da zukünftig nichtmehr jeder Mitarbeiter auch automatisch einen Notes Account erhalten wird. Die Funktionalität der Gruppenverwaltung (primär für Applikationen) muß aber jedem zur Verfügung stehen.

Ein ähnliches Konzept haben wir für unseren User Manager verwendet und der hat sich schon bei vielen Kunden bewährt.

Vorteile

Die MVC (Model View Controller) ähnliche Trennung von Funktion und Interface bietet einige Vorteile. Zukünftig könnte die Gruppenverwaltung auch über weitere Prozesse oder Workflow Systeme angesprochen werden, da wir über standardisierte Webservice Schnittstellen kommunizieren. Ebenso könnte das Web Frontend weitere Aufgaben übernehmen, in dem wir dort weitere Schnittstellen zur Verwaltung weiterer Systeme integrieren.

Die Umsetzung

Ich kann hier leider nicht die ganze Applikation veröffentlichen, werde aber versuchen im Verlauf der nächsten Tage/Wochen den Fortschritt, die Erfahrungen und einige Code Beispiele zu posten.


Filed under: Development, IBM Notes/Domino, Vaadin

Domino Gruppen Management mit Hilfe von Webservices und einer Vaadin Applikation

11. September 2016 Posted by Stephan Kopp

Letzte Woche habe ich geschrieben, dass ich mich mit dem Vaadin Framework ein wenig auseinandersetzen wollte. Mittlerweile bin ich schon so weit, dass ich meine erste Applikation für einen Kunden beinahe fertig habe. Das war nur eine kleine Applikation, die einige Daten aus einer Domino Applikation darstellt und einen Status per Webservice wieder zurück in die Applikation schreiben kann. Das war nichts großartiges, hat mir aber Gelegenheit gegeben, mich mit der Materie näher zu befassen. Das Ergebnis hat mich überzeugt, sodass wir auch gleich die nächste Anforderung über diesen Weg umsetzen werden.

Das Ziel

Wir arbeiten für einen Kunden, der momentan weg von Notes migriert (wie so viele). Da eine komplette Abschaltung jedoch vermutlich noch Jahre oder Jahrzehnte dauern wird, benötigt der Kunde eine Möglichkeit, die bislang vorhandene Lösung um Gruppen im Domino Adressbuch zu verwalten, durch eine Self Service Web Applikation zu ersetzen.

Die Idee

Um möglichst flexibel für zukünftige Szenarien zu sein, wollten wir die Applikation Zweigeteilt implementieren. Der erste Teil besteht aus einer Domino Applikation, die die eigentliche Verwaltung der Gruppen übernimmt. Also das eigentliche ändern der Gruppen im Adressbuch, Validierung, Rechte Verwaltung, etc. Diese Funktionalität soll per Webservice zur Verfügung gestellt werden um sie aus externen Systemen komfortabel bedienen zu können. Die Schnittstelle soll dabei aber einfach genug sein, um sie verwenden zu können, ohne zu viel Know-How über das Domino Backend haben zu müssen. Es sollen also z.B. automatisch verschachtelte Gruppen erzeugt werden, wenn wir an irgendwelche Grenzen laufen, ohne dass ich selbst an so etwas denken muss. Ebenso sollten die Gruppen Mitglieder anhand ihrer SMTP Adresse verwaltet werden können, ohne dass der Vollhierarchische Notes Name bekannt sein muss.

Für diese Schnittstelle entwickeln wir dann auch ein unabhängiges Web Frontend, um die Gruppen Verwaltung komplett in einem Browser vornehmen zu können. Hierfür verwenden wir eine Standalone Vaadin Applikation. Die Vaadin Applikation könnte man auch als OSGi Plugin auf den Domino Server installieren, aber die eigenständige Variante befreit uns von jeglicher Abhängigkeit von Server Versionen, Zugriffsrechten oder ähnlichem. Die Authentifizierung wird direkt gegen das Active Directory gemacht, da zukünftig nichtmehr jeder Mitarbeiter auch automatisch einen Notes Account erhalten wird. Die Funktionalität der Gruppenverwaltung (primär für Applikationen) muß aber jedem zur Verfügung stehen.

Ein ähnliches Konzept haben wir für unseren User Manager verwendet und der hat sich schon bei vielen Kunden bewährt.

Vorteile

Die MVC (Model View Controller) ähnliche Trennung von Funktion und Interface bietet einige Vorteile. Zukünftig könnte die Gruppenverwaltung auch über weitere Prozesse oder Workflow Systeme angesprochen werden, da wir über standardisierte Webservice Schnittstellen kommunizieren. Ebenso könnte das Web Frontend weitere Aufgaben übernehmen, in dem wir dort weitere Schnittstellen zur Verwaltung weiterer Systeme integrieren.

Die Umsetzung

Ich kann hier leider nicht die ganze Applikation veröffentlichen, werde aber versuchen im Verlauf der nächsten Tage/Wochen den Fortschritt, die Erfahrungen und einige Code Beispiele zu posten.

Auf der Suche nach Alternativen: Vaadin + Spring Boot

4. September 2016 Posted by Stephan Kopp

Die ganze Diskussion über die Zukunft von IBM Notes/Domino ist sehr müßig und darauf habe ich eigentlich gar keine Lust mehr. Ich für meinen Teil beschäftige mich sehr gerne mit neuen Themen und schaue mich daher ganz automatisch immer auch nach Alternativen um.

Das Konzept von Node.js und vor allem in Kombination mit AngularJS gefällt mir sehr. Einige REST Services mit Anbindung an Domino Daten habe ich damit auch schon für Kunden umgesetzt. Ich bin aber ehrlich gesagt kein großer Freund von JavaScript. Mir persönlich fehlt einfach der klassische Ansatz der Objekt orientierten Programmierung, außerdem tue ich mir mit dem Oberflächen Design in HTML auch sehr schwer.

Zuletzt bin ich aufgrund eines Erfahrungsberichtes über das Vaadin Framework gestolpert und war auf den ersten Blick begeistert. Das Prinzip ist im Grunde sehr ähnlich zur klassischen Notes Entwicklung. Mit sehr wenig Aufwand halbwegs ansehnliche Business Applikationen zu entwicklen. Ja, Notes war damals auch durchaus ansehnlich. Was mich allerdings wiederum abgeschreckt hat, war die Notwendigkeit eines Applikationsservers. Sicher, man kann Domino verwenden und die Vaadin Applikation in ein OSGi Plugin packen, aber dadurch steckt man eigentlich wieder in genau der selben Zwickmühle wie jetzt auch. Man ist abhängig von Java Versionen, Server Upgrade Zyklen, etc. Wenn ein Kunde im großen Stil auf solche Applikationen setzen möchte, macht eine Server Infrastruktur mit Backup, Hochverfügbarkeit, Rechte Konzept, etc. natürlich Sinn. Die Flexibilität geht dabei aber verloren.

Die Node.js Applikationen, die ich für einen meiner Kunden entwickelt habe, war ein gutes Beispiel. Es war völlig egal auf welcher Technologie wir entwickeln, aber wenn ich als Voraussetzung einen Application Server genannt hätte, wäre es nicht mehr so egal gewesen. Dann hätte das eine Menge zusätzlichen Aufwand, Abstimmungen und Entscheidungen nach sich gezogen. Statt dessen habe ich einfach eine Node.js Applikation irgendwo als Windows Service konfiguriert und seit dem läuft die Applikation ohne Probleme. Ich war nicht abhängig von irgendwelchen Server Versionen oder sonst irgendwas. Alles was ich benötige, packe ich in meine Applikation.

Das Vaadin Framework alleine kann diese Anforderung nicht erfüllen. Vor einiger Zeit habe ich mich aber auch mit Spring Boot beschäftigt. Vaadin und Spring Boot in Kombination erfüllen auf den ersten Blick all meine Erwartungen. Mit Vaadin entwickle ich meine Applikation und das Frontend und über Spring Boot integriere ich quasi einen Application Server und viele weitere nützliche Dinge, wie z.B. eine Authentifizierung gegen ein LDAP Verzeichnis.

Ich habe aktuell zwei Projekte auf meiner ToDo Liste, für die genau dieses Konzept sinnvoll wäre. Falls es zeitlich möglich ist, würde ich diese beiden Projekte mal sozusagen als Testballon mit Vaadin und Spring Boot implementieren. Als Backend werde ich per REST API auf Domino Daten zugreifen und über Webservices komplexere Funktionen ansprechen. Meine Erfahrungen, ob das Experiment erfolgreich war, werde ich hier bei Gelegenheit erzählen…

Falls jemand schon Erfahrung zu dem Thema gemacht hat, würde ich mich über Feedback sehr freuen.


Filed under: Development, IBM Notes/Domino

Auf der Suche nach Alternativen: Vaadin + Spring Boot

4. September 2016 Posted by Stephan Kopp

Die ganze Diskussion über die Zukunft von IBM Notes/Domino ist sehr müßig und darauf habe ich eigentlich gar keine Lust mehr. Ich für meinen Teil beschäftige mich sehr gerne mit neuen Themen und schaue mich daher ganz automatisch immer auch nach Alternativen um.

Das Konzept von Node.js und vor allem in Kombination mit AngularJS gefällt mir sehr. Einige REST Services mit Anbindung an Domino Daten habe ich damit auch schon für Kunden umgesetzt. Ich bin aber ehrlich gesagt kein großer Freund von JavaScript. Mir persönlich fehlt einfach der klassische Ansatz der Objekt orientierten Programmierung, außerdem tue ich mir mit dem Oberflächen Design in HTML auch sehr schwer.

Zuletzt bin ich aufgrund eines Erfahrungsberichtes über das Vaadin Framework gestolpert und war auf den ersten Blick begeistert. Das Prinzip ist im Grunde sehr ähnlich zur klassischen Notes Entwicklung. Mit sehr wenig Aufwand halbwegs ansehnliche Business Applikationen zu entwicklen. Ja, Notes war damals auch durchaus ansehnlich. Was mich allerdings wiederum abgeschreckt hat, war die Notwendigkeit eines Applikationsservers. Sicher, man kann Domino verwenden und die Vaadin Applikation in ein OSGi Plugin packen, aber dadurch steckt man eigentlich wieder in genau der selben Zwickmühle wie jetzt auch. Man ist abhängig von Java Versionen, Server Upgrade Zyklen, etc. Wenn ein Kunde im großen Stil auf solche Applikationen setzen möchte, macht eine Server Infrastruktur mit Backup, Hochverfügbarkeit, Rechte Konzept, etc. natürlich Sinn. Die Flexibilität geht dabei aber verloren.

Die Node.js Applikationen, die ich für einen meiner Kunden entwickelt habe, war ein gutes Beispiel. Es war völlig egal auf welcher Technologie wir entwickeln, aber wenn ich als Voraussetzung einen Application Server genannt hätte, wäre es nicht mehr so egal gewesen. Dann hätte das eine Menge zusätzlichen Aufwand, Abstimmungen und Entscheidungen nach sich gezogen. Statt dessen habe ich einfach eine Node.js Applikation irgendwo als Windows Service konfiguriert und seit dem läuft die Applikation ohne Probleme. Ich war nicht abhängig von irgendwelchen Server Versionen oder sonst irgendwas. Alles was ich benötige, packe ich in meine Applikation.

Das Vaadin Framework alleine kann diese Anforderung nicht erfüllen. Vor einiger Zeit habe ich mich aber auch mit Spring Boot beschäftigt. Vaadin und Spring Boot in Kombination erfüllen auf den ersten Blick all meine Erwartungen. Mit Vaadin entwickle ich meine Applikation und das Frontend und über Spring Boot integriere ich quasi einen Application Server und viele weitere nützliche Dinge, wie z.B. eine Authentifizierung gegen ein LDAP Verzeichnis.

Ich habe aktuell zwei Projekte auf meiner ToDo Liste, für die genau dieses Konzept sinnvoll wäre. Falls es zeitlich möglich ist, würde ich diese beiden Projekte mal sozusagen als Testballon mit Vaadin und Spring Boot implementieren. Als Backend werde ich per REST API auf Domino Daten zugreifen und über Webservices komplexere Funktionen ansprechen. Meine Erfahrungen, ob das Experiment erfolgreich war, werde ich hier bei Gelegenheit erzählen…

Falls jemand schon Erfahrung zu dem Thema gemacht hat, würde ich mich über Feedback sehr freuen.

Vaadin In XPages: A UIComponent for embedding Vaadin applications

3. Mai 2016 Posted by Sven Hasselbach

I have created an UIComponent to embed Vaadin applications into XPages. It allows to run both technologies on the same site by adding it to your XPage:

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

    <!-- XPages Application -->
    <xp:form>
        <xp:div id="refreshMe">
            <h1>XPage</h1>
            <xp:label
                value="#{javascript:java.lang.System.nanoTime()}"
                id="label1">
            </xp:label>
        </xp:div>
        <xp:button
            value="refresh"
            id="button1">
            <xp:eventHandler
                event="onclick"
                submit="true"
                refreshMode="partial"
                refreshId="refreshMe">
            </xp:eventHandler>
        </xp:button>
    </xp:form>
    
    <!--  VAADIN Application -->
    <vaadin:Vaadin
        id="Vaadin1"
        url = "/vaadin/"
        divId="addressbook"
        version="7.3.8"
        forceResize="true" />
        
</xp:view>

This little example shows the XPage above including the the Adressbook application:

2016-05-03 12_31_17-VaadinInXPages

The Vaadin application is reachable at „http://localhost/vaadin/“ (hosted by Domino), that’s why the property url is set to „/vaadin/„. The property divId contains the name of the application which is used as id in the DOM tree.

It is required that the VaadinComponent is not inside a xp:form element. If it detects a surrounding form, a runtime exception is thrown. That’s why you have to set createForm to false and add your own xp:form to your application, as shown in the example.

2016-05-03 12_50_11-Runtime Error

If the parameter forceResize is set to true, a CSS style sheet is added to the XPage which resizes the height of html and the body node to 100%. Otherwise the Vaadin application will not be displayed correctly.

2016-05-03 12_54_35-view-source_localhost_VaadinInXPages.nsf_index.xsp

Resource Aggregation must be disabled, otherwise it won’t work.

The sources can be found at https://github.com/hasselbach/VaadinInXPages

Vaadin IBM Challenge

14. Dezember 2015 Posted by Sven Hasselbach

Since two weeks the Vaadin IBM challenge is over. While I was only able to do the bare minimum, I really enjoyed the different tasks (see here for list of steps).

Congrats to the winners! And thanks to the Vaading Team & IBM for this exciting experience.

HowTo: Vaadin on Domino (4)

26. Januar 2015 Posted by Sven Hasselbach

Now, let’s access some Domino resources.

I have created a database named “VaadinResources.nsf“, containing a normal image resource, and an image added via package explorer to the “WEB-INF” folder:

Screenshot - ImageResource

Screenshot - WEB-INF Resource

Vaadin provides stream resources, which allows creating of dynamic resources. These resources handle “InputStream” objects, which we can grab from Domino via Java NAPI.

To do this, it is first required to add some plug-ins to the dependencies of the “HelloVaadin” plug-in:

Screenshot - Dependencies

  • com.ibm.domino.napi
  • com.ibm.domino.commons
  • com.ibm.commons

Then we can import the “NAPIUtils” class to the project and add a new method “loadBinaryFile” to it:

/**
 * loads given file from a database and returns the Inputsstream
 * 
 * @param serverName
 *            the server to use
 * @param dbPath
 *            the database path
 * @param fileName
 *            the file to load
 * @return the file data as InputStream
 * 
 */
static public InputStream loadBinaryFile(final String serverName, final String dbPath,
        final String fileName) {

    NotesSession nSession = null;
    NotesDatabase nDatabase = null;
    NotesNote nNote = null;

    try {
        nSession = new NotesSession();

        // open database
        try {
            nDatabase = nSession.getDatabaseByPath(serverName + "!!" + dbPath);
        } catch (NotesAPIException e) {
            e.printStackTrace();
        }
        nDatabase.open();

        // load existing data
        nNote = FileAccess.getFileByPath(nDatabase, fileName);

        // get Filedate and return String
        InputStream is = FileAccess.readFileContentAsInputStream(nNote);

        return is;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // recycle NAPI objects
        recycleNAPIObject(nNote, nDatabase, nSession);
    }
    return null;
}

A new class “DominoImageSource” which implements the “StreamResource.StreamSource” interface uses this method to pipe the “InputStream” object returned from the Domino Java NAPI:

package ch.hasselba.vaadin;

import java.io.InputStream;
import ch.hasselba.napi.NAPIUtils;
import com.vaadin.server.StreamResource.StreamSource;

@SuppressWarnings("serial")
public class DominoImageSource implements StreamSource {
    
    private String fileName;
    private String serverName;
    private String dbPath;
    
    public DominoImageSource(final String serverName, final String dbPath, 
            final String fileName){
        super();
        this.serverName = serverName;
        this.dbPath = dbPath;
        this.fileName = fileName;
    }
    public InputStream getStream () {    
        return NAPIUtils.loadBinaryFile( this.serverName, this.dbPath, this.fileName );
    }
}

Now, we can create a new Application named “ResourceUI” which displays these two resources:

package ch.hasselba.vaadin;

import com.vaadin.server.StreamResource;
import com.vaadin.server.StreamResource.StreamSource;
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.Image;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
public class ResourcesUI extends UI  {

    @Override
    protected void init(VaadinRequest request) {
        
         VerticalLayout layout = new VerticalLayout();
         setContent(layout);
         layout.setSizeFull();
         
         // Create an instance of our stream source.
         StreamSource webinfResource = new DominoImageSource ( 
                 "Dev01", "VaadinResources.nsf" , "/WEB-INF/WEB-INFResource.png");
         
         StreamSource imageResource = new DominoImageSource ( 
                 "Dev01", "VaadinResources.nsf" , "ImageResource.gif");

         // Create an image component that gets its contents
         // from the resource.
         layout.addComponent(new Image("WEB-INF Resource", 
                 new StreamResource(webinfResource, "image01.png")));
         layout.addComponent(new Image("Image Resource", 
                 new StreamResource(imageResource, "image02.gif")));
        
    }
}

Again, no rocket science and self-explaining code. When we open the application, the resources are loaded from the database and displayed in the browser:

Screenshot - Resource Application

As soon we are changing the images in the database (and the cache is expired), the new image will appear in our Vaadin application.

HowTo: Vaadin on Domino (3)

25. Januar 2015 Posted by Sven Hasselbach

Let’s create another application, based on Vaadin’s AddressBook example. You can download the source code directly or grab the code from the repository; it is a single class file named “AddressbookUI” only.

After importing (or manually creating) the class in the HelloVaadin plug-in, the servlet configuration in “web.xml” must be updated:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name>Addressbook</display-name>
    <context-param>
        <description>Vaadin production mode</description>
        <param-name>productionMode</param-name>
        <param-value>false</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>AdressbookServlet</servlet-name>
        <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
        <init-param>
            <param-name>UI</param-name>
            <param-value>ch.hasselba.vaadin.AddressbookUI</param-value>
        </init-param>
    </servlet> 

    <servlet-mapping>
        <servlet-name>AdressbookServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
</web-app>

The “<param-value>” must contain the complete class name, I have additionally changed the name of the servlet and updated the path in the “plugin.xml“:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

     <extension
         point="com.ibm.pvc.webcontainer.application">
      <contextRoot>
         /addressbook  
      </contextRoot>
      <contentLocation>
         WebContent
      </contentLocation>
   </extension>

</plugin>

To connect the example to a Domino environment, the “createDummyDatasource” method of the class must be replaced:

@SuppressWarnings("unchecked")
private static IndexedContainer createDummyDatasource() {

    // Domino objects
    Session session = null;
    Database db = null;
    View view = null;
    Document doc = null;
    Document tmpDoc = null;

    // initialize IndexedContainer
    IndexedContainer ic = new IndexedContainer();

    // add fieldnames as properties
    for (String p : fieldNames) {
        ic.addContainerProperty(p, String.class, "");
    }

    // get all users from NAB
    try{
        // init Domino objects
        session = ContextInfo.getUserSession();
        db = session.getDatabase(session.getServerName(), "dummynames.nsf");
        view = db.getView( "People" );

        // process all documents in view
        doc = view.getFirstDocument();
        while (doc != null) {

            // create a new item
            Object id = ic.addItem();

            // add field values to the item
            ic.getContainerProperty(id, FNAME).
                setValue(doc.getItemValueString("FirstName"));
            ic.getContainerProperty(id, LNAME).
                setValue(doc.getItemValueString("LastName"));

            // grab next document
            tmpDoc = doc;
            doc = view.getNextDocument(tmpDoc);
            recycle( tmpDoc );
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        recycle( doc, tmpDoc, view, db, session );
    }
    return ic;
}

/**
* recycle Domino objects
*
* @param objs
*     lotus.domino.Base objects to recylce
*/
private static void recycle(Base... objs){
    try{
        for( Base obj:objs ){
            if( obj != null )
                obj.recycle();
        }
    }catch(Exception e){}
}

Because this is not rocket science I won’t get into the details.

To prevent anonymous access, I have added a simple redirection in the “init” method:

protected void init(VaadinRequest request) {
        
    if( ContextInfo.isAnonymous() ){
         getPage().setLocation("/names.nsf?login=1&redirectto=" + 
             request.getContextPath() );
         return;
    }
        
    initLayout();
    initContactList();
    initEditor();
    initSearch();
    initButtons();
}

When opening the application as an anonymous user you will be automatically redirected to the Login Screen:

00 - Login

After signing in, domino redirects back to the addressbook example, and the list of persons in your “names.nsf” is shown up:

00 - Addressbook

HowTo: Vaadin on Domino (2)

24. Januar 2015 Posted by Sven Hasselbach

When running your own servlet, you eventually want to access the Domino environment. To do this, some changes has to be made to the HelloVaadin plug-in.

1. Open the “MANFIFEST.MF” and open the “Dependencies” tab

2. Add the plug-in “com.ibm.osgi.domino.core” to the list of required plug-ins

01 - Dependencies - Add OSGi Plugin 00

01 - Dependencies - Add OSGi Plugin

01 - Dependencies - Add OSGi Plugin 02

Save the “MANIFEST.MF

3. Now we can use “com.ibm.domino.osgi.core.context.ContextInfo” to access the Domino environment in HelloVaadinUI

package ch.hasselba.vaadin;

import lotus.domino.Database;
import lotus.domino.NotesException;
import lotus.domino.Session;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI; 
import com.vaadin.ui.VerticalLayout;
import com.ibm.domino.osgi.core.context.ContextInfo;

@SuppressWarnings("serial")
public class HelloVaadinUI extends UI {
    
    public static class Servlet extends VaadinServlet {
    }
    
    @Override
    protected void init(VaadinRequest request) {
    
        VerticalLayout layout = new VerticalLayout();
        setContent(layout);
        layout.setSizeFull();
        
        String dbPath = "";
        String userName = "";
        String queryString = "";
       
        try {
            
            // get the current database
            Database db = ContextInfo.getUserDatabase();
            if( db != null )
                dbPath = db.getFilePath();
            
            // get the current session
            Session session = ContextInfo.getUserSession();
            if( session != null )
                userName = session.getEffectiveUserName();
            
            // get the query string
            queryString = ContextInfo.getServerVariable("QUERY_STRING");
            
        } catch (NotesException e) {
            e.printStackTrace();
        }
        
        Label label = new Label();
        label.setValue("<h1>Hello " + userName + "!</h1>");
        label.setContentMode(ContentMode.HTML);
        
        Label labelDB = new Label();
        labelDB.setValue("<p>DB Path: " + dbPath + "</p>");
        labelDB.setContentMode(ContentMode.HTML);
        
        Label labelQuery = new Label();
        labelQuery.setValue("<p>Query: " + queryString + "</p>");
        labelQuery.setContentMode(ContentMode.HTML);
        
        layout.addComponents(label, labelDB, labelQuery);
    }

}

4. When opening the application inside the names.nsf, the result looks like this:

04  - Result

HowTo: Vaadin on Domino

24. Januar 2015 Posted by Sven Hasselbach

This example requires a valid XPages Plugin Development Environment. The execution environment used is the XPages Domino JRE.

1. Create a new plug-in project and select “Equinox” as OSGi framework

01 - New Plugin Project

2. Set the name of the activator class to “ch.hasselba.vaadin.Activator

02 - Activator Class

3. Open the MANIFEST.MF file

03 - Manifest

4. On Tab “Overview“, activate the option for lazy loading and the singleton property

04 - Singleton

5. Go to “Dependencies” tab and add the required plugin “com.ibm.pvc.webcontainer

05 - Dependencies - Required Plugins 01

When entering “pvc“, you can easily find the plugin from the list:

05 - Dependencies - Required Plugins 02

6. Then, add  “javax.servlet” and “javax.servlet.http” to the list of imported packages

06 - Dependencies -ImportedPackages

7. Now, download the Jar files for Vaadin. The files can be found here (the All-in-One archive is the right one).

8. Import the Jars to the project

08 - Import - Vaadin Jars 01

08 - Import - Vaadin Jars 02

The required Jars are:

  • vaadin-client-7.3.8.jar
  • vaadin-client-compiled-7.3.8.jar
  • vaadin-client-compiler-7.3.8.jar
  • vaadin-push-7.3.8.jar
  • vaadin-server-7.3.8.jar
  • vaadin-shared-7.3.8.jar
  • vaadin-themes-7.3.8.jar

08 - Import - Vaadin Jars 03

9. Do this with „jsoup“ and „org.json“ libaries too:

09 - Import - Other Jar

10. Now, go to the “Runtime” tab and add the classpathes (don’t forget to move the “.” to the top of the list)

10 - Runtime - Classpath 02

10 - Runtime - Classpath

The symbol of the filetypes have now changed:

10 - Runtime - Classpath 03

11. On tab “Overview“, click on “Extensions” to open the Extension tab

11 - Overview - Extensions

Click on “Yes” to open the “Extension” tab:

11 - Overview - Extensions 02

12. Here, you have to add the extension point “com.ibm.pvc.webcontainer.application

12 - Extension - Add 01

12 - Extension - Add 02

13. Open “plugin.xml”

13 - Plugin_XML

14. … and configure the extension point:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

     <extension
         point="com.ibm.pvc.webcontainer.application">
      <contextRoot>
         /helloVaadin  
      </contextRoot>
      <contentLocation>
         WebContent
      </contentLocation>
   </extension>

</plugin>

contextRoot defines the URL pattern where the Vaadin servlet is reachable.  contentLocation is a folder where the required web.xml configuration file can be found.

Save the “plugin.xml” file.

15. Create the folder “WebContent“…

15 - Folder 01

15 - Folder 02

16. … and then a second folder “WEB-INF” inside of “WebContent

17. Create the “web.xml” file in this folder, the tree should look like this:

17 - WebFolder Structure

18. The “web.xml” contains the configuration of the servlet:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name>HelloVaadin</display-name>
    <context-param>
        <description>Vaadin production mode</description>
        <param-name>productionMode</param-name>
        <param-value>false</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>HelloVaadinServlet</servlet-name>
        <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
        <init-param>
            <param-name>UI</param-name>
            <param-value>ch.hasselba.vaadin.HelloVaadinUI</param-value>
        </init-param>
    </servlet> 

    <servlet-mapping>
        <servlet-name>HelloVaadinServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
</web-app>

The <init-param> tag inside <servlet> defines our UI class of our application. We will create this class later. The <servlet-mapping> defines a mapping inside the webapplication path.

This means, if you would add a url-pattern like “/helloVaadinServlet/*” to the Vaadin servlet, the URL to reach the application is

http://example.com/helloVaadin/helloVaadinServlet/

The “/helloVaadin/” part is the defined in the contextPath parameter in the web application. When using another pattern as “/*“, an additional mapping for the Vaadin resources is required:

<servlet-mapping>
        <servlet-name>HelloVaadinServlet</servlet-name>
        <url-pattern>/VAADIN/*</url-pattern>
</servlet-mapping>

19. Go to “Build” tab, and include the “Web-Content” folder:

19 - Build - Add WebContent 01

The following line should now appear in the build.properties file which includes the folder in the final Jar.

19 - Build - Add WebContent 02

20. Create the Vaadin servlet class “ch.hasselba.vaadin.HelloVaadinUI”

20. Servlet Class 01

20. Servlet Class 03

21. Add the following code to the class

package ch.hasselba.vaadin;

import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI; 

@SuppressWarnings("serial")
public class HelloVaadinUI extends UI {
    
    public static class Servlet extends VaadinServlet {
    }
    
    @Override
    protected void init(VaadinRequest request) {
    
        HorizontalLayout layout = new HorizontalLayout();
        setContent(layout);
        layout.setSizeFull();

        Label label = new Label();
        label.setValue("<h1>Hello Vaadin!</h1>");
        label.setContentMode(ContentMode.HTML);
        layout.addComponent(label);
        layout.setComponentAlignment(label, Alignment.TOP_CENTER);
    }

}

22. At the end, organize the manifest. Open tab “Overview” and start the “Organize Manifest Wizard

22 - Overview - Organize Manifest 01

22 - Overview - Organize Manifest 02

This updates the manifest and adds all resources for the Vaadin application.

22 - Overview - Organize Manifest 03

Last but not least, save all project files.

25. Create a Feature Project named “HelloVaadinFeature” and click on “Next

Feature 00

27. Select the “HelloVaadin” Plug-In

Feature 02

28. On the “Plugins” tab, check the option “Unpack the plug-in archive after the installation“:

Feature 03

Save the file and…

29. … create the Update Site “HelloVaadinUpdateSite

UpdateSite 01

UpdateSite 02

Add the feature…

UpdateSite 03

UpdateSite 04

… and build the site:

UpdateSite 05

30. Import it to the Update Site on the Domino server and restart the HTTP task

31. That’s it! Open the URL in the browser and enjoy.

99 - Hello Vaadin