Java shell for Notes/Domino programming

Here is an example program I wrote, about Java code that interfaces to Notes/Domino. The main code body is below.

Full source code at:

http://www.chc-3.com/downloads/NotesJavaShell.zip

Other samples on my downloads page at:

http://www.chc-3.com/downloads.php

Chuck Connell

++++++++++++++++++++

/*

  • Chuck Connell, www.chc-3.com, June 2010.

  • Example of general shell for Java programming for IBM/Lotus Notes and Domino.

  • The core idea is from Bob Balaban(www.bobzblog.com, bbalaban@gmail.com).

  • I added the configuration database, logging, and more comments.

*/

import lotus.domino.*;

public class NotesJavaShell extends AgentBase{

// Public fields.



// Local vars

private Session session;

private Database database;  



// Constructors



public NotesJavaShell(){    // default constructor, without run context

	}

public NotesJavaShell(Session s, Database d) { // when we know the run context

	this.session = s; 

	this.database = d;

	}



// Start here when run from Eclipse.

public static void main(String[] args) {    



	Session sess=null; 

	Database db=null;

	NotesJavaShell ag;

	

	// Initialize Notes

	NotesThread.sinitThread(); 

	

	try {

		sess = NotesFactory.createSession();  // start a Notes session

		db = sess.getDatabase("", Constants.DEFAULT_HOME_DB);  // simulate home database for agent

		ag = new NotesJavaShell(sess, db);  // simulate agent object with session and database

		ag.NotesMain();   // call main routine of agent

		}

	catch(NotesException ne) {

		System.out.println(ne.id + " " + ne.text);

		}

	catch (Exception e)	{

		e.printStackTrace();

		}

	finally {

		try { 

			if (db != null) db.recycle(); 

			if (sess != null) sess.recycle(); 

			}

		catch (Exception x) {}

		NotesThread.stermThread();

		}			



} // end main





// This routine is called however the code is run: from Eclipse or agent launch within Notes/Domino.

public void NotesMain()

{

	Log notesLog=null;

	Session sess=null;

	Database db=null;

	AgentContext ac=null;

	Utilities util;

	int logLevel;

	

	try {

		if (this.session != null)  	// Already have an agent context.  

			{

			sess = this.session;

			db = this.database;

			}

		else {  // Need to get agent context.  

			sess = this.getSession();

			if (sess==null) throw new NotesException(NotesError.NOTES_ERR_ERROR, "Could not get current session at start of agent.");

			ac = sess.getAgentContext();

			if (ac==null) throw new NotesException(NotesError.NOTES_ERR_ERROR, "Could not get agent context at start of agent.");

			db = ac.getCurrentDatabase();

			if (db==null) throw new NotesException(NotesError.NOTES_ERR_ERROR, "Could not get current database at start of agent.");

			}

		}

	catch(NotesException ne) {

		System.out.println(ne.id + " " + ne.text);

		return;

		}

	catch (Exception e)	{

		e.printStackTrace();

		return;

		}

	finally {};

	

	// The truly common code, however we are invoked.

	try {



		// Get utilities.

		util = new Utilities();		

		

		// Record the session so other objects can use it.

		util.setSession(sess);

		

		// Find all the runtime parameters.

		util.readParameters();



		// Start a Notes log.

		notesLog = util.getNotesLog();

		logLevel = util.getLogLevel();

		if (Constants.CONSOLE_OUTPUT) System.out.println("Agent started. " + Constants.BUILD_STAMP);

		if (logLevel >= Constants.LOG_LEVEL_BRIEF) notesLog.logAction ("Agent started. " + Constants.BUILD_STAMP);	



		// ******* Do the real work here ********



		System.out.println (db.getTitle());  // print title of home database, to prove we got the agent context correctly



		// ******* Do the real work here ********



		// All done with no errors.

		if (logLevel >= Constants.LOG_LEVEL_BRIEF) notesLog.logAction ("Agent done with no errors.");

		if (Constants.CONSOLE_OUTPUT) System.out.println("Agent done with no errors.");

		} // try





	// Catch Notes exceptions from main code.

	catch(NotesException ne) {

		if (Constants.CONSOLE_OUTPUT) System.out.println("Notes error code " + ne.id + ". " + ne.text);

		try {

			notesLog.logError (ne.id, ne.text);  // Notes log may not be valid, but give it a try

			}

		catch (Exception x) {}

		}



	// Catch non-Notes exceptions from main code.

	catch (Exception x)	{

		if (Constants.CONSOLE_OUTPUT) System.out.println("Error: " + x.getMessage());

		if (Constants.CONSOLE_OUTPUT) 	x.printStackTrace();

		try {

			notesLog.logError (NotesError.NOTES_ERR_ERROR, x.getMessage());  // Notes log may not be valid, but give it a try

			}

		catch (Exception x2) {}

		}



	// Do cleanup from main code block.

	finally { 

		try {

			if (notesLog!=null) notesLog.close(); 

			if (notesLog!=null) notesLog.recycle(); 

			// cannot recycle the AgentContext, Session or Database, since they may have been passed in by Notes.

			}

		catch (Exception x){}

		} // finally

	

} // NotesMain

} // main class