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]


Reply via email to