SlideShare a Scribd company logo
1 of 71
UKLUG 2012 – Cardiff, Wales September 2012
Presenter: Paul T. Calhoun
Company: NetNotes Solutions
ICON UK 2013
Apache Software: The FREE Java
toolbox you didn't know you had !!
UKLUG 2012 – Cardiff, Wales
Obligatory Introduction Slide
•Have used Notes/Domino since R2
•Certified in Administration and Development or every release: R3-R8.5
•Independent trainer/developer/mentor for the past 22 years running
NetNotes Solutions Unlimited (www.nnsu.com)
•Specializing in
• Java
• Web Services
• XPages
• J2EE (WebSphere)
• Eclipse
• Rational Developer
• And….
UKLUG 2012 – Cardiff, Wales
Obligatory Introduction Slide
•Raising Grand Kids
UKLUG 2012 – Cardiff, Wales
Agenda
●What is APACHE ?
●Commons
●POI
●FOP
●Summary
UKLUG 2012 – Cardiff, Wales
What is APACHE ?
•The Apache Software Foundation
(www.apache.org) is
• An Open Source (Yes that means FREE)
consortium of companies and developers
• Donate time and resources to developing
tools (primarily Java based) that simplify
many tasks that developers are faced
with everyday
• It’s a lot like OpenNTF, but for Java
developers
UKLUG 2012 – Cardiff, Wales
What is APACHE ?
•IBM is a major contributor/supporter
•If you develop using Java code (and you should be) than you
owe it to yourself to spend some time reviewing the projects on
this site
•Some I use all the time
• Xerces
• Xalan
• XML Graphics (FOP)
• POI
• Commons
UKLUG 2012 – Cardiff, Wales
Demo
UKLUG 2012 – Cardiff, Wales
Agenda
●What is APACHE ?
●Commons
●POI
●FOP
●Summary
UKLUG 2012 – Cardiff, Wales
Apache Commons
•http://commons.apache.org
•Focused on all aspects of reusable Java
components
UKLUG 2012 – Cardiff, Wales
Commons Proper
•Commons Proper
• Goal of creating and maintaining
reusable java Components
•Individual downloadable components
• Not one GIANT utility library
• Just get what you need
UKLUG 2012 – Cardiff, Wales
Commons Proper
Component
Attributes Runtime API to metadata attributes such as doclet tags.
BCEL Byte Code Engineering Library - analyze, create, and manipulate Java class files
BeanUtils Easy-to-use wrappers around the Java reflection and introspection APIs.
Betwixt Services for mapping JavaBeans to XML documents, and vice versa.
BSF Bean Scripting Framework - interface to scripting languages, including JSR-223
Chain Chain of Responsibility pattern implemention.
CLI Command Line arguments parser.
Codec General encoding/decoding algorithms (for example phonetic, base64, URL).
Collections Extends or augments the Java Collections Framework.
Compress Defines an API for working with tar, zip and bzip2 files.
Configuration Reading of configuration/preferences files in various formats.
CSV Component for reading and writing comma separated value files.
Daemon Alternative invocation mechanism for unix-daemon-like java code.
DBCP Database connection pooling services.
DbUtils JDBC helper library.
Digester XML-to-Java-object mapping utility.
UKLUG 2012 – Cardiff, Wales
Commons Proper
Component
Discovery Tools for locating resources by mapping service/reference names to
resource names.
EL Interpreter for the Expression Language defined by the JSP 2.0
specification.
Email Library for sending e-mail from Java.
Exec API for dealing with external process execution and environment
management in Java.
FileUpload File upload capability for your servlets and web applications.
Functor A functor is a function that can be manipulated as an object, or an object
representing a single, generic function.
Imaging (previously called
Sanselan)
A pure-Java image library.
IO Collection of I/O utilities.
JCI Java Compiler Interface
JCS Java Caching System
Jelly XML based scripting and processing engine.
Jexl Expression language which extends the Expression Language of the JSTL.
JXPath Utilities for manipulating Java Beans using the XPath syntax.
Lang Provides extra functionality for classes in java.lang.
UKLUG 2012 – Cardiff, Wales
Commons Proper
Component
Launcher Cross platform Java application launcher.
Logging Wrapper around a variety of logging API implementations.
Math Lightweight, self-contained mathematics and statistics components.
Modeler Mechanisms to create Model MBeans compatible with JMX specification.
Net Collection of network utilities and protocol implementations.
OGNL An Object-Graph Navigation Language
Pool Generic object pooling component.
Primitives Smaller, faster and easier to work with types supporting Java primitive types.
Proxy Library for creating dynamic proxies.
SCXML An implementation of the State Chart XML specification aimed at creating and
maintaining a Java SCXML engine. It is capable of executing a state machine
defined using a SCXML document, and abstracts out the environment interfaces.
Transaction Implementations for multi level locks, transactional collections and transactional
file access.
Validator Framework to define validators and validation rules in an xml file.
VFS Virtual File System component for treating files, FTP, SMB, ZIP and such like as a
single logical file system.
UKLUG 2012 – Cardiff, Wales
Commons Lang
•Provides a host of helper utilities for the
java.lang API
• String manipulation methods
• Basic numerical methods
• Object reflection
• Additionally it contains basic
enhancements to java.util.Date
UKLUG 2012 – Cardiff, Wales
Commons Lang - Versions
•Latest Version is 3.3.1
• For Java 1.5 and higher
• For Notes/Domino 8.x and 9.x
•Version 2.6 is still available
• For Java 1.2 and higher
• For Notes Domino 7.x and below
http://commons.apache.org/proper/commons-lang/download_lang.cgi
UKLUG 2012 – Cardiff, Wales
Commons Lang API
Packages
org.apache.commons.lang3 Provides highly reusable static utility methods, chiefly concerned with adding value to
the java.lang classes.
org.apache.commons.lang3.builder Assists in creating consistent equals(Object), toString(), hashCode(),
and compareTo(Object) methods.
org.apache.commons.lang3.concurrent Provides support classes for multi-threaded programming.
org.apache.commons.lang3.event Provides some useful event-based utilities.
org.apache.commons.lang3.exception Provides functionality for Exceptions.
org.apache.commons.lang3.math Extends java.math for business mathematical classes.
org.apache.commons.lang3.mutable Provides typed mutable wrappers to primitive values and Object.
org.apache.commons.lang3.reflect Accumulates common high-level uses of the java.lang.reflect APIs.
org.apache.commons.lang3.text Provides classes for handling and manipulating text, partly as an extension to java.text.
org.apache.commons.lang3.text.translate An API for creating text translation routines from a set of smaller building blocks.
org.apache.commons.lang3.time Provides classes and methods to work with dates and durations.
org.apache.commons.lang3.tuple Tuple classes, starting with a Pair class in version 3.0.
UKLUG 2012 – Cardiff, Wales
org.apache.commons.lang3.StringUtils
•IsEmpty/IsBlank - checks if a String contains text
•Trim/Strip - removes leading and trailing whitespace
•Equals - compares two strings null-safe
•startsWith - check if a String starts with a prefix null-safe
•endsWith - check if a String ends with a suffix null-safe
•IndexOf/LastIndexOf/Contains - null-safe index-of checks
•IndexOfAny/LastIndexOfAny/IndexOfAnyBut/LastIndexOfAnyBut - index-
of any of a set of Strings
UKLUG 2012 – Cardiff, Wales
org.apache.commons.lang3.StringUtils
•ContainsOnly/ContainsNone/ContainsAny - does String contains
only/none/any of these characters
•Substring/Left/Right/Mid - null-safe substring extractions
•SubstringBefore/SubstringAfter/SubstringBetween - substring extraction
relative to other strings
•Split/Join - splits a String into an array of substrings and vice versa
•Remove/Delete - removes part of a String
•Replace/Overlay - Searches a String and replaces one String with
another
UKLUG 2012 – Cardiff, Wales
org.apache.commons.lang3.StringUtils
•Chomp/Chop - removes the last part of a String
•LeftPad/RightPad/Center/Repeat - pads a String
•UpperCase/LowerCase/SwapCase/Capitalize/Uncapitalize - changes the
case of a String
•CountMatches - counts the number of occurrences of one String in
another
UKLUG 2012 – Cardiff, Wales
org.apache.commons.lang3.StringUtils
•IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable - checks the characters
in a String
•DefaultString - protects against a null input String
•Reverse/ReverseDelimited - reverses a String
•Abbreviate - abbreviates a string using ellipsis
•Difference - compares Strings and reports on their differences
•LevenshteinDistance - the number of changes needed to change one
String into another
UKLUG 2012 – Cardiff, Wales
Demo
UKLUG 2012 – Cardiff, Wales
Agenda
●What is APACHE ?
●Commons
●POI
●FOP
●Summary
UKLUG 2012 – Cardiff, Wales
So what is POI?
•POI is a Java API for Microsoft Documents
• Not just spreadsheets, but what it’s used
most often for
• Which is misleading because it contains
libraries that specifically allow API access
to file formats based upon
• OOXML – Open Office XML
Standards
• OLE2 – Microsoft’s Compound
Document Format
• You do NOT have to have MS Office
installed in order to use POI !!
UKLUG 2012 – Cardiff, Wales
So what is POI?
•POI can “Read” and “Write” to MS and Open
source versions of
• Spreadsheets
• Word Processing documents
• Presentation (Powerpoint)
• MS Publisher
UKLUG 2012 – Cardiff, Wales
So what is POI?
•Useless Trivia
• POI is an acronym for “Poor
Obfuscation Implementation” in
reference to reverse engineering the
original MS Office document formats
UKLUG 2012 – Cardiff, Wales
Use Cases
•There are three primary use cases for
creating spreadsheets from Domino Data
• Export all the documents in a view
• Export selected documents from a
view
• Export documents that match a query
(Ad Hoc Reporting)
UKLUG 2012 – Cardiff, Wales
Export All Documents From a View
•This is the primary use case
• Create an XPage that displays the
View
• This isn’t really required, but is
nice for context purposes
UKLUG 2012 – Cardiff, Wales
Export All Documents From a View
•Create a clickable component that will
trigger running an XAgent that will output
the data to the spreadsheet
UKLUG 2012 – Cardiff, Wales
The Button Code
•Create a session scoped variable to hold
the view name
•Create an array of the fields that will be
exported
• This should generally match up to the
columns in the view but the View is
only used to aggregate the
documents. Field values are read
from the document collection
UKLUG 2012 – Cardiff, Wales
The Button Code
•Call the “XAgent” that will stream the
spreadsheet to the browser
UKLUG 2012 – Cardiff, Wales
The XAgent Code
•An XAgent is an XPage that has had it’s
“rendered” property turned off
•All of the code is in either the
“beforeRenderResponse” or
“afterRenderResponse” event
•We want to hi-jack the output stream so our
code will go in the “beforeRenderResponse”
event
UKLUG 2012 – Cardiff, Wales
The XAgent Code
•In an Xagent, the code is responsible for
producing all of the output
•It uses the underlying JSF API’s to
accomplish this task
UKLUG 2012 – Cardiff, Wales
The XAgent Code
•This is required because we need the
output stream of the page but CAN NOT
use the one from the executing XPage
(There can only be one!)
UKLUG 2012 – Cardiff, Wales
The XAgent Code
•The XAgent code reads the session scope
variables from the initiating XPage to
process the view and field list
UKLUG 2012 – Cardiff, Wales
The XAgent Code
•The Apache POI API is used to create a
new spreadsheet file and workbook
UKLUG 2012 – Cardiff, Wales
The XAgent Code
•The field list array is used to read the fields
from the notes documents
•Every document in the view is processed
UKLUG 2012 – Cardiff, Wales
The XAgent Code
•For every field in the field list array we read
the ITEMS from the Notes documents
•We have have to account for field “type” as
Java is a strongly “typed” language
UKLUG 2012 – Cardiff, Wales
The XAgent Code
•We use the “create” and “set” CellValue
methods to, you guessed it, create and set
the cell values
UKLUG 2012 – Cardiff, Wales
Demo
UKLUG 2012 – Cardiff, Wales
Agenda
●What is APACHE ?
●Commons
●POI
●FOP
●Summary
UKLUG 2012 – Cardiff, Wales
So what is FOP?
•FOP is a sub-project of the XML Graphics
project at APACHE
•FOP stands for Formatting Objects
Processor
• This is a print formatter driven by XSL
FO (Formatted Objects)
UKLUG 2012 – Cardiff, Wales
So what is FOP?
•An API that
• Reads an FO Tree
• Renders the resulting pages to a specified output
• PDF (Primary)
• PS
• PCL
• AFP
• XML
• Print
• AWT
• PNG
UKLUG 2012 – Cardiff, Wales
Um.. How about that again in English !!
•It’s a java based toolset that lets YOU (the
developer) create solutions that allow your End
Users (the Bain of all existence) to create PDF
documents from Notes content for FREE !!!
•Yes FREE!!!
• Ok, Free is relative.
• You are going to have to invest some time,
but I’m going to give you a working framework
that you can implement out of the box.
• For Free!!!
UKLUG 2012 – Cardiff, Wales
The Process
•The great thing about FOP is it is a highly
duplicable design pattern
XML
Source
XSLT
StyleSheet
FO Source
FO
Renderi
ng
Engine
Rendered Output
UKLUG 2012 – Cardiff, Wales
The Process
•It all starts with an XML Document (can be
from disk or in memory)
XML
Source
XSLT
StyleSheet
FO Source
FO
Renderi
ng
Engine
Rendered Output
UKLUG 2012 – Cardiff, Wales
The XML
•The XML can be
• A Static Document
• The output from ?ReadViewEntries
• Appended to the end of a Domino View
URL
• The output from generateXML
• Method of the Notes Document class
• The results of running an XAgent
• The results of running an Agent
• The results of running a Web Service
UKLUG 2012 – Cardiff, Wales
The XML
•The source of the XML is not as important as
the FORMAT and CONSISTANCY of the XML
• The XML must be well formed and
optionally valid
• Make sure that if you do not control the
source that you have an SLA with the
source provider that includes them
providing the XML Schema AND changes
to the XML Schema in enough advance
that you have time to test it.
UKLUG 2012 – Cardiff, Wales
The XML
•Using the ?ReadViewEntries option is
HIGHLY duplicable
• Once you have the stylesheet (and I’m
providing that to you) that transforms
the source XML to the FO XML then
ANY view source can be passed to the
code to produce a PDF of the view
UKLUG 2012 – Cardiff, Wales
The XML
•The other options require an XSLT stylesheet that
is specific to transforming the specified XML to FO
XML.
• This is not as flexible, but once the base
stylesheet is created it can be stored in a
notes document that is editable by a non-
developer
• This option allows changes to colors,
fonts etc without developer intervention
and re-compiling/re-deploying the code
UKLUG 2012 – Cardiff, Wales
The Stylesheet
•The stylesheet that is used is an XSLT
document (written in XML) that uses the
FOP tags from the tag library
XML
Source
XSLT
StyleSheet
FO Source
FO
Render
ing
Engine
Rendered Output
UKLUG 2012 – Cardiff, Wales
The XSL FO Stylesheet
•This is by far the most challenging part of this solution
•Stylesheet creators must be able to create and edit XSLT stylesheets (Doh!)
•The Tags used in the style sheet are not documented at the FOP site
• The good news is they ARE documented at the w3 schools site
• http://www.w3schools.com/xslfo/default.asp
• The other good news is they are documented in the form of a tutorial !!
• You can follow the tutorial to examine how to create a base XSL FO
style sheet
• You can also copy/paste this example code directly to your
XSL FO style sheet to get started !!
UKLUG 2012 – Cardiff, Wales
Using Eclipse or an XSLT editor is the
best choice
•Download the version that has the Web Tools Plugin (WTP)
•I usually download the one that supports J2EE development
•The benefit of this option is there is an XSLT editor included
not just an XML editor
•Also you can train “power-users” to use eclipse to build, edit,
maintain XSLT stylesheets for the purpose of maintaining their
own output without the need for them to have designer
• This might sound difficult, but it is significantly easier to
train both developers and power users on XSLT than it
is Java !!
UKLUG 2012 – Cardiff, Wales
The XSLT
•The Stylesheet is made up of a
combination of XSLT and XSL:FO tags
UKLUG 2012 – Cardiff, Wales
Structure of the FO Tags
•The XSL:FO tags are all about the layout of
the “printed” page
•XSL:FO tags always start with “root”
• Followed by a “layout master”
• Followed by a “page master”
• The a series of page sequences
that contain
• Flows
• Blocks
UKLUG 2012 – Cardiff, Wales
Structure of the FO Tags
UKLUG 2012 – Cardiff, Wales
The Layout and Page Master
•These tags define the output page
• Height
• Width
• Margins
• etc
UKLUG 2012 – Cardiff, Wales
The Page Sequence tag
•References the page master set tag to get
its output constraints
UKLUG 2012 – Cardiff, Wales
The Page Content
•The Page content is the output using a
series of “flows” and “blocks”
•A “flow” contains a series of “blocks”
•A “block” is roughly equivalent to a
paragraph on the page
UKLUG 2012 – Cardiff, Wales
The Page Content
•Blocks can contain other constraining tags
like the “table” tag
UKLUG 2012 – Cardiff, Wales
Where are the stylesheets Stored
•After the stylesheet is created there are two
options
• Save the stylesheet as a design
resource (A stylesheet)
• Save the stylesheet in a document that
is accessible from the notes client
• This allows editing/maintainence
of the stylesheets without the
need of a designer client
UKLUG 2012 – Cardiff, Wales
Storing Stylesheets in Designer
•The XSLT Sheets can be
stored in DDE in the Style
Sheets folder contained in
the resources folder
UKLUG 2012 – Cardiff, Wales
Alternately Store in documents
•You can create a
• Form
• View
•to store Notes documents that contain the
XSLT stylesheets
•Your code will “lookup” the stylesheet when
applying it to the XML source
UKLUG 2012 – Cardiff, Wales
The Code
•Now that you have the XML Source and the
XSLT stylesheet you are ready to write
some code !!! (Yea !!)
•The APACHE FOP is a JAVA Library
• Yes this means you have to code the
solution using Java !!
UKLUG 2012 – Cardiff, Wales
The Code
•Can be coded as
• Java Agents
• Java Code elements
• Coded in SSJS (like an XAgent)
UKLUG 2012 – Cardiff, Wales
Creating the FO Source
•The code will take the XSLT stylesheet, apply it to the XML source and
produce the XSL:FO that is used by the rendering engine to produce the
PDF
XML
Source
XSLT
StyleSheet
FO Source
FO
Renderi
ng
Engine
Rendered Output
UKLUG 2012 – Cardiff, Wales
The Code
•The “XAgent” that calls the Java Code
UKLUG 2012 – Cardiff, Wales
The XPage that calls the XAgent
•In the onClick event of a button the XAgent
is “executed” to produce the PDF output
UKLUG 2012 – Cardiff, Wales
The Complete Process
•That finishes the design pattern
XML Source
XSLT
StyleSheet
FO Source
FO
Renderin
g Engine Rendered Output
UKLUG 2012 – Cardiff, Wales
Demo
UKLUG 2012 – Cardiff, Wales
Agenda
●What is APACHE ?
●Commons
●POI
●FOP
●Summary
UKLUG 2012 – Cardiff, Wales
Summary / Q and A
•Thank YOU !!!
•Thank THE SPONSORS !!!!
•Don’t forget to fill out those evals !!!
•This is how to get ahold of me
•Email: pcalhoun@nnsu.com
•Twitter: ptcalhoun

