Confused I am not :)

Let me give you three examples...

I. filtering with a subset of properties

This is a class that worked perfectly in 1.4.19:
public class CustomersDataProvider extends
HibernateDataProvider<Customer> implements
IFilterStateLocator<CustomerFilter> {
    @SuppressWarnings("unused")
    public static class CustomerFilter implements Serializable {
        private String    name;
        private String    nip;

        public String getName() {
            return name;
        }

        public void setName( String name ) {
            this.name = name;
        }

        public String getNip() {
            return nip;
        }

        public void setNip( String nip ) {
            this.nip = nip;
        }
    }

    private CustomerFilter    filter    = new CustomerFilter();

    public CustomersDataProvider() {
        super( Customer.class );
        setSort(    "name",
                    true );
    }

    @Override
    public CustomerFilter getFilterState() {
        return filter;
    }

    @Override
    public void setFilterState( CustomerFilter state ) {
        filter = (CustomerFilter) state;
    }

    @Override
    public IModel<Customer> model( Customer object ) {
        return new CustomerModel( object );
    }

    @Override
    protected void filter( Criteria c ) {
        CriteriaHelper.ilike(    c,
                                "name",
                                filter.getName() );
        CriteriaHelper.ilike(    c,
                                "nip",
                                filter.getNip() );
    }
}

why? Customer is a class with lots of properties. I am unable to
provide proper filtering for all properties so I create a
CustomerFilter having only two properties: name and nip. This way I am
stating to other developers that my IDataProvider filters by two
properties only.


II. filtering date properties

Let's have a Sale entity with "date" property. Dates are usually
filtered by date ranges. So in filter I need startDate and finishDate
with two inputs rather than one (Sale.date). It is impossible if the
filter does not differ from base collection type.

with wicket 1.4.19 it was:

@Getter @Setter
public class SaleFilter implements Serializable {
    private Date            dateFrom;
    private Date            dateTo;
    private String            customerName;
    private String            description;
    private Status            status;
    private GroupingMode    groupingMode;
}

class SalesDataProvider extends HibernateDataProvider<Sale> implements
IFilterStateLocator<SaleFilter> {
    private SaleFilter    filter    = new SaleFilter();
    private final Long    customerId;

    public SalesDataProvider( Long customerId ) {
        super( Sale.class );
        this.customerId = customerId;

        setSort(    "date",
                    false );
    }

    @Override
    protected Criteria setupCriteria( Session session ) {
        Criteria c = super.setupCriteria( session );
        c.createAlias(    "customer",
                        "customer" );
        return c;
    }

    @Override
    protected void filter( Criteria c ) {
        if ( customerId != null )
            c.add( Restrictions.eq( "customer.id",
                                    customerId ) );
        else if ( !StringUtils.isBlank( filter.getCustomerName() ) )
            CriteriaHelper.ilike(    c,
                                    "customer.name",
                                    filter.getCustomerName() );

        CriteriaHelper.dateFilter(    c,
                                    "date",
                                    filter.getDateFrom(),
                                    filter.getDateTo() );

        CriteriaHelper.ilike(    c,
                                "description",
                                filter.getDescription() );

        if ( filter.getStatus() != null )
            c.add( Restrictions.eq( "status",
                                    filter.getStatus() ) );

        if ( filter.getGroupingMode() != null )
            c.add( Restrictions.eq( "groupingMode",
                                    filter.getGroupingMode() ) );
    }

    @Override
    public IModel<Sale> model( Sale object ) {
        return new SaleModel( object );
    }

    @Override
    public SaleFilter getFilterState() {
        return filter;
    }

    @Override
    public void setFilterState( SaleFilter state ) {
        this.filter = state;
    }
}


III. filtering with a superset of properties

Lets design a data provider for Order.

How would you create a filter for orders containing a selected
product? Probably so:

@Getter @Setter
public class OrderFilter implements Serializable {
    private Date creationStartDate;
    private Date creationFinishDate;
    private String customerName;
    private Long selectedProductId;
}

In this case the filter contains MORE properties than the actual Order itself.

-- 
Leszek Gawron

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to