Hi Ramsey, Am 13.03.2012 um 18:20 schrieb Ramsey Gurley:
> On Mar 13, 2012, at 5:53 AM, Fabian Peters wrote: > >> Hi Ramsey, >> >> Am 13.03.2012 um 01:49 schrieb Ramsey Gurley: >> >>> On Mar 12, 2012, at 4:21 PM, Fabian Peters wrote: >>> >>>> Hi Ramsey, >>>> >>>>>> swallowed in ERD2WPage since d2wContext().propertyKey() is null. Setting >>>>>> the propertyKey from the exception resolves this: >>>>>> >>>>>> if (d2wContext().propertyKey() == null && erv.propertyKey() != >>>>>> null) { >>>>>> d2wContext().setPropertyKey(erv.propertyKey()); >>>>>> } >>>>>> >>>>>> Maybe this (or some better solution) should be added to ERD2W? >>>>> >>>>> I don't remember exactly why I didn't do this, but I think it broke query >>>>> validation. Hence why I wanted to make a pluggable validation delegate. >>>>> The logic in there has become so overloaded, it's difficult to make >>>>> changes without breaking something for someone, somewhere :-) >>>> >>>> I haven't yet looked into query validation. How could I test this? >>> >>> I don't remember what broke or how I broke it. It was quite a while ago. >>> >>> Pushing the propertyKey into the d2wContext there will have other >>> consequences though. Taking a second look at the code, it looks like you'll >>> get errors if you try this in a nested page that propogates exceptions. >> >> My understanding of D2W is still quite limited, so I'm not sure I really >> understand what this would mean. When would a nested page throw an exception >> for which d2wContext().propertyKey() == null in >> validationFailedWithException? Could we add a check via >> shouldPropagateExceptions() and/or shouldCollectValidationExceptions()? Or >> just use a copy of the context? > > That would be safer. Something like > > D2WContext c = ERD2WContext.newContext(oldContext); > > It's still dirty though. Remember, each nested page has it's own d2wContext. > So if you are propagating exceptions to the parent page, you are probably > pushing the propertyKey into a context with an entity that doesn't have that > property. > > Example: An OwnerEO has a DogEO which has a numberOfFleas attribute. If your > numberOfFleas attribute is the cause of a validation exception and it's > propagated up to the OwnerEO page, you'll be pushing numberOfFleas > propertyKey onto a d2wContext with an entity and object of OwnerEO. That > could end badly depending on what rules are triggered after it happens. > > Anyway, my gut says don't do it this way :-) It has no brain, but my gut is > correct with surprising frequency. Well, I'm very much willing to accept your judgement here, but I'd still like to fix the issue. I can say "works for me" and carry on with a forked ERD2WPage. But I'd rather not, as this will make life more complicated in the future. >> I'm creating quite a few objects in embedded page configurations here and >> the code does indeed get called when saving a (valid) new object that is >> then getting set up as the destination of the relationship. But the >> validation error is not getting displayed, probably because the relevant >> update container is not being refreshed. When clicking on next, the >> validation is run again and no exception is thrown. >> >> I've tried this with a classic ERD2WWizardCreationPageTemplate and the >> result is the same, i.e. the method is getting called but the exception is >> not getting displayed. >> >>>>>> It seems to me that the whole validationKeys approach is unusable >>>>>> otherwise? >>>>> >>>>> Using validateKeys would be the correct approach. But were you actually >>>>> able to display the error with validateKeys on an ERMODWizard page? Last >>>>> time I tried that, it didn't work... >>>>> >>>>> https://github.com/projectwonder/wonder/issues/97 >>>> >>>> Well, with the modification above it works for me. That's the only thing I >>>> had to change for it to work. >>> >>> Good to know. If no one else is having the issue, I can close it. >> >> Just to be sure: I do have the issue, modifying ERD2WPage fixes it. > > When I had the issue, the validation exception was throwing, but it was not > showing up in the page. I assumed some part of the ajaxyness was swallowing > it and continuing on, because the same worked fine in a look with no ajax. Are you sure about it working in a non-ajax look? I've just tested this using the ERMovies example app with the neutral look. The first rule below was changed so that a tab for studio is included and the second was added: 333 : (pageConfiguration = 'EditTabMovie' or pageConfiguration = 'EditWizardMovie') => displayPropertyKeys = ("[Title Information]",title,trailerName,dateReleased,"[Studio]","(Studio)",studio,"[People]","(Directors)",directors,"(Actors)",roles) 333 : ((pageConfiguration = 'EditTabMovie' or pageConfiguration = 'EditWizardMovie') and tabKey = 'Studio') => validationKeys = (validateStudio) My validateStudio() method: public void validateStudio() { if (studio() == null) { System.out.println("Movie.validateStudio: throwing! "); throw ERXValidationFactory.defaultFactory().createException(this, "studio", null, ERXValidationException.MandatoryToOneRelationshipException); } } Exceptions from property-level components (e.g. movie title) are handled correctly, but the exception on the studio relationship falls through. The exception does get thrown. >>>> I still wonder why this missing validation seems not to bother anybody. >>> >>> I think it's more complicated than that. The property key is not guaranteed >>> to be an attribute or relationship. But if you'd like to try something >>> different, you can always clone the wizard page template and create your >>> own logic. >> >> Sure, I'm not saying it's a simple thing to do and I certainly don't want to >> complain. > > I didn't mean to imply you were complaining :-) Just wanted to make sure... > I have my own look framework for this reason. My wizard page doesn't even > have a next/previous button on it. Everything is handled through delegates > that I can switch out on a whim. Just because something isn't already done > in wonder doesn't make it wrong. But at the same time, we can't just change > behaviors that others may be dependent on either. > >> I guess I'm just so impressed with D2W and all the things people have >> implemented already that I feel I must be missing something here. It should >> be possible to check which property keys are being displayed on the current >> tab/step, then check for each of them whether it's a mandatory relationship >> and validate accordingly. > > Devil's Advocate: There's always willUpdate(). How do we know that a > mandatory relationship isn't going to be auto-populated by the business logic > if left empty? Conversely, how do we know if a propertyKey that's handled by > NSKeyValueCoding.ErrorHandling is or isn't mandatory? You'll certainly need > more than just the propertyKey to know. I'll happily use validationKeys for now, it just has to work. ;-) cheers, Fabian >> >>>> I'd expect validation of mandatory to-ones to "just work". It's no fun if >>>> you edit something and on the 7th step you're told you forgot to set a >>>> property on the 1st step. Or is there something I'm overlooking? >>> >>> It would also be no fun if a validation error from step four showed up in >>> step one :-) >> >> ;-) >> >>> The EO can't be validated until the last step when creating. If you want to >>> validate parts of the EO before leaving a step, then validateKeys is >>> currently the place to do it. >> >> Thanks, it's good to know I'm not ignoring something helpful. >> >> cheers, Fabian > _______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com