More Related Content

What's hot

Guglielmo iozzia - Google I/O extended dublin 2018
Guglielmo iozzia - Google  I/O extended dublin 2018Guglielmo iozzia - Google  I/O extended dublin 2018
Guglielmo iozzia - Google I/O extended dublin 2018Guglielmo Iozzia
 
AestasIT - Internal DSLs in Scala
AestasIT - Internal DSLs in ScalaAestasIT - Internal DSLs in Scala
AestasIT - Internal DSLs in ScalaDmitry Buzdin
 
Refactoring to Java 8 (Devoxx UK)
Refactoring to Java 8 (Devoxx UK)Refactoring to Java 8 (Devoxx UK)
Refactoring to Java 8 (Devoxx UK)Trisha Gee
 
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)Garth Gilmour
 
Project Jigsaw in JDK 9: Modularity Comes To Java
Project Jigsaw in JDK 9: Modularity Comes To JavaProject Jigsaw in JDK 9: Modularity Comes To Java
Project Jigsaw in JDK 9: Modularity Comes To JavaC4Media
 
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...
Flink Forward SF 2017: Tzu-Li (Gordon) Tai -  Joining the Scurry of Squirrels...Flink Forward SF 2017: Tzu-Li (Gordon) Tai -  Joining the Scurry of Squirrels...
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...Flink Forward
 
