How dynamic are your Notes sidebar plugins?

If you thought that the MyWidgets sidebar plug-in is doing some kind of dark magic to dynamically add sidebar plug-ins then think again. The purpose of my latest exploration into the World of Eclipse was to find out how I could do the same stuff. It wasn’t easy and took a while but it proved to be easier than I thought (once I knew how of cause). The plug-in I did is rather simple but shows how to dynamically add sidebar plug-ins and associate actions with it much like MyWidgets. If you want to see how it works check out the Flash movie. Now this has amazing possibilities…

As always – this isn’t your ol’ Notes client… πŸ™‚

Thinking about improvements to TwitNotes – do you have any suggestions?


While I’m getting more and more absorbed into the twitterverse I’m also thinking about new ways to extend TwitNotes to make it even more useful in my day-to-day twittering. The search capability I added that hooks into Twitter search is nice but making searches persistent would be nice. By persistent I mean to have the option of having Twitter searches in separate, created-on-the-fly, sidebar plugins for easier reference. It might well be that it makes just as much sense to follow a hashtag as to follow your friends and your timeline. Also having separate access to your replies would be nice.

If you have comments and/or suggestions about improvements please drop me a comment or send me a direct message via Twitter. You can also simply reply to me.

Google Apps Update: February 24 Outage Postmortem

Following Ed Brills “VNUNet: What if Google Mail had been your corporate IT system?” post following the Google mail outage the other day I found it interesting, as a paying Google mail customer (for my private e-mail accounts), that I received an e-mail from Google during the night.


“Dear Google Apps customer,

Between approximately 9AM to 12PM GMT / 1AM to 4AM PST on Tuesday, February 24, 2009, some Google Apps mail users were unable to access their accounts. The actual outage period varied by user because the recovery process was executed in stages. No data was lost during this time. The root cause of the problem was a software bug that caused an unexpected service disruption during the course of a routine maintenance event. The root cause of this unexpected service disruption has been found and fixed.

<snip />

We will be extending a full 15-day SLA credit to all affected Google Apps Premier customers for the month of February. This credit will be applied to customer accounts automatically so there’s no action needed on the part of administrators.”

The e-mail goes on but at least they recognize that something went wrong…

Using EventAdmin for interprocess-communication

One of the tricks to really loosely coupling components in Eclipse is using an event broker to publish events and subscribe to events. You can roll your own which is easy enough (lets face it – it’s a listener interface and a list keeping track of listeners) but it adds a constraint among plug-ins. Another solution is to use the OSGi EventAdmin service.

EventAdmin uses a concept of hierarchical topics much like a messaging system (JMS) and is available from all plugins. You simply add a dependency on org.eclipse.osgi.services and you’re laughing.

This “Event Admin Service specification explained by Example” post has all the info you need to get started and if you ask nicely and there’s enough interest I might even share my EventAdmin test plugin with you… πŸ™‚

Target platform for Sametime 8.0.0/8.0.1 development

Some days ago I posted on developing drag’n’drop support for Notes 8.0.x and Notes 8.5 Standard clients (see “Show ‘n Tell Thursday: SWT drag’n’drop in Notes 8.0.x and Notes 8.5 (19 February 2009)“). When doing this and you have configured your Eclipse IDE to use Notes 8.5 as the target platform you will be missing the Sametime 8.0.0 libraries and hence some classes wont compile. This is easily solved by copying the necessary Sametime 8.0.0 libraries from a Notes 8.0.x install to a directory to your local machine and adding it to the target platform. Below you can see my target platform where I have the Notes 8.5 libraries and the Sametime 8.0.0 classes (third entry).

<img src="https://wp2.mm.heisterberg.dk/wp-content/uploads/2018/02/sametime800_sametime801_eclipsebuildpath.jpg" /S

Show ‘n Tell Thursday: SWT drag’n’drop in Notes 8.0.x and Notes 8.5 (19 February 2009)


This weeks SnTT post is about adding drag’n’drop of Lotus Sametime buddies in the Notes 8.0.x Standard and Notes 8.5 Standard client in SWT plug-ins. Unfortunately the Sametime API for dragging buddies around changed between Sametime 8.0.0 and Sametime 8.0.1 so you have to take this into account when developing drag’n’drop functionality that works across Notes 8.0.x and Notes 8.5. Read on…

As mentioned in my Drag’n’drop in SWT components post drag’n’drop uses a socalled Transfer classes to signal which types of data a drag source delivers and a drop target accepts. To allow Sametime buddies to dropped on your component you use PersonGroupTransfer class but this class changed package from Sametime 8.0.0 to Sametime 8.0.1… πŸ™

