On 22 December 2015 at 15:19, Óscar Bou - GOVERTIS <o....@govertis.com>
wrote:

>
> Hi all.
>
> I find the SPI Service really useful for advanced use cases.
>
> But in order to have the desired behavior clearly specified on the same
> class definition, shouldn't be helpful to also have an annotation
> indicating the desired behavior (like returning this instance)?
>
>
Seems better to provide a lower level SPI service that can work in all use
cases, and then use that as a building block for higher level abstractions
that might include annotations (or more likely, a new attribute of the
@Action annotation).

But to start that conversation, we could have a new "strategy" attribute,
eg:

@Action(
    routeUsing=MyRouter.class  // implements some sort of "Router"
interface, similar to our Specification interface
)
public void whatever(...) { ... }

Cheers
Dan




> Christmas here also :))
>
> HTH,
>
> Oscar
>
> > El 22 dic 2015, a las 15:54, Cesar Lugo <cesar.l...@sisorg.com.mx>
> escribió:
> >
> > Dan,
> >
> > I think your proposal is quite good to have a configurable "default"
> behavior, and having the option to return whatever the developer wants is
> quite useful as well. Probably this could evolve to some kind of wizard (I
> saw a work in progress in Isis add-ons), or even some integration with some
> BPM tool. Just thinking loud here, it's christmas  :) .
> >
> > Cesar.
> >
> > -----Original Message-----
> > From: Dan Haywood [mailto:d...@haywood-associates.co.uk]
> > Sent: Tuesday, December 22, 2015 6:02 AM
> > To: users
> > Subject: Re: How should we handle void and null results
> >
> > There was a related discussion a while back [1], revolving around
> whether the Wicket viewer should always render the returned object, or some
> other object (eg the owning object/aggregate root).  I raised a ticket
> ISIS-666 [2] for this, and have also now referenced this thread [3].
> >
> > To pick up on a couple of points made:
> >
> > * should the object returned by the action determine the next object
> rendered (ie do domain object actions act as "controllers")?  Yu Ri says
> no, whereas in the previous conversation (Oscar, Jeroen, Dan) I think we
> were always saying its ok, but to provide the ability for this to be
> modified (eg to the aggregate root rather than leaf).  We didn't discuss
> the case of returning void, though.
> >
> > * Martin was wondering about whether Person#delete() even makes sense.
> I think it does though; at least an end-user would want to press a button
> called "delete" on a domain object.  Behind the covers that might be a
> contributed action or mixin or double-dispatch back to a repository
> service.  But that's an implementation detail: the core responsibility is
> for a domain object to know how to get itself deleted
> >
> > * Steve suggests that where there is no obvious answer to "which object
> should be shown next", then the home page might be a reasonable default.  I
> agree, and think we should provide such a capability.
> >
> > * Cesar illustrates how to return a parent object, eg for both delete
> and also for add.
> >
> > To me it seems that it's unlikely to be a single policy that will
> support all use cases.  So I propose a new optional SPI service that, if
> present, the viewer will consult to determine which object to show next.  I
> see this a quite low-level service and we might use it as a building block
> to some higher-level strategy (eg based on new annotations) at a later date.
> >
> > The SPI I suggest is:
> >
> > public interface RoutingService {
> >
> >     public Object route(Object original);
> >
> > }
> >
> > A default implementation could be something like:
> >
> > public class RoutingServiceDefault {
> >
> >    public Object route(Object original) {
> >        return original != null? original: homePage();
> >    }
> >
> >    private Object homePage() { ... code to find the @HomePage object if
> any ... } }
> >
> > This behaviour could be overridden eg to support the aggregate object
> idea as discussed in [1].
> >
> > So, that's my proposal.
> >
> > Cheers
> > Dan
> >
> >
> >
> > [1] http://markmail.org/message/xhmeq62ywr2vqvje .
> > [2] https://issues.apache.org/jira/browse/ISIS-666
> >
> >
> >> On 21 December 2015 at 14:46, Cesar Lugo <cesar.l...@sisorg.com.mx>
> wrote:
> >>
> >> Hello. I am just another Isis user like you, but I thought this might
> help:
> >>
> >> Wicket viewer shows what you "return" in your action method, so,
> >> because you are returning void, Wicket is showing "no results"
> >> message. Usually, you return the thing you create or update, but you
> >> can return the parent if that's what you want, or anything else you
> >> need, just get it in your code and return it. For example, I have a
> >> method that adds a Deliverer that belongs to a BusinessLocation, and
> >> after created shows the parent BusinessLocation entity object instead
> >> of showing the Deliverer object just created (in my case, when showing
> >> the BusinessLocation parent, the Deliverer just  created shows in the
> >> collection section, which is what I wanted, because Business have that
> >> collection). If you adapt this code to your deletePerson method I think
> it can work.
> >>
> >> My sample code is:
> >>
> >>    @Action(
> >>            domainEvent = CreateDomainEvent.class
> >>    )
> >>    @MemberOrder(name = "deliverers",sequence = "24")
> >>    public BusinessLocation addDeliverer(
> >>            final @ParameterLayout(named="Business Location")
> >> BusinessLocation businessLocation,
> >>            final @ParameterLayout(named="Deliverer Id") String
> >> delivererId,
> >>            final @ParameterLayout(named="First Name") String firstName,
> >>            final @ParameterLayout(named="Middle Name")
> >> @Parameter(optionality = Optionality.OPTIONAL)String middleName,
> >>            final @ParameterLayout(named="Last Name") String lastName,
> >>            final @ParameterLayout(named="Last Name 2")
> >> @Parameter(optionality = Optionality.OPTIONAL)String lastName2,
> >>            final @ParameterLayout(named="Contact Phone")
> >> @Parameter(optionality = Optionality.OPTIONAL)Long contactPhone,
> >>            final @ParameterLayout(named="Delivery Phone")
> >> @Parameter(optionality = Optionality.OPTIONAL)Long deliveryPhone,
> >>            final @ParameterLayout(named="Deliverer Picture")
> >> @Parameter(optionality = Optionality.OPTIONAL) Blob delivererPicture
> >>    )
> >>    {
> >>        final Deliverer obj =
> >> container.newTransientInstance(Deliverer.class);
> >>        obj.setBusinessLocation(businessLocation);
> >>        obj.setDelivererId(delivererId);
> >>        obj.setFirstName(firstName);
> >>        obj.setMiddleName(middleName);
> >>        obj.setLastName(lastName);
> >>        obj.setLastName2(lastName2);
> >>        obj.setContactPhone(contactPhone);
> >>        obj.setDeliveryPhone(deliveryPhone);
> >>        obj.setDelivererPicture(delivererPicture);
> >>        obj.setCreationTime(clockService.nowAsDateTime());
> >>        container.persistIfNotAlready(obj);
> >>        return obj.getBusinessLocation();
> >>    }
> >>
> >> If you choose to return the parent of the Person object being deleted,
> >> make sure you get the parent before you Delete the person. Have fun!
> >>
> >> Cesar.
> >>
> >> -----Original Message-----
> >> From: Y.R Tan [mailto:m...@yuritan.nl]
> >> Sent: Saturday, December 19, 2015 5:44 AM
> >> To: users
> >> Subject: How should we handle void and null results
> >>
> >> Hi everyone,
> >>
> >> When using a void action, let’s say a remove action, the user is
> >> redirected to a page "no results". When clicking the back button in
> >> the browser the user sees "Object not found" (since you’ve just
> >> deleted this object).
> >>
> >> Example:
> >>
> >> public class Person {
> >>    ....
> >>    public void remove() {
> >>        ...
> >>    }
> >> }
> >>
> >> You can return a list for example to prevent the user from being
> >> redirect to a "No results" page, but I think it’s not the
> >> responsibility of the controllers in the domain model. A solution
> >> could be that wicket viewer goes back one page when encountering a
> >> deleted object. And refresh the current page when receiving a null
> response or invoking a void action.
> >>
> >> What do you guys think that is the best solution? Or do you have
> >> another view on this situation?
> >>
> >> Looking forward hearing from you.
> >>
> >> Regards,
> >>
> >> Yu Ri Tan
> >>
> >>
> >> ---
> >> This email has been checked for viruses by Avast antivirus software.
> >> https://www.avast.com/antivirus
> >
> >
> > ---
> > This email has been checked for viruses by Avast antivirus software.
> > https://www.avast.com/antivirus
> >
>

Reply via email to