Tuesday 28 September 2010

Best Practices for Designing Mobile Portal pages for multiple mobile devices

An interesting blog post from Lauren Wendel covering the new Mobile Portal Accelerator: -

<snip>
Our team is often asked how to approach developing the mobile versions of web content pages.  How to begin and what needs to be considered and prioritized as you go?  Once you determine which mobile devices you will need to support  (if you need to support one or two devices that your organization has standardized on, developing a mobile portal page using a development tool such as Rational Application Developer or Portlet Factory may be a great option for your organization).   Several useful mobile application examples are available from the engineering team, located in the WebSphere Portlet Factory wiki, http://www-10.lotus.com/ldd/pfwiki.nsf/xpViewRecent.xsp?searchValue=mobile.    Other organizations realize they will need to support more than three mobile devices (and their updates) and may choose a multi-channel server option, such as Mobile Portal Accelerator, to help automate mobile portal development and display optimization for thousands of in-market devices, and their updates in the future. We've worked with a number of organizations worldwide that have saved development and code maintenance costs using this approach.  A demonstration of the power of Mobile Portal Accelerator to optimize content for virtually all mobile devices in -market can be viewed here on an IBM "Demonet" server: http://mpademo.net:10040/wps/portal  (you can check this out with your own mobile device)!
</snip>

https://www.ibm.com/developerworks/mydeveloperworks/blogs/WebSpherePortal/entry/best_practices_for_designing_mobile_portal_pages_for_multiple_mobile_devices27?lang=en_us

including a link to the MPA demo -> http://mpademo.net:10040/wps/portal <- which looks pretty good on my BlackBerry 8310 Curve and Apple iPod Touch .....

Monday 27 September 2010

WebSphere Portal v7 - Clustering

This goes into the pile of things that I haven't yet tried, but soon will.

Hunter Tweed has followed up his most excellent WebSphere Portal 6.1.5 clustering guide with an updated version for the newly released WebSphere Portal 7 product.

Want to download and read ?

In that case, navigate over to the WebSphere Portal Wiki: -

Included in the attached PDF are the steps necessary to build a two-node WebSphere Portal v7.0.0 cluster running on WebSphere Application Server v7.0.0.11. This also includes configuration to an external database, a Lightweight Directory Access Protocol (LDAP) user registry, and a remote Web server.

http://www-10.lotus.com/ldd/portalwiki.nsf/dx/Step-by-Step_Cluster_Guide_for_IBM_WebSphere_Portal_v7.0.0

Thursday 23 September 2010

Installing Ubuntu Linux 10.04 on an IBM Thinkpad R50e

Just going through a clean installation of Ubuntu 10.04 Lucid Lynx on my beloved's old-but-still-good Thinkpad, and immediately hit a problem whereby the display would go blank as soon it had finished booting from the DVD, either into Live CD mode or into Installation mode.

However, after a quick Google search, I stumbled upon this article Ubuntu 10.04 “Lucid” Blank Screen at Startup : Workaround which reports a similar problem, albeit post installation, and solution, which involves editing the GRUB loader: -



Booting from CD

This section outlines how to workaround the video issue while booting from the CD. Your mileage may vary, depending on your video card, but hopefully this steers you in the right direction:

  1. At the install screen press ‘F6‘ and insert one of the options below, depending on your hardware.
  2. On first boot after install, press e to edit the GRUB menu.
  3. Using the arrow keys to navigate, delete quiet and splash and again insert one of the options below.
  4. Press Ctrl and X to boot.

The suggested options that I have found are hardware specific. Here is a list:

  • Older Intel video card: i915.modeset=1 or i915.modeset=0
  • nVidia: nomodeset
  • Generic: xforcevesa

Hopefully one of these options will get you up and running. Keep reading now to make these changes persistent!




For me, the "secret sauce" was to use the i915.modeset=1 switch, having removed quiet and splash.

The installation started, and is running at 93% as I type. I may have to revisit this post-installation, to make the changes to GRUB permanently.

For the record, the machine is a 1834-BYG as per the IBM support site here: -

http://www-307.ibm.com/pc/support/site.wss/quickPath.do?quickPathEntry=1834BYG

and the graphics card is an Intel Extreme.

:-)

WebSphere Portal v7 and the Web Application Integrator portlet - no success thus far

Continuing my exploration of the newly released WebSphere Portal v7, I thought I'd see whether I could get the Web Application Integrator portlet to work.

Now before I start, it's worth remembering that, currently, WAI is only supported with WebSphere Portal 6.1.0.4 and below - it's not yet been updated to support v7.

It started well; I expanded the ZIP: -

-rwxrwxrwx 1 1000 1000 231572 Jan 13  2009 webappintegrator_for_Portal_6_1.ZIP

into /root on my portal server, copied the ConfigEngine script: -

-rw-r--r-- 1 root root 2763 Feb 20  2008 /root/wai_install/deployWebAppIntegrator.xml

into the appropriate directory: -

/opt/IBM/WebSphere/AppServer/profiles/wp_profile/ConfigEngine/config/includes/

and then installed it using ConfigEngine: -

cd /opt/IBM/WebSphere/AppServer/profiles/wp_profile/ConfigEngine
./ConfigEngine.sh -DWasPassword=passw0rd -DPortalAdminPwd=passw0rd -DWebAppIntegratorLocation=/root/wai_install/

When I logged back into WebSphere Portal, and navigated to Administration -> Manage Pages, I was sad to see that the normal WAI user interface did not appear in its normal place under the Manage Pages portlet.

Recalling a recent conversation with a colleague about WAI and Virtual Portals, and referencing an older blog post of mine, I tried an alternate angle of attack; using XMLAccess to deploy it to the appropriate pages: -

cd /opt/IBM/WebSphere/AppServer/profiles/wp_profile/PortalServer/bin/
./xmlaccess.sh -in /root/wai_install/addWAItoManagePages.xml -user padmin -password passw0rd -url http://localhost:10039/wps/config

This initially failed, because the XMLAccess script couldn't find the WAR file :-

...
     <message id="EJPXA0107E">com.ibm.wps.command.xml.XmlCommandException: EJPXA0107E: The resource for the URL file:////opt/IBM/WebSphere/PortalServer/installableApps/WebAppIntegrator.war could not be read. [web-app uid=webappintegrator.WebAppIntegratorPortlet.dbcf144b21.webmod]</message>
        <message>java.io.FileNotFoundException: /opt/IBM/WebSphere/PortalServer/installableApps/WebAppIntegrator.war (No such file or directory)</message>
...

so, approaching desperation, I manually copied the WAR file, WebAppIntegrator.war, from /root/wai_install to /opt/IBM/WebSphere/PortalServer/installableApps.

I then re-ran the same XMLAccess command, which completed normally: -

<status element="all" result="ok"/>

and, joy of joy, the WAI UI appeared in its rightful place under the Manage Pages portlet.