Deawsj 7 ppt-1_b
Deawsj 7 ppt-1_bDeawsj 7 ppt-1_b
Deawsj 7 ppt-1_bNiit Care
 
Briefly: Scala Implicits, Pimp My Library and Java Interop
Briefly: Scala Implicits, Pimp My Library and Java InteropBriefly: Scala Implicits, Pimp My Library and Java Interop
Briefly: Scala Implicits, Pimp My Library and Java Interopbwmcadams
 
What's new in java 9?
What's new in java 9?What's new in java 9?
What's new in java 9?Trayan Iliev
 
Rollin onj Rubyv3
Rollin onj Rubyv3Rollin onj Rubyv3
Rollin onj Rubyv3Oracle
 
Enterprise Software Architecture styles
Enterprise Software Architecture stylesEnterprise Software Architecture styles
Enterprise Software Architecture stylesAraf Karsh Hamid
 
Intro to Object Oriented Programming with Java
Intro to Object Oriented Programming with Java Intro to Object Oriented Programming with Java
Intro to Object Oriented Programming with Java Hitesh-Java
 
Corba and-java
Corba and-javaCorba and-java
Corba and-javaafreen58
 
Mongony aug10
Mongony aug10Mongony aug10
Mongony aug10bwmcadams
 
.NET Core, ASP.NET Core Course, Session 2
.NET Core, ASP.NET Core Course, Session 2.NET Core, ASP.NET Core Course, Session 2
.NET Core, ASP.NET Core Course, Session 2aminmesbahi
 
Web Development Environments: Choose the best or go with the rest
Web Development Environments:  Choose the best or go with the restWeb Development Environments:  Choose the best or go with the rest
Web Development Environments: Choose the best or go with the restgeorge.james
 
CORBA - Introduction and Details
CORBA - Introduction and DetailsCORBA - Introduction and Details
CORBA - Introduction and Detailsdgsdg2websd
 
