001    package net.sf.logdistiller;
002    
003    /*
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    import java.io.Serializable;
018    import java.util.HashSet;
019    import java.util.Set;
020    
021    import org.apache.commons.lang.ArrayUtils;
022    import org.apache.commons.lang.StringUtils;
023    import org.jdom.Element;
024    
025    /**
026     * One condition for a LogEvent to be selected in a group. It consists of matches on attributes of the LogEvent.
027     */
028    public class Condition
029        implements Serializable
030    {
031        private static final long serialVersionUID = 9085774334169039381L;
032    
033        private final Match[] matches;
034    
035        public static final Condition ACCEPT_ALL = new Condition( null, new Match[0] );
036    
037        /**
038         * @since 1.1
039         */
040        private final Set tags;
041    
042        public Condition( String tags, Match[] matches )
043        {
044            if ( tags != null )
045            {
046                this.tags = new HashSet();
047                String[] values = tags.split( "," );
048                for ( int i = values.length - 1; i > 0; i-- )
049                {
050                    String tag = values[i].trim();
051                    if ( tag.length() > 0 )
052                    {
053                        this.tags.add( tag );
054                    }
055                }
056            }
057            else
058            {
059                this.tags = null;
060            }
061            this.matches = (Match[]) ArrayUtils.clone( matches );
062        }
063    
064        public boolean match( LogEvent le )
065        {
066            int count = matches.length;
067            for ( int i = 0; i < count; i++ )
068            {
069                if ( !matches[i].match( le ) )
070                {
071                    return false;
072                }
073            }
074            return true;
075        }
076    
077        /**
078         * @since 1.1
079         * @param tag tag value looked for
080         * @return <code>true</code> if this condition was flagged with corresponding tag
081         */
082        public boolean hasTag( String tag )
083        {
084            return ( tags == null ) ? false : tags.contains( tag );
085        }
086    
087        public Element dump()
088        {
089            Element elmt = new Element( "condition" );
090            if ( tags != null )
091            {
092                elmt.setAttribute( "tags", StringUtils.join( tags, ", " ) );
093            };
094            int count = ( matches == null ) ? 0 : matches.length;
095            for ( int i = 0; i < count; i++ )
096            {
097                elmt.addContent( matches[i].dump() );
098            }
099            return elmt;
100        }
101    }