Sadly, when I attempted to generate the JavaScript that I'd normally insert into my to-be-integrated page, I was instead redirected an error page, containing: -

Error 500: java.lang.NoSuchFieldError: com/ibm/wps/state/accessors/url/URLContextConstants.FORCE_ABSOLUTE_URLS

Ah, well, I did try.

As I mentioned, WAI is not (yet) supported under WebSphere Portal 7 - I'll endeavour to find out if/when, and report back.

*UPDATE 24/11/2010* I've now learned that Web Application Integrator for WP7 will shortly be made available via the Catalog. I've tested it internally, and it works as one would expect.

Wednesday 22 September 2010

Good Times with external USB drives on Ubuntu Linux 10.04

For a long while, I've been using a rather useful 320 GB USB drive from Lenovo, which has the added feature of security via a keycode entered on the device itself. Whilst I'm sure it's not totally hack-proof, it's good enough for my requirements.

A while back I did see an issue where Ubuntu would (correctly) throw up a message when I booted up because it was trying to automount the drive even though it wasn't connected. So far, so good, but my problem was that the error message was written in black text on a black background :-) I did report a bug via Launchpad, as per my previous post but haven't yet seen any response.

As long as I remember to hit the "S" key to skip past the error when I boot, I'm OK.

However, I have experienced another issue recently.

The drive is formatted using the Apple HFS/HFS+ format, which allows me to use it for read-only AND read-write under OSX and Ubuntu without needing to use the dreaded NTFS format.

Occasionally, when I try to write to the drive, I get the exception: -

Read-only file system

even though the drive is definitely mounted as read-write in /etc/fstab : -

/dev/sdb2 /home/hayd/lenovo hfsplus rw,auto,exec,user

and the mount point is definitely owned by my user ID: -

drwxrwxrwx  2 hayd hayd      4096 2010-08-05 16:27 lenovo

Following this thread led me to the solution, although I did go down a blind alley :-)

In the first instance, I thought that the drive might be using the Apple Journalling mechanism, which Ubuntu can't handle. Having mounted it up on my Macbook, I could see that this wasn't the case.

However, this section of the thread provided the answer: -

The Ubuntu kernel (at least as of Feisty) does have write support for non-journalled HFS+. If you've got a journalled HFS+ file system, you're out of luck.

Furthermore, the driver will refuse to mount the filesystem read/write if it was not cleanly unmounted (to prevent serious data corruption). If the drive is ever not cleanly unmounted, you'll need to run a filesystem checker/repairer on it before you'll be able to mount it read/write again. Unfortunately, the HFS+ filesystem checker isn't actually packaged for Ubuntu (or wasn't last time I checked). You can download and build the Apple tools -the howto I followed was on the Gentoo Wiki. You probably want to read that anyway, there's some good information there. You can ignore all the "adding kernel support" bits though - we've already got the kernel support.

I remembered that I'd previously removed the drive from my Thinkpad having suspended, rather than shut down, the OS, meaning that the drive was never cleanly unmounted.

I used the Ubuntu Disk Utility to check the file system on the relevant partition ( sdb2 ) on the drive, and then remounted it again, using the mount command.

This time, it mounted up in read-write mode, and I was able to create folders, copy files etc. to my heart's content.

Lovely

Tuesday 21 September 2010

WebSphere Portal Version 7 - my first few steps ...

Having had a massive download fest whilst I was on the IBM network a week or so back, I'm now the proud owner of two VMware images, one with WebSphere Portal Server 7 and the other with WebSphere Portal Express 7.

These are the images and the unpack scripts that I used for both: -

WebSphere Portal Server 7

IL-Setup            CZLL2ML.zip
IL-1                    CZLP0ML.tar
IL-2                    CZLP6ML.tar
IL-3                    CZLL5ML.zip
IL-4                    CZLL8ML.zip
IL-5                    CZLM1ML.zip

unpack.sh

mkdir                        /tmp/WP7
unzip CZLL2ML.zip      -d    /tmp/WP7/IL-Setup
mkdir                        /tmp/WP7/IL-1
tar xvf CZLP0ML.tar    -C    /tmp/WP7/IL-1
mkdir                        /tmp/WP7/IL-2
tar xvf CZLP6ML.tar    -C    /tmp/WP7/IL-2
unzip CZLL5ML.zip      -d    /tmp/WP7/IL-3
unzip CZLL8ML.zip      -d    /tmp/WP7/IL-4
unzip CZLM1ML.zip      -d    /tmp/WP7/IL-5

Download Document

http://www-01.ibm.com/support/docview.wss?uid=swg24026527

WebSphere Portal Express 7

IL-Setup                CZLL3ML.zip
IL-1                        CZLP0ML.tar
IL-3                        CZLR2ML.zip
IL-4                        CZLL6ML.zip
IL-5                        CZLL9ML.zip
IL-6                        CZLM2ML.zip

Note that there is no IL-2 as Express doesn't support a 64-bit WAS, unlike Server

unpack.sh

mkdir                        /tmp/WPX7
unzip CZLL3ML.zip      -d    /tmp/WPX7/IL-Setup
mkdir                        /tmp/WPX7/IL-1
tar xvf CZLP0ML.tar    -C    /tmp/WPX7/IL-1
unzip CZLR2ML.zip      -d    /tmp/WPX7/IL-3
unzip CZLL6ML.zip      -d    /tmp/WPX7/IL-4
unzip CZLL9ML.zip      -d    /tmp/WPX7/IL-5
unzip CZLM2ML.zip      -d    /tmp/WPX7/IL-6

Download Document

http://www-01.ibm.com/support/docview.wss?uid=swg24026542

At present, I'm playing with the Express variant, partly because it also includes Lotus Web Content Management 7, which has a rather nice make-over to the authoring environment etc.

One thing that I'd noticed that, unlike previous versions, the wp_profile directory is no longer automatically placed under /opt/IBM/WebSphere, but is instead under /opt/IBM/WebSphere/AppServer/profiles which brings the product into line with other non-Express installations.

As part of my exploration, I am looking at the options to integrate iWidgets and portlets onto the same page.

To begin with, I went looking for the My Mashups page in the navigation, and was surprised to find it absent - when I thought back, I realised that it might not yet have been enabled, especially considering an earlier blog post that I had written re adding and removing Mashups etc. i WebSphere Portal Server.

Therefore, I needed to run the following ConfigEngine script: -

cd /opt/IBM/WebSphere/AppServer/profiles/wp_profile/ConfigEngine
./ConfigEngine.sh deploy-portal-mashup-ui

as detailed in the Wiki here: -

IBM WebSphere Portal Express 7 Product Documentation > Installing on Linux: exp7

Having done that, I now have access to the My Mashups page, and was able to create a model in WebSphere Portlet Factory Designer, deploy it as portlet AND as an iWidget, and then add BOTH portlets and iWidgets to the same page.

I'm still testing the water here, but v7 looks to be a very very nice release.

:-)

