Tag Archives: IBM Content Navigator

How to compress an ICN Plug-in

Disclaimer: so I started this draft months ago, and apparently for months now, my main job has been taking all my time, so instead of keeping it as a draft, I thought I would just release this. Keep in mind it might not be perfect, but hopefully it can still help others. I’ve been using kind of the same process for months on production and our plugins work all fine.

Here is a long due article: how to compress/shrink and build production-ready plug-ins. The documentation is quite sparse about that, I found this forum post and of course there is the official Dojo documentation, but although it will help you build a product including what you need from Dojo, this doesn’t really explain how to build your plug-in so it does not include Dojo at all, since in our case it’s already part of ICN.

In this article, I will explain how to automate all the process using Gradle build, unlike the forum post I linked above which is providing an ant build to do this. Both are perfectly valid but as you can see in my open source plug-ins hosted in the IBM ECM GitHub, I’m fond of Gradle ­čÖé
Continue reading

New Official ICN Plug-ins open source repository

I’m really excited to announce a new area for ICN!

Ok, maybe I’m overreacting but this is really, I hope, the beginning of something great.

My colleague Kerry Langford and I, have been working for months internally on the idea of building a global, centralized, IBM managed, open source repository for ICN Plug-ins and get me approved to commit code there. The idea is a public repository of Plug-ins, a bit like Jenkins does, where people can choose what they need and just download production-ready releases, but also give feedback, open issues, enhancement requests or even contribute.

I really wanted to thank Kerry in this post because he has been doing an amazing job internally to push open source and build a better FileNet/ICN community, which is IMHO one of the weak spot of FileNet and ICN, but probably because I’m used to open source, community driven projects ­čÖé Nothing would have been possible without him so Thank you Kerry for making this possible!

So, after a lot of discussion with the ICN Team (they own the GitHub repository), we finally did it. It’s live here. Hosted by IBM, one unique repository to rule them all!

Continue reading

Install FileNet P8 without CPIT

I’ve been focusing a lot lately on how to install P8 with CPIT. Mostly because this is easier, faster, and usually more convenient, but it has inconveniences as well. Installing all components separatly has a few benefits and I thought it was time to write how to do that:

  • Install different versions of the components
  • Install Fix Packs during install
  • Use different technologies
  • Split components on different servers
  • Use pre-installed components (LDAP, DB, …)
  • Optimize install size by deleting binaries after each install
  • And for curious people, understand better what’s going on ­čÖé

This will be a long post, but I’ll try to split this step by step and explain precisely what is going on. At the end of this post, I will give the full script you can run to install a full platform. Unlike the CPIT installer, I’ve tried to keep everything in one script to ease distribution, installation and customization. That’s why you will see a lot of HERE-doc commands to create files on-the-go. At this moment I’m using only one dependency, which is a file from the CPIT installer: cpt-actions.jar. This is the java tool allowing us to create the default domain and object store. This is quite basic to implement using the Java API so I hope to write soon how to rewrite this tool so we can get rid of all dependency on CPIT.

Continue reading

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 2.0.3.0 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