Wednesday, 8 February 2012

Integrating IBM Connections 3.0.1 with WebSphere Portal 7.0 using Page Builder 2 Themes

This popped up on Twitter earlier today - it's a new article up on the Connections Wiki, written by Roberto Boccadoro and Andrea Fontana.

This article describes how to integrate IBM Connections 3.0.1 with WebSphere Portal 7 when using Page Builder 2 themes (the default for Portal 7). 

Integrating IBM Connections 3.0.1 and WebSphere Portal 7 is not possible using WebSphere Application Integrator (WAI) because WAI does not support Page Builder 2 themes. This article shows how to obtain a result similar to the one that was possible with WebSphere Portal 6 using WAI, namely, hiding the navigation header of IBM Connections and allowing navigation only through Portal.

• 1 Overview
• 2 Creating a Stylesheet to Customize the UI
• 3 Creating a Stylesheet to Hide the IBM Connections Navigation Header
• 4 Modifying JavaServer Pages (.jsp) Files
• 4.1 Activities
• 4.2 Blogs
• 4.3 Communities
• 4.4 Bookmarks
• 4.5 Files
• 4.6 Profiles
• 4.7 Wikis
• 4.8 Forums
• 4.9 Home Page
• 5 Building the Integration Pages in the Portal
• 6 Verifying Results
• 7 Creating URLs Instead of Pages
• 8 About the Authors


Saturday, 4 February 2012

IBM Tivoli Directory Integrator - java.lang.IllegalArgumentException: Bad arguments

This one baffled me for a good 10-15 minutes on Friday.

When I ran any TDI script ( this is TDI 7.0.0.5 as used with Connections 3.0.1 ), including populate_from_dn_file.sh

<snip>
CTGDKD024I Remote API successfully started on port:1099, bound to:'SessionFactory'. SSL and Client Authentication are enabled.

Platform: 'Generic' 
java.lang.IllegalArgumentException: Bad arguments 
        at javax.crypto.Cipher.doFinal(Unknown Source) 
        at com.ibm.di.security.RSACrypto.decrypt(RSACrypto.java:145) 
        at com.ibm.di.util.PropertiesFile$Property.decryptPropertyValue(PropertiesFile.java:411) 
        at com.ibm.di.util.PropertiesFile$Property.getValue(PropertiesFile.java:221) 
        at com.ibm.di.util.PropertiesFile.getProperty(PropertiesFile.java:795) 
        at com.ibm.di.connector.PropertiesConnector.findEntry(PropertiesConnector.java:635) 
        at com.ibm.di.connector.PropertiesConnector.getNextEntry(PropertiesConnector.java:595) 
        at com.ibm.di.config.interfaces.TDIPropertyStore.advanceIterator(TDIPropertyStore.java:693) 
        at com.ibm.di.config.interfaces.TDIPropertyStore.hasNext(TDIPropertyStore.java:648) 
        at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) 
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
        at java.lang.reflect.Method.invoke(Method.java:618) 
        at com.ibm.jscript.types.JavaAccessObject.call(JavaAccessObject.java:298) 
        at com.ibm.jscript.types.FBSObject.call(FBSObject.java:153) 
        at com.ibm.jscript.ASTTree.ASTCall.interpret(ASTCall.java:151) 
        at com.ibm.jscript.ASTTree.ASTWhile.interpret(ASTWhile.java:61) 
        at com.ibm.jscript.std.FunctionObject._executeFunction(FunctionObject.java:230) 
        at com.ibm.jscript.std.FunctionObject.executeFunction(FunctionObject.java:162) 
        at com.ibm.jscript.std.FunctionObject.call(FunctionObject.java:148) 
        at com.ibm.jscript.types.FBSObject.call(FBSObject.java:153) 
        at com.ibm.jscript.ASTTree.ASTCall.interpret(ASTCall.java:151) 
        at com.ibm.jscript.ASTTree.ASTObjectLiteral.interpret(ASTObjectLiteral.java:72) 
        at com.ibm.jscript.ASTTree.ASTAssign.interpret(ASTAssign.java:90) 
        at com.ibm.jscript.ASTTree.ASTProgram.interpretEx(ASTProgram.java:102) 
        at com.ibm.jscript.JSExpression.interpretExpression(JSExpression.java:399) 
        at com.ibm.jscript.JSExpression.evaluateValue(JSExpression.java:249) 
        at com.ibm.jscript.JSExpression.evaluateValue(JSExpression.java:236) 
        at com.ibm.jscript.JSExpression.evaluateValue(JSExpression.java:239) 
        at com.ibm.jscript.JSInterpreter.interpret(JSInterpreter.java:53) 
        at com.ibm.di.script.ScriptEngine.interpret(ScriptEngine.java:867) 
        at com.ibm.di.script.ScriptEngine.exec(ScriptEngine.java:495) 
        at com.ibm.di.script.ScriptEngine.loadScript(ScriptEngine.java:622) 
        at com.ibm.di.script.ScriptEngine.includeAllScripts(ScriptEngine.java:726) 
        at com.ibm.di.script.ScriptEngine.includeAllScripts(ScriptEngine.java:752) 
        at com.ibm.di.server.AssemblyLine.autoIncludeScripts(AssemblyLine.java:2626) 
        at com.ibm.di.server.AssemblyLine.initScriptEngine(AssemblyLine.java:2205) 
        at com.ibm.di.server.AssemblyLine.msStart(AssemblyLine.java:3243) 
        at com.ibm.di.server.AssemblyLine.executeMainStep(AssemblyLine.java:3145) 
        at com.ibm.di.server.AssemblyLine.executeMainLoop(AssemblyLine.java:2818) 
        at com.ibm.di.server.AssemblyLine.executeMainLoop(AssemblyLine.java:2801) 
        at com.ibm.di.server.AssemblyLine.executeAL(AssemblyLine.java:2770) 
        at com.ibm.di.server.AssemblyLine.run(AssemblyLine.java:1275)