In other news, I'm very pleased to report that the newly released WebSphere Portlet Factory Designer now supports Open Document Format (ODF) ... specifically, the old Excel Import and Excel Export builders have been replaced by Spreadsheet Import and Spreadsheet Export builders, which support XLS *AND* ODS. This makes my demos far far easier ....

Application Development for IBM WebSphere Process Server 7 and Enterprise Service Bus 7

I mentioned previously that I'm reviewing a second book from Packt Publishing, entitled Application Development for IBM WebSphere Process Server 7 and Enterprise Service Bus 7.

Well, I'm mid-way through the book, which has proved to be an excellent read thus far. Having reached Chapter 7, we're now starting to look at a hypothetical existing customer, JungleSea, and identify their business and IT problems/requirements with their existing sales order processing system, which ( as with many organisations ) is built in a "stove-pipe" fashion, with specific applications for each and every business function, many developed before the vision of Service Oriented Architecture was born.

Up until this point, we've really only scratched the surface of the capabilities of WebSphere Process Server (WPS) and WebSphere Enterprise Service Bus (WESB) with a focus on topics such as web services, Business Objects, mediation, service endpoints etc.

I'm enjoying the book immensely, especially given the fact that WPS/WESB are solutions with which I've not worked in "anger", but have seen in a number of my portal engagements over the past year or so.

I do have a few gripes, more with the presentation than with the content: -

  • The English, whilst excellent, is somewhat overlong - I know that I'm often guilty of using 5 words when 1 word would do, but this book does suffer the same "problem". It's not a major problem, but it does nag at me from time to time
  • There is some inconsistency in acronym expansion - early on, the authors use the terms WS-BPEL and BPEL interchangeably, and then indicate that they're going to use BPEL from that point on, and then switch back to WS-BPEL and so on. It may be as a result of having multiple authors, but again it's a niggle
  • On occasion, the book provides instruction to do specific tasks in WebSphere Integration Developer (WID), but often skims over the detail - therefore, this book definitely wouldn't serve as one's only introduction to WID, WPS and WESB. However, this book would work extremely well, if read shortly after a developer had received formal training on the products
  • The book is well stocked with pictures, both mindmaps and screenshots, but, and this is partly down to it's size/format, the pictures are often very, very small, making it hard to draw any detail from them - if I had my way, I'd have preferred the book to be printed in an A4 format, similar to the IBM Redbooks but .....

So, I'm continuing to enjoy the read, and will report back once I've completed it.

It may be worth noting that I'm undertaking this read / review as a favour to Packt - they did provide me with a copy of the book, but that's all - my review is MY review, based upon my own observations, opinions and findings.

Whilst on the subject of Packt, it's worth noting that they also have an online digital book service called *   PacktLib, which provides registered users with access to NINE books free-of-charge. Take a look ....

Friday 17 September 2010

Error "BMWMB0081E:Space is not created correctly" seen with Lotus Mashups 2.0

Did you ever see this error when attempting to create a new space: -

BMWMB0081E:Space is not created correctly.

I followed the advice in this Technote: -

BMWMB0081E: Space is not created correctly

but to no avail.

I also see: -

[9/17/10 16:32:51:423 BST] 0000002f EasyX509Trust W com.ibm.mm.proxy.util.contrib.EasyX509TrustManager checkServerTrusted Since the unsigned_ssl_certificate_support flag is enabled, the following exception is IGNORED: PKIX path building failed: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is:
java.security.cert.CertPathValidatorException: The certificate issued by CN=wps615.uk.ibm.com, OU=Root Certificate, OU=wps615Node01Cell, OU=wps615Node01, O=IBM, C=US is not trusted; internal cause is:
java.security.cert.CertPathValidatorException: Certificate chaining error

in /opt/ibm/MashupCenter/2.0/mm_profile/logs/server1/SystemOut.log at the same time, but this looks to be a warning rather than an exception, and I have: -

<proxy:meta-data>
<proxy:name>unsigned_ssl_certificate_support</proxy:name>
<proxy:value>true</proxy:value>
</proxy:meta-data>

set in: -

/opt/ibm/MashupCenter/2.0/mm/config/proxy-config.xml

Seen anything similar ?

Thursday 16 September 2010

IBM Customer Experience Suite

A few days back, I mentioned an upcoming announcement about a new solution offering that IBM's bringing to market.

Well, it's here - the IBM Customer Experience Suite which is: -



"A flexible, comprehensive offering that helps organizations create highly engaging, personalized, and differentiated web experiences that meet the evolving needs of today's customer.

  • Drive revenue & increase brand loyalty with enhanced web experiences that include native social & mobile capabilities

  • Improve customer satisfaction & reduce costs through online self-service that's quick and easy to use

  • Deliver greater flexibility & drive incremental value by creating personalized web experiences that seamlessly combine back-end applications, commerce solutions, social media sites, and cloud-based services



The announcement letter is here  and there's even a video out on YouTube taken from the announcement, as well as a demo.




More things I had forgotten - metrics in Lotus Connections 2.5 Profiles

Whilst I was hacking around inside Profiles to identify why I'm seeing this exception

Error: The stylesheet http://mashups.uk.ibm.com/profiles/home.do?lang=en was not loaded because its MIME type, "text/html", is not "text/css".
Source File: http://mashups.uk.ibm.com/mum/enabler#pid=AAE0A31CC29BB444C75C2ECA68C786000040&
Line: 0

I found a neat little JSP called: -

servermetrics_not_used.jsp

and thought .... hmmm, I wonder what that does, so I loaded it up in a browser: -

http://lc25.uk.ibm.com:9083/profiles/servermetrics_not_used.jsp

and get a nice little table of data about my Profiles environment: -




Profiles Metrics

Name Value
Total number of employees 3
Number of employees who have updated their background 0
Number of employees with a picture supplied 2
Number of employees with pronunciation supplied 0
Number of employees logged in today 1
Number of employees logged in the last week 2
Number of employees logged in the last month 2

Not hugely impressive on my own VMware image of Lotus Connections, but it might just be useful one day.

Wednesday 15 September 2010

Re-use don't reinvent - Lotus Connections Person Card appearing in a web page near you soon ....

One of my colleagues is seeking to have the Lotus Connections Profiles Person Card appear within Lotus Mashups, so that all references to a user's name/ID are Profiles-sensitive.

This is something I've been working on with Portal etc. as per my previous posts, and it's pretty much implicit via the Semantic Tagging service that WebSphere Portal 6.1.5 etc. include.

However, I wanted to do this outside of Portal, so dug through my bookmarks ( held in Lotus Connections Bookmarks, of course, and browsable via the rather nice little Foxear plugin that we have inside IBM ), and found Luis Benitez' post here: -

Are you ready for this? Lotus Connections person card in Sharepoint

which then took me on a trawl through developerWorks to find Luis' developerWorks article from 2008: -

Integrating IBM Lotus Connections with Microsoft technologies

from which I harvested this code: -

