Skip to main content

Posts

Showing posts from 2016

Killing SSJS - Passing a parameter using Expression Language - Part 3

Quick, but important, footnote to this series. I discovered some serialization problems related to this technique due to the GetMap being transient. The fix is to replace this: transient private GetMap<boolean> readOnlyGetter = new GetMap<boolean>() { @Override public Boolean get(final Object key) { if(null==unid || !(unid instanceof String)){ throw new IllegalArgumentException(); } return isReadOnly(key); } public GetMap<boolean> getReadOnly() { return readOnlyGetter; } with this: public GetMap<boolean> getReadOnly() { readOnlyGetter = new GetMap<boolean>() { @Override public Boolean get(final Object key) { if(null==unid || !(unid instanceof String)){ throw new IllegalArgumentException(); } return isReadOnly(key); } return readOnlyGetter; }

XPages Application Framework (Part 2 of ?)

In my last post, I offered a very rough overview of the framework I've been building and adapting. Full credit where it's due, I've been borrowing and adapting from Jesse Gallagher's XPages Scaffolding - an awesome project that I've learned a great deal dissecting. This is one of those projects that, if you make the effort to truly understand it, will give you entirely new tools and approaches for problems. As usual, I've learned the most changin g things and breaking them. My project differ s f rom Jesse's mostly in that it supports 8.5.3 and doesn't require any relaxed security permissions - bec ause I'm on 8.5.3 and because the admins h ere will not grant any relaxed permissions.

Killing SSJS - Passing a parameter using Expression Language - Part 2

In part 1, I showed how you can expand the DataObject implementation to allow you to pass a parameter to a method and return the result. It's not a perfectly elegant solution, and it has some limitations, but it's a very solid technique and not at all difficult to implement or maintain. But I kept running into roadblocks. What if I have to compute part of the expression? What if I have to get a value based on another parameterized getter? You can't compute part of an EL expression in your EL. So after some research and experimentation, I created the GetMap. This isn't a new concept - it was developed for JSF 1.1 (which is what XPages is built on) but the rest of the world has moved on to JSF 2.0 and so some of these older techniques can be a little tricky to unearth since this hasn't been an issue in the JSF world for years.

XPages Application Framework (Part 1?)

Note: I changed projects and priorities after my last POI article, resulting in a long hiatus. I anticipate using that framework on my current project and will likely refine and complete my related article series. For the past several months, I've been fortunate enough to lead a project overhaul from traditional Domino Webapp to XPages. I had a few goals in mind, but the top three were integrating Bootstrap, embracing MVC principles, and eliminating all SSJS . I imagine the motivation for Bootstrap integration is self-explanatory. There is an OpenNTF project out there called Bootstrap4XPages. I didn't use that for a number of reasons - the main being a policy in the current environment. But you may ask yourself (if you didn't follow that link), why so much hatred for SSJS? I have a litany of reasons. It impacts readability of the XPage source; it hurts maintainability when logic is scattered across dozens of XPages, custom controls, and script libraries; it mixes log

POI Spreadsheet Manager - Part 3

Between the holidays and some deadline pressure, it's taken longer to get to this than I'd like. But at last, here it is. This is my CellStyleManager and CellStyles enum. public class CellStyleManager {     public static final int BORDERLOC_NONE = 0;     public static final int BORDERLOC_TOP = 1;     public static final int BORDERLOC_BOTTOM = 2;     public static final int BORDERLOC_LEFT = 4;     public static final int BORDERLOC_RIGHT = 8;     public static final int BORDERLOC_ALL = BORDERLOC_BOTTOM | BORDERLOC_TOP | BORDERLOC_LEFT | BORDERLOC_RIGHT;     public static final int BORDERLOC_SIDES = BORDERLOC_LEFT | BORDERLOC_RIGHT;     public static final int BORDERLOC_TB = BORDERLOC_TOP | BORDERLOC_BOTTOM;     private final Workbook wb;     private final Map<cellstyles cellstyle=""> styleMap;     private final FontManager fontManager;     public CellStyleManager(Workbook wb) {         this.wb = wb;          this.fontManager = new FontManager(wb);         this.sty