Hi,

I agree, that look bogus.

WICKET-3413 tried to improve on a similar issue though:

    https://issues.apache.org/jira/browse/WICKET-3413

Wouldn't it be easier, just to always clear FLAG_INHERITABLE_MODEL in #setDefaultModel(), i.e. when a model is set explicitely?

Please create a Jira issue.

Regards
Sven


On 07/29/2014 05:26 PM, Raoul Zander wrote:
Hi,

the flag is not set to true - that's the problem :)

See the method Component.setModelImpl(IModel)

especially (Line 2981 in Wicket-Core 6.16.0):

if (getFlag(FLAG_INHERITABLE_MODEL) && !(model instanceof
IComponentInheritedModel))
{
     setFlag(FLAG_INHERITABLE_MODEL, false);
}

Which should probably be

if (getFlag(FLAG_INHERITABLE_MODEL) && !(model instanceof IWrapModel))
{
     setFlag(FLAG_INHERITABLE_MODEL, false);
}

Regards,
rza

2014-07-29 17:09 GMT+02:00 Sven Meier <[email protected]>:

Hi,

if I look for setFlag(FLAG_INHERITABLE_MODEL, true), it is called in
initModel() only.

Please paste the relevant code or even better create a quickstart.

Regards
Sven


On 07/29/2014 04:59 PM, Raoul Zander wrote:

In Component.setModelImpl(IModel)

- rza

2014-07-29 16:37 GMT+02:00 Sven Meier <[email protected]>:

  Hi,

  the setModel(CompoundPropertyModel ...) actually KEEPS the
FLAG_INHERITABLE_MODEL on true

where is that?

Sven



On 07/29/2014 04:29 PM, Raoul Zander wrote:

  Hi everyone,
I think there is some kind of bug in the handling of
CompoundPropertyModel
(or any IComponentInheritedModel).

In Component exists a Flag FLAG_INHERITABLE_MODEL - which is set to true
whenever a model is inherited from a parent, so that the model can be
nulled onDetach. Thing is: The same flag is set when a
IComponentInheritedModel is set as default model (via
setModelImpl(IModel)).

This leads to exceptions with chained CompoundPropertyModels as in the
following scenario:

(With correct indention and code high lighting:
http://pastebin.com/5iu0qhWw
)

// POJOs (implements Serializable omitted)
public class Game {
       private Data data;
       // getters / setters
}

public class Data {
       private Value value;
       // getters / setters
}


public class Value {
       private int number;
       // getters / setters
}

// Panels
public class DataPanel extends GenericPanel<Data> {

       public DataPanel(String id) {
           super(id);
       }

       protected void onInitialize() {
           super.onInitialize();

           setModel(new CompoundPropertyModel<Data>(getModel()));
           add(new ValuePanel("value"));
       }
}

public class ValuePanel extends GenericPanel<Value> {

       public ValuePanel(String id) {
           super(id);
       }

       protected void onInitialize() {
           super.onInitialize();

           setModel(new CompoundPropertyModel<Value>(getModel()));
           add(new Label("number"));
       }
}

// and the page
public class GamePage extends WebPage {

       protected void onInitialize() {
           super.onInitialize();

           setDefaultModel(new CompoundPropertyModel<Game>(new Game()));
           // make Page stateful like it would happen with AJAX links and
alike
           setStatelessHint(false);
           add(new DataPanel("data"));
       }
}

Markup is irrelevant. The first time the page loads correct but as soon
as
you refresh the page you'll get the error "No get method defined for
class:
class Game expression: number".
Why that? Because the setModel(CompoundPropertyModel ...) actually KEEPS
the FLAG_INHERITABLE_MODEL on true so that our custom set model will be
nulled on the next detach.

In my opinion this is a bug as FLAG_INHERITABLE_MODEL should be true if
(and only if) the current component model was inherited - and not if it
is
*inheritable*.
But on the other hand: Maybe i'm using the models the wrong way and
there's
a better way to achieve the same result (basically using
CompoundPorpertyModels on different levels of an object graph)

Kind regards,
rza


  ---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to