<html>
<head>
<script type="text/javascript" src="http://lc25.uk.ibm.com:9083/profiles/ibm_semanticTagServlet/javascript/semanticTagService.js"></script>
<link rel="stylesheet" href="http://lc25.uk.ibm.com:9083/profiles/css/styles.css" type="text/css"></script>
</head>
<body>

<div id="personCard" class="vcard">
<a href="http://lc25.uk.ibm.com:9083/profiles/html/simpleSearch.do?searchFor=padmin@uk.ibm.com&searchBy=email" class="fn url person">Portal Admin</a>
<span class="email" style="display:none;">padmin@uk.ibm.com</span>
</div>
</body>
</html>

Now this only works if you're prepared to hard code the user's email address in your web page, which is unlikely, so I'm working on the assumption that we can use a JSP and grab the logged-in user's email address and wrap the JavaScript around that.

More to follow, but many thanks to Luis and the team for his help ...

Tuesday 14 September 2010

May you live in interesting times ( aka Delivering exceptional Web Experiences )

I know that that expression is supposedly a curse dating back to ancient China, but it normally reflects my status quo for which I'm extremely grateful.

I am very fortunate in that I have a great job, working for a fantastic company, with an extremely talented bunch of people, right around the world.

In the past week, I've been involved in a number of projects and activities, most of which fall into the category of my day job, as an infrastructure architect, working for IBM Lotus. I guess you could say that my/our role is to help our customers deliver exceptional web experiences ...

Looking at the next few days, there's a rather fascinating announcement coming down the line, about which I can't yet say too much, but it has the potential to change the way that IBM's customers can interact with their customers across the web, reflecting the sea change in the way that we all do business online today ( remembering that terms such as e-commerce and e-business may seem quite quaint now, but this evolution/revolution is only 10 or so years old ).

All I can say for now is, check out this teaser page -> www.ibm.com/software/info/northstar - and  follow these hashtags on Twitter - http://twitter.com/#search?q=%23ibmexperience and http://twitter.com/#search?q=%23lotusknows

Remember you don't actually need to sign up to use Twitter as a consumer - you only need an account if you wish to contribute, so you can "safely" follow those of us who spend our ( perhaps too much ) time on the tricksy little social site.

So, have a browse, and ( in less than two days time on September 16 ), I hope you'll be pleased with the results ...

Help Wanted - Why do my Lotus Connections Business Cards intermittently not get returned to WebSphere Portal ?

As part of my ongoing mission to seek out new life, and explore the wonders of inter-product communication, I'm intermittently finding that my LC Business Card ( aka Person Card ) does NOT appear in my Portal page, either via the Profiles portlet or via People Finder.

This follows my earlier reports, perhaps mistimed, of success here.

Digging around,using Firefox's Error Console,  I did see this exception at some point yesterday: -

Error: BusinessCard.getProfileInfo is not a function
Source File: http://wps615.uk.ibm.com:10040/wps_semanticTag/javascript/semanticTagPerson.js?language=en
Line: 430

where semanticTagPerson.js is here: -

/opt/IBM/WebSphere/PortalServer/ui/wp.tagging.liveobject/semTagEar/Live_Object_Framework.ear/liveobjects.war/javascript/semanticTagPerson.js

It's my assumption that, at some point, we must import the BusinessCard "object" which has a number of methods, one of which should be getProfileInfo and, at some point, this import/include fails, which means that the calling JS ( semanticTagPerson.js ) no longer has access to the "right" version of the object.

If I open a browser to the URL that I have set under Resources -> URLs within the Integrated Solutions Console in WebSphere Portal : -

http://lc25.uk.ibm.com:9083/profiles/html/businessCard

I do see a BusinessCard object defined: -

var BusinessCard = {
profileServiceUrl : "http://lc25.uk.ibm.com:9083/profiles",
semanticTagServiceUrl : "http://lc25.uk.ibm.com:9083/profiles/ibm_semanticTagServlet",
request : null,

and an associated getProfileInfo function: -

getProfileInfo : function(crossDomainRequest, callback, keyValue, searchKey) {
var searchKeySpecified = !(searchKey == null);
if (!searchKeySpecified) searchKey = "email"; // default search is by email

// logic to detect whether key is email or not.  if not email and no search key was specified, then assume key to be userid
if (keyValue.indexOf("@") == -1 && !searchKeySpecified) searchKey =  "userid";

if (!crossDomainRequest) {
if (window.ActiveXObject) {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
}

if (request) {
// synchronous request
request.open("GET", BusinessCard.profileServiceUrl + '/json/profile.do?' + searchKey + '=' + keyValue + '&variable=person', false);

request.send(null);

if (request.status == 200) {
eval(request.responseText);
return person;
}
}
}
else {
var script = document.createElement("script");
script.src = BusinessCard.profileServiceUrl + '/json/profile.do?' + searchKey + '=' + keyValue + '&callback=' + callback;
document.getElementsByTagName('head')[0].appendChild(script);
}
}

Therefore, it's my view that there's some kind of network inconsistency between Portal and Connections that intermittently fails to connect to the URL, and therefore returns the WRONG BusinessCard object, meaning that things don't work.

What I did find that, to move from this not working to working, I merely needed to suspend and resume my Ubuntu laptop on which I'm running LDAP, Portal and Connections in separate VMware images. My current view is that there's some kind of network inconsistency between Portal and Connections, that gets "cleared" by the suspend/resume operation of the host OS, even though all of the guests are using NAT rather than bridged networking.

So, over to the community - what AM i missing ?

For the record, I've got WebSphere Portal 6.1.5.1 ( upgraded from 6.1.5.0 ) and Lotus Connections 2.5.0.2 ( LC2502_Fixpack.jar,  LO51606.jar,  LO51608.jar,  LO51610.jar,  LO53141.jar, LO51605.jar, LO51607.jar,  LO51609.jar,  LO51615.jar ).



Wednesday 8 September 2010

VMware Tools - Forcing the Issue

I managed to get into a state with VMware Tools on a Red Hat VM ( RHEL 5.5 if it helps ), where I couldn't start or use the tools, and yet couldn't install them either :-)

Having extracted the contents of the tools archive: -

VMwareTools-8.4.3-282343.tar.gz

to /tmp, I tried to run the installation: -

/tmp/vmware-tools-distrib/vmware-install.pl

and immediately got: -

A previous installation of VMware Tools has been detected.

The previous installation was made by the tar installer (version 4).

Keeping the tar4 installer database format.

You have a version of VMware Tools installed.  Continuing this install will
first uninstall the currently installed version.  Do you wish to continue?
(yes/no) [yes]

Error: Unable to execute "/usr/bin/vmware-uninstall-tools.pl.

Uninstall failed.  Please correct the failure and re run the install.

Execution aborted.

which was less than helpful.

So I can't install the tools because I can't uninstall the tools - which I can't use in the first place :-)

