Upgrade to ICN 2.0.3 FP8

Here is a way to silently upgrade from IBM Content Navigator 2.0.3.x to 2.0.3 FP8. You can use this right after using the CPIT installer to be up-to-date with your ICN version. You need at least ICN to upgrade to ICN 2.0.3 FP8.

In the same folder you copied 2.0.3-ICN-FP008-LINUX.tar, execute these commands:
Continue reading

Display a new icon for each row

This post we’ll go through how to add a new custom icon, next to the lock, compound, … icons.

This is not something that can be done with configuration in ICN. It needs some customization which is near hacking but that will give us what we want.

First step, if you are intending to display an icon based on a custom property, you will have to, either add the property as an icon so it gets fetched, or customize ICN to fetch it, this is explain here.

When this is done, you can proceed to the customization of the client to use the property and display the icon. This is a 2 step process.

  • Aspect the factory of IconValue which is the multiStateIcon method of the class ecm.widget.listview.decorators.common to add your icon when toString is called on the returned object
  • Aspect the createResultSet method of the class ecm.model.ContentItem to increase the size of the first column of the Content list view

First will result in this customization, here I’m using an existing class (ecmRecordIcon) since we are not using it, but you can add some css code in the css of your plugin and use your own icon of course:

// No need to use .prototype on common since it's already a Singleton, no instance are create with new
aspect.after(common, "multiStateIcon", function (result) {
    aspect.after(result, "toString", function (resToString) {
        if (this.item && this.item.attributes.MultiFiledIn) {
            resToString += '<img class="ecmStatusIcon ecmRecordIcon" alt="Multi Filed In Document" title="Multi Filed In Document" src="' + this._blankGif + '" />';
            resToString += '<div class="dijitHidden">Multi Filed In Document</div>';
        return resToString;
    return result;

The second will look like this:

// ContentItem.createResultSet is a static method from ContentItem, no need to aspect the prototype
aspect.after(ContentItem, "createResultSet", function (result) {
    if (result && result.structure && result.structure.cells && result.structure.cells.length > 0) {
        var s = result.structure.cells[0][0];
        s.width = "71px"; // 71 is good for one new icon, add 16 per icon
        s.widthWebKit = "71px"; // You can also reuse te value and just add 16px to make it more flexible and cleaner
    return result;

And this is it. This way the IconValue will add your icon when its toString is called, and the resultSet will add some extra space to make sure it is still displayed on one line.

Use a custom property in Action.isVisible or isEnabled

Sometimes, we want to use a custom property to decide if an action should be displayed, enabled or hidden. The items provided by ICN as parameters of these functions are items as they are shown in the view, as rows. They don’t have all properties fetched, only the system ones and the ones you configured to be shown as extra columns (since they have to be fetched in order to be displayed).

As you may have noticed when overriding the isVisible and isEnabled functions, they are synchronous and they expect an immediate return. That means fetching the attributes using the item.retrieveAttributes function won’t work since it’s an asynchronous function (there is one round trip made to the ICN server to fetch them).

In this post, we’ve seen how to fetch custom attributes for all rows without showing them in a column. We will now see another way to do this, by making the ContextMenu actually asynchronous. Since the isVisible and isEnabled functions are synchronous, we will actually retrieve the attributes before showing the Context Menu for the item.
Continue reading

Fetch a custom property for all objects or rows

This post explains how to fetch a custom property you’ve added on a class for all documents retrieved by ICN, before all attributes are actually retrieved using the ContentItem.retrieveAttributes function. That means all items when displayed as row in the Content List view will have this property (also named attribute in ICN) already fetched. There are use cases for this, two of them being:

  • Using a custom attribute in the isVisible or isEnable function of an action, to decide if the action should be displayed based on business logic. I wrote about this here
  • Using a custom property to display a new icon along with the lock/compound/readon-only/… icons. I wrote about this here

After spending some time investigating how ICN works to know what custom properties to fetch when retrieving the content of a folder (openFolder action), I came to the conclusion it goes through two steps:
Continue reading

Add an extra hard-drive in CentOS 6

In this post, we are going to add an extra drive to store binaries for the CTPIT installer or a full FileNet installation. I would suggest setting the new disk as type Write-Through. That means it won’t be affected by snapshots, which is convenient in that case since we don’t need to snapshot it.

To do this, edit the Virtual Machine’s settings, go to Storage, and attach a new disk. Then go to the Virtual Media Manager (Ctrl+D), modify the disk you’ve just created and set the type on Writethrough.

Now, the first time you will be using this disk on a VM, you will have to create a partition, format it and mount it.

Create the partition

First you need to find what is the device name for the OS. By default, there is a good chance it’s /dev/sdb, but you can check by running a ls in the /dev folder:

ls /dev/sd*

Here we can see sda already has 2 partitions, so that’s the main disk, and sdb has none, that’s our disk. We will use fdisk to create the main partition on our disk sdb:

fdisk /dev/sdb

Continue reading

Put any window on top

Depending on how many screens you have, sometimes it comes really handy to keep one window on top of the others without spending 30 seconds for something as simple as that.

That can be a simple console/PuTTY so you can keep track of something running or a notepad to copy-paste pieces of text without switching applications every time and so on.

To do this with a simple shortcut on Windows, I’m using AutoHotkey, which over time became vital for me and for my productivity 🙂

So this is as simple as that, edit your current script:

And add the following line to add a shortcut to keep any current window on top of the others:

^+SPACE::  Winset, Alwaysontop, , A

Of course you can change the shortcut, here I used Ctrl (^) + Shift (+) + Space.
Continue reading

Improved console for Windows

At some point I got tired of the Windows console (cmd). First, it is always in non-insert mode by default. I fixed this by checking the Insert mode in the properties, but still, no persistent history, no history search, bad auto completion, that was too much. So here is tip that could save you a lot of time when using command lines under Windows.

Project’s name is Clink. It gives you GNU read line power in cmd.exe. You can download the portable version (zip) and just unzip it somewhere.

Then, since it’s quite frequent to use the console, let’s pin it to the TaskBar. In the start menu, search for cmd, right click on it and pin it to the taskbar. Then right click on it while pressing shift and click Properties and add /c “full_path_to_clink.bat“.


Now when you clic on your pin that will open clink instead or the standard cmd.

Last but not least. Here is how to change the “Open command window here” when you’re doing right clic + shift on a folder, to open Clink.


To do this, edit the Windows register (Start menu, search regedit)

Open the key HKEY_CLASSES_ROOT\Directory\shell\cmd\command. Then edit the value to the following

cmd.exe /s /c "pushd "%V" &amp; C:\Applis\clink\clink.bat"

Edit with the path to your clink.bat of course.

Now the Right-Clic + Shift > Open command window here should open Clink already located on the target folder.