Quick Tip: Wrapping a lotus.domino.Document in a DominoDocument
Mar 3, 2015, 3:13 PM
In the XPages environment, there are two kinds of documents: the standard Document
class you get from normal Domino API operations and DominoDocument
(styled NotesXspDocument
in SSJS). Many times, these can be treated roughly equivalently: DominoDocument
has some (but not all) of the same methods that you're used to from Document
, such as getItemValueString
and replaceItemValue
, and you can always get the inner Document
object with getDocument(boolean applyChanges)
.
What's less common, though, is going the other direction: taking a Document
object from some source (say, database.getDocumentByUNID
) and wrapping it in a DominoDocument
. This can be very useful, though, as the API on the latter is generally nicer, containing improved support for dealing with attachments, rich text and MIME, and even little-used stuff like getting JSON from an item directly. Take a gander at the API: com.ibm.xsp.model.domino.wrapped.DominoDocument
.
It's non-obvious, though, how to make use of it from the Java side. For that, there are a couple wrap
static methods at the bottom of the list. The methods are overflowing with parameters, but they align with many of the attributes used when specifying an <xp:dominoDocument/>
data source and are mostly fine to leave as blanks. So if you have a given Document
, you can wrap it like so:
Document notesDoc = database.getDocumentByUNID(someUNID); DominoDocument domDoc = DominoDocument.wrap( database.getFilePath(), // databaseName notesDoc, // Document null, // computeWithForm null, // concurrencyMode false, // allowDeletedDocs null, // saveLinksAs null // webQuerySaveAgent );
Once you do that, you can make use of the improved API. You can also serialize these objects, though I believe you have to call restoreWrappedDocument
on it after deserialization to use it again. I do this relatively frequently when I'm in a non-ODA project and want some nicer methods and better data-type support.