1/**
2 * $RCSfile$
3 * $Revision$
4 * $Date$
5 *
6 * Copyright 2003-2007 Jive Software.
7 *
8 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 *     http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21package org.jivesoftware.smack.filter;
22
23import org.jivesoftware.smack.packet.Packet;
24
25import java.util.List;
26import java.util.ArrayList;
27
28/**
29 * Implements the logical AND operation over two or more packet filters.
30 * In other words, packets pass this filter if they pass <b>all</b> of the filters.
31 *
32 * @author Matt Tucker
33 */
34public class AndFilter implements PacketFilter {
35
36    /**
37     * The list of filters.
38     */
39    private List<PacketFilter> filters = new ArrayList<PacketFilter>();
40
41    /**
42     * Creates an empty AND filter. Filters should be added using the
43     * {@link #addFilter(PacketFilter)} method.
44     */
45    public AndFilter() {
46
47    }
48
49    /**
50     * Creates an AND filter using the specified filters.
51     *
52     * @param filters the filters to add.
53     */
54    public AndFilter(PacketFilter... filters) {
55        if (filters == null) {
56            throw new IllegalArgumentException("Parameter cannot be null.");
57        }
58        for(PacketFilter filter : filters) {
59            if(filter == null) {
60                throw new IllegalArgumentException("Parameter cannot be null.");
61            }
62            this.filters.add(filter);
63        }
64    }
65
66    /**
67     * Adds a filter to the filter list for the AND operation. A packet
68     * will pass the filter if all of the filters in the list accept it.
69     *
70     * @param filter a filter to add to the filter list.
71     */
72    public void addFilter(PacketFilter filter) {
73        if (filter == null) {
74            throw new IllegalArgumentException("Parameter cannot be null.");
75        }
76        filters.add(filter);
77    }
78
79    public boolean accept(Packet packet) {
80        for (PacketFilter filter : filters) {
81            if (!filter.accept(packet)) {
82                return false;
83            }
84        }
85        return true;
86    }
87
88    public String toString() {
89        return filters.toString();
90    }
91}
92