A serious blow for AppDev on Notes – the proof of entitlement for Lotus Sametime is seriously screwed up!

As you probably know you are entitled to a Lotus Sametime Entry license when you have a “Lotus Notes for Collaboration” license. This is really great and a real selling point for Notes since Sametime is a “first class citizen” in the Notes 8.x client as it provides you with awareness throughout the client and in custom applications including sidebar plug-ins. It also allows for awareness in web pages using either Sametime Links (stlinks) or the newer and much better Sametime webapi (as used in Lotus Connections 2.x).

So now comes the problem – have you ever read the PoE or Proff of Entitlement for Lotus Sametime as it pertains to the Lotus Notes for Collaboration license? Probably not. Read below and weep!! (or read the full document – the text for “IBM Lotus Notes for Collaboration” is on page 2 of that document)

“A valid POE for the IBM Lotus Notes for Collaboration does not include the right to:
1. … (omitted for brevity)
2. … (omitted for brevity)
3. Enable or use IBM Lotus Sametime Limited capabilities beyond the default settings in the Program as provided to You, or as established by policy within IBM Lotus Sametime server, including without limitation: Lotus Sametime Connect client, IBM Lotus Sametime Web conferencing capabilities, access from a mobile device, use of IBM Lotus Sametime Gateway, voice chat, video chat, file transfer, geographic location awareness, IBM Lotus Sametime toolkits or APIs, or plug-ins and applications built using the IBM Lotus Sametime unique APIs available in the IBM Lotus Sametime toolkits, with the exception of the chat logging service provider interface.

A POE for IBM Lotus Notes for Collaboration includes all rights granted hereunder for IBM Lotus iNotes for Collaboration.”

So this is lawyer speak and quite convoluted but in essence it says that a Lotus Notes for Collaboration licensed user may

  • use Sametime for chat and awareness using the default settings on the server (meaning no custom business card or photo)
  • not use file transfer
  • not use any Lotus Sametime API besides the chat logging API

The first two are IMO hopeless restrictions but the last one is really, really, really, really bad! It’s beyond words actually. It means that you as a developer must require that a user has a Sametime Standard license in order to use Sametime awareness in your own applications. To be fair it could be that this is only the case for sidebar applications and SWT based composite application components and doesn’t pertain to forms/views (though you could argue that they use an API as well). Another thing that this entails is that you may not use Sametime awareness in Lotus Connections as it uses a API to do the awareness (Sametime webapi). I just checked the PoE for Lotus Connections and no further Sametime entitlement is extended there.

So what does this mean for me as an application developer? Well it means that the sidebar applications I’m developing have to distinguish between Sametime users and make sure that Sametime functionality is only exposed to Sametime Standard license holders. How do I do that? Not sure as I don’t know of an API which tells me which Sametime license the current user has. Oh – and it has to be a Notes API as I otherwise technically violate the license agreement on behalf of the user.

Who came up with this? What sense does it make to provide less functionality in API than in the UI? I really don’t get it. If I had anything to say at all the restriction on API’s in the client should be lifted. It is these API’s that makes the platform strong and feel coherent since applications running on the platform can leverage the platform.

So from being really psyched about the appdev perspective in Notes as it pertains to Sametime and how Sametime could be used throughout the client I’m now really bummed out. From a customer standpoint it’s going to be difficult to tell them that many of the demos that IBM do require a Sametime Standard license. And then we have our own applications where we have to informing and making sure they understand what they may use based on the license they hold.

Sigh….

(As always I could be wrong about this but I have just been through IBM Lotus here in Denmark which says I have understood the PoE correctly so I’m probably right.)

Why you should develop with the same version as your users use

Got a call from a customer running Notes 7 today. He told me that they were no longer able to search using the “Fill out example form” without getting an error message (“The linked document cannot be found in the view”). After looking into the matter and looking for the obvious first (ie. no default view in the database) I looked more carefully at the Fill Out Example Form dialog and saw some interesting entries in the form dropdown as shown below.

