i thought the issue we were discussing here is the way the models are linked...which is not solved by making setdefaultmodelobject non-public.
-igor On Thu, Sep 27, 2012 at 10:04 AM, Sven Meier <s...@meiers.net> wrote: > If you extend GenericPanel you inherit setModel() and getModel(), that's the > whole purpose of this base class. > You want these two methods, otherwise you wouldn't extend it - there's > nothing to fix. > > Component#setDefaultModel() is dangerous because it allows others to tinker > with your component innards. > > I still think limiting access to #setDefaultModel() is a good idea, but this > is no crucial issue anyway. > > Sven > > > > On 09/27/2012 06:16 PM, Michael Mosmann wrote: >> >> Am 27.09.2012 17:51, schrieb Igor Vaynberg: >> >> good point.. >> -1 from me.. thought it was a good idea, but wasn’t >> >> Michael >> >>> so what happens if panel A extends GenericPanel which has setModel? >>> you havent fixed anything. >>> >>> -igor >>> >>> On Thu, Sep 27, 2012 at 8:50 AM, Michael Mosmann <mich...@mosmann.de> >>> wrote: >>>> >>>> Am 27.09.2012 17:32, schrieb Igor Vaynberg: >>>> >>>> Hi, >>>> >>>> .. i would leave setModel as it is, only make this change for >>>> Component.setDefaultModel(). >>>> >>>> Michael >>>> >>>>> -1 on changing setDefaultModel(). >>>>> >>>>> 1) if B panel's model is truly dependent on A's then that dependency >>>>> should be expressed: >>>>> >>>>> add(new BPanel("b", new PropertyModel(this, "defaultModel")); >>>>> >>>>> or do not use the default model slot of B to store the model. that way >>>>> setDefaultModel() calls on B will be a noop and you can choose not to >>>>> provide a setter. >>>>> >>>>> 2) you are only "solving" this for a subset of usecases where the >>>>> container (A) is not generic. are we also going to make setModel(T) >>>>> protected? that would require the model assignment be done through the >>>>> constructor only and would eliminate any possibility of writing >>>>> builder-style code. consider a simple example: >>>>> >>>>> new DropDownChoice("foo").setModel(bar).setChoices(baz)... >>>>> >>>>> this kind of code should be possible whether written directly by the >>>>> developer in the page or produced by some builder. >>>>> >>>>> -igor >>>>> >>>>> >>>>> On Thu, Sep 27, 2012 at 5:19 AM, Sven Meier <s...@meiers.net> wrote: >>>>>> >>>>>> Even a simpler example might fail (no PropertyModel involved): >>>>>> >>>>>> >>>>>> class APanel extends Panel { >>>>>> APanel(String id, IModel<Some> model) { >>>>>> super(id,model); >>>>>> >>>>>> add(new BPanel("b", model); >>>>>> } >>>>>> } >>>>>> >>>>>> A client using APanel might later change the model, leaving BPanel >>>>>> working >>>>>> on the old model: >>>>>> aPanel.setDefaultModel(otherModel); >>>>>> >>>>>> You could argue that APanel should be made failsafe when passing the >>>>>> model: >>>>>> >>>>>> add(new BPanel("b", new PropertyModel(this, "defaultModel"))); >>>>>> >>>>>> But it would be much easier if APanel could assume that its model >>>>>> isn't >>>>>> changed unattendedly. >>>>>> >>>>>> IMHO changing a component's model isn't the "wicket way" so I'd >>>>>> suggest >>>>>> changing the visibility of Component#setDefaultModel() to protected. >>>>>> >>>>>> Sven >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On 09/27/2012 10:47 AM, Martin Grigorov wrote: >>>>>>> >>>>>>> I see. This is an advanced way to create a static model :-) >>>>>>> But again I find PropertyModel as the real problem here. >>>>>>> >>>>>>> I'll let others give their opinions too. >>>>>>> >>>>>>> On Thu, Sep 27, 2012 at 11:39 AM, Michael Mosmann >>>>>>> <mich...@mosmann.de> >>>>>>> wrote: >>>>>>>> >>>>>>>> Am 27.09.2012 09:51, schrieb Martin Grigorov: >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> a dont care about the type issue here.. Maybe i can explain it again >>>>>>>> in >>>>>>>> an >>>>>>>> other way: >>>>>>>> >>>>>>>> APanel uses model instance A and the label uses a property model >>>>>>>> instance >>>>>>>> P >>>>>>>> which uses a reference to model instance A. >>>>>>>> >>>>>>>> After calling APanel.setDefaultModel(B) APanel uses model instance >>>>>>>> B,but >>>>>>>> label uses model instance P which uses model instance A as before. >>>>>>>> So >>>>>>>> the >>>>>>>> label does not see any changes, because no one tells the model >>>>>>>> instance >>>>>>>> P, >>>>>>>> that it should use B instead of A. I think, there are rare cases for >>>>>>>> such >>>>>>>> a >>>>>>>> usage. >>>>>>>> >>>>>>>> thanks >>>>>>>> Michael >>>>>>>> >>>>>>>> >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> In this particular code I think the "problem" is PropertyModel, >>>>>>>>> since >>>>>>>>> it brings the type unsafety. >>>>>>>>> >>>>>>>>> Another solution is to make Component<T>, this way we can remove >>>>>>>>> #setDefaultModel() and have #setModel(IModel<T>) only and such >>>>>>>>> problems will go away. >>>>>>>>> But as discussed in early Wicket 1.4 days this will lead to more >>>>>>>>> typing. With Java 7 diamonds it is half the typing though. >>>>>>>>> >>>>>>>>> For now you can use GenericPanel, GenericPage and all >>>>>>>>> FormComponent. >>>>>>>>> >>>>>>>>> On Thu, Sep 27, 2012 at 10:41 AM, Michael Mosmann >>>>>>>>> <mich...@mosmann.de> >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> Am 27.09.2012 09:01, schrieb Martin Grigorov: >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> I think, there is a little difference in using setDefaultModel and >>>>>>>>>> setDefaultModelObject .. the first one sets a new model instance, >>>>>>>>>> the >>>>>>>>>> second >>>>>>>>>> only change the value in the existing model. Some pseudo-code: >>>>>>>>>> >>>>>>>>>> class APanel extends Panel { >>>>>>>>>> APanel(String id,IModel<Some> model) { >>>>>>>>>> super(id,model); >>>>>>>>>> >>>>>>>>>> add(new Label("name",new >>>>>>>>>> PropertyModel(getDefaultModel(),"name")); >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> If you replace the value in model, everything is fine and works as >>>>>>>>>> expected. >>>>>>>>>> If you call setDefaultModel you might think, that everything is >>>>>>>>>> fine, >>>>>>>>>> but >>>>>>>>>> its not. A child component does not use >>>>>>>>>> getParent().getDefaultModel() >>>>>>>>>> to >>>>>>>>>> get >>>>>>>>>> these changes. I saw a lot of code like this, which leads to >>>>>>>>>> trouble, >>>>>>>>>> if >>>>>>>>>> you >>>>>>>>>> change the model and not the value. >>>>>>>>>> >>>>>>>>>> If there is no benefit in using setDefaultModel over >>>>>>>>>> setDefaultModelObject i >>>>>>>>>> would like to remove this method. This could prevent many "you >>>>>>>>>> might >>>>>>>>>> not >>>>>>>>>> got >>>>>>>>>> the full picture how to use wicket the right way" errors. >>>>>>>>>> >>>>>>>>>> Michael >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> Hi, >>>>>>>>>>> >>>>>>>>>>> Most of the time it is recommended to use a dynamic model, so >>>>>>>>>>> there >>>>>>>>>>> is >>>>>>>>>>> no reason to replace the component's model. >>>>>>>>>>> Component#setDefaultModel() gives you semi-dynamic nature - you >>>>>>>>>>> can >>>>>>>>>>> replace the model completely with a new one. Same with >>>>>>>>>>> #setDefaultModelObject(). >>>>>>>>>>> >>>>>>>>>>> What is the problem you face with it ? >>>>>>>>>>> >>>>>>>>>>> On Thu, Sep 27, 2012 at 9:57 AM, Michael Mosmann >>>>>>>>>>> <mich...@mosmann.de> >>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Hi, >>>>>>>>>>>> >>>>>>>>>>>> is there any usefull application of >>>>>>>>>>>> Component.setDefaultModel(...)? >>>>>>>>>>>> IMHO >>>>>>>>>>>> this Method is the cause for much trouble without any benefit. >>>>>>>>>>>> But >>>>>>>>>>>> maybe >>>>>>>>>>>> i >>>>>>>>>>>> did not understand when someone should replace a component >>>>>>>>>>>> model... >>>>>>>>>>>> >>>>>>>>>>>> thanks >>>>>>>>>>>> Michael >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >> >