2012-02-03 14:42:40,652 INFO  [convert_uids_for_customer] - CTGDIR103W The properties file '/opt/IBM/TDI/V7.0/tdisol_FM/TDI/301.properties' for  was not found, and will be created if anything is written to it. 
2012-02-03 14:42:40,789 ERROR [AssemblyLine.AssemblyLines/dump_profiles.1] - [read_whole_db] CTGDIS810E handleException - cannot handle exception , initialize java.lang.IllegalArgumentException: Bad arguments 
        at javax.crypto.Cipher.doFinal(Unknown Source) 
        at com.ibm.di.security.RSACrypto.decrypt(RSACrypto.java:145) 
        at com.ibm.di.util.PropertiesFile$Property.decryptPropertyValue(PropertiesFile.java:411) 
        at com.ibm.di.util.PropertiesFile$Property.getValue(PropertiesFile.java:221) 
        at com.ibm.di.util.PropertiesFile.getProperty(PropertiesFile.java:795) 
        at com.ibm.di.connector.PropertiesConnector.findEntry(PropertiesConnector.java:635) 
        at com.ibm.di.config.interfaces.TDIPropertyStore.getPropertyEntry(TDIPropertyStore.java:426) 
        at com.ibm.di.config.interfaces.TDIPropertyStore.getProperty(TDIPropertyStore.java:384) 
        at com.ibm.di.config.interfaces.TDIProperties.getProperty(TDIProperties.java:351) 
        at com.ibm.lconn.profiles.api.tdi.connectors.Util.AbstractProfilesConnector.initializeInternal(AbstractProfilesConnector.java:72) 
        at com.ibm.lconn.profiles.api.tdi.connectors.Util.AbstractProfilesConnector.initialize(AbstractProfilesConnector.java:53)

        at com.ibm.di.server.AssemblyLineComponent.doInitialize(AssemblyLineComponent.java:1129) 
        at com.ibm.di.server.AssemblyLineComponent.initialize(AssemblyLineComponent.java:1110) 
        at com.ibm.di.server.AssemblyLine.initConnectors(AssemblyLine.java:1865) 
        at com.ibm.di.server.AssemblyLine.msInitConn(AssemblyLine.java:3335) 
        at com.ibm.di.server.AssemblyLine.executeMainStep(AssemblyLine.java:3157) 
        at com.ibm.di.server.AssemblyLine.executeMainLoop(AssemblyLine.java:2818) 
        at com.ibm.di.server.AssemblyLine.executeMainLoop(AssemblyLine.java:2801) 
        at com.ibm.di.server.AssemblyLine.executeAL(AssemblyLine.java:2770) 
        at com.ibm.di.server.AssemblyLine.run(AssemblyLine.java:1275) 
