Disapointing news on the timetable for Hannover – release date pushed back?

I got quite disapointed when talking to a former IBM colleague of mine yesterday when he said that the public Hannover beta had been pushed back to 2nd quarter 2007 and the gold release pushed back to end 2007. From comments on Ed Brills blog I had gathered that a public beta would be available start of November 2006 (60 days from 1 September 2006) and from other discussions online that the gold release would be available mid 2007.

Does anyone have any credible info as to release dates? We need some solid information to tell customers.

Show ‘n Tell Thursday: Don’t rely on the default font-size (28 Sept 2006)


You should be aware of relying on the default font size of the Lotus Notes client when doing richtext programming via LotusScript. I found this out then doing an application that does the following:

  1. Grabs a document with a richtext item.
  2. Makes a copy of the backend document to do a reply-with-history style function.
  3. Remove some items in the backend and bring the document to the UI.
  4. Move focus to the richtext item and add a text like “User did function xyz at 07:41PM on 28 Sept 2006” using the InsertText method.

The problem here is that if the user just wrote an e-mail using the normal e-mail functionality where he ended the e-mail using a larger font, the text you add via LotusScript will be added using this larger font-size.

So when doing richtext programming be sure to always set the font-size or take some counter measure to avoid this behaviour.

Re: What’s up with Sametime 7.5 spellchecking?

I was made aware by a coworker that the UI language and the spellchecking language doesn’t go together as started previously. The only available spellchecking language in Sametime 7.5 is English. The dictionary for the spellchecking is located together with the IBM “langware”-plugin (see the “pluginscom.ibm.langware.v5.dic.en_US_5.3.1.9-20060714” directory) in the Sametime 7.5 install directory.

I wasn’t able to find any additional dictionaries but found a post in the Sametime forum on LDD requesting the same thing. I do not however think I would be well of by finding additional dictionaries since there is no way to specify the spellchecking language in the Sametime client UI.

What’s up with Sametime 7.5 spellchecking?

We have been running the new Sametime 7.5 at the office since its release and I must say that I’m impressed. The UI is slick and the new features have made it an up2date IM client. The small issues we had getting the server installed was, I guess, minor and could be expected. I have blogged about a couple of the issues previously.

I have an issue with the real-time spellchecking though. The feature is nice but apparently the spellcheck language follows the UI language which means that I cannot run the UI in English and have the spellcheck in Danish which is my native language. Separate options for UI language and spellcheck language would be nice. If IBM decides to do this I also think that they should consider letting the user set the spellcheck language from the button bar of the IM window for easy on-the-fly switching.

Java in Notes/Domino Explained: NotesException


The documentation on NotesException is a little scarse but basically it’s simply an exception like all the others and it inherits from java.lang.Exception via org.omg.CORBA.UserException. It inherits from org.omg.CORBA.UserException since it needs to be throwable when using remote sessions. NotesException has three constructors for you:

  • NotesException()
  • NotesException(int code, String message)
  • NotesException(int code, String message, Throwable t)

The second and third ones has an integer and a string argument which is the error code and error message as you know them from the LotusScript Error statement. The third argument of the third constructor is for throwing nested exceptions. Anyways – you can throw NotesException as you do with any exception using throw new:

try {
   ...do some stuff
} catch (NotesException e) {
   // throw new NotesException();
   // throw new NotesException(99999, "My own error code...");
   // throw new NotesException(99999, "My own error code...", e);
}

What is a little strange though is that the actual error codes for the NotesExceptions throws cannot be found in the NotesException class but is found in the lotus.domino.NotesError class. This means that if you like to test for “human understandable” error codes (e.g. NOTES_ERR_INVALID_DATE) instead of the actual error code (e.g. 4045) you need to use the constants in the NotesError interface since there isn’t a way to include the error codes like you do in LotusScript unless you implement the interface.

I would consider it bad form to implement the NotesError interface simply to get the error codes. Either use it as a static constant or, if using Java 5 outside of Notes/Domino, use static imports.

As a rule of thumb I would recommend that you do not use lotus.domino.NotesException for your own program code but rather use custom exception classes (by extending java.lang.Exception) or use standard exception classes from the JVM as you see fit. That’s how I do it anyways…

More sessions on blogging @ Lotusphere 2007

I have been thinking about the sessions on blogging at last years Lotusphere now as we are nearing the submission deadline for sessions for Lotusphere 2007. At Lotusphere 2006 we had two sessions on blogging:

The first one was a panel discussion on the more general aspects on blogging and how blogging can and will affect the enterprise. The latter was a Birds of a Feather and a relaxed discussion on blogging in general and was in essence a blogger meet-up. I only attended the latter session and my main reason for doing so was to meet my fellow bloggers however it seemed to me that there wasn’t enough time.

