/** * */ package org.openntf.domino.xsp.helpers; import java.util.Map; import org.openntf.domino.helpers.DocumentScanner; import org.openntf.domino.helpers.DocumentSyncHelper; /** * @author nfreeman Samples from OpenNTF Webinar 2013 */ public class WebinarSamples { public WebinarSamples() { } // ******* BEGIN AUTO-LOGGING, GARBAGE COLLECTION AND ITERATOR SAMPLES public void processViewOld(final lotus.domino.View view) { lotus.domino.ViewEntryCollection collection = null; lotus.domino.ViewEntry currentEntry = null; lotus.domino.ViewEntry nextEntry = null; try { view.setAutoUpdate(false); // Don't be updating the collection underneath us! collection = view.getAllEntries(); currentEntry = collection.getFirstEntry(); while (currentEntry != null) { nextEntry = collection.getNextEntry(currentEntry); try { // We have to do an inner try/catch because we may want to keep walking the view currentEntry.getNoteID(); // Do whatever it is you actually want to get done } catch (lotus.domino.NotesException ne1) { ne1.printStackTrace(); // Is this even what you want to do with your exception? Probably not. } finally { currentEntry.recycle(); } currentEntry = nextEntry; // Note: if these entries happen to point to the same document, bad things will happen. } } catch (lotus.domino.NotesException ne) { ne.printStackTrace(); } finally { // Do our recycling in a finally block so it can't be skipped if (collection != null) { // If for any reason you didn't get a collection, you'd throw an NPE try { collection.recycle(); } catch (lotus.domino.NotesException ne) { // What would you even do with an exception from a .recycle attempt? Unrecycle it? } } } } public void processViewNew(final org.openntf.domino.View view) { for (org.openntf.domino.ViewEntry entry : view.getAllEntries()) { entry.getNoteID(); // Do whatever it is you actually want to get done } } // ******* END AUTO-LOGGING, GARBAGE COLLECTION AND ITERATOR SAMPLES // ******* BEGIN AUTO-BOXING SAMPLES public org.openntf.domino.DocumentCollection getTermCollectionNew(final org.openntf.domino.Database db, final String searchTerm) { org.openntf.domino.DocumentCollection result = db.createDocumentCollection(); for (org.openntf.domino.Document doc : db.getAllDocuments()) { for (org.openntf.domino.Item item : doc.getItems()) { if (item.getValues().contains(searchTerm)) { result.add(doc); break; } } } return result; } public lotus.domino.DocumentCollection getTermCollection(final lotus.domino.Database db, final String searchTerm) { lotus.domino.DocumentCollection allDocs = null; lotus.domino.Document curDoc = null; lotus.domino.Document nextDoc = null; lotus.domino.DocumentCollection result = null; try { result = db.createDocumentCollection(); allDocs = db.getAllDocuments(); curDoc = allDocs.getFirstDocument(); while (curDoc != null) { nextDoc = allDocs.getNextDocument(curDoc); if (hasTerm(curDoc, searchTerm)) { result.addDocument(curDoc); } curDoc.recycle(); curDoc = nextDoc; } } catch (lotus.domino.NotesException ne) { ne.printStackTrace(); } finally { if (curDoc != null) { try { curDoc.recycle(); } catch (lotus.domino.NotesException ne) { // do what, then? } } if (nextDoc != null) { try { nextDoc.recycle(); } catch (lotus.domino.NotesException ne) { // do what, then? } } if (allDocs != null) { try { allDocs.recycle(); } catch (lotus.domino.NotesException ne) { // do what, then? } } } return result; } public boolean hasTerm(final lotus.domino.Document doc, final String searchTerm) { boolean result = false; try { java.util.Vector<?> items = doc.getItems(); for (Object o : items) { lotus.domino.Item item = (lotus.domino.Item) o; try { java.util.Vector<?> values = item.getValues(); for (Object vo : values) { if (vo != null && vo instanceof String) { if (((String) vo).equalsIgnoreCase(searchTerm)) { item.recycle(); // don't forget to recycle if we're going to break the loop and return early! return true; // now we can return safely } } } } catch (lotus.domino.NotesException ne1) { // yes, this can happen. There's no guarantee that the Java API can read the contents of every item successfully. } item.recycle(); // we're good green citizens! } } catch (lotus.domino.NotesException ne) { ne.printStackTrace(); } return result; } public boolean hasTerm2(final lotus.domino.Document doc, final String searchTerm) { boolean result = false; try { java.util.Vector<?> items = doc.getItems(); for (Object o : items) { lotus.domino.Item item = (lotus.domino.Item) o; try { java.util.Vector<?> values = item.getValues(); for (Object vo : values) { if (vo != null && vo instanceof String) { if (((String) vo).equalsIgnoreCase(searchTerm)) { item.recycle(); // don't forget to recycle if we're going to break the loop and return early! // Wait... we didn't recycle all the other items in the Vector! // ah! What we really need to do is... doc.recycle(items); // oh wait... the values too! (See below) doc.recycle(values); return true; // now we can return safely } } } // but what if our Vector has DateTime or DateRange objects? We need... item.recycle(values); } catch (lotus.domino.NotesException ne1) { // yes, this can happen. There's no guarantee that the Java API can read the contents of every item successfully. } item.recycle(); // we're good green citizens! } } catch (lotus.domino.NotesException ne) { ne.printStackTrace(); } return result; } public java.util.Date getProcessedDateOld(final lotus.domino.Document doc) { java.util.Date result = null; try { if (doc.hasItem("processDate")) { java.util.Vector<?> vector = doc.getItemValue("processDate"); if (vector != null && !vector.isEmpty()) { Object o = vector.get(0); if (o != null) { if (o instanceof lotus.domino.DateTime) { lotus.domino.DateTime datetime = (lotus.domino.DateTime) o; try { result = datetime.toJavaDate(); } catch (lotus.domino.NotesException ne1) { ne1.printStackTrace(); } finally { datetime.recycle(); // You still have to recycle even if the conversion to java date failed! } } else { // Deal with having gotten something besides a Date, like a DateRange or a Number or a String } } else { // Deal with the vector having null entries } } else { // Deal with having gotten an empty vector (yes, it's possible) } } else { // Deal with the absence of a processDate field doc.getItemValue("processDate"); // This will return a Vector with a String of "" if the item isn't present. } } catch (lotus.domino.NotesException ne) { ne.printStackTrace(); // Again, probably not what you actually want to do } return result; } public java.util.Date getProcessedDateNew(final org.openntf.domino.Document doc) { return doc.getItemValue("processDate", java.util.Date.class); } public void setProcessedDateOld(final lotus.domino.Document doc, final java.util.Date date) { lotus.domino.Database db = null; lotus.domino.Session session = null; try { db = doc.getParentDatabase(); session = db.getParent(); lotus.domino.DateTime datetime = session.createDateTime(date); try { doc.replaceItemValue("processDate", datetime); } catch (lotus.domino.NotesException ne1) { ne1.printStackTrace(); // Once again, not what you actually want to do here. } finally { datetime.recycle(); } } catch (lotus.domino.NotesException ne) { ne.printStackTrace(); } finally { // Apply our standard finally block recycling here if (db != null) { try { db.recycle(); // Uh oh... } catch (lotus.domino.NotesException ne) { ne.printStackTrace(); } } if (session != null) { try { session.recycle(); // No, wait! I need that to live! } catch (lotus.domino.NotesException ne) { ne.printStackTrace(); } } // Recycling the PARENTS of the argument is super-bad! We shouldn't be using our standard pattern here! // Welcome to Dante's ninth circle } } public void setProcessedDateNew(final org.openntf.domino.Document doc, final java.util.Date date) { doc.replaceItemValue("processDate", date); // stores a single date/time value } public void setProcessedDateListNew(final org.openntf.domino.Document doc, final java.util.List<java.util.Date> dates) { doc.replaceItemValue("processDate", dates); // stores a set of date/time values } public void setProcessedDateMapNew(final org.openntf.domino.Document doc, final java.util.Map<String, java.util.Date> dateMap) { doc.replaceItemValue("processDate", dateMap); // serializes dateMap, compresses the byte stream and stores it as MIME doc.getItemValue("processedDate", Map.class); } // ******* END AUTO-BOXING SAMPLES // ******* BEGIN HELPER SAMPLES public void doMapStuff(final org.openntf.domino.Document doc) { doc.get("foo"); doc.put("foo", "bar"); // puts "bar" in item "foo" doc.clear(); // removes every item from doc (not recommended) doc.size(); // returns the number of items doc.get("@Adjust(@Modified; 1; 0; 0; 0; 0; 0)"); } public Map<?, ?> scanDatabase(final org.openntf.domino.Database db) { // DocumentScanner looks at values of all string-based items in a document DocumentScanner scanner = new DocumentScanner(); for (org.openntf.domino.Document doc : db.getAllDocuments()) { scanner.processDocument(doc); } // The FieldTokenMap returns a Map with a key of the item name, and a sorted set of the unique strings in each of those items // Sample uses: Predictive typeahead, custom indexing, external term matching return scanner.getFieldTokenMap(); } public void syncDatabases(final org.openntf.domino.Database sourceDb, final org.openntf.domino.Database targetDb) { java.util.Map<Object, String> syncMap = new java.util.HashMap<Object, String>(); syncMap.put("Name", "CompanyName"); syncMap.put("Address", "CompanyAddress"); syncMap.put("City", "CompanyCity"); syncMap.put("State", "CompanyState"); syncMap.put("ZIP", "CompanyZIP"); syncMap.put("@Now", "LastSync"); DocumentSyncHelper helper = new DocumentSyncHelper(DocumentSyncHelper.Strategy.CREATE_AND_REPLACE, syncMap); helper.setTargetServer(targetDb.getServer()); helper.setTargetFilepath(targetDb.getFilePath()); helper.setTargetLookupView("byCompanyID"); helper.setTargetDatabase(targetDb, "byCompanyID"); helper.setSourceKeyFormula("CompID"); java.util.Date sinceDate = new java.util.Date(0); org.openntf.domino.DateTime dt = sourceDb.getAncestorSession().createDateTime(sinceDate); org.openntf.domino.DocumentCollection sourceCollection = sourceDb.getModifiedDocuments(dt); helper.process(sourceCollection); helper.setTransactionRule(DocumentSyncHelper.TransactionRule.COMMIT_EVERY_SOURCE); helper.processSince(sourceDb, sinceDate); } // ******* END HELPER SAMPLES }