That’s right. Our new psudo-design elements (build.properties, plugin.xml, WEB-INF/faces-config.xml, .classpath, .project) generated by DDE (Domino Designer on Eclipse) shows up as forms in the search dialog and even worse as forms you can use to search with. Now I know it’s impossible to make future-proff software but on that’s not good. Nothing Lotus can do about it though.

So what’s the morale? Well be sure you know what effects using a newer Designer client may have on your users before using it. You have been warned…

Don’t install Notes in the default location if doing Notes plug-in development

A little while back I was contacted by a fellow Yellow-head who had some issues with some plug-in development for Notes 8. Unfortunately I wasn’t able to help him at the time but when he some head scratching time later found the answer he was kind enough to share it. I thought I would share it here in case it can help someone.

From the offset the issue looked simple as it had to do with the good old nlsxbe which is normally caused by the binary Notes directory not being on the path. The issue was however a bit twisted as the error raised complained about the filename or extension being too long.

java.lang.UnsatisfiedLinkError: nlsxbe
   (The filename or extension is too long. )

What our good Yellow-head found out was that the issue was caused by his install location of the Notes client. Specifically he had installed his client in “C:Archivos de programaIBMLotusNotes” which is the default location for his OS. This however means that the path to the notes.jar for plug-ins becomes “C:Archivos de programaIBMLotusNotesframeworkrcpeclipsepluginscom.ibm.rcp.j2se.win32.x86_1.5.0.SR4-200707311521jrelibNotes.jar” which is too long a path (longer than 128 characters). Installing Notes in “C:program filesIBMLotusNotes” solved the issue.

So if you run into weird issues like this check your install path or choose an English copy of Windows! πŸ™‚

Google Maps Widget Generator – come grab your own!

One of the coolest and most powerful features of Notes 8 is the MyWidgets sidebar and the ability to link widgets to text selection actions and/or LiveText.

The only thorn in the side is that not all users are capable of doing their own widgets and some widgets cannot be sent to them because they contain custom data. Take a widget that generate directions for instance. Normally the starting address and you choose the destination address but since the starting address it set it makes the widget difficult to share. What to do?

The solution is of cause to generate the widget on an ad hoc basic. Meet the Google Maps Widget Generator. The widget generator works as follows.

You point your browser at the Google Maps Widget Generator. From this page you follow the short instructions and drag the extension.xml to your MyWidgets sidebar. This installs the widget into your client.

To generate a directions widget you right click the widget and choose to open it in the sidebar (it isn’t visible by default).

Now specify the title you would like to see when right clicking text in the client in the top field (e.g. Google Maps from the office) and the source address in the bottom field (e.g. 1500 Epcot Resorts Blvd, Lake Buena Vista, FL‎). Then click “Go!”

From the resulting page simply drag the extension.xml link to your MyWidgets sidebar to install the Google Maps widget.

Now your new Google Maps widget is available in your Notes client. To generate another widget click the “Generate another widget”-button and simply right click the widget header and choose “Close” to close it. You may always reopen it to generate new widgets.

IBM / SAP Alloy dissected

After the announcement of the general availability of IBM/SAP Alloy the other day I downloaded the package to find out which components it is made up of. Below are some tidbits that may or may not be of interest to you.

Download packages

  • Client package == plugin
  • Domino Server package
  • SAP Server package
  • Documentation package

Parts

  • Plug-in to Notes 8.0.2 or newer
  • Domino Server component
    • Notes database with a web service
    • This database is used to configure the available applications and hostname for the SAP server
  • Updates to the user mail database
    • Description: “The Alloy by IBM and SAP Mail Template Update Tool adds additional and required design elements to the master IBM Lotus Notes and IBM Lotus Domino mail template. This is required to enable integrated Alloy functionality in user’s mail and calendar views. The additional design elements are supplied in the NDERPmail.ntf template, which is typically resident in the Dominodata directory on the Alloy server. “

SAP applications

  • Leave management
  • Travel management
  • Reports
  • Customized decision workflow applications

More info

IBM/SAP Alloy InfoCenter

