Stuck out of ICN, Update admins via Database updates

There are situations where you can get stuck out of the ICN Admin desktop. For instance because you change the uid mapping for the LDAP and the ID you used is not valid anymore, you should now use the email address or another field. If you forgot to add the new ID before you made the change, you’ll have to rollback and restart ICN which is not always possible. There is one way to add/remove admins without restarting.
You can update directly the database, and wait 10 minutes (the default refresh time) to get your changes pick up. The entry we are interested in is settings.navigator.default in the table NEXUS.CONFIGURATION.

This field contains a json object with plenty of information. You can check it by doing:

select ATTRIBUTES from NEXUS.CONFIGURATION where ID='settings.navigator.default'

Then when you are ready, you can add a new admin by using the following command:

UPDATE NEXUS.CONFIGURATION SET ATTRIBUTES = REPLACE(ATTRIBUTES, 'adminUsers=', 'adminUsers=NewAdmin,') WHERE ID='settings.navigator.default'

Wait for at top 10 minutes and you should be able to log in again. Then you should clean up old admins which are not needed anymore.

Aliases for Windows and Clink

Here is how to set aliases for the Windows command window and Clink if you’re using Clink.

First, create a cmd file somewhere to create your aliases using the doskey command. Mine looks like this:

@echo off
doskey np=notepad++.exe $*
doskey ls=dir $*
doskey ns=nslookup $*
doskey ip=ipconfig $*
doskey hosts=notepad++.exe C:\Windows\System32\drivers\etc\hosts
doskey aliases=notepad++.exe C:\Applis\clink\aliases.cmd

You can also use all available cmd commands and variables to customize your shell, like title, color, set PROMPT, …

Then, open your registry and go to the following key:
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
and add add a string value named AutoRun and valued with the absolute path of your aliases file.

That’s it, from now on, all your aliases will be loaded every time you start cmd or clink.

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 P8 FileNet Platform to 5.2.1 FP5

Here is how to upgrade P8 FileNet Platform 5.2.1 to 5.2.1 FP5 silently. This upgrades both the server and the client.

You need FileNet 5.2.1 to upgrade to 5.2.1 FP 5. Here is a way to install FileNet 5.2.1.

You can execute this in the same directory you copied 5.2.1.5-P8CPE-LINUX-FP005.tar.gz and 5.2.1.5-P8CPE-CLIENT-LINUX-FP005.tar.gz.

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.