You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@isis.apache.org by Deepak Gopalakrishnan <dg...@gmail.com> on 2013/12/20 01:13:00 UTC

Trying to do bulk delete from a parented collection

Hello,

I have a dom class A which contains a datamember List<B>. I need to be able
to select and delete multiple items in list B in one go. The issue I'm
facing is that @Bulk does work only work with standalone collections. Can
someone gimme an example of how to do this?


-Deepak

Re: Trying to do bulk delete from a parented collection

Posted by Dan Haywood <da...@haywood-associates.co.uk>.
Quick follow-up on this ; Deepak contacted me offlist to say that the code
below throws a ClassCastException.  It seems that Isis assumes that
standalone collections are of type java.util.List, not Sets.

The workaround is therefore:

    @ActionSemantics(Of.SAFE)
    public SortedSet<B> bulkDelete() { return new ArrayList<B>(children); }


Deepak's gonna raise a ticket for this so that the original code I posted
would also work.

Dan



On 20 December 2013 08:05, Dan Haywood <da...@haywood-associates.co.uk> wrote:

> Hi Deepak,
> the best you can do at the moment (other than providing a patch :-) is to
> "export" the parented collection as a standalone collection:
>
> public class A {
>
>     private SortedSet<B> children = ...
>     public SortedSet<B> getChildren() { return children; }
>     public void setChildren(SortedSet<B> children) { this.children =
> children; }
>
>     // simply exposes (a copy of) the parented collection as a standalone
> collection
>     @ActionSemantics(Of.SAFE)
>     public SortedSet<B> bulkDelete() { return new TreeSet<B>(children); }
>
> }
>
> and then:
>
> public class B {
>
>     private A parent;
>     public A getParent() { return parent; }
>     public void setParent(A parent) { this.parent= parent; }
>
>     @Bulk
>     public SortedSet<B> delete() {
>        A parent = getParent();
>        container.removeIfNotAlready(this);
>        TreeSet<B> remainingChildren = parent.bulkDelete();
>        remainingChildren.remove(this);
>        return remainingChildren;
>     }
> }
>
> It might also work simply as:
>
>     @Bulk
>     public void delete() {
>        container.removeIfNotAlready(this);
>     }
>
> I have a feeling that if the bulk action returns void, then the standalone
> collection is refreshed.
>
> Hope that helps.  If the user experience isn't good enough, though, then
> do go ahead and raise a ticket if you wish for @Bulk being supported on
> parented collections.  No guarantees when it'll be implemented, though...
>
> Cheers
> Dan
>
>
> [1]
> https://github.com/apache/isis/blob/isis-1.3.0/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java#L569
>
>
>
>
>
> On 20 December 2013 00:13, Deepak Gopalakrishnan <dg...@gmail.com> wrote:
>
>> Hello,
>>
>> I have a dom class A which contains a datamember List<B>. I need to be
>> able
>> to select and delete multiple items in list B in one go. The issue I'm
>> facing is that @Bulk does work only work with standalone collections. Can
>> someone gimme an example of how to do this?
>>
>>
>> -Deepak
>>
>
>

Re: Trying to do bulk delete from a parented collection

Posted by Dan Haywood <da...@haywood-associates.co.uk>.
Hi Deepak,
the best you can do at the moment (other than providing a patch :-) is to
"export" the parented collection as a standalone collection:

public class A {

    private SortedSet<B> children = ...
    public SortedSet<B> getChildren() { return children; }
    public void setChildren(SortedSet<B> children) { this.children =
children; }

    // simply exposes (a copy of) the parented collection as a standalone
collection
    @ActionSemantics(Of.SAFE)
    public SortedSet<B> bulkDelete() { return new TreeSet<B>(children); }

}

and then:

public class B {

    private A parent;
    public A getParent() { return parent; }
    public void setParent(A parent) { this.parent= parent; }

    @Bulk
    public SortedSet<B> delete() {
       A parent = getParent();
       container.removeIfNotAlready(this);
       TreeSet<B> remainingChildren = parent.bulkDelete();
       remainingChildren.remove(this);
       return remainingChildren;
    }
}

It might also work simply as:

    @Bulk
    public void delete() {
       container.removeIfNotAlready(this);
    }

I have a feeling that if the bulk action returns void, then the standalone
collection is refreshed.

Hope that helps.  If the user experience isn't good enough, though, then do
go ahead and raise a ticket if you wish for @Bulk being supported on
parented collections.  No guarantees when it'll be implemented, though...

Cheers
Dan


[1]
https://github.com/apache/isis/blob/isis-1.3.0/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java#L569





On 20 December 2013 00:13, Deepak Gopalakrishnan <dg...@gmail.com> wrote:

> Hello,
>
> I have a dom class A which contains a datamember List<B>. I need to be able
> to select and delete multiple items in list B in one go. The issue I'm
> facing is that @Bulk does work only work with standalone collections. Can
> someone gimme an example of how to do this?
>
>
> -Deepak
>