package net.sf.kerner.utils.collections.impl.filter;

import java.util.ArrayList;
import java.util.List;

import net.sf.kerner.utils.collections.applier.ApplierAbstract;
import net.sf.kerner.utils.collections.filter.Filter;
import net.sf.kerner.utils.collections.filter.FilterApplier;
import net.sf.kerner.utils.collections.list.impl.UtilList;

public class FilterApplierProto<E> extends ApplierAbstract implements FilterApplier<E> {

    private List<Filter<E>> filters = UtilList.newList();

    public FilterApplierProto() {
        this(DEFAULT_FILTER_TYPE);
    }

    public FilterApplierProto(final Filter<E>... filters) {
        this(DEFAULT_FILTER_TYPE, filters);
    }

    public FilterApplierProto(final TYPE type) {
        super(type);
    }

    public FilterApplierProto(final TYPE type, final Filter<E>... filters) {
        super(type);
        for (final Filter<E> f : filters) {
            this.filters.add(f);
        }
    }

    public synchronized void addFilter(final Filter<E> filter) {
        filters.add(filter);
    }

    public synchronized void clear() {
        filters.clear();
    }

    public boolean filter(final E e) {
        switch (type) {
        case ALL:
            for (final Filter<E> f : filters) {
                if (f.filter(e)) {
                    // take
                } else {
                    return false;
                }
            }
            return true;
        case ONE:
            for (final Filter<E> f : filters) {
                if (f.filter(e)) {
                    return true;
                } else {
                    // see what others say
                }
            }
            return false;
        default:
            throw new RuntimeException("unknown type " + type);
        }
    }

    public List<Filter<E>> getFilters() {
        return new ArrayList<Filter<E>>(filters);
    }

    public void setFilters(final List<Filter<E>> filters) {
        this.filters = new ArrayList<Filter<E>>(filters);
    }
}

@@ -1182,24 +1182,28 @@
 ) %7B%0A        
+    
 case ALL:%0A  
@@ -1200,16 +1200,20 @@
 se ALL:%0A
+    
         
@@ -1260,32 +1260,36 @@
                 
+  
+  
 if (f.filter(e))
@@ -1315,16 +1315,20 @@
     
+    
 // take%0A
     
@@ -1323,16 +1323,20 @@
 // take%0A
+    
         
@@ -1364,32 +1364,36 @@
                 
+    
 return false;%0A  
@@ -1398,34 +1398,40 @@
                 
-%7D%0A
+    %7D%0A  
             %7D%0A  
@@ -1418,34 +1418,40 @@
 %7D%0A              
-%7D%0A
+  %7D%0A    
             retu
@@ -1451,32 +1451,36 @@
    return true;%0A
+    
         case ONE
@@ -1485,32 +1485,36 @@
 NE:%0A            
+    
 for (final Filte
@@ -1541,32 +1541,36 @@
                 
+    
 if (f.filter(e))
@@ -1584,32 +1584,36 @@
                 
+  
+  
 return true;%0A   
@@ -1617,32 +1617,36 @@
                 
+    
 %7D else %7B%0A       
@@ -1630,32 +1630,36 @@
        %7D else %7B%0A
+    
                 
@@ -1693,34 +1693,42 @@
                 
-%7D%0A
+    %7D%0A    
             %7D%0A  
@@ -1729,32 +1729,36 @@
   %7D%0A            
+  
+  
 return false;%0A  
@@ -1763,16 +1763,20 @@
         
+    
 default:
@@ -1776,16 +1776,20 @@
 efault:%0A
+    
         
@@ -2083,11 +2083,103 @@
 );%0A    %7D
+%0A%0A    @Override%0A    public String toString() %7B%0A        return getFilters().toString();%0A    %7D
 %0A%7D%0A

Add FilterApplierProto#toString().