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); }