Fixing a wierd widget installation issue (Content is not allowed in prolog)

For our OnTime Group Calendar 2011 Notes user interface which is Java plugin based we have seen some strange problem reports with customers reporting that the widget installs but after installation an error message is displayed on screen (“The widgets below had issues during the installation. See the log for more details.”). The wierd thing about the reports were that the customers reported that the widget (and hence the plugins) actually installed just fine and worked after a client restart. What’s even funnier is that the same plugins installed without error if the customer used HTTP and not NRPC for their update site access protocol. In the log (Help/Support/View Trace) the below error messages was shown (my highlighting):

Could not access digest on the site: no protocol:
   0/8E4DFE3996CBDD94C1257A33003CE3A9/$file/digest.zip
[Fatal Error] :1:1: Content is not allowed in prolog.
org.eclipse.ui.WorkbenchException: Content is not allowed in prolog.
	at org.eclipse.ui.XMLMemento.createReadRoot(Unknown Source)
	at org.eclipse.ui.XMLMemento.createReadRoot(Unknown Source)
	at com.ibm.rcp.dynamic.extensions...
	at com.ibm.rcp.dynamic.extensions...
	at com.ibm.rcp.dynamic.extensions...
	at com.ibm.rcp.toolbox.internal.management...
	at com.ibm.rcp.toolbox.internal.management...
	at com.ibm.rcp.toolbox.internal.management...
	at com.ibm.rcp.toolbox.internal.management...
	at com.ibm.rcp.toolbox.internal.management...
	at org.eclipse.core.internal.jobs...
Caused by:
org.xml.sax.SAXParseException: Content is not allowed in prolog.
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.DocumentBuilderImpl...
	... 11 more

This really had me scratching my head.

After reseaching and Googling I found a post called “Java: “Content is not allowed in prolog” – causes of this XML processing error” which led me in right direction.

When I opened the widget XML file in an editor and switched to HEX mode I saw this:



3 invisible bytes were inserted at the start of the file. I copy/pasted the XML into a new file which solved the issues. The 3 bytes actually turn out to be what’s called a Byte order mark or BOM for short. From the wikipedia article I found out that the BOM for a UTF-8 file is those exact bytes and I did save the file as UTF-8 in my editor.

The UTF-8 representation of the BOM is the byte sequence 0xEF,0xBB,0xBF. A text editor or web browser interpreting the text as ISO-8859-1 or CP1252 will display the characters  for this.

But the bytes were not there in my editor but only in the file that I received from a customer. So how did the bytes get there?!

So after more research and playing around I found out that the BOM is added by Notepad on Windows. But of course!! A lot of customers receive the XML file and change the update site URL to point to their own servers and if they use Notepad for this the BOM is added (see “The Notepad file encoding problem, redux” for more details).

But how to fix it? Telling customers not to use Notepad to edit the XML file would be a no-go as many probably no not use another editor. And even if they did the problem would probably still arise in some situations and we would spend time diagnosing it. The solution I’ve opted for is to change the encoding of the file to ASCII and change the encoding declation in the XML file to ASCII as well. The content of the XML file is unchanged and now customers can change it using Notepad without issues.

Watch the names when doing SSO between WAS and Domino

This morning I helped a customer because they couldn’t make the beta of the OnTime Group Calendar for IBM Connections work and it turned out to be a Single-Sign-On issue. For the OnTime widgets to work we require SSO between Websphere Application Server and Domino which is trivial to set up. Simply export the SSO keys from Websphere using the Integrated Solution Console (ISC) and import them into the SSO document in Domino Directory. In Websphere Application Server terms this is called cross-cell SSO and is very easy to set up.

After doing this SSO still didn’t work and right of the bat I suspected the good ol’ “multiple O= identifier” issue. The issue is when you incorrectly configure federated repositories and a username is reported by ISC with an extra organization identifier e.g. I would be “CN=Mikkel Flindt Heisterberg,o=IntraVision,o=IntraVision” and not simply “CN=Mikkel Flindt Heisterberg,o=IntraVision” the latter of course being correct. While WAS (and IBM Connections) will work just fine with that type of configuration is can cause SSO not to work correctly or only work when the user authenticates to Domino first the problem being that the DN that WAS sticks into the LtpaToken isn’t valid in Domino.