A quickr Google of the exception ( Error: Unable to execute "/usr/bin/vmware-uninstall-tools.pl. ) led me to the VMware forums: -

http://communities.vmware.com/thread/221719

which, although it didn't appear to help the original poster, helped me in that the responder said: -

"...Also since "vmware-install.pl" is a link to "/vmware-tools-distrib/bin/vmware-uninstall-tools.pl"..."

Lo and behold, he's right - I ran the following command: -

/tmp/vmware-tools-distrib/bin/vmware-uninstall-tools.pl

and saw: -

Uninstalling the tar installation of VMware Tools.

Restoring the kernel initrd image.:
The removal of VMware Tools 8.4.3 build-282343 for Linux completed
successfully.  Thank you for having tried this software.

I was then able to install the tools again using /tmp/vmware-tools-distrib/vmware-install.pl and all is good.

/etc/hosts or DNS - sorting it out on Red Hat Enterprise Linux

During my recent battle with Domino and hostnames ( more to come soon ), I stumbled upon this rather useful little configuration file: -

/etc/nsswitch.conf

in Red Hat Enterprise Linux 5.4.

Amongst other gems, it contains the magic line: -

hosts:      files dns

which means that hosts are looked up via /etc/hosts before heading off to the wacky world of DNS.

For the record, AIX uses an environment variable called NSORDER

export NSORDER=bind,local,nis

as per this wiki article: -

Installing and configuring IBM Lotus Domino 8.5 on AIX

Now is that useful, or what ?

Starting Lotus Domino on Linux

This is one of those facts that I knew, and yet had forgotten - the primary reason that I blog is to write down what happened, so I don't forget it or, if I do forget it, to find it again :-)

Working with Lotus Domino 8.5.1 FP3 on Red Hat Enterprise Linux 5.4, I was wondering why I was unable to start the server, or its constituent tasks: -

a) Log in as the Notes user ( idcuser in my case )
b) Change to the Notes data directory

    cd /local/notesdata

c) Execute the Domino task e.g. server, http etc.: -

/opt/ibm/lotus/notes/latest/linux/http

d) Get the message: -

/opt/ibm/lotus/notes/latest/linux/http: error while loading shared libraries: libhttpstack.so: cannot open shared object file: No such file or directory

I was then directed to an existing startup script: -

/local/notesdata/DomShrct.sh

which contains precisely one line: -

su idcuser -c "cd /local/notesdata; /opt/ibm/lotus/bin/server; "

Note that it executes the Domino binary from /opt/ibm/lotus/bin - exploring this further with: -

ls -al /opt/ibm/lotus/bin/server

shows me that it's "merely" a symbolic link to another place: -

lrwxrwxrwx 1 root root 32 Sep  2 20:37 /opt/ibm/lotus/bin/server -> /opt/ibm/lotus/bin/tools/startup

However, it works a treat, and I can use a similar syntax for other tasks: -

su idcuser -c "cd /local/notesdata; /opt/ibm/lotus/bin/http;"

su idcuser -c "cd /local/notesdata; /opt/ibm/lotus/bin/ldapsearch;"

etc.

Is that sweet, or what ?

Monday 6 September 2010

Lotus Connections 2.5 - Linking from the Person Card - Don't use JavaScript in your URLs

Following on from my earlier post, I've hit a roadblock in my plan to create a link from the Lotus Connections Person Card which opens in a new, rather than in the same, window.

As I'd mentioned, I was using the sloc:serviceReference stanza in LotusConnections-config.xml to create the link, using the code: -

<sloc:serviceReference serviceName="googleService"
  href="http://www.google.com"   enabled="true"
  ssl_href="http://www.google.com"   ssl_enabled="false"
  person_card_service_url_pattern="/search?hl=en&amp;q={email}&amp;btnG=Google+Search"
  person_card_service_name_js_eval="'Google Me'"/>

which works OK, but causes the Google page to open in the same window as Connections.

Therefore, I thought I'd be a smartypants, and replace the href= tag with something that I know works in "pure" HTML: -

<a href="javascript:void(window.open('http://www.google.com','width=300','height=300'))">Google Me</a>

giving me: -

<sloc:serviceReference serviceName="googleService"
  href="http://www.google.com"   enabled="true"
  ssl_href="http://www.google.com"   ssl_enabled="false"
  person_card_service_url_pattern="/search?hl=en&amp;q={email}&amp;btnG=Google+Search"
  person_card_service_name_js_eval="'Google Me'"/

Well, that was a great idea .... until I started Profiles, at which point I saw: -

9/6/10 15:55:11:687 BST] 00000051 VenturaConfig E com.ibm.ventura.internal.config.VenturaConfigurationProviderImpl getServiceURL CLFRO2006E: com.ibm.ventura.internal.config.VenturaConfigurationProviderImpl href attribute in googleService service element cannot be used to construct a proper URL
                                 java.net.MalformedURLException: unknown protocol: javascript
        at java.net.URL.<init>(URL.java:609)
        at java.net.URL.<init>(URL.java:499)
        at java.net.URL.<init>(URL.java:448)

in the SystemOut.log file.

Looking at the exception: -

java.net.MalformedURLException: unknown protocol: javascript

this actually makes sense, as Connections is taking the contents of the href= tag, and using it to create a Java object of type java.net.URL which, as per the Javadoc

<snip>
Parameters:
protocol - the name of the protocol to use.
host - the name of the host.
port - the port number on the host.
file - the file on the host
Throws:
MalformedURLException - if an unknown protocol is specified.
</snip>

doesn't expect to see stuff other than a "real" URL encoded within it.

So, I'll have to search elsewhere - not sure where but .... watch this space ....


Lotus Connections 2.5 - Checking Out Configurations Don't Work For Me

I'm currently working on a requirement to add a link to the top-half of the Lotus Connections 2.5 Business Card, linking off to a separate application. Part of the requirement is to open this separate application in a new window, rather than over-writing the window in which the user is currently accessing Connections or, at least, the Business Card.

Following the Information Centre here: -

Adding third-party links via the XML configuration file

I'm directed to modify LotusConnections-config.xml *AND* service-location.xsd

Now I'm quite happy to check out the configuration files: -

/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh -lang jython
execfile("/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/config/bin_lc_admin/connectionsConfig.py")
LCConfigService.checkOutConfig("/root","lc25Cell01")

and then hand edit LotusConnections-config.xml and service-location.xsd before checking them back in again: -

LCConfigService.checkInConfig()

and synchronise the nodes: -

synchAllNodes()

*BUT* I didn't expect the check in process to (a) not update the copy of service-location.xsd held within the cell configuration and (b) even worse, revert it back to it's pre-exported state.

The symptoms that I saw, when starting Profiles, were: -

