Probably dangerous but nice...or, probably nice but dangerous ;-)
Anyway, perhaps this can find its way in our wiki. http://wiki.apache.org/tapestry/ On 4/6/07, Drew McAuliffe <[EMAIL PROTECTED]> wrote:
You can also do what I did and just contribute a brand new expression evaluator: public class NullSafeExpressionEvaluator extends ExpressionEvaluatorImpl { private static Logger log = Logger.getLogger( NullSafeExpressionEvaluator.class); private static final String START_BRACKET = "{"; private static final String ESCAPED_BRACKET = START_BRACKET; private static final String END_BRACKET = ESCAPED_BRACKET; public Object readCompiled(Object target, Object expression){ Object result = null; try{ result = super.readCompiled(target, expression); } catch (ApplicationRuntimeException e){ if (!(e.getRootCause() instanceof NullPointerException)) result = ""; // don't do anything! } return result; } } HIVEMIND: <!-- override OGNL evaluator to use more null friendly one --> <implementation service-id="tapestry.ognl.ExpressionEvaluator"> <invoke-factory> <construct class="com.mypackage.NullSafeExpressionEvaluator"> <set-object property="applicationSpecification" value="infrastructure:applicationSpecification"/> <set-configuration property="contributions" configuration-id="PropertyAccessors"/> <set-configuration property="nullHandlerContributions" configuration-id="NullHandlers"/> </construct> </invoke-factory> </implementation> On 1/31/07, andyhot <[EMAIL PROTECTED]> wrote: > > Gentry, Michael (Contractor) wrote: > > I get an error trying to contribute to tapestry.ognl.NullHandlers ... > > Is that available in T4? Thanks! > > > > Damn, that's 4.1 only... > If you're on 4.0.x, you can still do this, but you'll have to register > the handlers on your own. > > You just have to call OgnlRuntime's static method at a convenient time, > i.e. on app startup > > OgnlRuntime.setNullHandler(subjectClass, handler); > > That's exactly what happens in > > http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ExpressionEvaluatorImpl.java?view=markup > > > > > > > The electronic mail message you have received and any files transmitted > > with it are confidential and solely for the intended addressee(s)'s > > attention. Do not divulge, copy, forward, or use the contents, > > attachments, or information without permission of Fannie Mae. > > Information contained in this message is provided solely for the purpose > > stated in the message or its attachment(s) and must not be disclosed to > > any third party or used for any other purpose without consent of Fannie > > Mae. If you have received this message and/or any files transmitted with > > it in error, please delete them from your system, destroy any hard > > copies of them, and contact the sender. > > > > > > -----Original Message----- > > From: andreas a [mailto:[EMAIL PROTECTED] On Behalf Of andyhot > > Sent: Tuesday, January 30, 2007 12:15 PM > > To: Tapestry users > > Subject: Re: Tapestry prop: suggestion (or question) > > > > Gentry, Michael (Contractor) wrote: > > > >> I've downloaded and tried out the prop: prefix extension from HLS. > >> > > One > > > >> thing I was *really* hoping for, compared to OGNL, is that it would > >> ignore null pointers, at least on reads. > >> > > > > OGNL has a feature called NullHandlers > > > > You contribute one to configuration point tapestry.ognl.NullHandlers > > like this > > <null-handler class="class.having.null.properties" > > object="instance:org.MyNullHandler"/> > > > > where MyNullHandler implements > > http://www.ognl.org/2.6.9/Documentation/javadoc/ognl/NullHandler.html > > > > So, if you have a RegisterPage that contains a path like > > user.department.name you have > > to register null handlers (could be the same one) for the following : > > RegisterPage (cause its user may be null), > > User (cause his department may be null) > > > > > > > > > > > >> I have report-type pages > >> (read-only) where I can sometimes have thousands of rows with 10-15 > >> columns. Each of those columns currently has bulky cover methods > >> > > which > > > >> do NPE protection in case a relationship is missing (the actual values > >> almost always come from a dotted path: foo.bar.baz.status, and OGNL > >> > > will > > > >> blow up if "bar" is null). I was hoping the prop: extension would > >> handle this, but it seems to work just like OGNL if it hits a null. > >> > > If > > > >> something doesn't exist, I'm pretty happy with just getting a null > >> > > back > > > >> and displaying nothing. > >> > >> I played with the code a bit and this seems to work if you edit > >> PropertyAccessorBinding.java and change the getObject() method: > >> > >> public Object getObject() > >> { > >> return _accessor.readProperty(); > >> } <http://www.len.ro/work/articles/tapestry-ajax-application-1/> > >> > >> to: > >> > >> public Object getObject() > >> { > >> try > >> { > >> return _accessor.readProperty(); > >> } > >> catch (NullPointerException exception) > >> { > >> // Ignore NPE on reads ... > >> return null; > >> } > >> } > >> > >> A) Does this seem like a reasonable thing to do? > >> B) If yes to A, could it maybe be included in the actual prop: package > >> (would beat maintaining a separate branch). > >> > >> Thanks! > >> > >> /dev/mrg > >> > >> PS. I didn't alter setObject() ... I'd consider that an actual error > >> > > if > > > >> you were trying to set things through nulls. > >> > >> > >> The electronic mail message you have received and any files > >> > > transmitted > > > >> with it are confidential and solely for the intended addressee(s)'s > >> attention. Do not divulge, copy, forward, or use the contents, > >> attachments, or information without permission of Fannie Mae. > >> Information contained in this message is provided solely for the > >> > > purpose > > > >> stated in the message or its attachment(s) and must not be disclosed > >> > > to > > > >> any third party or used for any other purpose without consent of > >> > > Fannie > > > >> Mae. If you have received this message and/or any files transmitted > >> > > with > > > >> it in error, please delete them from your system, destroy any hard > >> copies of them, and contact the sender. > >> > >> > >> > >> > >> > >> > > > > > > > > > -- > Andreas Andreou - [EMAIL PROTECTED] - http://andyhot.di.uoa.gr > Tapestry / Tacos developer > Open Source / J2EE Consulting > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > >
-- Andreas Andreou - [EMAIL PROTECTED] - http://andyhot.di.uoa.gr Tapestry / Tacos developer Open Source / JEE Consulting