public Object visit(PropertyName expression, Object notUsed) {
   // JD: use an expression to get at the attribute type intead of accessing directly
   if (parent != null && expression.evaluate(parent) == null) {
     throw new IllegalArgumentException(
         "Property '"
             + expression.getPropertyName()
             + "' could not be found in "
             + parent.getTypeName());
   }
   if (transactionAccessor != null) {
     Filter updateFilter =
         (Filter) transactionAccessor.getUpdateFilter(expression.getPropertyName());
     if (updateFilter != null) {
       changedStack.add(updateFilter);
       preStack.push(updateFilter);
     } else preStack.push(expression);
   } else {
     preStack.push(expression);
   }
   return null;
 }
  /**
   * Gets the filter that can be sent to the server for pre-processing.
   *
   * @return the filter that can be sent to the server for pre-processing.
   */
  public Filter getFilterPre() {
    FilterFactory ff = CommonFactoryFinder.getFilterFactory(null);
    if (preStack.isEmpty()) {
      return Filter.INCLUDE;
    }

    if (preStack.size() > 1) {
      logger.warning("Too many pre stack items after run: " + preStack.size());
    }

    // JE:  Changed to peek because get implies that the value can be retrieved multiple times
    Filter f = preStack.isEmpty() ? Filter.INCLUDE : (Filter) preStack.peek();
    // deal with deletes here !!!
    if (transactionAccessor != null) {
      if (f != null && f != Filter.EXCLUDE) {
        Filter deleteFilter = transactionAccessor.getDeleteFilter();
        if (deleteFilter != null) {
          if (deleteFilter == Filter.EXCLUDE) f = Filter.EXCLUDE;
          else f = ff.and(f, ff.not(deleteFilter));
        }
      }
    }

    if (changedStack.isEmpty()) return f;

    Iterator iter = changedStack.iterator();
    Filter updateFilter = (Filter) iter.next();
    while (iter.hasNext()) {
      Filter next = (Filter) iter.next();
      if (next == Filter.INCLUDE) {
        updateFilter = next;
        break;
      } else {
        updateFilter = (Filter) ff.or(updateFilter, next);
      }
    }
    if (updateFilter == Filter.INCLUDE || f == Filter.INCLUDE) return Filter.INCLUDE;
    return ff.or(f, updateFilter);
  }