9/6/10 15:04:11:420 BST] 0000002e VenturaConfig E com.ibm.ventura.internal.config.VenturaConfigFileValidator$DefaultContentHandler error CLFRO2024I: Error Line 142: cvc-enumeration-valid: Value 'googleService' is not facet-valid with respect to enumeration '[activities, blogs, communities, directory, dogear, personTag, presenceAwareness, profiles, sametimeLinks, homepage, quickr, search, wikis, files, global, news, mobile]'. It must be a value from the enumeration.

                                 org.xml.sax.SAXParseException: cvc-enumeration-valid: Value 'googleService' is not facet-valid with respect to enumeration '[activities, blogs, communities, directory, dogear, personTag, presenceAwareness, profiles, sametimeLinks, homepage, quickr, search, wikis, files, global, news, mobile]'. It must be a value from the enumeration.
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
...

[9/6/10 15:04:11:432 BST] 0000002e VenturaConfig E com.ibm.ventura.internal.config.VenturaConfigurationProviderImpl getConfiguration CLFRO2001E: com.ibm.ventura.internal.config.VenturaConfigurationProviderImpl Error processing config file: path /opt/IBM/WebSphere/AppServer/profiles/AppSrv01//config//cells//lc25Cell01//LotusConnections-config, filename LotusConnections-config.xml
                                 com.ibm.ventura.internal.config.exception.ValidationException: cvc-enumeration-valid: Value 'googleService' is not facet-valid with respect to enumeration '[activities, blogs, communities, directory, dogear, personTag, presenceAwareness, profiles, sametimeLinks, homepage, quickr, search, wikis, files, global, news, mobile]'. It must be a value from the enumeration.
        at com.ibm.ventura.internal.config.VenturaConfigFileValidator.validateDoc(VenturaConfigFileValidator.java:118)
        at com.ibm.ventura.internal.config.VenturaConfigFileValidator.validateConfigurationFile(VenturaConfigFileValidator.java:79)
        at com.ibm.ventura.internal.config.VenturaConfigurationProviderImpl.getConfiguration(VenturaConfigurationProviderImpl.java:370)
...

Now the exception makes it quite clear - I've referenced a service called googleService which doesn't exist in service-location.xsd *because* the check-in process didn't upload the changes.

This is the "vanilla" copy of the file: -

        <xsd:simpleType name="serviceNames">
                <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="activities" />
                        <xsd:enumeration value="blogs" />
                        <xsd:enumeration value="communities" />
                        <xsd:enumeration value="directory" />
                        <xsd:enumeration value="dogear" />
                        <xsd:enumeration value="personTag" />
                        <xsd:enumeration value="presenceAwareness" />
                        <xsd:enumeration value="profiles" />
                        <xsd:enumeration value="sametimeLinks" />
                        <xsd:enumeration value="homepage" />
                        <xsd:enumeration value="quickr" />
                        <xsd:enumeration value="search" />
                        <xsd:enumeration value="wikis" />
                        <xsd:enumeration value="files" />
                        <xsd:enumeration value="global" />
                        <xsd:enumeration value="news" />
                        <xsd:enumeration value="mobile" />
                </xsd:restriction>
        </xsd:simpleType>

and this is my edited version: -

        <xsd:simpleType name="serviceNames">
                <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="activities" />
                        <xsd:enumeration value="blogs" />
                        <xsd:enumeration value="communities" />
                        <xsd:enumeration value="directory" />
                        <xsd:enumeration value="dogear" />
                        <xsd:enumeration value="personTag" />
                        <xsd:enumeration value="presenceAwareness" />
                        <xsd:enumeration value="profiles" />
                        <xsd:enumeration value="sametimeLinks" />
                        <xsd:enumeration value="homepage" />
                        <xsd:enumeration value="quickr" />
                        <xsd:enumeration value="search" />
                        <xsd:enumeration value="wikis" />
                        <xsd:enumeration value="files" />
                        <xsd:enumeration value="global" />
                        <xsd:enumeration value="news" />
                        <xsd:enumeration value="mobile" />
                        <xsd:enumeration value="googleService" />
                </xsd:restriction>
        </xsd:simpleType>

Once I realised, all was well.

For the record, here's the entry that I added into LotusConnections-config.xml as per the Information Centre: -

<sloc:serviceReference serviceName="googleService"
  href="http://www.google.com"   enabled="true"
  ssl_href="http://www.google.com"   ssl_enabled="false"
  person_card_service_url_pattern="/search?hl=en&amp;q={email}&amp;btnG=Google+Search"
  person_card_service_name_js_eval="'Google Me'"/>

I'll keep hacking away to achieve my objective of opening the Google service in a new window, and report back.

Weird problem with Shared Folders in VMware Workstation - SORTED!

Hmmm, for the first time ever, I wasn't able to mount a VMware Shared Folder, using VMware Workstation 7.1.1 build-282343, running on Ubuntu 10.04.

My guest OS is a 64-bit instance of Red Hat Enterprise Linux 5.5, freshly updated using YUM.

Initially, I didn't have the VMware Tools package installed, so extracted it ( VMwareTools-8.4.3-282343.tar.gz ) from the ISO that's included with Workstation, and installed and configured it in the normal manner.

Following a reboot, I was able to choose a directory from my host OS to map as a Shared Folder, but the folder itself never appeared under /mnt/hgfs - in fact, nothing appeared under /mnt.

Digging around on the web, I found a few references to SELinux causing problems with Shared Folders, but I'm not using SELinux, having opted to disable it at installation time. I checked this by examining the file /etc/selinux/config which reads: -

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

I tried restarting VMware Tools, using the command: -

/etc/init.d/vmware-tools restart

but to no avail.

Finally, I ran the following command: -

/usr/sbin/vmware-tools-upgrader

which shouldn't have been necessary given that this was a fresh installation of VMware Tools but .... it worked.

After doing this final step, my Shared Folders burst into life under the /mnt/hgfs directory.

Weird but true ....

Sunday 5 September 2010

VMware Workstation - Times are a-changing

Following on from an LTPA-related issue that I saw yesterday, I realised why I might be having problems with the clocks in my VMs getting out of sync.

I regularly suspend my laptop with the VMs still running - the combination of VMware Workstation 7 and Ubuntu 10.04 (host) makes this very workable, and suspend/resume is a very very quick process. In fact, this combination is as efficient as running VMware Fusion on the Mac, which also handles suspend/resume of host and guest seamlessly.

Having checked this morning, and seen that the timestamps on log files in one of my VMs was 21:20 even though it's 06:39, I realised that the guest OS still thought it was yesterday :-)

Thanks to yesterday's efforts, I know that VMware Tools is up-to-date, so I thought I'd explore further.

Digging in a bit, I found this command: -

vmware-toolbox-cmd timesync enable

which, according the VMware Tools Configuration Utility User's Guide ( VMware Fusion 3.0, VMware ACE 2.6, VMware Workstation 7.0, VMware Player 3.0) [PDF]: -

After you complete this procedure, the VMware Tools service enables or disables periodic time synchronization, as you specified.

Good enough for me. My clocks are now in sync - will see how this works after my next suspend/resume e.g. what the interval is.

Saturday 4 September 2010

