www.ics.ug #icsug
Fix & fertig:
Best Practises für "XPages-Migranten"
Oliver Busse, 26.03.2015
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Oliver Busse
• „Bleeding Yellow“ seit R4.5
• Certified Lotus Instructor seit 2001
• IBM Champion for ICS in 2015
• OpenNTF Contributor &
Board Member
• XPages Advocate
• Framework-süchtig, vor allem
Bootstrap
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
• Worum geht's?
– Alltags-Anforderungen mit XPages umsetzen
– Keine Angst vor Java mit XPages 
– Vermeidung von @Formeln in SSJS
– Denkanstöße & Best Practises
• Worum geht es nicht?
– XPages Einführung
– Java für Einsteiger
– Komplette Anwendungsmigration
Übersicht
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Warum kein ServerSide Javascript?
• SSJS wird zur Laufzeit interpretiert
• SSJS wird zur Laufzeit kompiliert
• SSJS-Kompilat wird ausgeführt, ist aber kaum zu
debuggen
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
• Datenbank- & Nutzerprofile migrieren
– „Klassische“ Profildokumente vs. Scoped Beans
– Wertelisten immer verfügbar machen
• Nutzer- & Umgebungsinformationen
– was darf und soll der Nutzer sehen & können
• Volltextsuche vs. Facettensuche
– Zusätzliche Datenfilterung mit Tags
Themen
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Datenbank- & Nutzerprofile migrieren
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Was wir häufig vorfinden: Profildokumente
Nachteile
• Man sieht sie ohne Hilfsmittel
nicht
• Man kann sie nur
programmatisch erzeugen und
bearbeiten
• Zum Teil Probleme mit der
Replikation
• Relativ viel Code nötig, um auf
Daten zuzugreifen
• Caching ;-)
Vorteile
• Schneller Zugriff auch ohne
Ansichten / Lookups
• Caching
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Was wir häufig vermisst haben
DatabaseScript != Globale Deklarationen
Leider gekapselt, kein Zugriff von außen
(außer Database Events)
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Performance-Killer
Viele dieser Formeln bremsen die Anwendung aus
eines von vielen...
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Transformation
Item1=Values1
Item2=Values2
Item3=Values3
...
NotesDocument
Key1=ValueMap1
Key2=ValueMap2
Key3=ValueMap3
...
HashMap
NSF-basiert, Lookup nötig Speicher-basiert, direkter Zugriff
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
• Umwandlung von Profildokumenten in
„normale“ Dokumente
1. Erzeugen einer entsprechenden
Lookup-Ansicht
2. Optional: entsprechende Masken
3. Erstellen der Java Beans
4. Definition der Bean-Klassen in der
faces-config.xml
Zutaten
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
• Key für Database Profile = dbprofile
• Key für Nutzer Profile = Kanonischer Name
• Key für Wertlisten = frei definierbar, eindeutig
Lookup Ansicht
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
• 3 Klassen:
– DatabaseProfileBean
– AppConfigBean
– UserProfileBean
• Die DatabaseProfileBean initialisiert das
Dokument, falls es noch nicht vorhanden ist
• Die UserProfileBean initialisiert das
Dokument, wenn der Nutzer es speichert
Java Beans
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
faces-config.xml
<faces-config>
<!-- Database Profile Bean -->
<managed-bean>
<managed-bean-name>dbprofile</managed-bean-name>
<managed-bean-class>com.icsug.DatabaseProfileBean
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
<!-- User Profile Bean -->
<managed-bean>
<managed-bean-name>userprofile</managed-bean-name>
<managed-bean-class>com.icsug.UserProfileBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<!-- Application Configuration -->
<managed-bean>
<managed-bean-name>application</managed-bean-name>
<managed-bean-class>com.icsug.AppConfigBean
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
</faces-config>
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
• Request
– kurzzeitig für die Dauer einer Anfrage bis zur Antwort (pro
Nutzer)
• View
– innerhalb einer Seite, auch bei partiellem Refresh (pro
Nutzer)
• Session
– Pro Nutzer für die Dauer der Anmeldung
• Application
– Anwendungsweit für die Dauer der Laufzeit (z.B. bis Server
Neustart bzw. Re-Initialisierung)
Exkurs: Bean Scopes
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
DEMO
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Nutzer- und Umgebungsinformationen
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Nutzer- & Umgebungsinformationen
Namensvariationen
Zugriffslevel
ACL Options notes.ini
Informationen
Environment
Bean
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
faces-config.xml: EnvironmentBean
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
<!-- Environment Bean -->
<managed-bean>
<managed-bean-name>env</managed-bean-name>
<managed-bean-class>com.icsug.EnvironmentBean
</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
</managed-bean>
</faces-config>
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Beispiel: Variationen des Nutzernamens
<p>
<xp:label
value="#{javascript:env.userName}"
id="label1">
</xp:label>
</p>
<p>
<xp:label
value="#{javascript:env.commonUserName}"
id="label2">
</xp:label>
</p>
<p>
<xp:label
value="#{javascript:env.abbreviatedUserName}"
id="label3">
</xp:label>
</p>
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Beispiel: ACL Options
Der Löschen-Button ist nur
verfügbar, wenn der Nutzer dies
per ACL auch kann
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Sogar in Themes nutzbar!
<theme
extends="flatly"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="platform:/plugin/com.ibm.designer.domino.style
kits/schema/stylekit.xsd">
<!--
display a submit type button only if user can create documents via ACL
-->
<control>
<name>Button.Submit</name>
<property
type="boolean">
<name>rendered</name>
<value>#{env.createDocuments}</value>
</property>
</control>
</theme>
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
DEMO
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Volltextsuche vs. Facettensuche
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Facetted Search
„Bei der Facettensuche oder Facettennavigation
werden anhand einer Facettenklassifikation
Suchtreffer eingegrenzt, beispielsweise in Produkt-
oder Bibliothekskatalogen. Die Facetten nutzen zur
Filterung Metadaten der jeweiligen Einträge.“
http://de.wikipedia.org/wiki/Facettensuche
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Facetted Search
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
„Prominente“ Beispiele
amazing.com cyberharbor
muse
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Facetted Search mit Domino?
1. Fulltext Search
2. Eingrenzen des Ergebnisses mit Metadaten-
Auswahl
1. Suche nach Metadaten-Auswahl
2. Durchsuchen des Ergebnisses mit Fulltext Search
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
FacettedSearchBean (Session scoped)
FacettenSuchbegriff
FacettedSearch
Bean
DocumentCollection
(ArrayList<SearchResultEntry>)
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Code/DEMO
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Facetted Search: Ausblick & Alternativen
• Graph-DB Funktionalität in der OpenNTF API
• 3rd party Graph-DB benutzen (z.B. Apache Solr)
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
www.ics.ug #icsug
Best Practises für "XPages-Migranten"
Quellen
http://de.wikipedia.org/wiki/Facettensuche
http://lucene.apache.org/solr/
https://www.focul.net/focul-best-practice-faceted-filtering-xpages-using-java-beans/
https://bitbucket.org/zeromancer1972/icsug-2015-demo