It appears that the Notes plug-in reads the webservice address from the plugin_customization.ini file (com.ibm.nderp.client/NDERPMDWS_URL=http://hostname/nderpws.nsf/MetaDataService?openwebservice) or from the notes.ini file (NDERPMDWS_URL)

If you’re wondering why your widget catalog deployment doesn’t work…

…then make sure your widget catalog is in the root of the server. This will be fixed in Notes 8.5.1 and a SPR has been generated (SPR #DMDD7Q4MWT) for Notes 8.5 FP1 so open an PMR and vote for it if this is important enough for you. For the record the way that this works is by the Notes client having a replication event listener for the widget catalog database.

How to deploy widgets and/or plugins in your organization

Deploying widgets and/or plug-ins in your organization is very easy and there’s a number of options for doing it.

  1. Desktop policies
  2. Widget catalog via MyWidgets
  3. Drag’n’drop of widgets to the MyWidgets sidebar plug-in

Using a desktop policy is just a administration shorthand for using the widget catalog via MyWidgets.

The first thing you really should do, if not simply using publishing widgets created through the MyWidgets functionality, is to read up on and understand the Lotus Expeditor provisioning manifest syntax. The manifest is used to specify where the update site server is and which features and in which version to install. The manifest looks weird at first but it’s actaully easy enough. Unfortunately there isn’t a nice UI for creating these provisioning manifests but I head rumors in the Meet the Developers lab at Lotusphere that a UI is coming. Soon… πŸ™‚

And now for the time and frustration saver…

Absolutely make sure that you put the widget catalog in the root of the Domino server to make sure it ends up in the root of the Notes client. If you do not do this and you specify a widget catalog in the preferences the Notes client wont apply updates to the widgets when new versions are available. This is a bug at least in Notes 8.5 GOLD.

Resources:

The technique for building a better Notes Java API

This is a followup post to yesterdays post titled Want to join me in building a better Notes Java API? and here I’ll show just how easy it was to build the wrapper API.

Below is the code from the implementation of the getView(String) method of the lotus.domino.Database interface. As you can see the central element is to get the current thread the method is called on and the thread used for Notes data access. If we’re not on the Notes thread execute a blocking request and return the result. If we’re on the Notes thread simply go ahead and do the operation. Simple right?

The most difficult part of all this was that I had to write my own Notes thread handler (equivalent of NotesPlatform) as there isn’t a method for doing a blocking request on the Notes thread in NotesPlatform class supplied by Lotus.

public View getView(final String name) throws NotesException {
  // get threads
  Thread curThread = Thread.currentThread();
  Thread notesThread = NotesPlatform.getInstance().getThread();

  // decide if we're in the Notes thread or not
  if (curThread != notesThread) {
    // we're not on the Notes thread so wrap
    final Holder h = new Holder();

    NotesPlatform.getInstance().syncExec(new Runnable() {
      public void run() {
        try {
          h.value = DatabaseWrapper.this.db.getView(name);

        } catch (NotesException e) {
          h.throwable = e;
        }
      }
    });

    if (null != h.throwable) {
      throw (NotesException)h.throwable;
    } else {
      return new ViewWrapper((View)h.value);
    }

  } else {
    // we're on the thread so do request
    return new ViewWrapper(DatabaseWrapper.this.db.getView(name));
  }
}

TwitNotes 1.0.9 available and the book is now closed on v. 1.0.x :-)

So I’ve fixed the final small issues I really wanted to get fixed before focusing on the next release of TwitNotes in version 1.0.9. This release is primarily a bug fix that fixes the following:

  • Make sure the date/time of the post is represented in search results
  • Make sure the source application of the post is represented in search results
  • Make sure the Twitter tab is always the first tab and search is the second
  • Make sure TwitNotes is working perfectly on Ubuntu
  • Fix the version number in the about dialog

I’ve created a widget descriptor for TwitNotes v. 1.0.9 as well. To update or install simply drag the widget descriptor to the MyWidgets sidebar.

I know there are (small) things that could be done differently but all future work will be done on version 1.1 which has some new exciting features I think… πŸ™‚