Wondering how to take advantage of Java and Managed Beans in XPages? To do this requires knowing how to store data in Java objects and a good understanding of Maps, Trees, Lists, and Sets. No, we are not talking about Google Maps or those big green things in forests but different Java interfaces! Come learn different programming models to use when storing application configuration information, speeding up lookups to Domino data and feeding data to repeat and table controls. Learn how to build reports from different data sources. Plus, we will also look at working with dates and numbers in Java and Domino. Finally, we will review the Domino Java APIs and an alternative, the OpenNTF Domino API.
MWLUG Session- AD112 - Take a Trip Into the Forest - A Java Primer on Maps, Trees, and Collections
1. 1
Take a Trip Into the Forest - A Java Primer on
Maps, Trees, and Collections
2. • Certified Lotus Instructor since R3
• Co-founded TLCC in 1987
• IBM Champion
• Prior to that 12 years at IBM in the PC group
• Also…
– Certified Public Accountant
– Certified Information Systems Auditor (CISA)
– Certified Flight Instructor
2
3. 3
• Private classes at
your location or
virtual
•XPages Development
•Support Existing Apps
•Administration
• Let us help you
become an expert
XPages developer!
• Delivered via Notes
• XPages
• Development
• Admin
• User
Self-
Paced
Courses
Mentorin
g
Instructor-
Led
Classes
Application
Developmen
t and
Consulting
Free
Demo
Courses!
4. • Let us help with your development needs
– Bootstrap
– Java
• Convert Notes Apps to mobile and the web!
• Modernize old Domino web applications
• Interface with backend data systems
• Skills transfer
4
5. • Why Use Java Objects in Xpages?
• Introduction to Managed Beans
• Scoped Variables in SSJS
• Introduction to Maps
• The DataObject Implementation
• A Reporting Example
• Questions???
5
6. • Performance (see my recorded webinar)
• Reporting
– Easily combine data from different sources
• Portability
– Back end
– Front end
• Code Maintenance
• Lots of code/knowledge out there
6
7. • The XPages runtime manages the creation of your
“managed bean”
– Request, View, Session, or Application scope
• Refer to methods on your XPages or from other Java
code
• How to:
– Create an entry in the Faces-Config file
– Create your Java code
• Getters and Setters
• No argument constructor
• Don’t have to use Managed Beans!
7
SampleBean.java
SampleBeanDemo.xsp
8. • sessionScope.testName
– read/write to a variable that is session scope
• Can store anything (string, Boolean, date, array, etc)
– Just don’t store Domino objects
• Why do we care???
– Scoped variables are stored as HashMaps
– Another way to access is:
• sessionScope.get(“testName”)
• sessionScope.put(“testName” , “A value”)
• Same as a Java Hash Map
– Let’s Learn more about these HashMaps!
8
9. • Collections is a Framework/root interface
– Architecture for representing collections
• Has Interfaces, Implementations, Algorithms
• Interfaces
– Abstract Data Type
– Defines a base used by all the classes that implement
• An interface in Java is similar to a class, but the body of
an interface can include only abstract methods and final fields
(constants). A class implements an interface by providing code for each
method declared by the interface.
• Implementations
– A class that uses an interface (we use this!)
9
15. • Goal
– Store configuration information
– Managed Bean with Application Scope
• Best choice is a HashMap
– Why? Back to the previous chart!
– Access values with a key
15
16. • Creation
private HashMap<String,String> configData = new HashMap<String,
String>();
• Set a value
configData.put(key ,value);
• Get a value (and test to see if key is there)
public String getConfig(String key) {
String rtnString = "";
if (this.configData.containsKey(key)){
rtnString = this.configData.get(key);
}
return rtnString;
}
16
17. 1. Notes view/form to hold configuration data
2. Create new Java Class
3. Add Managed Bean to faces-config
– Set scope as needed
4. Implement Serializable in the Java class
5. Create “private” variable for HashMap
6. Create constructor to initialize data
– Walk the view to load up the keys/values
7. Generate Getter/Setter
8. Use on XPage or in other Java code
17
ConfigBean.java
ConfigBeanDemo.xsp
18. • Get all the keys as a Set
– statesHashMap.keySet()
• Get all the values as a Set
– statesHashMap.values()
• Get the key and value as a Set
– statesHashMap.entrySet()
• Get the key with getKey() and the value with getValue()
18
for (Entry<String, String> state :statesHashMap.entrySet()){
myString = state.getValue() + "|" + state.getKey() ;
debugMsg(myString);
}
19. • A HashMap does not keep the insertion order (random)
• Need to keeps insertion order? LinkedHashMap
• Good when loading data from a Notes view (that is
ordered already)
– Keeps same (insertion) order
• Otherwise basically the same as HashMap
19
20. • A list of objects (like an Array)
– Hold any data type/object
– Can search the values
– Can access an element in a certain position
• Perfect for feeding to:
– Values in a combo box, list box, etc.
– Repeats
– Data Tables
• To add at end:
– rtnList.add(stateLine);
20
21. • Stop doing @DbColumns
– Slow!
• Load values from a view, store in memory
– FAST!
• Use Expression Language
– configBean.statesHashMap
• Use same ConfigBean as before (application scope)
– Method in Java is getStatesHashMap()
– Returns a List
21
ConfigBean.java
ConfigBeanDemo.xsp
22. • Do you Recycle?
– View looping
– NotesDateTime?
– columnValues with a Date creates NotesDateTime objects
• Instead use the Domino API
– Simpler code patterns
– Never have to worry about recycle
– Try/Catch block not required
– Support for logging
– Lots of cool new stuff
• Available on OpenNTF – Link to version 3
– Get help via Slack/Stack Overflow
22
24. 24
private void initBean(Database curDb, String viewName) {
View setupVw = curDb.getView(viewName);
String key = "";
String value = "";
if (setupVw != null) {
for (ViewEntry entryDoc : setupVw.getAllEntries()){
Vector<?> colValues = entryDoc.getColumnValues();
key = (String) colValues.elementAt(0);
value = (String) colValues.elementAt(1);
this.configData.put(key , value);
}
}
}
No Recycle!
Uses a for loop
No Try/Catch block
ConfigBean2.java
DomAPIDemo.xsp
25. • Use Case
– Get a list of values always sorted by the value
• “Natural” sort order
– No duplicates
• TreeSet!
• Good for looping through a view, getting a value
from a column
– Add to TreeSet and then you always have a
sorted, unique list
25
TreeSetBean.java
TreeSetBeanDemo.xsp
26. • Suppose you don’t want the “natural” order???
– Use a custom sort when defining the TreeSet
– Comparator function
– Will always sort using this new sort definition
26
public List<String> getArizonaTownsReversed() {
TreeSet<String> sorted = new TreeSet<String>(new Comparator<String>() {
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
sorted.addAll(ArizonaTowns);
return new ArrayList<String>(sorted);
}
TreeSetBean.java
TreeSetBeanDemo.xsp
27. • Use a TreeMap
– Key,Value pair
• In this case, a state is the key, a list of towns
(TreeSet) is the value
– Sorted on the Key value, natural order
27
28. • Way to implement an interface that works well with
the Expression Language
– Any data type
– Must implement certain methods
28
DataObjectBean.java
DataObjectBeanDemo.xsp
29. • Goal is to store information in the bean to allow fast
filtering and sorting
• Base storage is a LinkedHashMap
– Key is the city name
– Values are an ArrayList
• The ArrayList holds a Person object
–First and last name, city, state, email, etc.
–Universal doc id to retrieve Notes document
29
30. 30
Houston
LinkedHashMap<String,ArrayList
<Person>> customers
Key is City Name
Lorie Mason
Brad Hunt
Jessie Lang
Mark Travis
firstName
lastName
City
State
eMail
Notes ID
DocUNID
Person ObjectDallas
Austin
ArrayList<Person>
The customers HashMap
stores all the people from a
selected state
ReportBean.java
ReportBeanDemo.xsp
31. • Methods of the Bean are used to:
– Return data as an ArrayList to a Repeat
• Sorted (last name, city, email)
• Filter on a city or show all
– Switch to a different state
– Get the cities for the selected state (unique, ordered)
– Store information like:
• City filter
• Desired sorting
• Ascending or Descending sorting
31
32. • TLCC’s Java Classes (two)
http://www.tlcc.com/admin/tlccsite.nsf/coursedetails.xsp?ccode=ND9XJVKPG
• My Session on Xpages Performance (recorded)
– October, 2015
http://www.tlcc.com/admin/tlccsite.nsf/pages/recorded-xpages-
webinars?opendocument
• List of Collections with a summary of features
– http://www.janeve.me/articles/which-java-collection-to-use
• The Sun Java documentation (version 6, aka 1.6)
• StackOverflow
• Google!!!
32
33. 33
Email: howardg@tlcc.com
Twitter: @TLCCLtd
Web: www.tlcc.com
Special Offer!!!
Save 20% on any TLCC course or package until 9/30
To take advantage of this offer or to download the demonstration databases
www.tlcc.com/mwlug