2012-02-03 14:42:40,790 ERROR [AssemblyLine.AssemblyLines/dump_profiles.1] - CTGDIS266E Error in InitConnectors. Exception occurred: java.lang.IllegalArgumentException: Bad arguments 
java.lang.IllegalArgumentException: Bad arguments 

        at javax.crypto.Cipher.doFinal(Unknown Source) 
        at com.ibm.di.security.RSACrypto.decrypt(RSACrypto.java:145) 
        at com.ibm.di.util.PropertiesFile$Property.decryptPropertyValue(PropertiesFile.java:411) 
        at com.ibm.di.util.PropertiesFile$Property.getValue(PropertiesFile.java:221)

</snip>

I was getting really really cross as I couldn't see what had led to this problem. However, having just updated the SSL certificates between TDI and LDAP ( Active Directory ), I wasted a bit of time checking that the certificates were correct.

Then I remembered that I'd also updated the password in profiles_tdi.properties for the target database ( DB2 UDB ) ….

Even with that clue, it still took me two or three attempts to realise that, when I'd pasted the new password into profiles_tdi.properties, I'd inadvertently included a …. CR/LF character.

I was fooled because the encoded password wraps around onto a second line so I saw: -

{protect}-dbrepos_password={encr}f9dfa8r348rufdu9r8849089df8f89dfhdjhrkhwerjh32984r9fud9f9dsu90r[23ij4repdfua9sudf90[dsr0u2390ruefjaf
9832rufdifp8dsgy7sysuhuhrh3ur3y48dfsf8sdafkjhlkhrew

and read it as: -

{protect}-dbrepos_password={encr}f9dfa8r348rufdu9r8849089df8f89dfhdjhrkhwerjh32984r9fud9f9dsu90r[23ij4repdfua9sudf90[dsr0u2390ruefjaf9832rufdifp8dsgy7sysuhuhrh3ur3y48dfsf8sdafkjhlkhrew

whereas it was actually stored in the file as: -

{protect}-dbrepos_password={encr}f9dfa8r348rufdu9r8849089df8f89dfhdjhrkhwerjh32984r9fud9f9dsu90r[23ij4repdfua9sudf90[dsr0u2390ruefjaf [CR/LF]
9832rufdifp8dsgy7sysuhuhrh3ur3y48dfsf8sdafkjhlkhrew

meaning that TDI didn't know what to with this line: -

9832rufdifp8dsgy7sysuhuhrh3ur3y48dfsf8sdafkjhlkhrew

in its properties file, hence the nasty ( but actually quite revealing ) java.lang.IllegalArgumentException.

Bottom line, check your property files, and avoid copy/paste.

Newbie error :-)

Thursday, 2 February 2012

Lialis - WebDAV for IBM Connections & Lotus Quickr

Luis Benitez blogged about this solution earlier today

• Downloading synchronizing content from/to IBM Connections Files
• Deliver shared drives connected to IBM Connections to the users PC (OS independent)
• Allow easy archiving of content stored in IBM Connections by coping the files from the file share
• Readers apps supported: Goodreader, Readdledocs, Bitknex, WebDrive, readers for Android (*)
• Download files from IBM Connections, upload files to IBM Connections via WebDAV
• Delete files in IBM Connections via WebDAV
• Create communities or profiles inside the IBM Connections via Webdav
• Parallel user sessions supported

Now I've used WebDAV in the past with WebSphere Portal and IBM Web Content Manager, but haven't seen it used in this way before.

As a Mac user, I like Luis' next point ….

To me the most exciting feature is the ability to use IBM Connections as a mounted drive directly on your computer. For example, if have a Mac like me you could use this solution to mount all of your IBM Connections Files directly in Finder. Set up your Finder as described here in 3 steps and you are done! Very cool, right?

Guess what I'm going to do next ?

Lialis' website is here ....

Webinar - Kapow Software: Automating Web Content Migrations to IBM WCM

One of my IBM colleagues kindly shared this with me earlier today, and I thought it might be of use to other WCM customers and prospects: -

Date - Thursday, February 9, 2012
Time - 1:00 PM - 2:00 PM EST

Kapow's software is typically reducing the time and cost of web content migrations time by 80-90%, all while improving accuracy and eliminating business disruptions.   More specifically Kapow offers a stand-alone content migration platform that can extract content and metadata (from unstructured/flat/static html content and many other sources), transform/enrich content and metadata, map source content to target templates and load directly into IBM WCM …….all with no coding and no freeze on content.  

Want to know more ? Please visit here and register.

Wednesday, 1 February 2012

IBM WebSphere Application Server - Working with Secure Sockets Layer and LDAP

We needed to apply this iFix to WebSphere Application Server 7.0.0.17 ( under IBM Connections 3.0.1 ) in order to allow WAS to pull/use the root CA SSL certificates from the client's Active Directory servers via their Big IP F5 Load Balancer.


Abstract

The end cert is typically shorter lived then the root certificate so the tasks are changed to get the root certificate.

Error Description

The retrieveSignerFromPort task should return the root signer certificate from the port's certificate chain when available.

Users Affected

All users of IBM WebSphere Application Server that use the console or task options to retrieve signers from port of remote servers.

Prior to this, we were seeing different behaviour between Connections and WebSphere Portal, which runs on WAS 7.0.0.19 - Portal was automatically pulling back the root CA certificates, whereas Connections was pulling the "end" certificates, and occasionally throwing up chaining errors :-(

I opened a PMR with IBM Support, and discovered that this iFix was sneaked into WAS 7.0.0.19 and above, which explained why Portal was working differently to Connections.

Seemples :-)

IBM Connections 3.0.1 - Email Notifications

Following on from  a question via the Twitter-sphere about whether it was possible to change the date/time that Connections sends out it's email notifications, I checked a couple of existing sources, including the Wiki and the excellent whitepaper - Customizing IBM Lotus Connections 3.0 email digests and notifications - and then asked one of the IC Development team, based in Dublin, Eire, from whence this response comes: -

There is no set 'time' for the digests, they are processed/delivered throughout the day.

The users in the system are split into 20 tranches. 
Each hour, a task runs to pick up the next applicable tranche (i.e. one whose daily digest was not processed in last 24 hours, or whose weekly digest has not run in 168 hours).

You could change the time of the hour that the task runs, but this will not give the behaviour you are looking for.

The power of social, from Twitter to Sametime to email to blog post …….

Administering IBM WebSphere Portal 7.0: A comprehensive workshop

This plopped into my inbox this morning - kudos to Thomas Hurek and Falk Posch for creating this useful document: -

The goal of this white paper is to explain the various administration and configuration tools offered by IBM WebSphere Portal 7.0. Learn about which tool to use for which task and about the new capabilities of WebSphere Portal 7.0, and understand differences from previous versions of WebSphere Portal. We take you through exercises for each tool so you can learn hands-on how to use them.

ToC

• Introduction
• What is WebSphere Portal?
• WebSphere Portal installation
• WebSphere Portal file system structure
• Command line tools
• Administration user interface: Admin portlets
• WebSphere Application Server Admin user interface
• Conclusion
• Resources
• About the authors

Note to self - Firefox and local connections

 Whilst trying to hit my NAS from Firefox on my Mac, I kept seeing errors such as:- Unable to connect Firefox can’t establish a connection t...