The library finderEx.js was created long time ago to make batch scripts more easy that create man objects, potentially considering an external source as input. Problems like "I just want to create a failure mode X in my project but just once and then use it while the script runs" had to be addressed. So it introduces many functions like findOrCreateXXX as shown in this example:
findOrCreatePackage(finder.project, "New Package");
This is nice and works but soemtimes external sources have typos, or otherwise slightly different strings inisde for example leading or traling blanks. Like this:
findOrCreatePackage(finder.project, "New Package");
findOrCreatePackage(finder.project, "New Package ");
findOrCreatePackage(finder.project, " New Package ");
This will create 3 packages which is not what we want. Reason is how findPackage is imlemented, it uses the and() function of the Finder API:
Global.getFinder(scope).findByType(Metamodel.projectmodel.PJPackage, true).find("name", name);This uses a direct comparison of actual and expected value. To improve we coudl do:
Global.getFinder(scope).findByType(Metamodel.projectmodel.PJPackage, true).find("name", name.trim());This works for the above two exampels but fails when we face these changes:
findOrCreatePackage(finder.project, "New Package");
findOrCreatePackage(finder.project, "New Package ");
findOrCreatePackage(finder.project, "new package ");
So upper case/lower case comparison. Now we have to give up the usage of "and" and have to write our own filter. This version would work:
Global.getFinder(scope).findByType(Metamodel.projectmodel.PJPackage, true).filter(function (p) {
return p.name.trim().toLowerCase() == name.trim().toLowerCase();
}); As you can see we now start to compare actual and expected values ourselves. Grreat, just one package gets created. Next problem could be more blanks inside, typical user input:
findOrCreatePackage(finder.project, "New Package");
findOrCreatePackage(finder.project, "New Package ");
findOrCreatePackage(finder.project, "new package ");
findOrCreatePackage(finder.project, "New Package ");
findOrCreatePackage(finder.project, " new package ");
To solve that, we could (just one idea) strip all blanks from the values and compare like:
Global.getFinder(scope).findByType(Metamodel.projectmodel.PJPackage, true).filter(function (p) {
return p.name.trim().toLowerCase().replace(/ /g,"") == name.trim().toLowerCase().replace(/ /g,"");
});Works nicely but would allow also
findOrCreatePackage(finder.project, "n e w p a c k a g e ");
I just have shown how you can tweak the finderEx.js library to your own interpretation of whether an object with a given name already exists, you may take it from here and extend.
Happy Scripting
Jan