Verifying the names is easy using “Users and Group/Manage Users” in the left hand menu in ISC.

After reconfiguring federated repositories and restarting Websphere Application Server SSO functioned and the customer was back to using the OnTime Group Calendar widgets.

It’s been quiet around here – what have I been up to?

Well it has been very quiet on my front both on the blogging side and on twitter. I’ve not been lazy but just have had a lot of stuff on my plate the last couple of months. It all started with a very productive trip to Japan and following that AusLUG to catch up with friends and speak at that user group. Businesswise Japan was especially great and we have hooked up with a new OnTime partner out there. Axcel Coporation is our new spearhead into the Japanese market and they are making great progress and already have an ontimesuite.com-like website available in Japanese (ontimesuite.jp) complete with trials, support and online buying all in Japanese. Impressive.

We’ve received a lot of very nice press coverage in Japan with the latest piece coming this weekend where Mr. Muneyuki Ohkawa of IBM Lotus Japan wrote a very nice summary of OnTime Group Calendar and how he sees it in the Japanese market (Japanese: ノーツのグループカレンダー – OnTime Group Calendar, Google Translated into English: OnTime Group Calendar – Group Calendar of Notes).

Besides our Japanese venture I also spent quite a lot of time working on opening up the API for OnTime Group Calendar (more information here). Part of opening up the API has been recording videos on the usage as well as writing samples as well as completing the API Explorer I started writing in a session at BLUG. Don’t say you cannot get inspired everywhere! 🙂 The API Explorer (demo.ontimesuite.com/apiexplorer) is interesting from a number of perspectives. First of all it affords easy access to the API and easily allows you to try out the API without installing it in your own environment. It’s also written as a web application without any hardcoded piece of information. Every endpoint and every operation and argument for the operations are fully dynamic and read from a JSON file allowing up to easily extend and update the API Explorer when we need to. Very nice if I may say so myself.

As if that wasn’t enough I’ve been very busy with the next release of the plugin based UI’s for OnTime Group Calendar programming a sidebar app (Team-At-A-Glance, out in beta currently), adding private group support, adding meeting and allday appointment support to the Notes 2011 UI. I’ve also completed porting the UI’s to use the newer JSON based OnTime API. Oh and of course finalizing the Japanese support in both clients by fully supporting the Imperial Calendar system. It’s all been great fun.

For the next two weeks I’m doing an IBM Connections widget project which I’m looking very much forward to. It is going to be very cool to do some web and JavaScript development and it will give me an opportunity to use my iWidget Test Harness framework which allows me to easily develop and test iWidgets without running a full IBM Connections or Mashup server – oh yeah – wrote that too… 🙂

Now back to work – happy coding!!

Round up of trip to Tokyo and AusLUG

I’m back in the office after two weeks away for going to Tokyo, AusLUG in Melbourne, Australia, and then Easter vacation. While the latter is of no particular interest to anyone (I think) my trip might be. Let us get the most obvious thing out of the way first – we did a lot of flying. Besides having been in Antwerp, Belgium, on the Thursday/Friday for BLUG before going on this trip we went Copenhagen-Singapore-Tokyo-Singapore-Melbourne-Singapore-Frankfurt-Copenhagen in 8 days! The trip earned us about 27000 air miles and with the circurmference of the Earth being 24900 miles we actually went around the World and then some.

The trip started out in Tokyo where we had 2 days (Monday and Tuesday) of meetings with potential OnTime partners and with IBM. Great meetings and very good to meet local partners and learn about Japanese culture and language. Nothing is simple in Japan let alone the calendar. In Japan they actually have four (4) calendars that they use those being the international (the one we use in most of the World), the Imperial (based on the Japanese emperors), the Buddhist calendar and the 6 day Japanese calendar. The latter is not used in business but it does mean that a calendar product will need to support all if not most of them. At least at the UI layer. Besides business we had some time although not a lot for a look at Tokyo and to sample the local cuisine. While we unfortunately didn’t get to try Kobe steak (top of the list for next time) we did have local sushi (a must) and sampled sashimi with raw chicken and raw liver. Many thanks to the IBM’ers we met and to Atsushi Sato (@acchan777) for taking us out to dinner on the Monday.

