Wonderful !

Now I understand better. If only I could set the String deptId in an inner
variable inside the Model and link it to the property with another model !
This comes from the fact that the building of the RadioChoice is made inside
a Helper Class...

Probably this is an atrocity, but I hope it'll transmit the idea...

Helper.java
----------------------
public static RadioChoice getDeptRadioChoice(String id){
        RadioChoice cr = new RadioChoice(id,
                getDeptsAsDTOList(),
                new SimpleElementChoiceRenderer());

        Model crModel = new Model(){
                String id;
                getObject(){
                        return getDptDTO(id);
                }
                setObject(Object o){
                        id = ( ((DTO) o).getId());
                }
        };
        cr.setModel(crModel);
        return cr;
}

PersonForm.java
-----------------------------

RadioChoice cr = Helper.getDeptRadioChoice("deptId");
cr.setModel(new Model(cr.getModel()){
            public Object getObject(){
                        return ((Model)super.getObject()).getObject();
            }
            public void setObject(Object o){
                ((Model)getObject()).setObject(o);
                p.setDeptId((String)m.getObject());
            }
        });

Thanks !

2009/11/4 Pedro Santos <[email protected]>

> Model crModel = new Model(){
>     getObject(){
>         return contextData.getDTO(p.getDeptId());
>      }
>     setObject(Object o){
>            p.setDeptId( ((DTO) o).getId());
>     }
> };
>
> On Wed, Nov 4, 2009 at 2:32 PM, Xavier López <[email protected]> wrote:
>
> > Hi Sven, Pedro,
> >
> > Thanks both for your quick reply.
> >
> > Ideally you would just set a Department instance into your Person objects
> >
> >
> > the best way is you have your depid property of type Department
> >
> > This was the first approach to take into account, but the idea was
> > discarded
> > in benefit of SimpleElementDTO, in order to provide only the necessary
> > information to Wicket Models, with the intention of not wasting any
> memory
> > on PageMaps due to Department object serializations... Also, this
> > SimpleElementDTO would be reusable throughout the whole application when
> > it's about Radio and DropDown Choices...
> >
> > write some specialized render
> > >
> > This kinda 'dirty-fix' idea was already crawling in my mind, trying to
> come
> > out someway. Thanks for providing a concrete implementation.
> >
> > So, in the end I'm trying to provide a custom model. Something like:
> >
> > Java
> > ------------------------
> > final Person p;
> >
> > Model crModel = new Model(){
> >      getObject(){
> >         return p.getDeptId();
> >       }
> >      setObject(Object o){
> >             // o is String!
> >             p.setDeptId( (String) o);
> >       }
> > };
> > ChoiceRenderer cr = new ChoiceRenderer("deptId", choices, new
> > ChoiceRenderer("id", "description"));
> > cr.setModel(crModel);
> >
> > But i'm stucking into the same error, as this Model it's kind like a
> > PropertyModel which would be assumed by having the former
> > CompoundPropertyModel...
> >
> > Any thoughts ? Maybe rendering labels independently ?
> >
> > It's strange nobody has bumped into this situation before.. Maybe it's
> > because i'm still thinking like I was using Struts...
> >
> > Thanks to both again,
> > Cheers !
> >
> >
> > 2009/11/4 Pedro Santos <[email protected]>
> >
> > > Hi Sven, he stell can write some specialized render... but I think the
> > best
> > > way is you have your depid property of type Department. Than all this
> > > thread
> > > would not have started :)
> > >
> > > class YourCustomRender
> > >    {
> > >        @Override
> > >        public String getIdValue(Object object, int index)
> > >        {
> > >            if (object instanceof DTO)
> > >            {
> > >                return ((DTO)object).getDeptId()
> > >            }
> > >            else
> > >            {
> > >                return (String)object;//already is the depid string
> > >            }
> > >        }
> > >
> > >        @Override
> > >        public Object getDisplayValue(Object object)
> > >        {
> > >            if (object instanceof DTO)
> > >            {
> > >                return ((DTO)object).getDescription();
> > >            }
> > >            else
> > >            {
> > >                return contextData.getDTOBasedOnDepid(object);
> > >             }
> > >        }
> > >    }
> > >
> > > On Wed, Nov 4, 2009 at 1:29 PM, Xavier López <[email protected]>
> wrote:
> > >
> > > > Hi,
> > > >
> > > > I have a question regarding the use of RadioChoice and
> ChoiceRenderer's
> > > in
> > > > conjunction with CompoundPropertyModel. I'm new to Wicket (but
> already
> > a
> > > > convinced user ;) ), so maybe my approach on this one is not at all
> as
> > it
> > > > should be... Any comments are welcome !
> > > >
> > > > I'll get into details. Let's say I have a class in my domain model
> > named
> > > > Person. This entity has a property named 'deptId' of type String. The
> > > > Person
> > > > entity is the backing for a CompundPropertyModel applied to the whole
> > > form.
> > > > The 'deptId' field is inputted by the user, let's say, by means of a
> > > > RadioChoice (I guess it makes no difference from a DropDownChoice
> > taking
> > > > into account the point of the question). The choice list for the
> > > > RadioChoice
> > > > component is a List made up of DTO objects with properties "id" and
> > > > "description". To ensure proper rendering of labels, I use a suitable
> > > > ChoiceRenderer.
> > > >
> > > > Now, problems come when the 'deptId' property has a value in the
> Person
> > > > entity used in the CompoundPropertyModel. I get an error saying that
> > > class
> > > > String does not have any property called 'id' (I suppose this error
> > comes
> > > > from having a ModelObject of type String and also having a
> > ChoiceRenderer
> > > > refering to 'id' property).
> > > >
> > > > I'll provide some sample code:
> > > >
> > > > markup
> > > > -------------
> > > > ...
> > > > <form wicket:id="form">
> > > >    ...
> > > >    <span valign="top" wicket:id="deptId"></span>
> > > >    ...
> > > > </form>
> > > > ...
> > > >
> > > > Java
> > > > -------------
> > > >
> > > > ...
> > > > List<SimpleElementDTO> choices = contextData.getChoices();
> > > > Person p = new Person(...);
> > > > Form f = new Form("form"){...};
> > > > f.setModel(new CompoundPropertyModel(p));
> > > > ChoiceRenderer cr = new ChoiceRenderer("deptId", choices, new
> > > > ChoiceRenderer("id", "description"));
> > > > f.add(cr);
> > > > ...
> > > >
> > > >
> > > > I suppose the 'normal' way of doing things would be providing a
> custom
> > > > Model
> > > > to 'cr', but I'd like to know if there is a possibility to achieve
> this
> > > > point still using CompoundPropertyModel...
> > > >
> > > > The stack trace I get is the following:
> > > >
> > > > WicketMessage: No get method defined for class: class
> java.lang.String
> > > > expression: id
> > > > Root cause:
> > > > org.apache.wicket.WicketRuntimeException: No get method defined for
> > > class:
> > > > class java.lang.String expression: id
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.wicket.util.lang.PropertyResolver.getGetAndSetter(PropertyResolver.java:440)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.wicket.util.lang.PropertyResolver.getObjectAndGetSetter(PropertyResolver.java:282)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.wicket.util.lang.PropertyResolver.getValue(PropertyResolver.java:91)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.wicket.markup.html.form.ChoiceRenderer.getIdValue(ChoiceRenderer.java:140)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.wicket.markup.html.form.AbstractSingleSelectChoice.getModelValue(AbstractSingleSelectChoice.java:144)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.wicket.markup.html.form.FormComponent.getValue(FormComponent.java:797)
> > > > at
> > > >
> > > >
> > >
> >
> org.apache.wicket.markup.html.form.RadioChoice.onComponentTagBody(RadioChoice.java:407)
> > > > at org.apache.wicket.Component.renderComponent(Component.java:2480)
> > > > at
> > org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1411)
> > > > at org.apache.wicket.Component.render(Component.java:2317)
> > > > at
> > > org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1297)
> > > > ...
> > > >
> > >
> > >
> > >
> > > --
> > > Pedro Henrique Oliveira dos Santos
> > >
> >
> >
> >
> > --
> > "To err is human; to make real mess, you need a computer."
> >
>
>
>
> --
> Pedro Henrique Oliveira dos Santos
>



-- 
"To err is human; to make real mess, you need a computer."

Reply via email to