Building a Pipeline for State-of-the-Art Natural Language Processing Using Hu...
Building a Pipeline for State-of-the-Art Natural Language Processing Using Hu...Building a Pipeline for State-of-the-Art Natural Language Processing Using Hu...
Building a Pipeline for State-of-the-Art Natural Language Processing Using Hu...Databricks
 
Spring integration with the Java DSL
Spring integration with the Java DSLSpring integration with the Java DSL
Spring integration with the Java DSLBen Wilcock
 
Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)
Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)
Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)jaxLondonConference
 

What's hot (20)

Guglielmo iozzia - Google I/O extended dublin 2018
Guglielmo iozzia - Google  I/O extended dublin 2018Guglielmo iozzia - Google  I/O extended dublin 2018
Guglielmo iozzia - Google I/O extended dublin 2018
 
AestasIT - Internal DSLs in Scala
AestasIT - Internal DSLs in ScalaAestasIT - Internal DSLs in Scala
AestasIT - Internal DSLs in Scala
 
Refactoring to Java 8 (Devoxx UK)
Refactoring to Java 8 (Devoxx UK)Refactoring to Java 8 (Devoxx UK)
Refactoring to Java 8 (Devoxx UK)
 
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
Simpler and Safer Java Types (via the Vavr and Lambda Libraries)
 
Project Jigsaw in JDK 9: Modularity Comes To Java
Project Jigsaw in JDK 9: Modularity Comes To JavaProject Jigsaw in JDK 9: Modularity Comes To Java
Project Jigsaw in JDK 9: Modularity Comes To Java
 
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...
Flink Forward SF 2017: Tzu-Li (Gordon) Tai -  Joining the Scurry of Squirrels...Flink Forward SF 2017: Tzu-Li (Gordon) Tai -  Joining the Scurry of Squirrels...
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...
 
Deawsj 7 ppt-1_b
Deawsj 7 ppt-1_bDeawsj 7 ppt-1_b
Deawsj 7 ppt-1_b
 
Briefly: Scala Implicits, Pimp My Library and Java Interop
Briefly: Scala Implicits, Pimp My Library and Java InteropBriefly: Scala Implicits, Pimp My Library and Java Interop
Briefly: Scala Implicits, Pimp My Library and Java Interop
 
What's new in java 9?
What's new in java 9?What's new in java 9?
What's new in java 9?
 
Rollin onj Rubyv3
Rollin onj Rubyv3Rollin onj Rubyv3
Rollin onj Rubyv3
 
Enterprise Software Architecture styles
Enterprise Software Architecture stylesEnterprise Software Architecture styles
Enterprise Software Architecture styles
 
Intro to Object Oriented Programming with Java
Intro to Object Oriented Programming with Java Intro to Object Oriented Programming with Java
Intro to Object Oriented Programming with Java
 
Corba and-java
Corba and-javaCorba and-java
Corba and-java
 
Mongony aug10
Mongony aug10Mongony aug10
Mongony aug10
 
.NET Core, ASP.NET Core Course, Session 2
.NET Core, ASP.NET Core Course, Session 2.NET Core, ASP.NET Core Course, Session 2
.NET Core, ASP.NET Core Course, Session 2
 
Web Development Environments: Choose the best or go with the rest
Web Development Environments:  Choose the best or go with the restWeb Development Environments:  Choose the best or go with the rest
Web Development Environments: Choose the best or go with the rest
 
CORBA - Introduction and Details
CORBA - Introduction and DetailsCORBA - Introduction and Details
CORBA - Introduction and Details
 
Building a Pipeline for State-of-the-Art Natural Language Processing Using Hu...
Building a Pipeline for State-of-the-Art Natural Language Processing Using Hu...Building a Pipeline for State-of-the-Art Natural Language Processing Using Hu...
Building a Pipeline for State-of-the-Art Natural Language Processing Using Hu...
 
Spring integration with the Java DSL
Spring integration with the Java DSLSpring integration with the Java DSL
Spring integration with the Java DSL
 
Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)
Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)
Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)
 

Similar to Apache POI: Generate Excel Spreadsheets from Domino Data

Introduction Java Web Framework and Web Server.
Introduction Java Web Framework and Web Server.Introduction Java Web Framework and Web Server.
Introduction Java Web Framework and Web Server.suranisaunak
 
Chapter 12:Understanding Server-Side Technologies
Chapter 12:Understanding Server-Side TechnologiesChapter 12:Understanding Server-Side Technologies
Chapter 12:Understanding Server-Side TechnologiesIt Academy
 
Current & Future Use-Cases of OpenDaylight
Current & Future Use-Cases of OpenDaylightCurrent & Future Use-Cases of OpenDaylight
Current & Future Use-Cases of OpenDaylightabhijit2511
 
Distributed & Highly Available server applications in Java and Scala
Distributed & Highly Available server applications in Java and ScalaDistributed & Highly Available server applications in Java and Scala
Distributed & Highly Available server applications in Java and ScalaMax Alexejev
 
Fundamentals of JAVA
Fundamentals of JAVAFundamentals of JAVA
Fundamentals of JAVAKUNAL GADHIA
 
1java Introduction
1java Introduction1java Introduction
1java IntroductionAdil Jafri
 
Unit 1 Core Java for Compter Science 3rd
Unit 1 Core Java for Compter Science 3rdUnit 1 Core Java for Compter Science 3rd
Unit 1 Core Java for Compter Science 3rdprat0ham
 
JAVA J2EE Training in Coimbatore - Fundamentals of Java J2EE
JAVA J2EE Training in Coimbatore - Fundamentals of Java J2EE JAVA J2EE Training in Coimbatore - Fundamentals of Java J2EE
JAVA J2EE Training in Coimbatore - Fundamentals of Java J2EE abile technologies
 
Experiences with Evangelizing Java Within the Database
Experiences with Evangelizing Java Within the DatabaseExperiences with Evangelizing Java Within the Database
Experiences with Evangelizing Java Within the DatabaseMarcelo Ochoa
 
Essential Java Libraries Every Developer Should Know About
Essential Java Libraries Every Developer Should Know AboutEssential Java Libraries Every Developer Should Know About
Essential Java Libraries Every Developer Should Know AboutInexture Solutions
 
Top 10 Libraries of Java.pptx
Top 10 Libraries of Java.pptxTop 10 Libraries of Java.pptx
Top 10 Libraries of Java.pptxSudhanshiBakre1
 
Technology Stack Discussion
Technology Stack DiscussionTechnology Stack Discussion
Technology Stack DiscussionZaiyang Li
 

Similar to Apache POI: Generate Excel Spreadsheets from Domino Data (20)

Introduction Java Web Framework and Web Server.
Introduction Java Web Framework and Web Server.Introduction Java Web Framework and Web Server.
Introduction Java Web Framework and Web Server.
 
Introduction to Spring & Spring BootFramework
Introduction to Spring  & Spring BootFrameworkIntroduction to Spring  & Spring BootFramework
Introduction to Spring & Spring BootFramework
 
Chapter 12:Understanding Server-Side Technologies
Chapter 12:Understanding Server-Side TechnologiesChapter 12:Understanding Server-Side Technologies
Chapter 12:Understanding Server-Side Technologies
 
Current & Future Use-Cases of OpenDaylight
Current & Future Use-Cases of OpenDaylightCurrent & Future Use-Cases of OpenDaylight
Current & Future Use-Cases of OpenDaylight
 
70487.pdf
70487.pdf70487.pdf
70487.pdf
 
Introduction to Java
Introduction to JavaIntroduction to Java
Introduction to Java
 
Analysis
AnalysisAnalysis
Analysis
 
Distributed & Highly Available server applications in Java and Scala
Distributed & Highly Available server applications in Java and ScalaDistributed & Highly Available server applications in Java and Scala
Distributed & Highly Available server applications in Java and Scala
 
