{"id":1028,"date":"2012-10-24T13:43:16","date_gmt":"2012-10-24T11:43:16","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=1028"},"modified":"2012-10-24T16:49:54","modified_gmt":"2012-10-24T14:49:54","slug":"quick-n-dirty-use-your-own-factory-classes-in-xpages2-the-virtualpagetransformer","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=1028","title":{"rendered":"Quick-n-Dirty: Use your own Factory classes in XPages (2) &#8211; The VirtualPageTransformer"},"content":{"rendered":"<p>While playing a little bit with core XPages functionality I found the interesting <em>VirtualPageTransformer<\/em> interface. With this interface it is possible to implement &#8222;virtual&#8220; XPages, and this allows to do something which can be described like an url mapping (the <em>$$OpenDominoDocument.xsp<\/em> url for example was implemented this way).<\/p>\n<p>To do create your own transformations you have to do the following:<\/p>\n<p>1. Read the first article about using <a title=\"Quick-n-Dirty: Use your own Factory classes in XPages\" href=\"https:\/\/hasselba.ch\/blog\/?p=1002\">Factory classes<\/a> in XPages and create the required \/WEB_INF\/<em>com.ibm.xsp.factories.properties<\/em> file in your database<\/p>\n<p>2. In this file add a new entry for the page transformer class to use:<\/p>\n<pre>PageTransformer=ch.hasselba.factory.PageTransformer<\/pre>\n<p>You can choose every key name you want for the factory. The class will be identified from the XPages runtime by the implemented interface <em>com.ibm.xsp.page.VirtualPageTransformer<\/em>.<\/p>\n<p>3. Create a java class which implements this interface:<\/p>\n<pre>package ch.hasselba.factory;\r\n\r\nimport com.ibm.xsp.page.VirtualPageTransformer;\r\nimport com.ibm.xsp.FacesExceptionEx;\r\nimport javax.faces.context.FacesContext;\r\n\r\npublic class PageTransformer implements VirtualPageTransformer {\r\n\r\n\u00a0\u00a0 \u00a0public boolean isVirtualPage(FacesContext fc, String pStr) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return (pStr.indexOf(\"$$VirtualPage$$\") &gt; (-1));\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public String transformPageName(FacesContext fc, String pStr) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0try {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return \"\/Test.xsp\";\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} catch (Exception e) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throw new FacesExceptionEx(\"Error! \" + e.getMessage());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<p>This adds the &#8222;virtual&#8220; page handler &#8222;<em>$$VirtualPage$$<\/em>&#8220; to your database.<\/p>\n<p>This means that every request to your\u00a0 database is checked if the keyword is contained in the url. For this test, the method <em>isVirtualPage<\/em> is called with the current url as parameter. If this method returns true, the method <em>transformPageName<\/em> is called; this method must return a string which identifies the XPage to use. In this case, it is the XPage &#8222;<em>Test.xsp<\/em>&#8220;<\/p>\n<p>If you open this URL&#8230;<\/p>\n<pre>http:\/\/localhost\/Factories.nsf\/$$VirtualPage$$.xsp\/blahblahblah\/blubb\/blubb\/?etc=etc<\/pre>\n<p>&#8230; the XPage &#8222;Test.xsp&#8220; is rendered instead.<\/p>\n<p><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAe4AAABhCAIAAACf5NW4AAAgAElEQVR4nO2d919Tyf7\/z\/0Xvh9c966791p2V9cturvcta3r2lCx1y30ovQu0puAIkVRpEmTKkgH6b33XlMISSBAgIQECAGScL4\/HAiH5CQExYI7r8fzweOcycx75j3n5JXJBALUTWUqH9gy3xE03+Y\/1\/pkrtV3ruWfSqvvXOuT+Tb\/+Y6gv\/d\/1kwcD83DhebhQnJ6n+X0BGV1BWZ0PE1reZzc7JvU9Cip6WFio8\/LRu+EBu+EBs\/4Os8XdR5xtfdja+\/F1NyLrnGPqnaLrHKLrHJ9Xun6vPJuROXdiIq7ERXOERVOERVOEeVOEeWO4Ys4hJXZhZbahZbahpRaBxdbBRffCSq5E1h8O6DIwr\/I3L\/Q1K\/Q1C\/f5Em+sW+ekW+e4aM8A59cPZ9sXe9sHc\/sW55ZNx9kaXtkanlkat3P1LyfqXE\/XeN+urp7uppbmqpbmurdVJW7KSp3U5TvJiu5JCu7pCi5JCvdTVZySVa6m6Lsmqp8N03ZNU3ZNU3ZLU3ZLU3ZPV3ZNV3ZLUPZLUPZPVPVPVP1XqbqvVdq97M17udoPsjT9MzT9s676VNw62GBzsNC3UfF+r7FBo9L9J+UGDwpNfArNVzCaPGgxPBJqf6TUv0nJfqPl9F7XKLnW6LrW6LrW6zzqBj5eetR0c2HRTd9CrV9irS9C7W8CrW8CrS8CjQ9EfI1vfI1vQrE0ZKC9xJLlTW88jUe5Kt55Kl55Krcz1G+l\/23e9afrq9uuGTccEm\/7pR21TH1sn3KJbvkC7bJF2ySzlsnnbNOOmedeNY6UdEKk6RFrJPOWicjnLNJOY9N6gVbEdKWsUu7YJd2wX4J5NQu9bxd6nnb1Au2KcvYIaRetE+9aJ920T79okP6JYf0Sw4ZlxwXuSwFh3Q0VxzTrzhlXnbOuuSUeckx7YJdyjmbpHNWiWetEhQt489Yvjh9O+60Rewpi5hT5tEK5tEKZlEKplEKppEKJpEKJpEKps9PmkaeNI08aRZ50ixKwSxKwTRSZp4rmKzE9DlSeHKRiJMmESeMw08Yhx83DjtmFHrMMOSowbMj+sG\/6QUe1gn49dbTQ9p+BzQf71d\/9Iuqj7yy189KD378y2Pvnx4\/3Lj\/\/Q337667fXvNdffVu7uvunxz1WXXFeddl512XkJw3HnR8Ws0Fxy+vuDw9UWHnZccd11yWuSy8+6rzruv3v3uuut3191\/+OP+3r88flLylFfx+UXt0X6Nxwe1nv56y\/+wbtARveDfDUKOGYUdN444YfJcwTTylFnUKfPo0+bRZyxizljEnrkde+Z2rOLtuEUs3xSohzqhfGDLTJHxTP4tTo46J1uFk6X8DyVbhZOjPpN\/a6bIWGn\/Zy1942H5uLB8XFgeLiQXF5jZfvdZttm9cD3Hp3oOT3Ud\/HQc\/HTsn9yye3LT7om23RNt28daNo+1bHw1rX3VrR6pWz1Uv\/NQ3fKhmuVDNUsfVYTbPiq3vVVueytbeKtYeCtbeCuZeylZeClZeCmZe\/1t7vWXmddfZl5\/mnr+YfLghsmD68YPrhs\/uGbscdXQ46qhxxWD+5cN7l\/Wv39J\/94lvXsX9Nwv6Lqf13U7p+N27pbb2VuuCIo3757RvntG++5pbZfTWi6nNZ1PaToraDopaCA4Kmg4Kmg4ndRwOrlY6KKg6ayg6ayg6XJK00UBxSmtuwqaLqe0XE9rI7idueWueMtdUef+OV0Ej\/N6Dy7oP7ig\/+CCwYOLBp6XDL0uGXldMvK6bOyNcMnY67KR1yXDZS6u5IKB1wUDrwv6nuf1Pc\/re57Tf3BO\/8E5vQdndR8oIuh4KOp4KN66f0aIDgaK2Hgo6opyRsfjjM7907fun75579RNdwVtt5Naric0XY9ruBzTcD6q5vy7mtMRFcfDyo6HlR1\/VXI4pORw6G+Hg387HPzL\/gA2Dks4Hvjb8cDfjgf\/djyo5HhIyUk6vyojOGOggsbpkLLTIWWklaMIi0FUnA6rOB9WcT6s4nJYxeWw6gp+W8lhLH7X9DhjGnrFMeOyQ9pp42e\/qd9DEj\/wl\/2Bv+wO\/Gl74A\/bfX\/Y7PvDet8N6303rPZdv\/PL9Tu\/XBNi+QtS8jqs2tbyl+u3f7m2yP+uWshfNZe\/Yv7zZbOfLpn+eNFk7wXjPeeNfjhn8L2iwXdn9Hef1t19SmeXws1dJ2\/uPKH19XGtr45rfnVM88ujGjuOqu\/4XX37EbXtR9S2HVHddkR122+q235T3XZYddth1a2HVUTY9pvKYoUjqjuOqO34Xf3Lo+pfHtX86rjWzhNau07e\/EZBZ\/dp3e8U9b8\/a\/DDOaM95433XjD56ZLpT1fM5a9YyF+9\/b9rlr9cQ7Kw2nfdat8N6303rPf9Yb0fG5vXAOodmFA+uGU659ZUhtJUytWp5IuTSef\/mUwlX5xKuTqVoTSdc0tp\/2ctfYyIAnx4AT68AB+Wh3MOSC8tKx9nMBZgGAD4KBlnMErLyk8bBZ42CohNyW3BDZDo04ANAYQbmFA+uGUyU52dfJ2doMiKU2DFnZCRkefHevwPtzw61PLoUNvjQ\/jA30jPjvQGHCYG\/TYaeVz2CB1PfiUFHxmLkqnJ20SBnaDITr4+mamutP+zVhIjshAfUYCPKMBH5ONN3J7NzHAFCzAA8BEzM8M9puF6VN21u5\/eSR5v7RsDbAgg\/OCEysEt7BTliReXJqJOMiN+Z0YckQVG+JEOn30wSuP4iu40FxiG+yqiCX4HV40wEnK4\/v7\/aF3lMAxzGdSBwF9l7Pqt8ftE1MmJF5fYKcpKBz5rIzEiiwgIzwvxRs7+fMECDwD4qOELFo6qOf2u6tRDZbQQRwEbBYhAm1A5uIWV8OdE9Flm2O+MZ4cYzw7KwmjQgWrnvTAMM4f7k812lzvurXf9sTvZEYZhYmlkr\/f\/xoNXiYD3+QVX8hyG4Z6i5y33fqY93S9j1+JQ\/fZ1e8mLQ\/L9ZS1xDjHDfp+IPstK+FPpwGdt\/YzoYkJUESGqCP+8EGfk\/JTHX5gHAD5qePyFY2pOx9ScusjjzQQ6YKMAEYZYKge3MOOuMyJOjQf\/OhawbyzgF1kYfvq\/UrvvYBieGO4vtfuO6PNzn8\/PNc4\/ZJh9k2\/1bYvb3vZ7e1vc97S47+n1\/HHw8f\/6H8m339vb4LKn1X0P0fsn8qOfS22\/a8wOhWG4KtKmyXUPxVe+z+enVve9DS57mt324L1+pPjK471+7Li\/l+j9M9VXHu\/1Y6fHXtLDn+n+ooMhPfx5ilwv4PPQzDKpeK+fZExnLOCXsYB948G\/MiJOMeOuKx34rL2fEVtCiC7CRxfhnxf2Gjk9mecvzPEAgI+Zef7CMTXHY6oOneSxJsIIYKMAEYcmVA5uGY+8PPbsxKjffrrvz3Tfn2SB5vNjseUuGIYZQ6RE\/S9r7L5tdf6+K8EOhuHewvBy76vovZdGp+\/qfa8JT6dHydW23+KLwpc3Z3rKmpy+64i3FZYQisLLrL8hlz2HYZjeVVpuvZtYHAHD8ASubMD7R5HBdLv9kGTwNW9mUth8hk5M0v+q4+73MqZD9\/2J7vvzqN\/+sWcnxiMvI1Yes2jluMiCHkNH31neAnceg0kmg1r1qi3CpeGJSZ2vYX2QdW9uDGOQglkZAPiQmeUtHFN1OKZq30kea8IPAzYKEHF4QuXgltGw8yP+R4YfyQ95\/TDk9b0sUB98l2\/2Fdqvu+NtGiKtYBhuyXqW7nweKSy4d6HC8utXRjtgGO5rKvK+\/nmIxRkYhkc6S5J1t9ekB8MwXBZ6u9Ty67Y4axiGyS1FL25u68wNgWG4MtwyRX87a5gEw3Ci\/VkYhifp\/Q12uyge34kMZtDz+8o7X4eobefPc2EY5s2wg1X+U2O9c9BTplyW+GH4kfyI\/5HRsPNKB7Z09DNjSwgxxYtWbmD\/kMsTzMyLQmssbg+xGqoLnWdmL3CLFrhF88zsoYbQqqdGPYUJ4vUBgA8ZLk9wTNX+mKp9Z\/9oI25IyKvSBiePxwYWti2EYQMLWwML2\/TCmvTCGuQYKXTyePyqtAHdCvDOWFyVjwQpDvkeonnuHby3e\/DeN7JAdtuVZ7QNhuFxWl+U+hdFJturLHbUR9yGYbgx41mi3RkYhplDpCKT7Q1WX1aH3YZXaqSjOEt\/W316MAzDdRG3Ky12DLYVwTBcEWJRarqjxP08DMOkpsJMvW2vnM8KW1V6nO9x\/JrihjEeits3pWY7QlS3c5m0YOWt5eY7MKtJZTfNc++Q76GRIEWlA1s6yIiV46ILeyMLuvVtfWbmBdNzKyCXphBePZoby+BRg\/kNP\/DqvuXVfctv+GG+z4\/HyuvK9G7JCJvkzIm0AgDeFxwUmBVm5gXHVeyOq9h1kOgNvTQhlvbueRVNPZSxZvxQD2WshzLWRhxpI44gx0hhXkWTpb07uhXgnbFo5cNPFWje+wfdvxtw+XrA5StZ6Hf6Mk\/vPzAMM2l9eXr\/6bLZ0W61vSHcAobhhvSgl1anYBieGOorN95ab7GtM\/sZDMP1aUHRKlsSNT5P1\/6iwmRrvt5\/G9KCYBiuD7eoNNk60FIEw3BFsHmVydYSN0UYhkmNhZk3v8i0PyO08lK3s712O6jO2EMiO31VYbI1UePzCpOtZCeZsljJ14Pu39G89w8\/VVi08lIisip\/nt+ta+PFmRNMzS5Dqc7uy34iYCfPdTnO1Z5AfJxX9y2\/fstc7Yn5hpN82rOenEdNGeHoVlOzCZeh3TbNgpWFb0bsNehqgtjpm3ckjLCuY14e3rJ22bfLNhKZZ1LaJEhP5036QnQtah0v7joxjYA27lnBtFg1zpzgmIrtMRXb9r6R+p5BIfrmti2E4SYcTQothGF9c1t0q\/qeoOMQBJ0OWlny9c3MwZXV3pT7pyERbTMoxqr5Vnr\/EIAINKbKwS1Dj48PeshTXXZRHLdTHLbJQp\/d1pxbWxArL9TbgrfZ2nXnvw2hZjAMN6QFJlieRKy8wuiLZov\/FDidRrw4WunTFI3P2p6bd\/qcLdTb0pAWCMNwfahZrcl\/msLMYRhuSg98ofJp+6sgGIZLAkzjVD5l0vpgGE71NoJhmDXUV23yBclO4qhI9ttwNltJ9jKlIIrjdqrLrkEP+aHHx5UObOkgT8SW9sUUE6IWrdxzalbA5i7CZE11hNnMM7O5tX\/Dxv+Cjf\/Fq\/tW5IBTcJo\/lV\/4WHeQTBI2ZHMTLkG7rZsEqBKRQswKUmi3\/gZdX3i61jjiCCO8dijxhq83vFUnTdKcrLXhG\/QV64hUiLwC7bJrlznyuszqKkxyBZOzElhZc2pWcEzF9piqbRtxuK57QEg3ebSxd3BVusmj6FZ13YHHoa+27YCOP1pRop0xsLLaerFq8Lfa+\/sEwtOYKge3DHofobruJdvt6Lf+ot\/qc1kgWH5edPNTxF4r9T4lWn7ebb6lLcwUhuG2jIBM6xMwDLOH+mr1\/91ptqXk1qcZVifQGyydD06X637anhEAw3BrqGmL8b\/LdT6tCjQWVmjPCExU+mSwuQAJ+Py6XEt6AAzDY+2Fvbe3yDjItWH9BdluB9V176D3EaUDWzoorNgyUnQJMaqYEJHfo2PtOcnls2YWodQV0apDBQQHbtHv3KLfxa2cW3ZipnD\/fKdlX0Vg1Ut\/YUPWTPwlaLd1Ex9VIlKIWUEyTY67rsRjna4xDgbCCK8dSqzhaw5v1UmTNCdrbPhGfS1Sa7d7l127zJHXY1alwp7hs7l8H1+\/H\/b8+OiJ\/ySXP8nlP3ri\/8OeH318\/dhcPhtVeZLLR1blIlauZ2Yji5XrmdlgWOcjs207zF4AK3+rVo4bZKoc3EL1OER2+p5ktbXP4rM+809lAW\/2aaPeJ\/nqckUaci0GnxDMPu01\/bRG55NcNbl8dblCjU05qnIlmpvaDDf3mm5uM9xcpr0pU0UuTen\/XqnIlWlvajX8pEn\/k0INuRw1uRqdT7qMN7cZbi7X3pSpIpfy9\/9LV5Yr1NhUeXNToYZclopcgcamUq1NuWpyuWpydbqf9JrINMI1Y\/EZyWor2el7qschxMpjyvujS\/uiSvoiCnC3rL3ZM\/wJziLdyf7s\/lf8ht95dV8JGr7hN3y30LKZ3\/gTv0le0Lp\/vmqXoOGbuapf5qp+4YyVpLppChtOcOIvQbutoh13QhAEQTtt2yc48ZeEbwuvXEMdx2NV5k9EX4N2OdYsBayx3X0penlgqNP4S9Buq0b+BIc\/0bgYAYIgVOV2q10rCiOuoLtGR8AaBnZYdMz4lblIHt7qYA5AwqjEe8Fs2CgyBunJytIXX\/TqLM\/PtQiO+GyIzr9E3iwOi4N4tMA\/OPTIseN+AcF+AcFHjh33Dw6d5ApYM3wWqjJ7ho987NlKoNV2UYTomdk09Aysip6ZDbpVbVfAcegr7XSK+ylom34BuqS2i1KbbrptceBn3UUeWq3a8VNfLZ1idCcscT+1NFenApYrPFwMuDSkjwEIN8BQPvgZxW0\/ye6bPosviCabCcabZAFvvKnbQK5dT65dX67HcBPeeBPOaFOXgVy7nlzbEh3IQ0abegw3dejLtejKNevItejKdejLdRsuNm\/Tk+sykOs12tS7VKdJR65ZR65NT65dX65dT65VT65Nbzlsl4EczkimEa4VosnmPosvSHbfUNz2I1YeVdofVUJ6XkQML8TftPZizfAZnEVaI904YyXjgfvGA\/chi3F+62\/IwVzDDeRgPHDfZKI8zGuKtTwnbMjgxF+EIGiXYxWHz4i+BkHXwhcLd99pFFZAHy9VbnTciZRHX1ssWayARBA\/FcaJvwhBF6P5DHQQTvudXdBO23bUwNBBhA2XI2CNWSxs9DXoSjxWKMzhLWsxjkSw5gG7EKsXjIYiBxKSXVtffEaj484Vl2apWvS1nbbtK7sTm3\/U6+LKOVljnJUwOXzmDJ85w5+Y4bO5guDwyCvX\/7xy\/c\/g8Eg2VzAxs\/goc6k+a4Z\/VNX+mKp9M36wuqNfSCdpuK6LsiqdpGF0q+oO\/2PQV1qp0g\/6q30Ut+nlrShZpRq0TS9vZUcirSSV+x+DIGiHSWxHf3WqyTbsyhsSqIc6rnzgM7LLPpLNbqL5f4km\/yYYbZYRvNFmnOFmnOFmvLDEcLFEiPAhnOHmXoPNPQabew024ww34w2XK+MNsesg9IrFlH2Ea4Jo8m+i+X9JNrvJLvuUDmxpI7OiSvojS\/oiiohhBXgtqxVW3hzuwmNUT+dfZiVeRoxb0P77opW3qCEHU9nXZspuwPzOmDvnJbibdE8RtcLwK2KWt\/jcxjxdatvouBNlN4tBVhYKmy\/ZiAyWJzEshDEGKcOT5uDYLwlL8yBhciT3ItZw1Wuxpr5WvpKJWPOV+BVBMOcfkzeLg7byiRl+aGScgamlrpH5s4hopATDylXsjqraNeMGqtpJQqKSs2s7yasSlZyNblXV\/vQY9JVmKqmqnVTlrQgpPF0uSTXZis4L\/RC64SrVSBK7a1\/qdFFI+YoKrgrQMW\/MOBsPqINE1z\/3Y679RZLtnj7LXUTzHUSzbf9QzHf0We4i2e7Js7+ke+6nBgIjopgUXkQMKySE5OO0V1p5e+LTSWqRgGDDrdVZsvLjyMF8u+aSp5vwcIZzjOoEZ5X1sPL2O7tErLz9zi60G4qcrtHKl0uEcdZu5Rw+g8Ovst29tKgUGT\/W8NZs5cJ5wCyU0ot4w1WvxZr6ErdgEZN9bSt\/\/TjMJTefmOH7BYZe\/0s9PiXzRVL6+Ss3fP2DJpZ8HG3lx1TtjolZua6plSxWrmtqJdlb8zR3QMe80R6t6CqxsozVpFr5cts8zR3iVo6M5\/278PpYeU3XgP99e\/OrB4psTpLsf+6z29tnu+cfit1ekv3PhTYKFjd+e3LPqaRjJLyIGFpACM0nBOfiNS090VZOqC8hFoYIaOFCK0c5uJrQyvn00K7SsLKXAW9g5UuLXOGTVrjB0ui4E72bIXIqcYNF6NeQ6Ipy7RsRYmGX3Vx0K0Di8MQ8S\/wAcx4wCzF6wWy4vMskXF+j3ou8Xl8i84BqIuF1ReYNlrXEwXTzGb6vf7DCmfPRCSnIb6qEx8QfPnL8oV8AekmOWPlxVdvjqrZNvdTKtj4huqZWNR39q6JraoVuVdnmdxT6UjNl6TTFeCsEQYslfkchaKtuLqpyruZ26KhXX2VbX6WXouRqK2NK6c5LEdpuHL3Yr1i0FOOtkKIrRpANCZRS2tnYQw30dNJT3KN84DNJqCAc\/Ezl4Ja1cWCLyoEtyotIjI9C2PZzlYOfqxySzMHPlaWCRFhZuEX5oHAwW5Sw0FX88ck9xybiaEwpKSyfEJKHe5aLC8zpVb\/tgbbyscnZysdG06NtguEEZtwfsPG\/+IPOi5vmg86w8b8m8w35tGc8DiHxrgqFQlnNyvnhV4Rvn9HH8Reh3Rev7F7x3F7y3Crb3ehFusip2NoNvXOy7BGoyO13kE\/Pdl27KMuqHDPs8hbNoqMJc5E2PJmsXGwesAoxe8FsKDrgK9fQyb5WX2IvaWh3Fr2y4vMvmTeLgyy6WVwB8tu0E0v75lOzAhZXgF6SI1Z+QtX2hKptYw+lopUopI0wWN1OWpU2wiC6VUWr31HoS43k5ZIo3S8hYUmy8fLmyUm\/ilZihdeZpdMzRyVWE40pubscje0QBEHQ9jNHtyPlfkehL4+e\/BIJdtQLM8iGBIrLb00s6ahsJ7fghzr6RhA6EUgjXaSRLhK9u5\/e3U\/vJtN7yKPS6V5kbAX9Y139Y12kUYTOPnpnH72TSO8gjiB09tE7iPTOPnonabSrf7ybwuihMnupE72DLNwgG0dj44bYuKFJNL20yV4au4fG7h5kdw2yugZZXYPs7kF29yC7B4G2eNA9wO4eYHUNsLqoE53UiU4Ks4PM7CAz2vsZ7f2MNgQSo3WR8Qb8WHE7LaaEEJKPC8nDBef1Buf0BOZ0q1vcQ1s5g8PvrcrtSPERcHu5zY6sxMuCkSROmS2nzFYwnMCptpprdxVwexuSvMpeBkl7lq6ClF2I+IvLn7CJn35ovJvhvctJ+MAnfAVM1Kb5Clb6OIPDZ83wT6nZnlKzbegilzcThOgY36lq7VsVHeM76FaAdwYUndsUndMUk9MUk9sUk9sUk9csJDavOS6\/5UVBy4uCloTC1oTCtpdFCO1LtL0santZ2IqA1Ekoaksoak8o6ohfpvNFYceLgo64gva4\/LbYvLbYvNaYvNaY3JaY3JaY3NYY5DSvPa6g40VR14vinvhS3MsyfGIFIbmyL6WKlFpDTqshp9dS0uup6XXU9DpqWh01rY6aWktJqaUkI9QsHqTUUlJqqCm11JRaSnINJamanFTV\/7KyP6GClFDR96KcGFdGiC0lxJTio4tx0cW4qCJcVBEushAXUdi7SEFveH5vaF5PSG73s5zu4OyuoOwudTN3ESsfn+a15rxoS\/aZGifwp2oEwwkCWriAGiyghQsYRYK54fqXD0riHo9P897IL9awoQwASIQpAZFqrBm+oqadoqZdfWd\/WRNOiLmtS8Kr4spWghQSXhWb27qgWwHeGdDzVw1CIl81RGYtEpXdGJXdGJ3TFJ3TFJ3bHJPbHJvbHJvXHJfXHJfXEpfXEocc5y4TKySvOSa3ecmpW6IRclqiclqispujspsjs5sjs5ojs5qEPM9ujsxuicptjcpti8ptj87riC3ojCvqji\/pSSjFvSwnJFUSU6pJqTX9qbX9qbXk9DpK2iLk1DpKah0ZIaWOklK7RA05uaY\/qbo\/sYqUWEVKqCQlVPQllBNflBFflBHiSglxpYTYElxMSW90UW9UYW9UYW9kYe\/zgt6Igp7wgu6wvO7Q3O7Q3O6QnO7gnC51c1ErZ3D449O8jrLMHA\/tjuzQEULt1Bh+agzPoDRUxj1IuqtamRr+Zj7OB1YOWHcwHVwIa4Z\/QdvxgrZjXSeptLFXSGpumamV0y1jy4oW\/C1jy1vGlvEZhfEZhcgxUmhq5ZSaW4ZuBXhnQKFptaKk14am14Vl1IVl1IVl1oVn1ke8aojIaojIaozIanyevUQWQoMIEVnLlcNfLROW2RiW2RCW2RCagVAfki5KaEZDaEZjaEZj2Kvm8KyWiJzWyJzWqPyOuMKuhJKexHJ8ciUxpYqYVk1Kr+3PqOtPr+1PryMjpNWR02vJabXktFpyag05taY\/paY\/pYaUXEVKriIlVfUlVva9rCC+rCAklBPiywnxZfgXpfjYEnxMMS6mGBdT3BtV1BtVtOTm+T0I4Xk9YXndoRKsnMHhj0\/zxtnczqr84nD3HL\/bmQ9NcgJs6\/MTRxisN\/ZxAOBdw5rhX9FxuqLjVNtOLK7vFlLe1Fvf2dfQRSqu727oIjV0kcqbesubepFjpLC+s6+8qRfdCvDOgIKSq5eoCkqpXqIGITilJji19lla7bO0uiW3rQ\/LrA\/LbAjLrA\/LrA\/PrA\/PrA\/LqA\/LqAvNqAvNqAtJXyQ4rS44rS44tS5ISEpdYEptYEptYHJtQHLNMkk1\/knV\/kk1\/kk1\/sk1\/sk1Acm1Qan1z9IbQzKbwrNaovLa4wq7Ekp6k8oJKZXEtGpSRm1\/Zj0ls56S2UB9VU991UDNRKinZNRTMuqpGfXU9Hpyei05rYacWkNOqSGn1PQnV5OSq0hJlaTEStLLij5kkR5fTnhRRohbXqcTYkvwMSX4mGJ8dBE+qgj\/vAj\/vLBXU2yvHAD4+GDN8G8Y3L1hcLeyGZdf3Q7YKEBPEyqeJlQ8fVnx9GXl05eVTxMrnyYt\/vRPqvRPqgpIqg5Irg5MrglKqQlKrQ1KqwtOr3uWXv8MWUpn1IVk1IWk1z1Lr3uWVhecVheUWhuUWhOYXBOQXB2QVP00qfppUpVfUpVfYpVfYtWTxMoniZVPXlY+Tqj0Tajwja\/wja94FF\/x6EU5msfxFX4vK58mVQcm1walNYRntUTld8QXdyWV4VrKkAsAABE+SURBVFIqCWk1pFf15FeN1OzGgezGwZymwewmWnYTLatpEOFVw8CrhoHM+oHMhoHM+gHUDjslrZaSWktJqaEk15CTa8jITnpiZX9iZf\/Lyv6XFciWOim+nBRfTnpRTootI8WWkmJKidp37gMrB3z0sGb4fxm7\/mXsWt7YnVPRAtgoQL5x5Yu8qFgkHkVCxeOXFU8SK\/2Sqp4mVwek1ASm1i5aeUZ9iJD0esTcg9LrAlNrA1Jq\/JOq\/ZKqHidW+r6seJRQ8TC+4uGLCp8XFT5x5QhesWVesWVeMaVeMaVe0aWe0SWeUUtEFntFlXrHlD98UfE4odI\/uTYkvfF5TltcYdfLMlxqJTG9tv9VAzWnmZbbTMttoeW1Due1Due2Due2DOW2DOU0D2U3D2U1D2U10bKaaK8aaa8aaZmNgwgZDYMZDYPpDYPp9UvUDaTWDqTUUlNqqMk11ORqalI1NbGK8rKK8rKS8rKKklBFSaik3LJ+AKwc8NHDmuErmbormbqX1HW+Km0EbBQgLXPXJdyWfrppWSxx2+3mbfeblvdu3bmnY3Vfz9pD3\/aBgZ2noZ2XkZ2Xkb23sYO3sYO3kb2XoZ2noZ2nga2nns0DXWsPHav7t+7cv2l5T\/u2u5aFm6Y5gqumuauGuauGmau6mau6qau66V01k7tqJi5qxouoGruoGjurGbuom97VNHPVMne7ZXlfz8bT2MHH3NnX0s3P+l6A3YMgR+8QJ59Q54ehzo\/CXB6FIzg\/CnN+GOb0MMzxYaijzyIO3qEOyE\/vUAfvUPsl7LyWsfUMtfUMsfUMsfEMsUZ+Pnhm\/SDE+kGI1dJPxRsawMoBHz2sGf7xK2rHr6g9eOR\/2+4uYKMAMab5AAAAANjQQOPTfAAAAABsaNZg5aOTPNIwq7GHUtlKLK7vya\/uyK\/uKKrrrmwlNvZQiEMTo5O8954PAAAA\/AOBxqb5qzI0MduEG8ir7mjDD9Anpjmz87PzAp5ggSdYmJ0XcGbn6YypNvxAXnVHYy91aGJWlpgAAAAAWC+gsSm+FEYneW3EocLargE6a3aeP89fmOMtzPIWuPPLzPIW5ngL8\/yFWZ5gcJRdUNPZRhwaneRJjwwAAACA9QIaneJLgkSfrOnsx5Hp3Hn+HG9hZn515ngL3Hk+jkyv6ewn0SelBAcAAADAegGNTvEwoYxNFTf2Do6xZ3mCmXkBZ05WZuYF3Hn+0Bi7rBlvUsC1KFsAAAAAwFsFok\/yxOkbYZc14UcZU7O8BdlNHM0sb2Gcze3o7Zuc5sBAQEBAQG9TGFY+OD5T09E\/SGfN8ham5wSvDZcnGGNO4kjUubn5950mEBAQ0McsaGSSJ0IzntZDoXN5C9NzgqlZbNCWLbHOrIDLE\/TT6FQa\/X2nCQQEBPQxCxph89D0jUzWdvQzp7jTEgwa8ejG9l75I2dVdcyZU7PSa7KmZnv7qFOcmfedKRAQENBHK2iYzUNT1z1AGmJw5gSTXGymZgXNnfj9xy7+euraL0cvaBlbTc1KrDzJFXDmBLRRBok6JGkEfD5\/cnJybGxsZGRkZGRkbGxscnKSz+e\/y1kAAgIC2tBaYeUD49z82u7pWf6kBHeemhW09fQdOnnl5CWV6+qG5\/+6ee5PbelWPsUVTHF5TR24+XmeePdcLndkZITJZLJYrKmpKRaLxeFwhoeHR0ZGuFzuu58OICAgoI0oaIjNE9JFYbQSaNNzAjYXg8lZQWtP3+HT109eUf1T2\/Svm+bXNEzacf2Ts9j1hUzPCfqow+NMtkjfXC6XTqfPzc3xeDw2m42syhkMBmLlw8PDwM0\/KOHx+KysLOklG1Efa15A\/yhBQyyekJoOSh9tfGpWwJoRZZIr6MD1Hz59XeGq2t+3zJV0LP7QNu\/EUya5GJXF21JHGH0UGrpjPp8\/PDw8Pz+\/sLCwsLDA4\/EYDMbQkuh0OpvNHh4extxpgSAIj8e\/UdpLEd48lFBZWVlaWlpITKF8fHzWJThaeDx+HYeNVlZWFgRB8vLy6BIkKeQh9KMiJVpaWuhkkYbrOFT0JRPqzSOvmte6CH1viI9ZSiKy138vQRC9dnav0eR99YVIUuQPQRCNxRNS0kwcZk6xuYKJmRWwuYIuAvXw6eunrqkr6d5WM7TWMLZt6+3HXIOzZkSbs7gCOnOqE9+P7pjNZo+PjwsEAoFAMD8\/PyQmNpuN\/MQY9Adg5eIN5eXl3yTmW3LntY5BZDUqklRWVpawgkiJ8L5HpKWlJWVh+xrJil8yHx+fN3fbVfNaF0m\/Nza6lb92dq\/R5N33lZWVhVQQWazI3q\/sepM4K6w8v65nlD0jasQzgk4C9ci5P09f11TRv6Nlaq9pYndD2\/TI2T+\/P6iw8+ffd\/58BOHLvYf\/0jZmib0SsGYE45Pclq4VQ6TT6SwWi8vlIqtvmphGR0c5HA6djvGLjB+glePxeKGRbWgrx0wKj8cLb2vhQ+Il6GWL9CXMulj568VBS5a83lyr3hsb2srfJLu1NnlffSHy8fH5oK18cIInJKuqkzXDY3L4aFgzgjPXNc5c11QztL5p7oigbmTz502zq+qGV9UMhFxQ0j2s+AdrRiASgcnhs2d49W096I5pNBqdTh8eHh7E0sjICIfDmZubo9FoGINeShixD0To5568vDy6UEtLCzkVvw+QOsijwuuEGRYdU\/ioMKCPj4\/Isg49YPEBSA+IOQDkUcQiMWcAM3f0pPn4+IhkijkG4aMiSaFPMUvk5eXFV+joqRbOAzpZTGuWfslkqS+cGSRrSdMlS17C7JCZycrKQt4NiEw15r0kPo3idaRnjVn\/AwmypuwwL5zsY3uPfaEvOix2FwmPhXMl6TkoovWKs5jI4MS8kKyqDub0PJOz4p9TTMzwL6vo\/61jqXPbRTpapg6Kf92cmMH4Dxcszry4laO9GzkdHh5GzB35fcTZ2dnBwUGMQa+8NvDK7WPhU056Q+EBcoWQyymsJhJWZPcAXnmvwCsXoRBK4n4qaZAiN594XtJv2aysLOTmExknOj561xsW2xKRnpQwLyklwmULendF+vilHEvKVHiAucEifm+grVxkumTMS2RCpMweMh78yk8IRO4N8TrSs8a8Pz+QIGvKDvNCS2ryhjO5vn0h79XE50R4F6Ebijy10X4t4glrirOqoIGJeSF5td1DjGkGZ8U3mjM5\/LZesqqBrbaFs56VG8JNC2cVQ9u\/dO+guaZlZmrvweSIfic6g8MfYU6LbLCMjIwMDAwMDAwwGIzJyUkOhzM6OspkMoeGhgYGBqamppC9l5GREYxBQxAejxd5R4\/Yh0ghIvSSc9VLLiUsembRDdG+AGM9H0QGgDlIYSvMAUgZqlDCjxkx7wBJzWVMCl56yylyi6NLhHe8cENT+lRLOZZ+yYSSMsPizz3x6ZIxL5Fe0K+ykmZPeNWk3BviV1ZK1pJm8v0GWVN2rzGM157J9e0L\/bKNeRdJevJK0XrFWZ4QtJUXNRFIQwyGmBczOfx2PEXD2F7n9l1Dm3sG1u5GNvfxlBGszzz5mM0pIyyRjz1ZLNbAwMDo6Oj8krhc7ujo6MCSkOOJiQmMQa\/FytEl4p+ZSDI4kbDIMbK+E78D0M4l8hDmANbXysXnBz1OzFGhj2VMCl76FT30hIiXIHssmEsYSQOQnpf0SyZlhiVZufh0yZIXIrSVrzp7SKGUe0NYR5asJc3A+w0ie3avMYzXnsl17wutNT15pWi94iy3pTLnhVS0k5t6KEwOf2yKJwKDw2\/DU9SNHfSs3A1t76sa2lxU1u8gDDCmMSqLwOTwOwkDRPKKrRI+nz8wMEClUtlsttDN2Ww2jUajUqnIlsvAwID0X0aEVi6RkEdF3pgInQW\/ljdi4mERCfcQ0JMufZsCcwBr2mDBrCAcKuYaXHycktxTlqTwS5\/jI7kgz3aREmEoSMJaVdIA0DvsSLnsl0zKDEMSNlhE3vzKkhe6ufAn5uwhB8KrhnlviNQRxpeeNeZFf79B1pQd5oWW0uRNZnLd+xLxAfEnncj9LPsGi+xxVtUKK2\/rG8ur6pjg8DG\/wZwxzW\/DUTTMnPRt7ulauV1WNzp6Uam5u398Gru+kIkZfmVj1xiDJdI3h8OhUCg0Gm1ubg6x8rm5ucHBQTqdjizJORzsL8gVee1CJPKKjZ415NMDeXl5WVblmGHR7zeRysgbcOT3k6Ssf4VXRWQA4oMUBpSU16pDRVaRIuOUkqmUyuJJCT+BEf\/IVPzGxVw9ocvRyQqHgRQKn4qyXDIpM4z+LEvSdMmYF9Jc+NRC9ugxZ0\/4aaHwVUT83hCpA680IElZi8zAhxBkrdlhXmhJTd5wJte3LxErF7+L0PczLPbUlqT1irNYmcKcF0Ic4cRmV4+yZ0enML7EnD7JG5\/mt+Go2uYuRnYPDGzuX1EzPveH9tg0H7MywugUb3xyLq+8HvOrbqenp6lU6vDwMJPJRP5ECPnkk0qlTk9Przr6D0Hin7x9BMJMCr8x\/yoSv9p71fXKC8J6CV9rkA2kd5ndx9rXOgqiMObRVLRTShp6GNN8kW9MFDI2xW\/DUW9auhrZe2mYOpk7eY1NSaw8wuaNT\/Nr23Eif+qJFo\/Hm5iYGBoaolAoFAplaGhoYmKCx8P4whYgoNeQlpbWu3lyils5ENA7E0RmzKPpGmAlFtTjBxn0SZ7IlyYKGZ3iN\/eStSxcHLyCaEzOiOSa9Ele3xCzuKoZ\/C8hoHcs4T6J9CX5OgpYOdB7lKiVkxnzJS2ktJLG8Wm+FI8eneIzpvnS6wyzeRMzgoKqFhyJ+r7TBAICAvqYBfWPz4uAH+YkFTcX1vWMTfHRf9a\/Vsam+DVt+MrGNvAP4YCAgIDeqjCsvH98vpPKCkspa+imjk7yh1g82sTaGGLxRif5zXhaRkEl2FrZuGJ8\/iXgtXnfVw\/onyWIND6PSdfgZEBCQX5t9xBrjsbiDUzICo3FG2bNFdb3PIrKPvuScz5NANiIvHcr\/Ah47xcR8M8BIo3PSaKlfzwiszImu4o8NkWf5A2y5tF\/GirOIGuePsmjjE1FZ1VGZFbihqalBAd84Lx3H\/wIeO8XEfDPAeobm5MCcXQ2o6LDLTApvbSFOs6hT\/KGWLzBifmBpb8qGmDOD07MD7F49EnewPhMVmW7a0BiRkUHcXRWemTAB85798GPgPd+EQH\/HFaxcoRu2tSLvAaHJ3GBCQV5tV3tJDpxmDU0wR2a4BKHWe0kekFtT2BCgYPfi5js2m7a1HvPCrAuvHcr3NC898sH+EcBEcfmZARPny1tJT\/PrPKJeuUWnGznG2vnG+salOQT9Soio7KklYynz8oeDQAAAADrBUQcnQMAAADAhgYijM4BAAAAYEMDvSxsAQAAAMCG5h19PQUQEBAQ0NsTsHIgICCgDS9g5UBAQEAbXsDKgYCAgDa8gJUDAQEBbXgBKwcCAgLa8AJWDgQEBLThBawcCAgIaMMLWDkQEBDQhhewciAgIKANL2DlQEBAQBtewMqBgICANryAlQMBAQFteAErBwICAtrwAlYOBAQEtOEFrBwICAhowwtYORAQENCGF7ByICAgoA0vYOVAQEBAG15rtXK8jzwkKnkfPEaxvA8eaZKltVyolSUlyDqnBgQEBPRP0euuyvE+8ou+jHW6rCwtaPkBvI\/8CsuW2AoICAgIaA16y1YuWp6lhfZyYOVAQEBA66G3vSrH+8hL3jwBVg4EBAS0HlpHK5e89728W77S1IGVAwEBAa2H3vaqXLwV2GABAgICWme9ZSvP0hIpXlEArBwICAhoPfROf4MFfOwJBAQE9Db01vbKlx0c\/XvlYK8cCAgIaP0F\/toTCAgIaMMLWDkQEBDQhhewciAgIKANL2DlQEBAQBtewMqBgICANrz+P2+CXXbgwO4\/AAAAAElFTkSuQmCC\" alt=\"\" \/><\/p>\n<p>You can add as much VirtualPageTransformers you want to a database.<\/p>\n<p>P.S.\u00a0Keep in mind that this article has been posted in the \u201cQuick-n-<strong>Dirty<\/strong>\u201d category.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>While playing a little bit with core XPages functionality I found the interesting VirtualPageTransformer interface. With this interface it is possible to implement &#8222;virtual&#8220; XPages, and this allows to do something which can be described like an url mapping (the &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=1028\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[89,26,74],"tags":[33,7,31,32,3],"class_list":["post-1028","post","type-post","status-publish","format-standard","hentry","category-java","category-jsf","category-xpages","tag-8-5-3","tag-domino","tag-java","tag-tipp","tag-xpages"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1028"}],"version-history":[{"count":6,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1028\/revisions"}],"predecessor-version":[{"id":1035,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1028\/revisions\/1035"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}