Hi Tapestry List, long time no hear...

How do you make tapestry spit out what encoder/coercions are supported.  My
encoder doesn't seem to be getting registered

I am writing an app and have had to use a ValueEncoder.  I don't know where
I am going wrong, I've written them before...and for the past 3 days get
the same stupid coercion message.

My understanding is
1.  Write encoder that implements ValueEncoder
2.  Contribute to value encoders
3.  encoder="myNewEncoder" in the tapestry component to use where no
coercions come out-of-the-box

I have tried two alternatives and would like to know where I've gone wrong
in either please.

1.  Using Igor's Tapestry 5 book, I wrote a class called
LibraryEventEncoder and placed it in an uncontrolled package, it implements
ValueEncoder.

package au.com.mrvoip.t5app.encoders ;

public class LibraryEventEncoder implements ValueEncoder<LibraryEvent> {

    private LibraryEventFacadeLocal _libraryEventService;

    public LibraryEventEncoder(LibraryEventFacadeLocal libraryService) {
        this._libraryEventService = libraryService;

    }

    @Override
    public String toClient(LibraryEvent v) {
        return String.valueOf(v.getId());
    }

    @Override
    public LibraryEvent toValue(String id) {
        return _libraryEventService.find(Long.valueOf(id));
    }
}


AppModule receives this addition


    @Contribute(ValueEncoderSource.class)
    public static void provideEncoders(MappedConfiguration<Class,
ValueEncoderFactory>configuration, final LibraryEventFacadeLocal lqmefl){
        System.out.println("CHRIS THIS HAS BEEN CONTRIBUTED";
        ValueEncoderFactory<LibraryEvent> factory = new
ValueEncoderFactory<LibraryEvent>(){
            public ValueEncoder<LibraryEvent> create(Class<LibraryEvent>
clazz){
                return new LibraryEventEncoder(lqmefl);
            }
        };

        configuration.add(LibraryEvent.class, factory);
    }


My page class uses a simple grid and the template follows

    @EJB
    private LibraryEventFacadeLocal libraryService;
    @Property
    private LibraryEvent lmevent;

    @Property
    private LibraryEventEncoder libeventEncoder = new LibraryEventEncoder();

    public List<LibraryEvent> getLMEvents() {

        return libraryService.getMostRecentDistinct("2720101"); //returns a
short list (3-10 results usually)
    }

    public ValueEncoder<LibraryQueueMemberEvent> getLibEventEncoder(){
        return libEventEncoder  ;
    }



    <t:grid source="lmevents" encoder="libEventEncoder" row="lmevent"
rowsPerPage="50" >
            <p:empty>
              <p>There are no lmevents to display; you can add some
manually when the link is made.</p>
            </p:empty>
        </t:grid>




And the alternate way which appears to be popular - some private inner
class as a replacement, as well as something like this directly in the get
method.

    public LibraryEventEncoder getLibEventEncoder() {
        return new LibraryEventEncoder(lmService) {
            public String toClient(LibraryEvent value) {
                return String.valueOf(value.getId());
            }

            public LibraryEvent toValue(String clientValue) {
                LibraryEvent e =
libEventService.find(Long.valueOf(clientValue));
                if (String.valueOf(e.getId()).equals(clientValue)) {
                    return e;
                }
                return null;
            }
        };
    }


But all the time I'm getting a problem with coercion of String to
LibraryEvent even with the System.out.println message being spat out of
logs that this encoder is being contributed (or at least i think it is)


Any pointers would be helpful
Chris

Reply via email to