JDK1.6
JDK1.6JDK1.6
JDK1.6
 
Jooq java object oriented querying
Jooq java object oriented queryingJooq java object oriented querying
Jooq java object oriented querying
 
Fundamentals of JAVA
Fundamentals of JAVAFundamentals of JAVA
Fundamentals of JAVA
 
.NET RDF APIs
.NET RDF APIs.NET RDF APIs
.NET RDF APIs
 
1java Introduction
1java Introduction1java Introduction
1java Introduction
 
Unit 1 Core Java for Compter Science 3rd
Unit 1 Core Java for Compter Science 3rdUnit 1 Core Java for Compter Science 3rd
Unit 1 Core Java for Compter Science 3rd
 
JAVA J2EE Training in Coimbatore - Fundamentals of Java J2EE
JAVA J2EE Training in Coimbatore - Fundamentals of Java J2EE JAVA J2EE Training in Coimbatore - Fundamentals of Java J2EE
JAVA J2EE Training in Coimbatore - Fundamentals of Java J2EE
 
Experiences with Evangelizing Java Within the Database
Experiences with Evangelizing Java Within the DatabaseExperiences with Evangelizing Java Within the Database
Experiences with Evangelizing Java Within the Database
 
Essential Java Libraries Every Developer Should Know About
Essential Java Libraries Every Developer Should Know AboutEssential Java Libraries Every Developer Should Know About
Essential Java Libraries Every Developer Should Know About
 
Top 10 Libraries of Java.pptx
Top 10 Libraries of Java.pptxTop 10 Libraries of Java.pptx
Top 10 Libraries of Java.pptx
 
Best node js course
Best node js courseBest node js course
Best node js course
 
Technology Stack Discussion
Technology Stack DiscussionTechnology Stack Discussion
Technology Stack Discussion
 

More from panagenda

Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
Why you need monitoring to keep your Microsoft 365 journey successful
Why you need monitoring to keep your Microsoft 365 journey successfulWhy you need monitoring to keep your Microsoft 365 journey successful
Why you need monitoring to keep your Microsoft 365 journey successfulpanagenda
 
Developer Special: How to Prepare Applications for Notes 64-bit Clients
Developer Special: How to Prepare Applications for Notes 64-bit ClientsDeveloper Special: How to Prepare Applications for Notes 64-bit Clients
Developer Special: How to Prepare Applications for Notes 64-bit Clientspanagenda
 
Everything You Need to Know About HCL Notes 14
Everything You Need to Know About HCL Notes 14Everything You Need to Know About HCL Notes 14
Everything You Need to Know About HCL Notes 14panagenda
 
Alles was Sie über HCL Notes 14 wissen müssen
Alles was Sie über HCL Notes 14 wissen müssenAlles was Sie über HCL Notes 14 wissen müssen
Alles was Sie über HCL Notes 14 wissen müssenpanagenda
 
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis ZWorkshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Zpanagenda
 
How to Perform HCL Notes 14 Upgrades Smoothly
How to Perform HCL Notes 14 Upgrades SmoothlyHow to Perform HCL Notes 14 Upgrades Smoothly
How to Perform HCL Notes 14 Upgrades Smoothlypanagenda
 
The Ultimate Administrator’s Guide to HCL Nomad Web
The Ultimate Administrator’s Guide to HCL Nomad WebThe Ultimate Administrator’s Guide to HCL Nomad Web
The Ultimate Administrator’s Guide to HCL Nomad Webpanagenda
 
Die ultimative Anleitung für HCL Nomad Web Administratoren
Die ultimative Anleitung für HCL Nomad Web AdministratorenDie ultimative Anleitung für HCL Nomad Web Administratoren
Die ultimative Anleitung für HCL Nomad Web Administratorenpanagenda
 
Bring the Modern and Seamless User Experience You Deserve to HCL Nomad
Bring the Modern and Seamless User Experience You Deserve to HCL NomadBring the Modern and Seamless User Experience You Deserve to HCL Nomad
Bring the Modern and Seamless User Experience You Deserve to HCL Nomadpanagenda
 
Wie man HCL Nomad eine moderne User Experience verschafft
Wie man HCL Nomad eine moderne User Experience verschafftWie man HCL Nomad eine moderne User Experience verschafft
Wie man HCL Nomad eine moderne User Experience verschafftpanagenda
 
Im Praxistest – Microsoft Teams Performance im hybriden Arbeitsalltag
Im Praxistest – Microsoft Teams Performance im hybriden ArbeitsalltagIm Praxistest – Microsoft Teams Performance im hybriden Arbeitsalltag
Im Praxistest – Microsoft Teams Performance im hybriden Arbeitsalltagpanagenda
 
Hybrid Environments and What They Mean for HCL Notes and Nomad
Hybrid Environments and What They Mean for HCL Notes and NomadHybrid Environments and What They Mean for HCL Notes and Nomad
Hybrid Environments and What They Mean for HCL Notes and Nomadpanagenda
 
Hybride Umgebungen und was sie für HCL Notes und Nomad bedeuten
Hybride Umgebungen und was sie für HCL Notes und Nomad bedeutenHybride Umgebungen und was sie für HCL Notes und Nomad bedeuten
Hybride Umgebungen und was sie für HCL Notes und Nomad bedeutenpanagenda
 
MVP vs. MCM: Microsoft Teams Troubleshooting
MVP vs. MCM: Microsoft Teams TroubleshootingMVP vs. MCM: Microsoft Teams Troubleshooting
MVP vs. MCM: Microsoft Teams Troubleshootingpanagenda
 
HCL Notes und Nomad Fehlerbehebung für Dummies
HCL Notes und Nomad Fehlerbehebung für DummiesHCL Notes und Nomad Fehlerbehebung für Dummies
HCL Notes und Nomad Fehlerbehebung für Dummiespanagenda
 
HCL Notes and Nomad Troubleshooting for Dummies
HCL Notes and Nomad Troubleshooting for DummiesHCL Notes and Nomad Troubleshooting for Dummies
HCL Notes and Nomad Troubleshooting for Dummiespanagenda
 
The CEO is Having MS Teams Call Quality Issues! Now What?
The CEO is Having MS Teams Call Quality Issues! Now What?The CEO is Having MS Teams Call Quality Issues! Now What?
The CEO is Having MS Teams Call Quality Issues! Now What?panagenda
 

More from panagenda (20)

Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
Why you need monitoring to keep your Microsoft 365 journey successful
Why you need monitoring to keep your Microsoft 365 journey successfulWhy you need monitoring to keep your Microsoft 365 journey successful
Why you need monitoring to keep your Microsoft 365 journey successful
 
Developer Special: How to Prepare Applications for Notes 64-bit Clients
Developer Special: How to Prepare Applications for Notes 64-bit ClientsDeveloper Special: How to Prepare Applications for Notes 64-bit Clients
Developer Special: How to Prepare Applications for Notes 64-bit Clients
 
Everything You Need to Know About HCL Notes 14
Everything You Need to Know About HCL Notes 14Everything You Need to Know About HCL Notes 14
Everything You Need to Know About HCL Notes 14
 
Alles was Sie über HCL Notes 14 wissen müssen
Alles was Sie über HCL Notes 14 wissen müssenAlles was Sie über HCL Notes 14 wissen müssen
Alles was Sie über HCL Notes 14 wissen müssen
 
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis ZWorkshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
 
How to Perform HCL Notes 14 Upgrades Smoothly
How to Perform HCL Notes 14 Upgrades SmoothlyHow to Perform HCL Notes 14 Upgrades Smoothly
How to Perform HCL Notes 14 Upgrades Smoothly
 