On Wednesday we flew on to Melbourne via Singapore and landed early Thursday morning (7am). After a cab ride (through what can best be characterized as chaotic traffic) and a quick shower we were on scene at AusLUG to catch the last 30 minutes of the keynote. Not bad planning.

The event was excellent both from a technical, business and personal perspective. It’s always good to go to interesting sessions, learn new stuff and meet up with the friends I got at the inaugural AusLUG in Sydney. I spoke at two sessions – one on Thursday at 2pm and one on Friday morning at 8.30am where I slept through 3 alarms only to wake at the calendar reminder I set for 30 minutes before I should present! Let me just say that I didn’t shower before the the session but I made it (we stayed only 5-10 minutes away on foot) so all was good. Lesson learned? Set multiple timers – and go easy (easier) on the drinks the night before. 🙂 The night before was a very fun one as we went drinking after the AusLUG dinner. Great night out.

After the conference on Friday night we went to see “footy” at the MCG as part of the speaker/sponsor thank-you-event together with approx. 79000 other nice people. And boy was it excellent fun! Lets just say that if I’m invited to go see footy in the future I’ll go anytime! Great event and a great conclusion to our trip.

Saturday we went for a stroll about the city, chilled at the apartment, watched some footy on the telly and had some bieeerh (think that’s how the native spell beer) before we headed to the airport for our 1am fligth back home. What a trip – many memories and many good oppportunities to persue in the Japanese market.

The Java native2ascii tool (also important for you XPages geeks)

To prepare for our upcoming trip to Tokyo I’ve been working on a Japanese translation of our OnTime Group Calendar 2011 client for Notes based on Java plugins. The internationalization engine (i18n) was already in place so it was merely a matter of doing the translation (thanks to Google Translate and friends) and then adding language files to our API. In that process one becomes very thankful of UTF-8 and the fact that Java works natively in UTF-8.

Please note that the approach discussed in this post translates (excuse the pun) directly to making translation files for XPages as well.

Using the Japanese translation the GUI looks like the below screen shot (cropped of course).



(click the image for a large version)

The funny thing about most non-Latin languages is that even though you have the translations it’s hard to impossible to write the characters yourself. And once you have the words getting them into the language files which are mere property files. Take the weekdays in Japanese as an example:

月曜日
火曜日
水曜日
木曜日
金曜日
土曜日
日曜日

Because we’re running the OnTime Group Calendar out of Notes and because Notes is fully double-byte compatible we could actually just add the Japanese characters directly to the translation document. Instead however we opted to use the Java way that is the native2ascii tool.

The native2ascii tool is shipped with the JDK and lets you translate a file containing native characters to their UTF-8 equivalent escape sequences. So having my Japanese characters in japanese_source.txt and wanting to store the result in japanese_result.txt I simply ran the following command:

native2ascii -encoding UTF8 japanese_source.txt japanese_result.txt

The encoding parameter specifies the character encoding of the source file (here japanese_source.txt). The result is something like this:

u6708u66dcu65e5
u706bu66dcu65e5
u6c34u66dcu65e5
u6728u66dcu65e5
u91d1u66dcu65e5
u571fu66dcu65e5
u65e5u66dcu65e5

Chose escape sequences go directly into the language property file and when read into a Java property file they are automatically translated into Japanese. Sweet!

OnTime Group Calendar for Social Business

As part of the OnTime Group Calendar we’re building a series of widgets for IBM Connections to allow easier collaboration – the more we collaborate the more we need access to accurate, updated, calendar data. This puts OnTime Group Calendar smack in the middle of the move to social business. We are getting ready to release the widgets as part of the product and we have the first demo ready.


The integration into the Profiles feature is easily understandable and shows the calendar of the user right there on the profile page as shown on the right. Click the image to see a larger version.

However the real power lies in the integration into communities. Here we bring the calendar of community members into the community is a text list UI and a full graphical viewer based UI as in the rest of our clients. For communities we are also offering a Social Scheduling widget to allow you to find available meeting times and book meetings with community members plus people you may only know based on tags (keywords) or location. Very powerful and possible due to the API offered for OnTime Group Calendar.



(click the image for a larger version)

Please note that everywhere the access to calendar data is only available if the querying user has sufficient access.

