I recently
had to upgrade a not too big but quite complex system. The original environment
includes Maximo and ICD, and two large customization packages, one extended the other (let’s call them package XXX extended by package YYY). The target system is the latest Maximo + ICD 7.6.1, plus 4
add-ons which include Oil & Gas and Utilities.
Customization
were written by 3 different third parties over a long period of time and the
source code was lost. This posed some challenges related to preserving customization
and I had to spend a bit of time to figure it out. Below are some of the gotchas I
learnt after the project:
Problem
1: Ensure customization
are preserved after upgrade
After reviewing
the SMP folder, I found about 300 extended java class files, but the product.xml
files only cover about 20-30% of them; worse, some data are not
even up-to-date. After the initial attempt to correct these files, I decided to
simply ignore them, and build new product.xml files from scratch. Below are
some of the key steps I had to do:
- List out all extended java class files found in the SMP folder (using the command: dir /s /b >list.txt) and put them in an Excel sheet
- Use SQL to search from the DB any usage of custom java code, put this list into another Excel sheet
- Match the two sheets above to identify any missing files
- Use a decompiler to view the code of each file to determine what is the original class it extends, and the type of the class (which I put into: Action, Bean, Cron, Event, Field, Object, Util)
- For each of the class type, use Excel to generate an XML element as the follow examples:
- After generated those elements, I put them together into newly created XML files.
Problem
2: Manipulating
chain of extension without having java source code:
The updatedb
process took 6 hours, and after it finished and I can start Maximo. However, I freaked
out when I looked into the MboSet class used by various objects. For example, in the WorkOrder object, the class used is psdi.pluss.app.workorder.PlusSWOSet. Initially, I thought the custom classes were wiped out after the upgrade. But after some investigation, I realized that due
to the upgrade and installation of new add-ons, Maximo has updated the classes (through
the mean of binary code injection) to modify the chain of extension like this:
Before:
YYYWOSet > XXXWOSet > TloamWOSet > PlusPWOSet > WOSet
After:
PlusSWOSet > PlusGWOSet > YYYWOSet > XXXWOSet > TloamWOSet > PlusPWOSet > WOSet
After spending some time reading various IBM tech notes, I learnt that, in the past, we need to create a file with the exact name as: “a_customer.xml” to maintain metadata about customization. In the newer version (not exactly sure from what version, probably 7.5), we actually SHOULDN’T name it “a_customer.xml”. Because the file name makes it top of the list (in alphabetical order), and thus, become the first product to extend the core Maximo classes. For example, if you only have Core Maximo, Oil & Gas Add-on, and your custom package, if you name it a_customer.xml, the O&G package name is plusg, thus the extension chain would become: PlusGWOSet > CUSTOMWOSet > WOSet
If I like my custom class to be the last one that extends everything else, I actually should name it z_customer.xml, or anything that comes last in term of alphabetical order. So I named the product XML files for the two custom packaged as z1_XXX and z2_YYY.
For some
unknown reasons, using just file name doesn’t give me the desirable outcome
(probably due to some undocumented logic), I had to use the <depends>
tag inside the two product XML files. From my experiment, by having the <depends>
tag, the updatedb process will now ignore the file name rule, which means it
doesn’t matter if you name it a_customer or z_customer anymore. The classes in
your package will be extended after all packages listed in the <depends>
tag
To illustrate
this point, below is the <depends> tag of my original z2_YYY.xml file:
It means
the YYY package will extend the XXX package, then extend a bunch of packages
(which included in the ICD product).
I updated the <depends> tag of the z2_YYY.xml file as follows:
Notice now I inserted three other packages before z1_XXX. After I updated the files, I ran updatedb process again (Even if there’s no update, updatedb will still updating the java class files. With newer Maximo version, you can run updatedblitepreprocessor.bat to do the same). With this, the updated process displays the product installation order as below:
Checking
the class files, I got the extension in the desired order:
YYYWOSet > XXXWOSet > TloamWOSet
> PlusSWOSet > PlusGWOSet > PlusPWOSet > WOSet
One more note,
during the process, I found some of the files that get extended in an endless
loop, for example:
YYYWOSet > PlusSWOSet > PlusGWOSet > TloamWOSet > PlusPWOSet > XXX > TloamWOSet
This caused
Maximo to fail when opening the app and crashed Eclipse when I tried to decompile
the file. It turned out the reason is I used the wrong XML tag for the class
type i.e. I should have used <Mbo….> and <MboSet…> for object class rather
than <Class…> tag.
Another note is, due to some bugs or unknown logic, I had to play around a little with the product listed in the <depends> tag to get to the desired order as it doesn't seem to work exactly as documented.
Hope this helps.
This comment has been removed by the author.
ReplyDeleteThis is great post Viet , thought to share this relevant URL for post by Alexander here as it adds some more details related to this topic
ReplyDeletehttps://www.ibm.com/developerworks/community/blogs/a9ba1efe-b731-4317-9724-a181d6155e3a/entry/extending_maximo_using_java_classes_product_xml_and_extension_settings?lang=en