void initializeFilterFields() {
   /* Create new filters only if Filterable */
   if (owner.getFilterable() != null) {
     for (Object property : owner.getVisibleColumns()) {
       if (owner.getContainerPropertyIds().contains(property)) {
         AbstractField filter =
             createField(property, owner.getContainerDataSource().getType(property));
         addFilterColumn(property, filter);
       } else {
         addFilterColumn(property, createField(null, null));
       }
     }
   }
 }
  private Filter generateFilter(Property field, Object propertyId, Object value) {
    if (field instanceof DateFilterPopup) {
      /* Handle date filtering */
      DateInterval interval = ((DateFilterPopup) field).getDateValue();
      if (interval == null) {
        /* Date interval is empty -> no filter */
        return null;
      }
      if (owner.getFilterGenerator() != null) {
        Filter newFilter = owner.getFilterGenerator().generateFilter(propertyId, interval);
        if (newFilter != null) {
          return newFilter;
        }
      }
      Date from = interval.getFrom();
      Date to = interval.getTo();
      if (from != null && to != null) {
        return new Between(propertyId, from, to);
      } else if (from != null) {
        return new Compare.GreaterOrEqual(propertyId, from);
      } else {
        return new Compare.LessOrEqual(propertyId, to);
      }
    } else if (field instanceof NumberFilterPopup) {
      /* Handle number filtering */
      NumberInterval interval = ((NumberFilterPopup) field).getInterval();
      if (interval == null) {
        /* Number interval is empty -> no filter */
        return null;
      }
      if (owner.getFilterGenerator() != null) {
        Filter newFilter = owner.getFilterGenerator().generateFilter(propertyId, interval);
        if (newFilter != null) {
          return newFilter;
        }
      }
      String ltValue = interval.getLessThanValue();
      String gtValue = interval.getGreaterThanValue();
      String eqValue = interval.getEqualsValue();
      Class<?> clazz = owner.getContainerDataSource().getType(propertyId);
      Method valueOf;

      // We use reflection to get the vaueOf method of the container
      // datatype
      try {
        valueOf = clazz.getMethod("valueOf", String.class);
        if (eqValue != null) {
          return new Compare.Equal(propertyId, valueOf.invoke(clazz, eqValue));
        } else if (ltValue != null && gtValue != null) {
          return new And(
              new Compare.Less(propertyId, valueOf.invoke(clazz, ltValue)),
              new Compare.Greater(propertyId, valueOf.invoke(clazz, gtValue)));
        } else if (ltValue != null) {
          return new Compare.Less(propertyId, valueOf.invoke(clazz, ltValue));
        } else if (gtValue != null) {
          return new Compare.Greater(propertyId, valueOf.invoke(clazz, gtValue));
        } else {
          return null;
        }
      } catch (Exception e) {
        throw new RuntimeException("Creating number filter has failed.", e);
      }
    } else if (value != null && !value.equals("")) {
      /* Handle filtering for other data */
      if (owner.getFilterGenerator() != null) {
        Filter newFilter = owner.getFilterGenerator().generateFilter(propertyId, value);
        if (newFilter != null) {
          return newFilter;
        }
      }
      return new SimpleStringFilter(propertyId, String.valueOf(value), true, false);
    }
    /* Value is null or empty -> no filter */
    return null;
  }