While playing a little bit with core XPages functionality I found the interesting VirtualPageTransformer interface. With this interface it is possible to implement „virtual“ XPages, and this allows to do something which can be described like an url mapping (the $$OpenDominoDocument.xsp url for example was implemented this way).
To do create your own transformations you have to do the following:
1. Read the first article about using Factory classes in XPages and create the required /WEB_INF/com.ibm.xsp.factories.properties file in your database
2. In this file add a new entry for the page transformer class to use:
PageTransformer=ch.hasselba.factory.PageTransformer
You can choose every key name you want for the factory. The class will be identified from the XPages runtime by the implemented interface com.ibm.xsp.page.VirtualPageTransformer.
3. Create a java class which implements this interface:
package ch.hasselba.factory; import com.ibm.xsp.page.VirtualPageTransformer; import com.ibm.xsp.FacesExceptionEx; import javax.faces.context.FacesContext; public class PageTransformer implements VirtualPageTransformer { public boolean isVirtualPage(FacesContext fc, String pStr) { return (pStr.indexOf("$$VirtualPage$$") > (-1)); } public String transformPageName(FacesContext fc, String pStr) { try { return "/Test.xsp"; } catch (Exception e) { throw new FacesExceptionEx("Error! " + e.getMessage()); } } }
This adds the „virtual“ page handler „$$VirtualPage$$“ to your database.
This means that every request to your database is checked if the keyword is contained in the url. For this test, the method isVirtualPage is called with the current url as parameter. If this method returns true, the method transformPageName is called; this method must return a string which identifies the XPage to use. In this case, it is the XPage „Test.xsp“
If you open this URL…
http://localhost/Factories.nsf/$$VirtualPage$$.xsp/blahblahblah/blubb/blubb/?etc=etc
… the XPage „Test.xsp“ is rendered instead.
You can add as much VirtualPageTransformers you want to a database.
P.S. Keep in mind that this article has been posted in the “Quick-n-Dirty” category.
Great find! I always wondered where the heck was ‚$$OpenDominoDocument.xsp‘ stored in NSF. 🙂
But why is this technique ‚Dirty‘?
I call this a „Dirty“ technique because it is not documented somewhere. There are some guys who always comment such solutions with the „Don’t use it, it is not officially supported“ phrase.
Would love if IBM makes it documented and officially supports it 🙂