The Ultimate Administrator’s Guide to HCL Nomad Web
The Ultimate Administrator’s Guide to HCL Nomad WebThe Ultimate Administrator’s Guide to HCL Nomad Web
The Ultimate Administrator’s Guide to HCL Nomad Web
 
Die ultimative Anleitung für HCL Nomad Web Administratoren
Die ultimative Anleitung für HCL Nomad Web AdministratorenDie ultimative Anleitung für HCL Nomad Web Administratoren
Die ultimative Anleitung für HCL Nomad Web Administratoren
 
Bring the Modern and Seamless User Experience You Deserve to HCL Nomad
Bring the Modern and Seamless User Experience You Deserve to HCL NomadBring the Modern and Seamless User Experience You Deserve to HCL Nomad
Bring the Modern and Seamless User Experience You Deserve to HCL Nomad
 
Wie man HCL Nomad eine moderne User Experience verschafft
Wie man HCL Nomad eine moderne User Experience verschafftWie man HCL Nomad eine moderne User Experience verschafft
Wie man HCL Nomad eine moderne User Experience verschafft
 
Im Praxistest – Microsoft Teams Performance im hybriden Arbeitsalltag
Im Praxistest – Microsoft Teams Performance im hybriden ArbeitsalltagIm Praxistest – Microsoft Teams Performance im hybriden Arbeitsalltag
Im Praxistest – Microsoft Teams Performance im hybriden Arbeitsalltag
 
Hybrid Environments and What They Mean for HCL Notes and Nomad
Hybrid Environments and What They Mean for HCL Notes and NomadHybrid Environments and What They Mean for HCL Notes and Nomad
Hybrid Environments and What They Mean for HCL Notes and Nomad
 
Hybride Umgebungen und was sie für HCL Notes und Nomad bedeuten
Hybride Umgebungen und was sie für HCL Notes und Nomad bedeutenHybride Umgebungen und was sie für HCL Notes und Nomad bedeuten
Hybride Umgebungen und was sie für HCL Notes und Nomad bedeuten
 
MVP vs. MCM: Microsoft Teams Troubleshooting
MVP vs. MCM: Microsoft Teams TroubleshootingMVP vs. MCM: Microsoft Teams Troubleshooting
MVP vs. MCM: Microsoft Teams Troubleshooting
 
HCL Notes und Nomad Fehlerbehebung für Dummies
HCL Notes und Nomad Fehlerbehebung für DummiesHCL Notes und Nomad Fehlerbehebung für Dummies
HCL Notes und Nomad Fehlerbehebung für Dummies
 
HCL Notes and Nomad Troubleshooting for Dummies
HCL Notes and Nomad Troubleshooting for DummiesHCL Notes and Nomad Troubleshooting for Dummies
HCL Notes and Nomad Troubleshooting for Dummies
 
The CEO is Having MS Teams Call Quality Issues! Now What?
The CEO is Having MS Teams Call Quality Issues! Now What?The CEO is Having MS Teams Call Quality Issues! Now What?
The CEO is Having MS Teams Call Quality Issues! Now What?
 

Recently uploaded

Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Next-generation AAM aircraft unveiled by Supernal, S-A2
Next-generation AAM aircraft unveiled by Supernal, S-A2Next-generation AAM aircraft unveiled by Supernal, S-A2
Next-generation AAM aircraft unveiled by Supernal, S-A2Hyundai Motor Group
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxnull - The Open Security Community
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 

Recently uploaded (20)

Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Next-generation AAM aircraft unveiled by Supernal, S-A2
Next-generation AAM aircraft unveiled by Supernal, S-A2Next-generation AAM aircraft unveiled by Supernal, S-A2
Next-generation AAM aircraft unveiled by Supernal, S-A2
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 