Fix & fertig: Best Practises für "XPages-Migranten"

  • 1.
    www.ics.ug #icsug Fix &fertig: Best Practises für "XPages-Migranten" Oliver Busse, 26.03.2015
  • 2.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Oliver Busse • „Bleeding Yellow“ seit R4.5 • Certified Lotus Instructor seit 2001 • IBM Champion for ICS in 2015 • OpenNTF Contributor & Board Member • XPages Advocate • Framework-süchtig, vor allem Bootstrap
  • 3.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" • Worum geht's? – Alltags-Anforderungen mit XPages umsetzen – Keine Angst vor Java mit XPages  – Vermeidung von @Formeln in SSJS – Denkanstöße & Best Practises • Worum geht es nicht? – XPages Einführung – Java für Einsteiger – Komplette Anwendungsmigration Übersicht
  • 4.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Warum kein ServerSide Javascript? • SSJS wird zur Laufzeit interpretiert • SSJS wird zur Laufzeit kompiliert • SSJS-Kompilat wird ausgeführt, ist aber kaum zu debuggen
  • 5.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" • Datenbank- & Nutzerprofile migrieren – „Klassische“ Profildokumente vs. Scoped Beans – Wertelisten immer verfügbar machen • Nutzer- & Umgebungsinformationen – was darf und soll der Nutzer sehen & können • Volltextsuche vs. Facettensuche – Zusätzliche Datenfilterung mit Tags Themen
  • 6.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Datenbank- & Nutzerprofile migrieren
  • 7.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Was wir häufig vorfinden: Profildokumente Nachteile • Man sieht sie ohne Hilfsmittel nicht • Man kann sie nur programmatisch erzeugen und bearbeiten • Zum Teil Probleme mit der Replikation • Relativ viel Code nötig, um auf Daten zuzugreifen • Caching ;-) Vorteile • Schneller Zugriff auch ohne Ansichten / Lookups • Caching
  • 8.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Was wir häufig vermisst haben DatabaseScript != Globale Deklarationen Leider gekapselt, kein Zugriff von außen (außer Database Events)
  • 9.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Performance-Killer Viele dieser Formeln bremsen die Anwendung aus eines von vielen...
  • 10.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Transformation Item1=Values1 Item2=Values2 Item3=Values3 ... NotesDocument Key1=ValueMap1 Key2=ValueMap2 Key3=ValueMap3 ... HashMap NSF-basiert, Lookup nötig Speicher-basiert, direkter Zugriff
  • 11.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" • Umwandlung von Profildokumenten in „normale“ Dokumente 1. Erzeugen einer entsprechenden Lookup-Ansicht 2. Optional: entsprechende Masken 3. Erstellen der Java Beans 4. Definition der Bean-Klassen in der faces-config.xml Zutaten
  • 12.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" • Key für Database Profile = dbprofile • Key für Nutzer Profile = Kanonischer Name • Key für Wertlisten = frei definierbar, eindeutig Lookup Ansicht
  • 13.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" • 3 Klassen: – DatabaseProfileBean – AppConfigBean – UserProfileBean • Die DatabaseProfileBean initialisiert das Dokument, falls es noch nicht vorhanden ist • Die UserProfileBean initialisiert das Dokument, wenn der Nutzer es speichert Java Beans
  • 14.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" faces-config.xml <faces-config> <!-- Database Profile Bean --> <managed-bean> <managed-bean-name>dbprofile</managed-bean-name> <managed-bean-class>com.icsug.DatabaseProfileBean </managed-bean-class> <managed-bean-scope>application</managed-bean-scope> </managed-bean> <!-- User Profile Bean --> <managed-bean> <managed-bean-name>userprofile</managed-bean-name> <managed-bean-class>com.icsug.UserProfileBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <!-- Application Configuration --> <managed-bean> <managed-bean-name>application</managed-bean-name> <managed-bean-class>com.icsug.AppConfigBean </managed-bean-class> <managed-bean-scope>application</managed-bean-scope> </managed-bean> </faces-config>
  • 15.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" • Request – kurzzeitig für die Dauer einer Anfrage bis zur Antwort (pro Nutzer) • View – innerhalb einer Seite, auch bei partiellem Refresh (pro Nutzer) • Session – Pro Nutzer für die Dauer der Anmeldung • Application – Anwendungsweit für die Dauer der Laufzeit (z.B. bis Server Neustart bzw. Re-Initialisierung) Exkurs: Bean Scopes
  • 16.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" DEMO
  • 17.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Nutzer- und Umgebungsinformationen
  • 18.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Nutzer- & Umgebungsinformationen Namensvariationen Zugriffslevel ACL Options notes.ini Informationen Environment Bean
  • 19.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" faces-config.xml: EnvironmentBean <?xml version="1.0" encoding="UTF-8"?> <faces-config> <!-- Environment Bean --> <managed-bean> <managed-bean-name>env</managed-bean-name> <managed-bean-class>com.icsug.EnvironmentBean </managed-bean-class> <managed-bean-scope>view</managed-bean-scope> </managed-bean> </faces-config>
  • 20.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Beispiel: Variationen des Nutzernamens <p> <xp:label value="#{javascript:env.userName}" id="label1"> </xp:label> </p> <p> <xp:label value="#{javascript:env.commonUserName}" id="label2"> </xp:label> </p> <p> <xp:label value="#{javascript:env.abbreviatedUserName}" id="label3"> </xp:label> </p>
  • 21.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Beispiel: ACL Options Der Löschen-Button ist nur verfügbar, wenn der Nutzer dies per ACL auch kann
  • 22.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Sogar in Themes nutzbar! <theme extends="flatly" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="platform:/plugin/com.ibm.designer.domino.style kits/schema/stylekit.xsd"> <!-- display a submit type button only if user can create documents via ACL --> <control> <name>Button.Submit</name> <property type="boolean"> <name>rendered</name> <value>#{env.createDocuments}</value> </property> </control> </theme>
  • 23.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" DEMO
  • 24.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Volltextsuche vs. Facettensuche
  • 25.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Facetted Search „Bei der Facettensuche oder Facettennavigation werden anhand einer Facettenklassifikation Suchtreffer eingegrenzt, beispielsweise in Produkt- oder Bibliothekskatalogen. Die Facetten nutzen zur Filterung Metadaten der jeweiligen Einträge.“ http://de.wikipedia.org/wiki/Facettensuche
  • 26.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Facetted Search
  • 27.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" „Prominente“ Beispiele amazing.com cyberharbor muse
  • 28.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Facetted Search mit Domino? 1. Fulltext Search 2. Eingrenzen des Ergebnisses mit Metadaten- Auswahl 1. Suche nach Metadaten-Auswahl 2. Durchsuchen des Ergebnisses mit Fulltext Search
  • 29.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" FacettedSearchBean (Session scoped) FacettenSuchbegriff FacettedSearch Bean DocumentCollection (ArrayList<SearchResultEntry>)
  • 30.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Code/DEMO
  • 31.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Facetted Search: Ausblick & Alternativen • Graph-DB Funktionalität in der OpenNTF API • 3rd party Graph-DB benutzen (z.B. Apache Solr)
  • 32.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten"
  • 33.
    www.ics.ug #icsug Best Practisesfür "XPages-Migranten" Quellen http://de.wikipedia.org/wiki/Facettensuche http://lucene.apache.org/solr/ https://www.focul.net/focul-best-practice-faceted-filtering-xpages-using-java-beans/ https://bitbucket.org/zeromancer1972/icsug-2015-demo