Lotus Connections Profiles - Not Playing Nicely with WebSphere Portal

Whilst working on my WebSphere Portal <-> Lotus Connections integration challenge, I hit upon this exception: -

[9/3/10 12:43:54:087 BST] 000000a5 ServletWrappe E   SRVE0068E: Uncaught exception thrown in one of the service methods of the servlet: /genjsp/lcaccelerator/portlets/profiles/ProfilesPortlet_myNetworkMain.jsp. Exception thrown : java.io.IOException: Server returned HTTP response code: 400 for URL: https://lc25.uk.ibm.com:9446/profiles/atom/profileService.do

in the SystemOut.log file on the portal server.

When I tried the URL: -

https://lc25.uk.ibm.com:9446/profiles/atom/profileService.do

in a browser window, I received the response: -

CLFRN1172E: The request is invalid

( full details below ).

>From a previous investigation, I know that Connections has a mechanism for retrieving an XML document ( known as a Service Document ) from Profiles using the Atom API via an HTTP request, as documented here: -

http://publib.boulder.ibm.com/infocenter/ltscnnct/v2r0/topic/com.ibm.connections.25.help/r_api_prof_get_service_doc.html

I tested the two mechanisms with which I'm most familiar: -

https://lc25.uk.ibm.com:9446/profiles/atom/profileService.do?email=padmin@uk.ibm.com

and: -

https://lc25.uk.ibm.com:9446/profiles/atom/profileService.do?userid=24dcc5c0-23b2-102f-8265-e965b3598651

This suggests that the portlet isn't sending a valid userid with the HTTP/Atom request.

Given that I'm also seeing: -

[9/4/10 14:42:22:133 BST] 00000071 LTPAServerObj W   SECJ0371W: Validation of the LTPA token failed because the token expired with the following info: Token expiration Date: Fri Sep 03 14:43:45 BST 2010, current Date: Sat Sep 04 14:42:22 BST 2010.

in the SystemOut.log file on the Profiles WAS instance, I'm wondering whether there's an LTPA-related SSO issue between Portal and Connections.

I'm going to regenerate the LTPA token on Portal, import it into Connections, and try again.

Will report back ...









Full details of exception: -

-<error>
<code>
400
</code>

<message>
CLFRN1172E: The request is invalid.
</message>

<trace>
com.ibm.lconn.profiles.api.actions.APIException
at com.ibm.lconn.profiles.api.actions.APIAction.assertNotNull(APIAction.java:161)
at com.ibm.lconn.profiles.api.actions.APIAction.assertNotNull(APIAction.java:154)
at com.ibm.lconn.profiles.api.actions.ProfilesServiceAction.getBean(ProfilesServiceAction.java:181)
at com.ibm.lconn.profiles.api.actions.ProfilesServiceAction.getLastModified(ProfilesServiceAction.java:162)
at com.ibm.lconn.profiles.web.actions.BaseAction.execute(BaseAction.java:150)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1146)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1087)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:145)
at com.ibm.peoplepages.web.rpfilter.RPFilter.doFilter(RPFilter.java:154)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.util.lang.LanguageFilter.doFilter(LanguageFilter.java:105)
at com.ibm.lconn.core.web.util.lang.LanguageFilter.doFilter(LanguageFilter.java:73)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.profiles.web.servlet.DisableSSLCachingFilter.doFilter(DisableSSLCachingFilter.java:62)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.auth.LCRestSecurityFilter.doFilter(LCRestSecurityFilter.java:157)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.profiles.web.servlet.AppContextFilter.doFilter(AppContextFilter.java:286)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.auth.LCBasicAuthFilter.doFilter(LCBasicAuthFilter.java:79)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.auth.LCUserDataConstraintFilter.doFilter(LCUserDataConstraintFilter.java:84)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.request.HttpRequestFilter.doFilter(HttpRequestFilter.java:77)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.util.lang.I18NFilter.doFilter(I18NFilter.java:203)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.lconn.core.web.util.Utf8CharsetFilter.doFilter(Utf8CharsetFilter.java:45)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:837)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:680)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:588)
at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:525)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:90)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:751)
at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1478)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:126)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:267)
at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1037)
at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.readyInboundPostHandshake(SSLConnectionLink.java:725)
at com.ibm.ws.ssl.channel.impl.SSLConnectionLink$MyHandshakeCompletedCallback.complete(SSLConnectionLink.java:412)
at com.ibm.ws.ssl.channel.impl.SSLUtils.handleHandshake(SSLUtils.java:869)
at com.ibm.ws.ssl.channel.impl.SSLHandshakeIOCallback.complete(SSLHandshakeIOCallback.java:70)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:196)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:751)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:881)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1497)
</trace>
</error>

Success - Using Web Application Integrator to integrate Lotus Quickr for WebSphere Portal 8.5 into a portal page

Following on from yesterday's post, I've worked out how to use the Web Application Integrator (WA) portlet / functionality to integrate Lotus Quickr 8.5 into a portal page.

In the past, this has been relatively simply, using the previous 8.1.1 version of Quickr, as I've blogged about here and here.

Now perhaps the precise use case for this needs to be defined, as there are multiple ways to integrate Portal and Quickr, including WebSphere Portlet Factory Designer ( consuming Quickr via RESTful services ), the Places Catalog Portlet, the My Places Portlet etc.

However, in this case, let's accept that we need to bring the Places page ( the one that contains Public Places and My Places ) into a portal page.

I'm pretty comfortable with the basics of WAI, but was struggling to know precisely which JSP I needed to "hack" in order to inject the JavaScript that the WAI portlet generates.

After much hacking about, I've worked it out - I'm probably a bit dense, but I had assumed that all of Quickr's user experience was coming from a single Java Enterprise Edition application ( wps.ear ).

How the world has changed - now we live in a world where Quickr ( or, to be more precise, the underlying WebSphere Portal ) renders content from a variety of different enterprise/web applications, not all of which are running within the WPS.EAR application.