In Sametime 8.0.0 (Notes 8.0.x) the class is com.ibm.collaboration.realtime.people.PersonGroupTransfer and in Sametime 8.0.1 (Notes 8.5) the class is com.ibm.collaboration.realtime.people.PersonGroupTransfer (do not mind that the Sametime 8.0.0 class is in an “internal” package as it is exported from the plug-in). This means that if you develop a plug-in that needs to run on both Notes 8.0.x and Notes 8.5 you need to factor the drag’n’drop support out into two separate plug-ins and match based on perfect version numbers of the com.ibm.rcp.collaboration.realtime.people.impl plug-in.

It’s a bit cumbersome but it works fine.

Drag’n’drop in SWT components

Those who went to my Lotusphere session already know this but doing drag’n’drop in SWT is actually quite easy. All you need to do is define a drag source and/or a drop target. The former is only required if a control in users should be able to drag data from a control in your code. The latter is required if you would like users to be able to drop stuff onto your component.

When setting up a drag source or a drop target you specify the control the source/target controls and the types of data you can provide/accept. These types are called Transfer types and are subclasses of the org.eclipse.ui.dnd.Transfer class.

Transfer types that might come handy – the class names should be pretty self-explanatory:

  • org.eclipse.swt.dnd.URLTransfer.getInstance()
  • org.eclipse.swt.dnd.FileTransfer.getInstance()
  • org.eclipse.swt.dnd.TextTransfer.getInstance()

Making a JFace viewer a drop target is simple passing in the underlying control:

DropTarget dropTarget = new DropTarget(viewer.getControl(),
   DND.DROP_DEFAULT | DND.DROP_MOVE);

Once the drop target has been created you set the transfer types:

final Transfer[] dropTransferTypes = new Transfer[] {
  type1,
  type2
};
dropTarget.setTransfer(dropTransferTypes);

The last thing you need is to add an instance of DropTargetListener or use a subclass of DropTargetAdapter as I do here:

dropTarget.addDropListener(new DropTargetAdapter() {
  ...
  ...
});

Creating a drag source is analogous.

The stuff you need to test plug-in deployment in Notes 8

While testing the plug-in deployment features of Lotus Notes 8.x I needed some plug-ins to actually install. They needed to be small, not to have any dependencies on the platform as such as well as having a manageable, and known, dependency graph. Also I needed multiple versions to test installing different versions, upgrading and uninstalling. For this specific purpose I wrote a couple of very, very, very simple sidebar plug-ins (very simple – they just display the version of the plug-in) to play around with.

I now have two plug-ins packaged into two features – Feature 1 and Feature 2. Feature 1 depends on (a specific version of) Feature 2 which in turn doesn’t depend on anything else than the platform (Eclipse core). This means that I can test installing different versions of Feature 1 and verify that Feature 2 is also updated accordingly.

I have made these features publicly available so if you need something similar read on.

Feature dependencies

The below table shows the dependencies between the two test features provided. The table should be read so that Feature 1 v. 1.0.1 depends on Feature 2 v. 2.0.0 and Feature 1 v. 1.1.1 depends on Feature 2 v. 2.0.2.

Feature 2 version
Feature 1 version 2.0.0 2.0.1 2.0.2
1.0.0 X    
1.0.1 X    
1.0.2   X  
1.1.0   X  
1.1.1     X

Installing the features

You can test installation of the features in one of two ways. Either use an update site I provide or use the widget descriptors to install using a widget catalog or the My Widgets sidebar plug-in.

To use the update site point your Update Manager at http://update.lekkimworld.com/testplugins/site.xml and make sure that, when you install, untick the “Only show the latest version of a feature per update site” when selecting features.

Failure to do so will result in your only being able to see Feature 1 v. 1.1.1 and Feature 2 v. 2.0.2. Unticking the box will allow you to select any combination of features you would want to test.

To use the widget descriptors right-click and save the below widget descriptors to your system and use them directly by dragging them onto the My Widgets sidebar plug-in or import them into a widget catalog.

SOA is dead – long live its offspring mashups, BPM, SaaS…

Was tuned in to this blog post (“SOA is Dead; Long Live Services” by Anne Thomas Manes) by a very interesting interview about the post on ITConversations. The podcast is definitely worth a listen and quite interesting. Quoting from the blog post:

“SOA met its demise on January 1, 2009, when it was wiped out by the catastrophic impact of the economic recession. SOA is survived by its offspring: mashups, BPM, SaaS, Cloud Computing, and all other architectural approaches that depend on “services”.”

Sounds like something you realized without knowing it? The interview is very interesting and addresses, among other things, why SOA and governance is a concept and not something you buy. The podcast runs about 44 minutes and may be streamed or downloaded as MP3.