That got me thinking – should we have more than one BoF-style session on blogging or maybe simply a longer session? Maybe additional sessions or longer sessions should be held outside of the “official” Lotusphere conference since I guess there is a limit to how many sessions on blogging IBM will allow at Lotusphere. Considering the discussions that has been taking place in last few weeks in the blogosphere it could be that some face-to-face time would be nice and a chance to pick up some of the discussions (i.e. the nifty-fifty).

What do you think? If we need additional sessions, at least inside the scope of Lotusphere, we need to submit abstracts ASAP!

Reverse engineering the Sametime 7.5 business card servlet


Reading in chapter 9 of the Sametime Administration PDF I learned of the UserInfoServlet configured through the UserInfoConfig.xml document in the Domino directory (in the filesystem mind you) on the Sametime 7.5 server. In this post I will not go into the different configuration files but simply describe how the UserInfoServlet works, which parameters it takes and what it returns. You can use this, as I did, for troubleshooting.

Please note: All the information in this post was reverse engineered so use it and treat it accordingly.

Just to get it out of the way. The reason why my initial configuration didn’t work was that the Sametime client contacted a hostname that wasn’t configured in the Internet Sites view in the Domino Directory (I guess it resolved the ip address or hostname wrongly in some way). Anyways – the way to configure the phote part of the business card is perfectly descriped on Grant Binghams blog and in the Sametime 7.5 Administration PDF.

The UserInfoServlet

It appears that the servlet takes 4 arguments:

  • operation (valid values are: 1, 2, 3)
  • userid (the username of the user as listed in the ($Users) view)
  • setid (valid values are the configured blackbox sets; usually 0 and 1)
  • field?? (with ?? being a an incremental number starting a 1)

The operation parameter is the main parameter that controls what the servlet tries to do and what other parameters are required. See below for a description of each operation.

operation=1

This operation is used to get value for specific fields based on the name of the field the Sametime client uses. You can request information from more than one field at a time. The valid names of the fields are the ones from UserInfoConfig.xml and hence the field names shown when you use the operation=2 parameter.

URL syntax: http://hostname/servlet/UserInfoServlet?operation=1&field1=<field name>&userid=<username>

Example URL: http://hostname/servlet/UserInfoServlet?operation=1&field1=Name&field2=Title&userid=jdoe

<?xml version="1.0" encoding="UTF-8"?>
<userinfo>
   <user id ="lekkim">
      <field name="Name" type="text/plain">John Doe</field>
      <field name="Title" type="text/plain">Marketing Manager</field>
   </user>
</userinfo>

operation=2

This operation gives you a list of the fields configured for the required field set. If you leave out the optional setid-parameter a value of 0 will be implied.

URL syntax: http://hostname/servlet/UserInfoServlet?operation=2&setid=<set id>

Example URL: http://hostname/servlet/UserInfoServlet?operation=2&setid=0

<?xml version="1.0" encoding="UTF-8"?>
<userinfo>
   <field name="MailAddress" type="text/plain" />
   <field name="Telephone" type="text/plain" />
   <field name="Company" type="text/plain" />
   <field name="Title" type="text/plain" />
   <field name="Name" type="text/plain" />
   <field name="Photo" type="image/jpeg" />
   <field name="Location" type="text/plain" />
</userinfo>

Example URL: http://hostname/servlet/UserInfoServlet?operation=2&setid=1

<?xml version="1.0" encoding="UTF-8"?>
<userinfo>
   <field name="Photo" type="image/jpeg" />
   <field name="Name" type="text/plain" />
   <field name="Title" type="text/plain" />
   <field name="MailAddress" type="text/plain" />
   <field name="Telephone" type="text/plain" />
</userinfo>

operation=3

This operation is the workhorse of the servlet and the one that the Sametime client calls. This operation returns, as the others do, a XML document containing the business card of the requested user. The photo data is base64 encoded and the type attribute indicates whether it is a jpeg or a gif image.

URL syntax: http://hostname/servlet/UserInfoServlet?operation=3&userid=<username>

Example URL: http://hostname/servlet/UserInfoServlet?operation=3&userid=jdoe

<?xml version="1.0" encoding="UTF-8"?>
   <userinfo>
      <user id="John Doe/Acme">
         <field name="MailAddress" type="text/plain">jdoe@example.com</field>
         <field name="Telephone" type="text/plain">555-9921</field>
         <field name="Company" type="text/plain">Acme Corp.</field>
         <field name="Title" type="" error="UNAVAILABLE"/>
         <field name="Name" type="text/plain">John Doe</field>
         <field name="Photo" type="image/gif">R0lGODlhoQCjAOf==</field>
         <field name="Location" type="" error="UNAVAILABLE"/>
      </user>
   </userinfo>