Developing plugins for IBM Notes on Mac

I’ve been developing plugins for IBM Notes on Mac for years now but never really got around to sharing the steps on the blog. The below steps – in very crude form – works with Java 8 on Mac OS El Capitan (v. 10.11) using IBM Notes 9.0.1. The below sections are additions to the regular steps on creating a target platform documented otherwise on this blog

Main-tab

Run a product: com.ibm.notes.branding.notes

Execution Envionment: JavaSE-1.6

Arguments-tab

Program arguments:

-personality com.ibm.rcp.platform.personality
-debug
-console
-ws cocoa

VM Arguments:

-Declipse.registry.nulltoken=true
-Djava.util.logging.config.class=com.ibm.rcp.core.internal.logger.boot.LoggerConfig
-Dcom.ibm.pvc.webcontainer.port=8080
-Declipse.pluginCustomization="/Applications/IBM Notes.app/Contents/MacOS/rcp/plugin_customization.ini"
-Djava.protocol.handler.pkgs=com.ibm.net.ssl.www.protocol
-Dosgi.hook.configurators.exclude=org.eclipse.core.runtime.internal.adaptor.EclipseLogHook
-Dosgi.framework.extensions=com.ibm.rcp.core.logger.frameworkhook
-Xbootclasspath/a:"/Applications/IBM Notes.app/Contents/MacOS/rcp/eclipse/plugins/com.ibm.rcp.base_${rcp.base_version}/rcpbootcp.jar"
-XstartOnFirstThread

Environment-tab

  • DYLD_LIBRARY_PATH=/Applications/IBM Notes.app/Contents/MacOS
  • NOTESBIN=/Applications/IBM Notes.app/Contents/MacOS

Bob Balfe: plugin_customization.ini and Eclipse preferences

Bob has, once again, written a very nice post on his blog. This time it’s on plugin preferences and how the plugin_customization.ini file fits in and where Eclipse preferences are stored. As this is common cause of concern and questions from plugin developers and admins I wanted to point to the post.

Bob Balfe: plugin_customization.ini and Eclipse preferences

I’m on The Taking Notes Podcast episode 122

On Friday Bruce and Julian let me on The Taking Notes podcast to talk about plug-in development and how to get started with plug-in development. We also talked a bit about the RedWiki we’re writing. I think it’s a pretty decent discussion about the topic and I hope it’s a pleasant listen.

“Let’s talk Eclipse plugins! It’s not just an Eclipse thing, plugins can be used to extend the functionality of your Lotus Notes client.

Mikkel Heisterberg has been instrumental in helping developers wade through the murky waters of Lotus Notes sidebar app and plugin development for several years, through Lotusphere and user group presentations, blog articles, and onsite training. Bruce and Julian talked to him about how this plugin technology can be used and what’s going to be in the new IBM Redbook he’s been working on.”

The podcast may be found in iTunes or directly using the following link: Taking Notes Episode 122: 2010.09.24 – Sidebar, Plugins, and Notes Client Extensions with Mikkel Heisterberg

Option to install a widget from a .zip file, file structure, and focus on provisioning

Disclaimer: The following is from the release notes of Notes 8.5.2 so I don’t take credit for writing this. Lotus Notes 8.5.2 is in beta and there are no guarantees that the features described here will be in the final product that IBM ships.

Notes users can now install a widget that is supplied to them as a .zip file. Users can either drag and drop the .zip file into their My Widgets sidebar panel or use the Import menu option from the My Widgets sidebar panel.

This option is available for all supported widget types and enables the user to install a widget while working online or offline. The widget definition xml-file must be at the root of the zip file and the widget definition file name must be extension.xml. To make provisioning widgets self-contained in the .zip file, the updateSite URL in the widget definition must be set to jar:${zip.root}!/ and the updateSite itself must also reside in the .zip file.

The structure of the .zip file must be as follows:

features (DIR)
plugins (DIR)
extension.xml
site.xml

When a provisioning widget’s .xml definition is processed, the updateSite URL is replaced with a URL to the embedded updateSite in the .zip file. Automatic update is not supported.

Send/SMS… Sametime plugin

Using a couple of developerWorks articles (Extending the Lotus Sametime client with an LDAP directory lookup plug-in and Extending IBM Lotus Sametime Connect V7.5 with an SMS messaging plug-in) for inspiration I wrote a SMS plugin for the embedded Lotus Sametime client in Lotus Notes. The action goes in the Send menu when right-clicking a contact.

The plugin picks up the cellphone number from Domino Directory, supports sending to multiple contacts in one go and uses our exiting SMS gateway for sending the SMS’es (via e-mail). The hardest part was finding the menu path to use to stick the action where I wanted it. For others you should use com.ibm.collaboration.realtime.imhub.send/slotX where slotX is either slot1, slot2 or slot3 depending on where in the Send menu you want the action.

Once I’ve made it configurable which server to use for Domino Directory and how the SMS should be sent (which domain) I’ll probably make it publicly available.

Further reading

BAT-files (yup – you heard right!) to sign an entire update site

Digitally signing an Eclipse update after the fact (i.e. it’s not part of the build) can be tedious and time consuming. To make the process easier I wrote two small BAT-files that does the recursive signing of all plugin and feature JAR-files for you. Just stick the two BAT-files (signall.bat and dosign.bat) in the root Eclipse update site directory (together with site.xml) and invoke signall.bat.

Syntax
signall.bat <keystore path> <keystore password> <certificate alias from keystore>

Example
signall.bat mykeystore changeit signer_key

signall.bat

@echo off
set jdkhome=%JAVA_HOME%
for /f %%a IN ('dir /b /s *.jar') do call dosign.bat %1 %2 %3 %%a
set jdkhome=

