Transformations
Smart Application Migration
A presentation of Oliver Busse @ Engage.UG in March 2015
Broadcasted in the TLCC & Teamstudio Webinar April 21, 2015
Agenda
•About me
•Overview
•Preamble
•Migrate database and user profiles
• Legacy profile documents vs. Java Beans
• Value lists made available over the whole application
•User and environment information
• What can a user see and use?
•Extending Fulltext search to a facetted search
• Filtering your data with meta tags
Oliver Busse
• „Bleeding Yellow“ since 2000
• Working for We4IT Group
• OpenNTF Board Member
• IBM Champion for ICS in 2015
• @zeromancer1972
• www.oliverbusse.com
www.we4it.com
Overview
•What‘s this?
• Transforming & re-using commonly used legacy patterns in
XPages
• Don‘t fear Java 
• Avoid @Formulas in SSJS
• Ideas for best practices
•What‘s it not?
• An XPages Introduction
• A Java beginner‘s guide
• A complete application migration strategy
Preamble
•Why not to use SSJS „excessively“?
• SSJS is interpreted at runtime
• SSJS is compiled at runtime (every time you call it!)
• Compiled SSJS is hard to debug while executed
6#engageug
Migrating database and user profiles
What we find in legacy apps: profile documents
Disadvantages
• You cannot see them without
using tools
• You can edit and create them
only programmatically
• Sometimes replication issues
• Unwanted Caching ;-)
Advantages
• Quick access without using
lookup views
• Caching
What we missed in many cases
DatabaseScript != Global Declarations
Encapsuled, no access from outside
(except Database Events)
Performance-Killer
Numerous usage of those formulas slow down the app
one of many...
Transformation
Item1=Values1
Item2=Values2
Item3=Values3
...
NotesDocument
Key1=ValueMap1
Key2=ValueMap2
Key3=ValueMap3
...
HashMap
NSF-based, view lookup Memory-based, direct access
Ingredients
•Transformation of profile documents to „standard“
documents
1. Create a corresponding lookup view
2. Optional: corresponding forms for maintenance
3. Create the Java Bean classes
4. Define those Bean classes in faces-config.xml
Preparation: Lookup Views
•Key for Database Profiles = dbprofile
•Key for User Profiles = Canonical User Name
•Key for Value Lists = free but unique
Preparation: Java Beans
• 3 Classes:
• DatabaseProfileBean
• AppConfigBean
• UserProfileBean
• The DatabaseProfileBean initializes the document if
it doesn‘t exist
• The UserProfileBean initializes the document when
the user saves it for the first time
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>
Digression: Bean Scopes & Lifecycles
•Request
• Lives beginning with the request to creation of the response
•View
• Within a page until changing the page, even during partial
refreshes
•Session
• Per user session
•Application
• During the life time of th application (after 30 minutes it is
dropped by default)
DEMO
17#engageug
User and Environment Information
User and Environment Information
Name variations
Access Level
ACL Options notes.ini variables
Environment
Bean
faces-config.xml: EnvironmentBean
19#engageug
<?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>
Example: Username Variations
<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>
Example: ACL Options
The delete button is only visible if
the user can delete documents
Even in themes!
22#engageug
<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>
DEMO
24#engageug
Extending Fulltext-Search to a Facetted Search
Facetted Search
„Faceted search, also called faceted navigation or faceted browsing,
is a technique for accessing information organized according to a
faceted classification system, allowing users to explore a collection of
information by applying multiple filters.“
http://en.wikipedia.org/wiki/Faceted_search
Facetted Search
„Well-known“ Examples
amazing.com cyberharbor
muse
Facetted Search with Domino?
1. Fulltext Search
2. Filtering result from extra meta data
1. Meta data search with facet selection
2. Fulltext Search in results
FacettedSearchBean (Session scoped)
FacetsSearch Term
FacettedSearch
Bean
DocumentCollection
(ArrayList<SearchResultEntry>)
30#engageug
DEMO
Facetted Search: Outlook & Alternatives
•Using OpenNTF API‘s Graph-DB functions
•Using a 3rd party Graph-DB like Apache Solr
31#engageug
Want to get the DEMO?
Grab it from my Bitbucket repo (also contains an NTF):
https://bitbucket.org/zeromancer1972/icsug-2015-demo
It uses the following plugins available on OpenNTF:
XPages Extension Library (9.0.1.07+):
http://extlib.openntf.org/
Bootstrap 4 Xpages:
http://www.openntf.org/main.nsf/project.xsp?r=project/Bootstrap4XPages
OpenNTF Domino API:
http://www.openntf.org/main.nsf/project.xsp?r=project/OpenNTF%20Domino%20
API
32#engageug
Q & A
33#engageug
Other Resources
http://en.wikipedia.org/wiki/Faceted_search
http://lucene.apache.org/solr/
https://www.focul.net/focul-best-practice-faceted-filtering-xpages-using-java-beans/

Transformations - a TLCC & Teamstudio Webinar

Editor's Notes

  • #17 Db config Change app title Emptx app title Size = 0! Show CODE User Profile How it works Show CODE AppConfig Value lists (for combox, checkboxes, options) How it works Show CODE
  • #24 Username variations ACL Level ACL Options Notes.ini