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 implements
IFilterStateLocator {
@SuppressWarnings("unused")
public static class CustomerFilter implements Serializable {
private Stringname;
private Stringnip;
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 CustomerFilterfilter= 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 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 DatedateFrom;
private DatedateTo;
private StringcustomerName;
private Stringdescription;
private Statusstatus;
private GroupingModegroupingMode;
}
class SalesDataProvider extends HibernateDataProvider implements
IFilterStateLocator {
private SaleFilterfilter= new SaleFilter();
private final LongcustomerId;
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 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-m