Apache POI: Generate Excel Spreadsheets from Domino Data

  • 1. UKLUG 2012 – Cardiff, Wales September 2012 Presenter: Paul T. Calhoun Company: NetNotes Solutions ICON UK 2013 Apache Software: The FREE Java toolbox you didn't know you had !!
  • 2. UKLUG 2012 – Cardiff, Wales Obligatory Introduction Slide •Have used Notes/Domino since R2 •Certified in Administration and Development or every release: R3-R8.5 •Independent trainer/developer/mentor for the past 22 years running NetNotes Solutions Unlimited (www.nnsu.com) •Specializing in • Java • Web Services • XPages • J2EE (WebSphere) • Eclipse • Rational Developer • And….
  • 3. UKLUG 2012 – Cardiff, Wales Obligatory Introduction Slide •Raising Grand Kids
  • 4. UKLUG 2012 – Cardiff, Wales Agenda ●What is APACHE ? ●Commons ●POI ●FOP ●Summary
  • 5. UKLUG 2012 – Cardiff, Wales What is APACHE ? •The Apache Software Foundation (www.apache.org) is • An Open Source (Yes that means FREE) consortium of companies and developers • Donate time and resources to developing tools (primarily Java based) that simplify many tasks that developers are faced with everyday • It’s a lot like OpenNTF, but for Java developers
  • 6. UKLUG 2012 – Cardiff, Wales What is APACHE ? •IBM is a major contributor/supporter •If you develop using Java code (and you should be) than you owe it to yourself to spend some time reviewing the projects on this site •Some I use all the time • Xerces • Xalan • XML Graphics (FOP) • POI • Commons
  • 7. UKLUG 2012 – Cardiff, Wales Demo
  • 8. UKLUG 2012 – Cardiff, Wales Agenda ●What is APACHE ? ●Commons ●POI ●FOP ●Summary
  • 9. UKLUG 2012 – Cardiff, Wales Apache Commons •http://commons.apache.org •Focused on all aspects of reusable Java components
  • 10. UKLUG 2012 – Cardiff, Wales Commons Proper •Commons Proper • Goal of creating and maintaining reusable java Components •Individual downloadable components • Not one GIANT utility library • Just get what you need
  • 11. UKLUG 2012 – Cardiff, Wales Commons Proper Component Attributes Runtime API to metadata attributes such as doclet tags. BCEL Byte Code Engineering Library - analyze, create, and manipulate Java class files BeanUtils Easy-to-use wrappers around the Java reflection and introspection APIs. Betwixt Services for mapping JavaBeans to XML documents, and vice versa. BSF Bean Scripting Framework - interface to scripting languages, including JSR-223 Chain Chain of Responsibility pattern implemention. CLI Command Line arguments parser. Codec General encoding/decoding algorithms (for example phonetic, base64, URL). Collections Extends or augments the Java Collections Framework. Compress Defines an API for working with tar, zip and bzip2 files. Configuration Reading of configuration/preferences files in various formats. CSV Component for reading and writing comma separated value files. Daemon Alternative invocation mechanism for unix-daemon-like java code. DBCP Database connection pooling services. DbUtils JDBC helper library. Digester XML-to-Java-object mapping utility.
  • 12. UKLUG 2012 – Cardiff, Wales Commons Proper Component Discovery Tools for locating resources by mapping service/reference names to resource names. EL Interpreter for the Expression Language defined by the JSP 2.0 specification. Email Library for sending e-mail from Java. Exec API for dealing with external process execution and environment management in Java. FileUpload File upload capability for your servlets and web applications. Functor A functor is a function that can be manipulated as an object, or an object representing a single, generic function. Imaging (previously called Sanselan) A pure-Java image library. IO Collection of I/O utilities. JCI Java Compiler Interface JCS Java Caching System Jelly XML based scripting and processing engine. Jexl Expression language which extends the Expression Language of the JSTL. JXPath Utilities for manipulating Java Beans using the XPath syntax. Lang Provides extra functionality for classes in java.lang.
  • 13. UKLUG 2012 – Cardiff, Wales Commons Proper Component Launcher Cross platform Java application launcher. Logging Wrapper around a variety of logging API implementations. Math Lightweight, self-contained mathematics and statistics components. Modeler Mechanisms to create Model MBeans compatible with JMX specification. Net Collection of network utilities and protocol implementations. OGNL An Object-Graph Navigation Language Pool Generic object pooling component. Primitives Smaller, faster and easier to work with types supporting Java primitive types. Proxy Library for creating dynamic proxies. SCXML An implementation of the State Chart XML specification aimed at creating and maintaining a Java SCXML engine. It is capable of executing a state machine defined using a SCXML document, and abstracts out the environment interfaces. Transaction Implementations for multi level locks, transactional collections and transactional file access. Validator Framework to define validators and validation rules in an xml file. VFS Virtual File System component for treating files, FTP, SMB, ZIP and such like as a single logical file system.
  • 14. UKLUG 2012 – Cardiff, Wales Commons Lang •Provides a host of helper utilities for the java.lang API • String manipulation methods • Basic numerical methods • Object reflection • Additionally it contains basic enhancements to java.util.Date
  • 15. UKLUG 2012 – Cardiff, Wales Commons Lang - Versions •Latest Version is 3.3.1 • For Java 1.5 and higher • For Notes/Domino 8.x and 9.x •Version 2.6 is still available • For Java 1.2 and higher • For Notes Domino 7.x and below http://commons.apache.org/proper/commons-lang/download_lang.cgi
  • 16. UKLUG 2012 – Cardiff, Wales Commons Lang API Packages org.apache.commons.lang3 Provides highly reusable static utility methods, chiefly concerned with adding value to the java.lang classes. org.apache.commons.lang3.builder Assists in creating consistent equals(Object), toString(), hashCode(), and compareTo(Object) methods. org.apache.commons.lang3.concurrent Provides support classes for multi-threaded programming. org.apache.commons.lang3.event Provides some useful event-based utilities. org.apache.commons.lang3.exception Provides functionality for Exceptions. org.apache.commons.lang3.math Extends java.math for business mathematical classes. org.apache.commons.lang3.mutable Provides typed mutable wrappers to primitive values and Object. org.apache.commons.lang3.reflect Accumulates common high-level uses of the java.lang.reflect APIs. org.apache.commons.lang3.text Provides classes for handling and manipulating text, partly as an extension to java.text. org.apache.commons.lang3.text.translate An API for creating text translation routines from a set of smaller building blocks. org.apache.commons.lang3.time Provides classes and methods to work with dates and durations. org.apache.commons.lang3.tuple Tuple classes, starting with a Pair class in version 3.0.
  • 17. UKLUG 2012 – Cardiff, Wales org.apache.commons.lang3.StringUtils •IsEmpty/IsBlank - checks if a String contains text •Trim/Strip - removes leading and trailing whitespace •Equals - compares two strings null-safe •startsWith - check if a String starts with a prefix null-safe •endsWith - check if a String ends with a suffix null-safe •IndexOf/LastIndexOf/Contains - null-safe index-of checks •IndexOfAny/LastIndexOfAny/IndexOfAnyBut/LastIndexOfAnyBut - index- of any of a set of Strings
  • 18. UKLUG 2012 – Cardiff, Wales org.apache.commons.lang3.StringUtils •ContainsOnly/ContainsNone/ContainsAny - does String contains only/none/any of these characters •Substring/Left/Right/Mid - null-safe substring extractions •SubstringBefore/SubstringAfter/SubstringBetween - substring extraction relative to other strings •Split/Join - splits a String into an array of substrings and vice versa •Remove/Delete - removes part of a String •Replace/Overlay - Searches a String and replaces one String with another
  • 19. UKLUG 2012 – Cardiff, Wales org.apache.commons.lang3.StringUtils •Chomp/Chop - removes the last part of a String •LeftPad/RightPad/Center/Repeat - pads a String •UpperCase/LowerCase/SwapCase/Capitalize/Uncapitalize - changes the case of a String •CountMatches - counts the number of occurrences of one String in another
  • 20. UKLUG 2012 – Cardiff, Wales org.apache.commons.lang3.StringUtils •IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable - checks the characters in a String •DefaultString - protects against a null input String •Reverse/ReverseDelimited - reverses a String •Abbreviate - abbreviates a string using ellipsis •Difference - compares Strings and reports on their differences •LevenshteinDistance - the number of changes needed to change one String into another
  • 21. UKLUG 2012 – Cardiff, Wales Demo
  • 22. UKLUG 2012 – Cardiff, Wales Agenda ●What is APACHE ? ●Commons ●POI ●FOP ●Summary
  • 23. UKLUG 2012 – Cardiff, Wales So what is POI? •POI is a Java API for Microsoft Documents • Not just spreadsheets, but what it’s used most often for • Which is misleading because it contains libraries that specifically allow API access to file formats based upon • OOXML – Open Office XML Standards • OLE2 – Microsoft’s Compound Document Format • You do NOT have to have MS Office installed in order to use POI !!
  • 24. UKLUG 2012 – Cardiff, Wales So what is POI? •POI can “Read” and “Write” to MS and Open source versions of • Spreadsheets • Word Processing documents • Presentation (Powerpoint) • MS Publisher
  • 25. UKLUG 2012 – Cardiff, Wales So what is POI? •Useless Trivia • POI is an acronym for “Poor Obfuscation Implementation” in reference to reverse engineering the original MS Office document formats
  • 26. UKLUG 2012 – Cardiff, Wales Use Cases •There are three primary use cases for creating spreadsheets from Domino Data • Export all the documents in a view • Export selected documents from a view • Export documents that match a query (Ad Hoc Reporting)
  • 27. UKLUG 2012 – Cardiff, Wales Export All Documents From a View •This is the primary use case • Create an XPage that displays the View • This isn’t really required, but is nice for context purposes
  • 28. UKLUG 2012 – Cardiff, Wales Export All Documents From a View •Create a clickable component that will trigger running an XAgent that will output the data to the spreadsheet
  • 29. UKLUG 2012 – Cardiff, Wales The Button Code •Create a session scoped variable to hold the view name •Create an array of the fields that will be exported • This should generally match up to the columns in the view but the View is only used to aggregate the documents. Field values are read from the document collection
  • 30. UKLUG 2012 – Cardiff, Wales The Button Code •Call the “XAgent” that will stream the spreadsheet to the browser
  • 31. UKLUG 2012 – Cardiff, Wales The XAgent Code •An XAgent is an XPage that has had it’s “rendered” property turned off •All of the code is in either the “beforeRenderResponse” or “afterRenderResponse” event •We want to hi-jack the output stream so our code will go in the “beforeRenderResponse” event
  • 32. UKLUG 2012 – Cardiff, Wales The XAgent Code •In an Xagent, the code is responsible for producing all of the output •It uses the underlying JSF API’s to accomplish this task
  • 33. UKLUG 2012 – Cardiff, Wales The XAgent Code •This is required because we need the output stream of the page but CAN NOT use the one from the executing XPage (There can only be one!)
  • 34. UKLUG 2012 – Cardiff, Wales The XAgent Code •The XAgent code reads the session scope variables from the initiating XPage to process the view and field list
  • 35. UKLUG 2012 – Cardiff, Wales The XAgent Code •The Apache POI API is used to create a new spreadsheet file and workbook
  • 36. UKLUG 2012 – Cardiff, Wales The XAgent Code •The field list array is used to read the fields from the notes documents •Every document in the view is processed
  • 37. UKLUG 2012 – Cardiff, Wales The XAgent Code •For every field in the field list array we read the ITEMS from the Notes documents •We have have to account for field “type” as Java is a strongly “typed” language
  • 38. UKLUG 2012 – Cardiff, Wales The XAgent Code •We use the “create” and “set” CellValue methods to, you guessed it, create and set the cell values
  • 39. UKLUG 2012 – Cardiff, Wales Demo
  • 40. UKLUG 2012 – Cardiff, Wales Agenda ●What is APACHE ? ●Commons ●POI ●FOP ●Summary
  • 41. UKLUG 2012 – Cardiff, Wales So what is FOP? •FOP is a sub-project of the XML Graphics project at APACHE •FOP stands for Formatting Objects Processor • This is a print formatter driven by XSL FO (Formatted Objects)
  • 42. UKLUG 2012 – Cardiff, Wales So what is FOP? •An API that • Reads an FO Tree • Renders the resulting pages to a specified output • PDF (Primary) • PS • PCL • AFP • XML • Print • AWT • PNG
  • 43. UKLUG 2012 – Cardiff, Wales Um.. How about that again in English !! •It’s a java based toolset that lets YOU (the developer) create solutions that allow your End Users (the Bain of all existence) to create PDF documents from Notes content for FREE !!! •Yes FREE!!! • Ok, Free is relative. • You are going to have to invest some time, but I’m going to give you a working framework that you can implement out of the box. • For Free!!!
  • 44. UKLUG 2012 – Cardiff, Wales The Process •The great thing about FOP is it is a highly duplicable design pattern XML Source XSLT StyleSheet FO Source FO Renderi ng Engine Rendered Output
  • 45. UKLUG 2012 – Cardiff, Wales The Process •It all starts with an XML Document (can be from disk or in memory) XML Source XSLT StyleSheet FO Source FO Renderi ng Engine Rendered Output
  • 46. UKLUG 2012 – Cardiff, Wales The XML •The XML can be • A Static Document • The output from ?ReadViewEntries • Appended to the end of a Domino View URL • The output from generateXML • Method of the Notes Document class • The results of running an XAgent • The results of running an Agent • The results of running a Web Service
  • 47. UKLUG 2012 – Cardiff, Wales The XML •The source of the XML is not as important as the FORMAT and CONSISTANCY of the XML • The XML must be well formed and optionally valid • Make sure that if you do not control the source that you have an SLA with the source provider that includes them providing the XML Schema AND changes to the XML Schema in enough advance that you have time to test it.
  • 48. UKLUG 2012 – Cardiff, Wales The XML •Using the ?ReadViewEntries option is HIGHLY duplicable • Once you have the stylesheet (and I’m providing that to you) that transforms the source XML to the FO XML then ANY view source can be passed to the code to produce a PDF of the view
  • 49. UKLUG 2012 – Cardiff, Wales The XML •The other options require an XSLT stylesheet that is specific to transforming the specified XML to FO XML. • This is not as flexible, but once the base stylesheet is created it can be stored in a notes document that is editable by a non- developer • This option allows changes to colors, fonts etc without developer intervention and re-compiling/re-deploying the code
  • 50. UKLUG 2012 – Cardiff, Wales The Stylesheet •The stylesheet that is used is an XSLT document (written in XML) that uses the FOP tags from the tag library XML Source XSLT StyleSheet FO Source FO Render ing Engine Rendered Output
  • 51. UKLUG 2012 – Cardiff, Wales The XSL FO Stylesheet •This is by far the most challenging part of this solution •Stylesheet creators must be able to create and edit XSLT stylesheets (Doh!) •The Tags used in the style sheet are not documented at the FOP site • The good news is they ARE documented at the w3 schools site • http://www.w3schools.com/xslfo/default.asp • The other good news is they are documented in the form of a tutorial !! • You can follow the tutorial to examine how to create a base XSL FO style sheet • You can also copy/paste this example code directly to your XSL FO style sheet to get started !!
  • 52. UKLUG 2012 – Cardiff, Wales Using Eclipse or an XSLT editor is the best choice •Download the version that has the Web Tools Plugin (WTP) •I usually download the one that supports J2EE development •The benefit of this option is there is an XSLT editor included not just an XML editor •Also you can train “power-users” to use eclipse to build, edit, maintain XSLT stylesheets for the purpose of maintaining their own output without the need for them to have designer • This might sound difficult, but it is significantly easier to train both developers and power users on XSLT than it is Java !!
  • 53. UKLUG 2012 – Cardiff, Wales The XSLT •The Stylesheet is made up of a combination of XSLT and XSL:FO tags
  • 54. UKLUG 2012 – Cardiff, Wales Structure of the FO Tags •The XSL:FO tags are all about the layout of the “printed” page •XSL:FO tags always start with “root” • Followed by a “layout master” • Followed by a “page master” • The a series of page sequences that contain • Flows • Blocks
  • 55. UKLUG 2012 – Cardiff, Wales Structure of the FO Tags
  • 56. UKLUG 2012 – Cardiff, Wales The Layout and Page Master •These tags define the output page • Height • Width • Margins • etc
  • 57. UKLUG 2012 – Cardiff, Wales The Page Sequence tag •References the page master set tag to get its output constraints
  • 58. UKLUG 2012 – Cardiff, Wales The Page Content •The Page content is the output using a series of “flows” and “blocks” •A “flow” contains a series of “blocks” •A “block” is roughly equivalent to a paragraph on the page
  • 59. UKLUG 2012 – Cardiff, Wales The Page Content •Blocks can contain other constraining tags like the “table” tag
  • 60. UKLUG 2012 – Cardiff, Wales Where are the stylesheets Stored •After the stylesheet is created there are two options • Save the stylesheet as a design resource (A stylesheet) • Save the stylesheet in a document that is accessible from the notes client • This allows editing/maintainence of the stylesheets without the need of a designer client
  • 61. UKLUG 2012 – Cardiff, Wales Storing Stylesheets in Designer •The XSLT Sheets can be stored in DDE in the Style Sheets folder contained in the resources folder
  • 62. UKLUG 2012 – Cardiff, Wales Alternately Store in documents •You can create a • Form • View •to store Notes documents that contain the XSLT stylesheets •Your code will “lookup” the stylesheet when applying it to the XML source
  • 63. UKLUG 2012 – Cardiff, Wales The Code •Now that you have the XML Source and the XSLT stylesheet you are ready to write some code !!! (Yea !!) •The APACHE FOP is a JAVA Library • Yes this means you have to code the solution using Java !!
  • 64. UKLUG 2012 – Cardiff, Wales The Code •Can be coded as • Java Agents • Java Code elements • Coded in SSJS (like an XAgent)
  • 65. UKLUG 2012 – Cardiff, Wales Creating the FO Source •The code will take the XSLT stylesheet, apply it to the XML source and produce the XSL:FO that is used by the rendering engine to produce the PDF XML Source XSLT StyleSheet FO Source FO Renderi ng Engine Rendered Output
  • 66. UKLUG 2012 – Cardiff, Wales The Code •The “XAgent” that calls the Java Code
  • 67. UKLUG 2012 – Cardiff, Wales The XPage that calls the XAgent •In the onClick event of a button the XAgent is “executed” to produce the PDF output
  • 68. UKLUG 2012 – Cardiff, Wales The Complete Process •That finishes the design pattern XML Source XSLT StyleSheet FO Source FO Renderin g Engine Rendered Output
  • 69. UKLUG 2012 – Cardiff, Wales Demo
  • 70. UKLUG 2012 – Cardiff, Wales Agenda ●What is APACHE ? ●Commons ●POI ●FOP ●Summary
  • 71. UKLUG 2012 – Cardiff, Wales Summary / Q and A •Thank YOU !!! •Thank THE SPONSORS !!!! •Don’t forget to fill out those evals !!! •This is how to get ahold of me •Email: pcalhoun@nnsu.com •Twitter: ptcalhoun