@NotNagivate is indeed a better term. But if we use @AggregateRoot as default behavior we also need a directive to excplicity move away from the aggregate:
@AggregateRoot public class Invoice { ... public Invoice creditThisInvoice() { // The @AR annotation prevents the viewer going to this new invoice ... return newlyCreatedInvoice; } } Perhapse introduce @Navigate as well? On Tue, Dec 3, 2013 at 2:02 PM, GESCONSULTOR - Óscar Bou < o....@gesconsultor.com> wrote: > This is a mixed approach and I would prefer it also. > > The viewer annotation @Void (if it's for the viewer, perhaps @NotNavigate > or something more specific or explicit would be better than the generic > term "void" ) would have preference on the viewer's behavior. > > In absence, the logic could be to search for @AggregateRoot on the > action's entity. > > > El 03/12/2013, a las 13:49, Jeroen van der Wal <jer...@stromboli.it> > escribió: > > > I also prefer an annotation and not put boilerplate code in the domain > for > > ui purposes. An @AggregateRoot annotation doesn't meet all our > requirements > > though: we have cases where child objects are an aggregate in it's own: > > > > Lease <- @AggregateRoot > > + LeaseItem <- aggregate for terms > > + LeaseTerm > > > > Another approach in this case would be to use a viewer directive to > ignore > > the result of an action and to return to the calling page. Something > like: > > > > public class LeaseItem { > > ... > > @Void > > public LeaseTerm newTerm(...) {...} > > ... > > } > > > > This solution would also solve situations where you want to navigate away > > from an aggregate root. > > > > Cheers, > > > > Jeroen > > > > > > On Tue, Dec 3, 2013 at 12:48 PM, GESCONSULTOR - Óscar Bou < > > o....@gesconsultor.com> wrote: > > > >> > >> Hi, Dan. > >> > >> I like a lot the idea of explicitly having an annotation for Aggregate > >> Roots (and, "commercially" speaking, it can be a big call to all those > >> interested on DDD...). I'm sure we will find more use cases for that > >> annotation in the near future, as it will force us to consider the > distinct > >> semantics of ARs vs "child" Entities in different places. > >> > >> Also, I like also a lot the idea to have idioms that can be expressed > >> through Isis templates .... but a bit unsure about imposing them (it's > >> clearly not the case on what you're proposing). > >> > >> I assume that the "target" to evaluate would always be the entity you > are > >> invoking the action from. > >> If it's not an AR, in theory it should be showed without being able to > >> modify it (as a Value Object) in order to force the invariants imposed > by > >> the AR. > >> Despite that, in our case, we could have contributed actions (from the > AR, > >> or actions from the Entity delegated to the AR) that would allow for > >> properly modifying it within the context of its AR. And, if no > invariants > >> must be preserved on some fields, they simply could be safely edited ... > >> So, basically, if properly implemented through Isis (with disabled, > hidden > >> and actions) a "child" entity can safely be edited preserving all > >> invariants. > >> > >> As a derivation, on action invoked on Domain Services, Isis viewers will > >> always navigate to the returned entity, despite it's an AR or not (no > >> reason on DDD to return it from a Service, but no need neither to > >> explicitly forbid it for those following "bad practices"). > >> > >> HTH, > >> > >> Oscar > >> > >> > >> > >> > >> El 03/12/2013, a las 12:21, Dan Haywood <d...@haywood-associates.co.uk> > >> escribió: > >> > >>> That's an interesting idea, Oscar. > >>> > >>> The issue arises from the fact that there are potentially two different > >>> callers of the Order#createItem method: > >>> a) the Isis framework itself - in which case, as we all know, the > >> signature > >>> of the methdo is used to determine presentation/navigation > >>> b) other domain objects, ie programmatic interaction. In some cases > the > >>> caller might want the aggregate root (Order), at other times the > >> aggregated > >>> (OrderItem). > >>> > >>> Actually, being strict about (b), under DDD the aggregate root should > >> never > >>> return one of its constituent parts. That would argue that even for > >>> programmatic interactions (b) the method should only return Order, not > >>> OrderItem. > >>> > >>> If we relax that rule, though, then one solution is to split out the > >> method > >>> according to its two different callers, and have one method delegate to > >> the > >>> other; eg: > >>> > >>> public class Order { > >>> public Order createItem( ... ) { > >>> doCreateItem(...); > >>> return this; > >>> } > >>> @Programmatic > >>> pubilc OrderItem doCreateItem( .... ) { > >>> OrderItem item = ... > >>> ... > >>> return item; > >>> } > >>> } > >>> > >>> I suspect the above pattern/idiom is sufficient in many cases. > >>> > >>> But if that seems like too much boilerplate, and we really did want to > >> have > >>> a single method (such that Isis renders the Order even though an > >> OrderItem > >>> is returned) then I think I'd prefer to simply annotate which of our > >>> entities are aggregate roots, ie > >>> > >>> @AggregateRoot > >>> public class Order { ... } > >>> > >>> Then, the rule would be that if the returned object does not have the > >>> AggregateRootFacet, then we instead navigate to the target aggregate > >> root. > >>> > >>> Thoughts? > >>> Dan > >>> > >>> > >>> > >>> > >>> On 3 December 2013 10:01, GESCONSULTOR - Óscar Bou > >>> <o....@gesconsultor.com>wrote: > >>> > >>>> > >>>> Really well-looking, Jeroen. > >>>> > >>>> Regarding navigability through actions, I think that perhaps there > are 2 > >>>> distinct use cases that should be treated differently as such: > >>>> > >>>> 1. The user creates an Aggregate Root (such as an Order). As such, > >>>> normally want to navigate to the newly created one. > >>>> 2. The user creates an Entity that is part of an Aggregate (such as an > >>>> Order Line / Item). In this case, normally the user wants to stay on > the > >>>> Order by default. If not, he/she can always navigate by clicking on > the > >>>> item collections link to the newly created item. > >>>> > >>>> Implementing that desired default behavior by Isis could be easily > done > >>>> with an annotation that can be associated with an action, such as > >>>> @NotNavigate (sure there are better names :-). > >>>> > >>>> By default, the Isis framework viewers open the action's returned > entity > >>>> (such as when invoking Orders.createOrder(...) ), but that behavior > >> could > >>>> be overridden annotating with @NotNavigate the ( > Order.createItem(...) ) > >>>> action: > >>>> > >>>> public class Order { > >>>> > >>>> ... > >>>> > >>>> @NotNavigate > >>>> public OrderItem createItem(...) { > >>>> ... > >>>> } > >>>> > >>>> } > >>>> > >>>> > >>>> Currently, we are forced to choose to return void or return an object, > >> as > >>>> that mandates the Isis viewer behavior. With that annotation, the > value > >>>> returned does not always imposes the navigation behavior. > >>>> > >>>> Perhaps there are better solutions or some pitfalls on this proposal. > >>>> > >>>> HTH, > >>>> > >>>> Oscar > >>>> > >>>> > >>>> > >>>> El 02/12/2013, a las 22:57, Jeroen van der Wal <jer...@stromboli.it> > >>>> escribió: > >>>> > >>>>> Thanks for reminding Dan, screenshot now as link [1] > >>>>> > >>>>> [1] > >>>>> > >>>> > >> > https://dl.dropboxusercontent.com/u/1930710/Attachments/Screen%20Shot%202013-12-02%20at%2010.03.35%20PM.png > >>>>> > >>>>> > >>>>> On Mon, Dec 2, 2013 at 10:23 PM, Dan Haywood > >>>>> <d...@haywood-associates.co.uk>wrote: > >>>>> > >>>>>> Hi Jeroen, > >>>>>> Screenshots get stripped from the mailing list, so you'll need to > post > >>>> it > >>>>>> somewhere online. How about updating the screenshots on Estatio's > >>>> README? > >>>>>> > >>>>>> By the way, I have a further commit... discovered that default > values > >>>> for > >>>>>> parameters are not honoured second time around (ie bring up an > action > >>>>>> prompt, then cancel, then bring it up again). > >>>>>> > >>>>>> Cheers > >>>>>> Dan > >>>>>> > >>>>>> > >>>>>> > >>>>>> On 2 December 2013 21:17, Jeroen van der Wal <jer...@stromboli.it> > >>>> wrote: > >>>>>> > >>>>>>> The modal dialog really improves the usability, thanks Dan. I've > >>>> attached > >>>>>>> attached a screenshot which tells more then thousand words. > >>>>>>> > >>>>>>> I just recently learned that you can use java.lang.Object as the > >> return > >>>>>>> type of an action and return whatever domain object or collection > you > >>>>>>> programmatically decide. So your action basically is the > controller. > >>>>>> Nice! > >>>>>>> Sounds familiar to what Oscar is doing. > >>>>>>> > >>>>>>> Cheers, > >>>>>>> > >>>>>>> Jeroen > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> On Mon, Dec 2, 2013 at 7:37 PM, GESCONSULTOR - Óscar Bou < > >>>>>>> o....@gesconsultor.com> wrote: > >>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> Good done. > >>>>>>>> > >>>>>>>> We also use modal dialogs on our custom viewer to avoid context > >>>>>>>> switching. The same dialog redirects to a Domain Object if that's > >> the > >>>>>>>> result of the action invocation, or currently shows a Collection > in > >> a > >>>>>> grid > >>>>>>>> on the same dialog if that's the result of the action. The user > can > >>>> then > >>>>>>>> navigate to any of the objects in the collection. > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> El 02/12/2013, a las 17:54, Dan Haywood < > >> d...@haywood-associates.co.uk > >>>>> > >>>>>>>> escribió: > >>>>>>>> > >>>>>>>>> Hi folks, > >>>>>>>>> > >>>>>>>>> just an fyi that I've committed and pushed ISIS-486 [1], to > render > >>>> the > >>>>>>>>> Wicket viewer's action prompts in modal dialogs. This should > make > >>>>>> for > >>>>>>>> a > >>>>>>>>> better overall user experience. > >>>>>>>>> > >>>>>>>>> To use, you'll need to build from source, as per [2]. > >>>>>>>>> > >>>>>>>>> In case there are issues, the old behaviour (action prompts on > >> their > >>>>>> own > >>>>>>>>> page) can be enabled by adding the following property: > >>>>>>>>> > >>>>>>>>> isis.viewer.wicket.disableModalDialogs=true > >>>>>>>>> > >>>>>>>>> into WEB-INF/viewer_wicket.properties (or isis.properties if you > >>>>>>>> prefer). > >>>>>>>>> I'll probably remove this original behaviour before pushing out a > >>>>>> final > >>>>>>>>> release, though. > >>>>>>>>> > >>>>>>>>> Cheers > >>>>>>>>> Dan > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> [1] https://issues.apache.org/jira/browse/ISIS-486 > >>>>>>>>> [2] http://isis.apache.org/contributors/building-isis.html > >>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>>> > >>>> > >> > >> > >