001    package org.shiftone.jrat.core.criteria;
002    
003    
004    import org.shiftone.jrat.util.log.Logger;
005    
006    import java.util.ArrayList;
007    import java.util.Collection;
008    import java.util.Collections;
009    import java.util.List;
010    
011    
012    /**
013     * @author jeff@shiftone.org (Jeff Drost)
014     */
015    public abstract class CompositeMethodCriteria implements MethodCriteria {
016    
017        private static final Logger LOG = Logger.getLogger(CompositeMethodCriteria.class);
018        private List criterion = new ArrayList();
019    
020        public void addCriteria(MethodCriteria criteria) {
021            criterion.add(criteria);
022        }
023    
024    
025        public int size() {
026            return criterion.size();
027        }
028    
029    
030        public boolean isEmpty() {
031            return criterion.isEmpty();
032        }
033    
034    
035        public void clear() {
036            criterion.clear();
037        }
038    
039    
040        public Collection getCriterion() {
041            return Collections.unmodifiableCollection(criterion);
042        }
043    
044    
045        private MethodCriteria optimize() {
046    
047            if (criterion.size() == 0) {
048                return ConstantMethodCriteria.ALL;
049            } else if (criterion.size() == 1) {
050                return (MethodCriteria) criterion.get(0);
051            }
052    
053            return this;
054        }
055    
056    
057        protected abstract String getTag();
058    
059    
060        public String toString() {
061    
062            StringBuffer sb = new StringBuffer();
063    
064            sb.append("<" + getTag() + " size='" + criterion.size() + "'>");
065    
066            for (int i = 0; i < criterion.size(); i++) {
067                MethodCriteria criteria = (MethodCriteria) criterion.get(i);
068    
069                sb.append(criteria.toString());
070            }
071    
072            sb.append("</" + getTag() + ">");
073    
074            return sb.toString();
075        }
076    }