dosign.bat

@echo off
echo Signing: %4
%jdkhome%binjarsigner.exe -keystore %1 -storepass %2 %4 %3

Java class line numbers for plugin developers

If you’ve been tasked with developing and/or debugging Java extensions for the Notes 8 client you know that line numbers has been missing from the stacktraces produced by Notes. This can be a real problem when trying to debug stuff in a production client. There has been some discussion among the ones of us developing these extensions on how to enable these line numbers. The other day this information was provided by Srinivas Rao of IBM and I wanted to publish it here for all to read.

Line numbers are removed from the classes added to the shared class cache to reduce the memory needed for the memory mapped classes. To re-enable the line numbers, one needs to edit the <notes>frameworkrcpdeployjvm.properties file and add comment out the ignorelinenumbers vm argument. However, if the classes have already been added to the JVM shared class cache, then they will have been added without line numbers. Either comment out the shared class cache (which will dramatically affect performance at startup) for temporary work, or shutdown notes and remove the shared class cache so that it can be repopulated with classes with line numbers. Of course, this will also affect the startup performance, but not so much as not having a cache

These are two of the key lines … to comment them out, add a # to the front of the line

vmarg.Xnolinenumbers=-Xnolinenumbers
vmarg.Dshare=-Xshareclasses:name=xpdplat_.jvm, **line cont**
   controlDir=${prop.jvm.shareclasses.loc}, **line cont**
   groupAccess,keep,singleJVM,nonfatal
jvm.shareclasses.loc=${rcp.data}/.config/org.eclipse.osgi

The shared class cache is typically located in the data/workspace/.config/org.eclipse.osgi

IBM Developer Kit-In-A-Box – Composite Application

I want to bring your attention to a blog entry by Bob Balfe called Labs for “Eclipse, extensions, composites and XPages!” are now available! The site he points to is really cool and has some very nice hands-on exercises on how to do composite applications incl. XPage components and Eclipse components. If you’re new to Composite Applications or want to brush up this is for you.

How to get started with plugin development

I get a lot of questions (via e-mail and IM) on how to get started with plugin development for the Lotus Notes platform. Instead of answering them all individually I thought I would (finally) write a general purpose blog post to try and answer these questions in general terms.

First of I’m sorry to say that the current state of affairs for someone who want to get started doing plugin development for the Lotus Notes platform is grim. There is as you might have experienced very little material available for programmers new to the Eclipse world to build stuff for Lotus Notes 8+ clients. To make things worse the material that is available often cut corners or simply start out too advanced. That being said I am hearing muffled voices mention some material being developed and that IBM Lotus is focusing on this matter but it will be yet some time before it’s out. Until that time and until we can upload information directly into the brain like martial arts skills are given to Nemo in The Matrix I suggest the following.

My suggestions for someone getting started would be to start by realizing that programming for Eclipse and hence in SWT for the Lotus Notes 8 client has nothing, what so ever, to do with traditional Notes programming. It sounds obvious but once you have accepted this it gets easier. Maybe not easier technically but easier to accept that this is a completely new field you’re venturing into. If nothing else you stop looking to IBM Lotus for help and instead turn to the Eclipse side of the internet.

Before you start to whine I think this is just fine and how it should be. Really. Initially most of the stuff you need to know to get started has nothing to do with IBM Lotus but is general purpose Eclipse development information. It’s like blaming Toyota for not telling you how to repair their cars. Toyota can be expected to tell you and document what’s so special about their cars. They can’t be expected to teach you the basics – you go to a car repair classes for that.

It’s the same with Eclipse development. Learn the basics and specialize from there. You could say that we could expect information about the various ways to extend the client to readily available and better documented. I’ll give you that… 🙂

Once you’re past that and before you embark on your journey first realize this. In Eclipse and SWT we build everything our selves and we’re left to the mercy of the client and the differences that exist across the different platforms (Notes 8.0.x vs. Notes 8.5 across Mac / Linux / Windows XP / Windows Vista / Windows 7). We’re close to the metal with all the benefits, worries and problems that entail.

So if I had to come up with an action plan for learning about Eclipse / Expeditor / Notes 8+ development it would be something like the following:

  • Learn Java! Become proficient in Java! It sounds obvious but it’s one of the pillars for being successful in this area. Pay special attention to the following areas as they are used heavily when developing for Eclipse:
    • Event publishing/subscription using listeners
    • Anonymous inner classes
    • Interfaces
    • Multithreading
  • Learn about GUI development in general. Resources for developing in Java SWING are just as good as those for SWT as many, if not all, of the concepts apply to both. UI development includes:
    • Widgets
    • Layout managers
    • Threading and the concept on an UI thread. What should and shouldn’t you do on the UI thread!?
  • Learn about Eclipse and the Eclipse platform for building RCP (Rich Client Platform) programs.
  • Buy a book about it such as “Java Developer’s Guide to Eclipse, The (2nd Edition)“. It has been a good help to me.
  • Stop by http://www.eclipse.org/articles and take a look at the articles there.
  • Follow this blog 🙂

As you can see it’s no small adventure you’re starting into. The learning curve may be steep but it’s also rewarding to be able to extend the client beyond belief. If only you’d started learning Java earlier…

Doing Java plugins? Then you need to checkout this OpenNTF.org project

Props goes out to the Java UI Team (Ryan Baxter, Adam Geheb, Stanton Sievers) for publishing the Java UI API Exerciser plugin showing how to use the Java UI API for the Notes client. If you’re doing Java plugins for the Notes client you definitely want to check it out. Installation is also very easy because it’s signed and as such also serves as a showcase on how plugin deployment works when it’s fully transparent.

More info can be found on the catalog entry.