Therefore, after much digging, I found out that the "offending" application is Place Center App User Interface ( or placeCntrAppUI, to give it it's correct name ).

This application is located here: -

/opt/IBM/Quickr/wp_profile/installedApps/quickr85/placeCntrApp.ear/placeCntrAppUI.war

with the UI coming from: -

/opt/IBM/Quickr/wp_profile/installedApps/quickr85/placeCntrApp.ear/placeCntrAppUI.war/WEB-INF/jsp

Having discovered this, it was then a relatively simple manner to amend the file catalog.jsp and comment out the statement that "includes" the banner JSP ( banner.jspf ) as follows: -

<!--
                        <%@ include file="banner.jspf" %>
--!>

and added in the WAI JavaScript code: -

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

immediately below, so that the JSP now looks as follows: -

<snip>
               <script type="text/javascript" src="<c:out value='${path}/javascript/js.jsp?debugMode=${initParams.debugMode}&locale=${pageContext.request.locale}&layer=placeCenter'/>"></script>
                <div class="lotusFrame" id="mainContentDiv">

<!--
                        <%@ include file="banner.jspf" %>
--!>

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

                        <div class="lotusTitleBar">
                                <div class="lotusRightCorner">
                                        <div class="lotusInner">
                                                <div dojoType="ibm.lotus.theme.NavigationBar"
</snip>

Having done this, I'm now able to access the Places page through WebSphere Portal, with the portal navigation etc. preserved throughout.

I then added to my sense of success by doing the same thing with the Place Catalog Administration page, which is located here: -

/opt/IBM/Quickr/wp_profile/installedApps/quickr85/placeCntrApp.ear/placeCntrAdminUI.war/WEB-INF/jsp

Again, I edited a JSP ( admin.jsp ) and commented out the include statement for navigation.jsp : -

<!--
                        <%@ include file="navigation.jspf" %>
--!>

and added in the WAI JS: -

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

so the resulting JSP looks like this: -

<snip>
                                helpTopic="/com.ibm.lotus.qpp.places.help/admin/pc_managing_sources.html">
                        </div>

<!--
                        <%@ include file="navigation.jspf" %>
--!>

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

                        <div class="lotusMain">
                                <div class="lotusContent">
</snip>

and then did the same with the the page that's used to create new places - templates.jsp - which is located here: -

/opt/IBM/Quickr/wp_profile/installedApps/quickr85/placeCntrApp.ear/placeCntrAppUI.war/WEB-INF/jsp

so that it looks like this: -

<snip>
               <script type="text/javascript" src="<c:out value='${path}/javascript/js.jsp?debugMode=${initParams.debugMode}&locale=${pageContext.request.locale}&layer=templateCenter'/>"></script>
                <div class="lotusFrame">

<!--
                        <%@ include file="banner.jspf" %>
--!>

<!-- BEGIN PORTAL NAVIGATION INTEGRATION -->
<script type="text/javascript" src="http://wps615.uk.ibm.com:10040/wps/myportal/!ut/p/c5/XcjBCoIwGADgZ_HQ-f8Xae44IWUMxZiVeZElostwY1tFb1_n-G4fdPCzqpeeVNBmVQ-o3uONWcvXME5OBeM2-D_QQpf02OwFFwXBojxlyFlGkqKOETGGC7S46-Udjf-ktNSSimZYvFzwidfUC2krMlByzo8HVrvtHLMI7GyiL2_foN0!/"></script>
<!-- END PORTAL NAVIGATION INTEGRATION -->

                        <div class="lotusTitleBar">
                                <div class="lotusRightCorner">
                                        <div class="lotusInner">
</snip>

Right, time for a cup of tea to celebrate ...

Friday 3 September 2010

IBM Lotus Quickr for WebSphere Portal 8.5 - Various Notes on Administration

So, I've been looking at, and playing, with the latest version, 8.5, of IBM Lotus Quickr for WebSphere Portal, trying to ascertain how I can bring Quickr into another WebSphere Portal environment, using the Web Application Integrator portlet.

Now, I've done this before with earlier versions of Quickr, as blogged here and here, but 8.5 is currently foxing me ( and others ).

Digging into Quickr, it reminds me of one of those Russian Matryoshka dolls, with each layer containing another layer, perhaps going down to infinity.

So, I've learnt a few things today - in the first instance, there are a number of layers of administration, from the normal Quickr Places-based administration, right down to the pure WebSphere Portal 6.1.5 administration UI, that's buried beneath the surface.

Having hooked my Quickr server up to LDAP ( IBM Tivoli Directory Server 6.2 ), it's taken me a while to work out which ID to use where - in the end, having configured the underlying portal to use an LDAP user ( similar to wpsadmin of old ), via the ConfigEngine tasks: -

./ConfigEngine.sh wp-change-was-admin-user
./ConfigEngine.sh wp-change-portal-admin-user

I realised that I still needed to do a manual "hack" in order to get my LDAP user to access the crown jewels of the admin UI. This required me to log into the WAS Integrated Solutions Console, using the LDAP user, and locate the Enterprise Application, QuickrNextAdmin.

I stopped the application, and then used the Security role to user/group mapping and, having searched for and found my LDAP admin user, add it to the Administrator role. Once I started the application again, I was able to log into the Places Administration UI, and then click the Advanced Administration link to get to the meat of the situation - at this point, I'm back in good old WebSphere Portal land, which is my comfort zone.

So here's the URLs, for the record: -

Normal URLs

https://quickr85.uk.ibm.com:10035/places/

https://quickr85.uk.ibm.com:10035/places/publicplaces

https://quickr85.uk.ibm.com:10035/places/myplaces

Admin URLs

Places Administration

http://quickr85.uk.ibm.com:10040/QuickrAdmin/

Place Catalog Administration

http://quickr85.uk.ibm.com:10040/places/admin/app

Advanced Administration

https://quickr85.uk.ibm.com:10035/lotus/mypoc/!ut/p/digest!b0dWmDx3zxfGEAehkKu0fw/?uri=nm:oid:ibm.qp.Advanced%2520Administration

WebSphere Integrated Solutions Console

https://quickr85.uk.ibm.com:10041/ibm/console/logon.jsp

Now, back to Web Application Integrator ....

Thursday 2 September 2010

Getting the Lotus Connections Portlet to work with WebSEAL

Whilst Googling around, I discovered this rather useful posting from one of the gurus of Lotus Connections, Luis Benitez, and thought I'd share it far and wide ....

Last week, I spent a day at a customer up in New Jersey. They are currently deploying a pilot of Lotus Connections 2.5. One of the most important things for them is to be able to mash up Lotus Connections with their existing intranet applications via their portal (powered by WebSphere Portal, of course).

To simplify sign on for all their employees, they use WebSEAL and SPNEGO to provide single sign on for all web applications. This way, an employee logs on to their workstation in the morning, and they are never prompted to log on again to other web applications.


http://www.lbenitez.com/2010/05/getting-lotus-connections-portlet-to.html

Thanks for sharing, Luis, much obliged.


Wednesday 1 September 2010

WebSphere Portal and Lotus Web Content Management v7

Following my earlier post, I've not yet downloaded WebSphere Portal v7, given that I'm on a low-bandwidth ADSL connection, but am pleased to report that the documentation is now available: -

WebSphere Portal and Lotus Web Content Management - Product documentation

http://www.ibm.com/developerworks/websphere/zones/portal/proddoc.html

with the system requirements here: -

WebSphere Portal V7.0 detailed system requirements

http://www-01.ibm.com/support/docview.wss?uid=swg27007791

Am looking forward to a MASSIVE download session whilst I'm at an IBM location next week, with WP7, WebSphere Portlet Factory 7 and the beta of Lotus Connections RNext ...........

Visual Studio Code - Wow 🙀

Why did I not know that I can merely hit [cmd] [p]  to bring up a search box allowing me to search my project e.g. a repo cloned from GitHub...