The demo below outlines how OnTime Group Calendar for Social Business brings calendar data into IBM Connections in the Profiles feature and in the Communities feature.

All videos are available on the ontimesuite YouTube channel.

20% off OnTime Meeting Manager until December 2011



(click to learn more)

OnTime Meeting Manager is your one-stop organizer dedicated to making the process of organizing meetings quick and efficient, leaving you free to concentrate on what’s central to your business.

Booking rooms for meetings or even teleconferences should be an easy process. Most people would agree on that. Adding catering to the booking should not be much harder. However often organisations find that handling this procedure is a lengthy process that absorbs much more time than imagined.

If you consider some of the hidden “time consumers” like handling the entire approval workflow for catering and facility management it becomes clearer why this is true.

OnTime Meeting Manager is targeted at turning the entire process from invitation, meeting attendance, delivering catering and at the end doing the cost accounting into one fully integrated process.

New IBM Connections Kick-Start offering

IntraVision is happy to offer a fixed price IBM Connections Kick-Start offering to get you started with IBM Connections per the entitlement offered by IBM as part of the Notes 8.5.3 maintenance release. At our Social Business event on Thursday 27 October (there’s still time to register) we will be happy to discuss this offering as well as our new OnTime for IBM Connections product with you. More information about event may be found as part of our online newsletter (linked below).

IBM Connections Kick-Start and Social Business event with Stuart J. McRae (in Danish).

Stommunity – now released as open source on OpenNTF.org

As you might recall we at IntraVision some time back quit running Lotus Sametime on-premises and switched to LotusLive. This wasn’t without issues and I also blogged about the apparent lack of public groups in my “Using LotusLive for Sametime – 2 months in” post a couple of months ago. After experiencing this issue I talked to Erik Vos from RealConnections in the Netherlands at NLLUG. Erik was also having the same problem for his SaaS customers so we worked together to develop a proof-of-concept Notes sidebar plugin called Stommunity to work around the issue. The name Stommunity plays on the words Sametime (ST) and (LotusLive) Community.

So what does the plugin do?

The plugin synchronizes your LotusLive communities with your Lotus Sametime client and creates private groups based on the LotusLive communities you are a member of (and that you select for synchronization). This mimics the missing public group feature of LotusLive Sametime. The below screenshot shows a Sametime client with 4 communities synchronized from LotusLive.

So how does the plugin work?

The plugin sits as a sidebar plugin in your Lotus Notes client and monitors your Sametime client for when it logs into LotusLive Sametime. Once a login is detected it reads the communities the active user is a member of using the LotusLive REST API and shows a list of the communities. The user may then select the communities to synchronize with Sametime. The below screenshot shows the Stommunity plugin waiting for the user to log into Sametime.

Once logged in the communities is read from LotusLive. In the below screenshot you can see that the user is a member of a couple of communities but only one is synchronized with Sametime.

After selecting an additional community and clicking Apply the community is synchronized to Sametime and a private group is created. The below screenshot shows the Sametime client after synchronizing the BlueExtend community with the Sametime client.

So why only a proof-of-concept and not a ready-to-roll plugin?

While developing the plugin we discussed the license implications of a plugin like this. When you sign up for LotusLive Engage you receive a Sametime Entry license which means you may not use the Sametime API which again means that a plugin like this cannot work (from a licensing standpoint). That alone made the project a dead-end and after working a bit with IBM on this it became clear that changing the licensing agreement wasn’t in the books. Due to this we are releasing the plugin as a proof-of-concept with open source on OpenNTF hoping that it may inspire someone.

Looking at the plugin as it is now I see a lot of potential. Of course the selection of communities needs to be pushed into the preferences but as a LotusLive customer it would be really cool to have. I imagine an auto-sync option being added as well as an option to just sync all and change (or remove) the prefix I automatically add now (“LL Community:”). Think of having a policy option to automatically make certain, company wide, communities be synchronized to all users (or a set of users). Maybe even controlled from within LotusLive. Now that would be cool and bridge the gap between the products. One could even argue that a plugin like this should be a standard component that should come bundled with LotusLive Notes.

Anyways – I hope it may inspire the LotusLive teams.

The Stommunity plugin may be found on OpenNTF.org and the code may be downloaded from the SVN repository. See below for links to each.

Links and resources