//# 1 errors, 337 messages
//#
/*
    //#refererfiltermanager.java:1:1: class: net.sourceforge.pebble.domain.RefererFilterManager
    //#refererfiltermanager.java:1:1: method: net.sourceforge.pebble.domain.RefererFilterManager.net.sourceforge.pebble.domain.RefererFilterManager__static_init
 * Copyright (c) 2003-2006, Simon Brown
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *
 *   - Neither the name of Pebble nor the names of its contributors may
 *     be used to endorse or promote products derived from this software
 *     without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package net.sourceforge.pebble.domain;

import net.sourceforge.pebble.dao.DAOFactory;
import net.sourceforge.pebble.dao.PersistenceException;
import net.sourceforge.pebble.dao.RefererFilterDAO;
import net.sourceforge.pebble.logging.CountedUrl;

import java.util.*;
import java.util.regex.Matcher;

/**
 * A class to manage regular expressions used to filter out obscene and spam
 * referers that appear in the logs.
 *
 * @author    Simon Brown
 */
public class RefererFilterManager {

  /** the next filter id - used internally */
  private int nextId = 1;

  /** the owning root blog */
  private Blog rootBlog;

  /** the collection of all filters */
  private Collection filters;

  /**
   * Creates a new instance.
   */
  RefererFilterManager(Blog rootBlog) {
    //#refererfiltermanager.java:62: method: void net.sourceforge.pebble.domain.RefererFilterManager.net.sourceforge.pebble.domain.RefererFilterManager(Blog)
    //#refererfiltermanager.java:62: Warning: suspicious precondition
    //#    the precondition for net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void net.sourceforge.pebble.domain.RefererFilterManager(Blog)
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[net/sourceforge/pebble/dao/DAOFactory]
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[net/sourceforge/pebble/dao/file/FileDAOFactory]
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/DAOFactory.__Dispatch_Table.getRefererFilterDAO()Lnet/sourceforge/pebble/dao/RefererFilterDAO;
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO.__Tag
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/RefererFilterDAO]
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/file/FileRefererFilterDAO]
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/RefererFilterDAO.__Dispatch_Table.getRefererFilters(Lnet/sourceforge/pebble/domain/Blog;)Ljava/util/Collection;
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/file/FileDAOFactory.__Dispatch_Table.getRefererFilterDAO()Lnet/sourceforge/pebble/dao/RefererFilterDAO;
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Dispatch_Table.getRefererFilters(Lnet/sourceforge/pebble/domain/Blog;)Ljava/util/Collection;
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.log
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[net/sourceforge/pebble/domain/RefererFilter]
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.setExpression(Ljava/lang/String;)V
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.setId(J)V
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): rootBlog
    //#input(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): this
    //#output(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): new ArrayList(getRefererFilters#1) num objects
    //#output(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): this.filters
    //#output(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): this.nextId
    //#output(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): this.rootBlog
    //#new obj(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): new ArrayList(getRefererFilters#1)
    //#pre[1] (void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory != null
    //#pre[2] (void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag in {net/sourceforge/pebble/dao/DAOFactory, net/sourceforge/pebble/dao/file/FileDAOFactory}
    //#pre[3] (void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO != null
    //#pre[5] (void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): (soft) net/sourceforge/pebble/dao/file/FileRefererFilterDAO.log != null
    //#pre[6] (void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): (soft) rootBlog != null
    //#post(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): this.filters == One-of{&new ArrayList(getRefererFilters#1), undefined}
    //#post(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): this.filters in Addr_Set{null,&new ArrayList(getRefererFilters#1)}
    //#post(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): init'ed(this.nextId)
    //#post(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): this.rootBlog == rootBlog
    //#post(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): (soft) this.rootBlog != null
    //#post(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): new ArrayList(getRefererFilters#1) num objects <= 1
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:getConfiguredFactory
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:getRefererFilterDAO
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:net.sourceforge.pebble.dao.PersistenceException:printStackTrace
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:getRefererFilters
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.io.File
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.util.regex.Pattern:compile
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.util.ArrayList:add
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void net.sourceforge.pebble.domain.RefererFilterManager(Blog)): Effects-of-calling:org.apache.commons.logging.Log:error
    this.rootBlog = rootBlog;
    init();
  }
    //#refererfiltermanager.java:65: end of method: void net.sourceforge.pebble.domain.RefererFilterManager.net.sourceforge.pebble.domain.RefererFilterManager(Blog)

  /**
   * Initializes the filters.
   */
  private void init() {
    try {
      DAOFactory factory = DAOFactory.getConfiguredFactory();
    //#refererfiltermanager.java:72: method: void net.sourceforge.pebble.domain.RefererFilterManager.init()
    //#refererfiltermanager.java:72: Warning: suspicious precondition
    //#    the precondition for net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void init()
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(void init()): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[net/sourceforge/pebble/dao/DAOFactory]
    //#input(void init()): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[net/sourceforge/pebble/dao/file/FileDAOFactory]
    //#input(void init()): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[others]
    //#input(void init()): net/sourceforge/pebble/dao/DAOFactory.__Dispatch_Table.getRefererFilterDAO()Lnet/sourceforge/pebble/dao/RefererFilterDAO;
    //#input(void init()): net/sourceforge/pebble/dao/DAOFactory.configuredFactory
    //#input(void init()): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag
    //#input(void init()): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO
    //#input(void init()): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/RefererFilterDAO]
    //#input(void init()): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/file/FileRefererFilterDAO]
    //#input(void init()): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[others]
    //#input(void init()): net/sourceforge/pebble/dao/RefererFilterDAO.__Dispatch_Table.getRefererFilters(Lnet/sourceforge/pebble/domain/Blog;)Ljava/util/Collection;
    //#input(void init()): net/sourceforge/pebble/dao/file/FileDAOFactory.__Dispatch_Table.getRefererFilterDAO()Lnet/sourceforge/pebble/dao/RefererFilterDAO;
    //#input(void init()): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Dispatch_Table.getRefererFilters(Lnet/sourceforge/pebble/domain/Blog;)Ljava/util/Collection;
    //#input(void init()): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.log
    //#input(void init()): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[net/sourceforge/pebble/domain/RefererFilter]
    //#input(void init()): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[others]
    //#input(void init()): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.setExpression(Ljava/lang/String;)V
    //#input(void init()): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.setId(J)V
    //#input(void init()): this
    //#input(void init()): this.nextId
    //#input(void init()): this.rootBlog
    //#output(void init()): new ArrayList(getRefererFilters#1) num objects
    //#output(void init()): this.filters
    //#output(void init()): this.nextId
    //#new obj(void init()): new ArrayList(getRefererFilters#1)
    //#pre[1] (void init()): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory != null
    //#pre[2] (void init()): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag in {net/sourceforge/pebble/dao/DAOFactory, net/sourceforge/pebble/dao/file/FileDAOFactory}
    //#pre[3] (void init()): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO != null
    //#pre[4] (void init()): (soft) net/sourceforge/pebble/dao/file/FileRefererFilterDAO.log != null
    //#pre[6] (void init()): (soft) this.nextId <= 4_294_967_294
    //#pre[8] (void init()): (soft) this.rootBlog != null
    //#presumption(void init()): dao.__Tag@73 in {net/sourceforge/pebble/dao/file/FileRefererFilterDAO, net/sourceforge/pebble/dao/RefererFilterDAO}
    //#presumption(void init()): java.util.Iterator:next(...).__Tag@79 == net/sourceforge/pebble/domain/RefererFilter
    //#presumption(void init()): java.util.Iterator:next(...)@79 != null
    //#post(void init()): this.filters == One-of{&new ArrayList(getRefererFilters#1), old this.filters}
    //#post(void init()): init'ed(this.nextId)
    //#post(void init()): new ArrayList(getRefererFilters#1) num objects <= 1
    //#unanalyzed(void init()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void init()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(void init()): Effects-of-calling:java.io.File
    //#unanalyzed(void init()): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void init()): Effects-of-calling:java.io.FileReader
    //#unanalyzed(void init()): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(void init()): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(void init()): Effects-of-calling:java.util.regex.Pattern:compile
    //#unanalyzed(void init()): Effects-of-calling:java.util.ArrayList:add
    //#unanalyzed(void init()): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(void init()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void init()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void init()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void init()): Effects-of-calling:org.apache.commons.logging.Log:error
      RefererFilterDAO dao = factory.getRefererFilterDAO();
    //#refererfiltermanager.java:73: Warning: method not available
    //#    -- call on RefererFilterDAO getRefererFilterDAO()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void init()
    //#    unanalyzed callee: RefererFilterDAO getRefererFilterDAO()
      filters = dao.getRefererFilters(rootBlog);
    //#refererfiltermanager.java:74: Warning: method not available
    //#    -- call on Collection getRefererFilters(Blog)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void init()
    //#    unanalyzed callee: Collection getRefererFilters(Blog)

      Iterator it = filters.iterator();
      RefererFilter filter;
      while (it.hasNext()) {
        filter = (RefererFilter)it.next();
        filter.setId(nextId);
        nextId++;
    //#refererfiltermanager.java:81: ?overflow
    //#    this.nextId in -2_147_483_649..4_294_967_294
    //#    severity: LOW
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void init()
    //#    basic block: bb_8
    //#    assertion: this.nextId in -2_147_483_649..4_294_967_294
    //#    VN: this.nextId + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
      }
    } catch (PersistenceException pe) {
      pe.printStackTrace();
    //#refererfiltermanager.java:84: Warning: method not available
    //#    -- call on void net.sourceforge.pebble.dao.PersistenceException:printStackTrace()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void init()
    //#    unanalyzed callee: void net.sourceforge.pebble.dao.PersistenceException:printStackTrace()
    }
  }
    //#refererfiltermanager.java:86: end of method: void net.sourceforge.pebble.domain.RefererFilterManager.init()

  /**
   * Adds a new filter to the existing list.
   *
   * @param newFilter   a RefererFilter instance
   */
  public synchronized void addFilter(RefererFilter newFilter) {
    try {
      DAOFactory factory = DAOFactory.getConfiguredFactory();
    //#refererfiltermanager.java:95: method: void net.sourceforge.pebble.domain.RefererFilterManager.addFilter(RefererFilter)
    //#refererfiltermanager.java:95: Warning: suspicious precondition
    //#    the precondition for net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void addFilter(RefererFilter)
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[net/sourceforge/pebble/dao/DAOFactory]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[net/sourceforge/pebble/dao/file/FileDAOFactory]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[others]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/DAOFactory.__Dispatch_Table.getRefererFilterDAO()Lnet/sourceforge/pebble/dao/RefererFilterDAO;
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/RefererFilterDAO]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/file/FileRefererFilterDAO]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[others]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/RefererFilterDAO.__Dispatch_Table.addRefererFilter(Lnet/sourceforge/pebble/domain/RefererFilter;Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/file/FileDAOFactory.__Dispatch_Table.getRefererFilterDAO()Lnet/sourceforge/pebble/dao/RefererFilterDAO;
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/file/FileRefererFilterDAO]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Descendant_Table[others]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Dispatch_Table.addRefererFilter(Lnet/sourceforge/pebble/domain/RefererFilter;Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Dispatch_Table.getRefererFilters(Lnet/sourceforge/pebble/domain/Blog;)Ljava/util/Collection;
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.log
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[net/sourceforge/pebble/domain/RefererFilter]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[others]
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.getExpression()Ljava/lang/String;
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.setExpression(Ljava/lang/String;)V
    //#input(void addFilter(RefererFilter)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.setId(J)V
    //#input(void addFilter(RefererFilter)): newFilter
    //#input(void addFilter(RefererFilter)): newFilter.__Tag
    //#input(void addFilter(RefererFilter)): this
    //#input(void addFilter(RefererFilter)): this.filters
    //#input(void addFilter(RefererFilter)): this.nextId
    //#input(void addFilter(RefererFilter)): this.rootBlog
    //#output(void addFilter(RefererFilter)): newFilter.id
    //#output(void addFilter(RefererFilter)): this.nextId
    //#pre[1] (void addFilter(RefererFilter)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory != null
    //#pre[2] (void addFilter(RefererFilter)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag in {net/sourceforge/pebble/dao/DAOFactory, net/sourceforge/pebble/dao/file/FileDAOFactory}
    //#pre[3] (void addFilter(RefererFilter)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO != null
    //#pre[4] (void addFilter(RefererFilter)): (soft) net/sourceforge/pebble/dao/file/FileRefererFilterDAO.log != null
    //#pre[5] (void addFilter(RefererFilter)): (soft) newFilter != null
    //#pre[6] (void addFilter(RefererFilter)): (soft) newFilter.__Tag == net/sourceforge/pebble/domain/RefererFilter
    //#pre[8] (void addFilter(RefererFilter)): (soft) this.nextId <= 4_294_967_294
    //#pre[10] (void addFilter(RefererFilter)): (soft) this.filters != null
    //#pre[11] (void addFilter(RefererFilter)): (soft) this.rootBlog != null
    //#presumption(void addFilter(RefererFilter)): dao.__Tag@96 == net/sourceforge/pebble/dao/file/FileRefererFilterDAO
    //#post(void addFilter(RefererFilter)): newFilter.id == One-of{old newFilter.id, old this.nextId}
    //#post(void addFilter(RefererFilter)): this.nextId == One-of{old this.nextId, old this.nextId + 1}
    //#post(void addFilter(RefererFilter)): (soft) init'ed(this.nextId)
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.File
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.util.regex.Pattern:compile
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.util.ArrayList:add
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.FileWriter
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.BufferedWriter
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.BufferedWriter:write
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.BufferedWriter:newLine
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.BufferedWriter:flush
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.BufferedWriter:close
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:net.sourceforge.pebble.dao.PersistenceException
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.util.Collection:add
    //#unanalyzed(void addFilter(RefererFilter)): Effects-of-calling:java.lang.Exception
    //#test_vector(void addFilter(RefererFilter)): java.util.Collection:contains(...)@98: {1}, {0}
      RefererFilterDAO dao = factory.getRefererFilterDAO();
    //#refererfiltermanager.java:96: Warning: method not available
    //#    -- call on RefererFilterDAO getRefererFilterDAO()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void addFilter(RefererFilter)
    //#    unanalyzed callee: RefererFilterDAO getRefererFilterDAO()

      if (!filters.contains(newFilter)) {
        dao.addRefererFilter(newFilter, rootBlog);
    //#refererfiltermanager.java:99: Warning: method not available
    //#    -- call on void addRefererFilter(RefererFilter, Blog)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void addFilter(RefererFilter)
    //#    unanalyzed callee: void addRefererFilter(RefererFilter, Blog)
        filters.add(newFilter);
        newFilter.setId(nextId);
        nextId++;
      }
    } catch (PersistenceException pe) {
      pe.printStackTrace();
    //#refererfiltermanager.java:105: Warning: method not available
    //#    -- call on void net.sourceforge.pebble.dao.PersistenceException:printStackTrace()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: void addFilter(RefererFilter)
    //#    unanalyzed callee: void net.sourceforge.pebble.dao.PersistenceException:printStackTrace()
    }
  }
    //#refererfiltermanager.java:107: end of method: void net.sourceforge.pebble.domain.RefererFilterManager.addFilter(RefererFilter)

  /**
   * Removes a filter from the list.
   *
   * @param expression    the expression to be removed
   */
  public synchronized boolean removeFilter(String expression) {
    try {
      DAOFactory factory = DAOFactory.getConfiguredFactory();
    //#refererfiltermanager.java:116: method: bool net.sourceforge.pebble.domain.RefererFilterManager.removeFilter(String)
    //#refererfiltermanager.java:116: Warning: suspicious precondition
    //#    the precondition for net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: bool removeFilter(String)
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(bool removeFilter(String)): expression
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[net/sourceforge/pebble/dao/DAOFactory]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[net/sourceforge/pebble/dao/file/FileDAOFactory]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/DAOFactory.__Descendant_Table[others]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/DAOFactory.__Dispatch_Table.getRefererFilterDAO()Lnet/sourceforge/pebble/dao/RefererFilterDAO;
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/RefererFilterDAO]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/file/FileRefererFilterDAO]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/RefererFilterDAO.__Descendant_Table[others]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/RefererFilterDAO.__Dispatch_Table.deleteRefererFilter(Lnet/sourceforge/pebble/domain/RefererFilter;Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/file/FileDAOFactory.__Dispatch_Table.getRefererFilterDAO()Lnet/sourceforge/pebble/dao/RefererFilterDAO;
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Descendant_Table[net/sourceforge/pebble/dao/file/FileRefererFilterDAO]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Descendant_Table[others]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Dispatch_Table.deleteRefererFilter(Lnet/sourceforge/pebble/domain/RefererFilter;Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.__Dispatch_Table.getRefererFilters(Lnet/sourceforge/pebble/domain/Blog;)Ljava/util/Collection;
    //#input(bool removeFilter(String)): net/sourceforge/pebble/dao/file/FileRefererFilterDAO.log
    //#input(bool removeFilter(String)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[net/sourceforge/pebble/domain/RefererFilter]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[others]
    //#input(bool removeFilter(String)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.getExpression()Ljava/lang/String;
    //#input(bool removeFilter(String)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.setExpression(Ljava/lang/String;)V
    //#input(bool removeFilter(String)): this
    //#input(bool removeFilter(String)): this.filters
    //#input(bool removeFilter(String)): this.rootBlog
    //#output(bool removeFilter(String)): return_value
    //#pre[2] (bool removeFilter(String)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory != null
    //#pre[3] (bool removeFilter(String)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory.__Tag in {net/sourceforge/pebble/dao/DAOFactory, net/sourceforge/pebble/dao/file/FileDAOFactory}
    //#pre[4] (bool removeFilter(String)): (soft) net/sourceforge/pebble/dao/DAOFactory.configuredFactory.refererFilterDAO != null
    //#pre[5] (bool removeFilter(String)): (soft) net/sourceforge/pebble/dao/file/FileRefererFilterDAO.log != null
    //#pre[7] (bool removeFilter(String)): (soft) this.filters != null
    //#pre[8] (bool removeFilter(String)): (soft) this.rootBlog != null
    //#presumption(bool removeFilter(String)): dao.__Tag@122 == net/sourceforge/pebble/dao/file/FileRefererFilterDAO
    //#presumption(bool removeFilter(String)): filter.expression@122 != null
    //#presumption(bool removeFilter(String)): java.util.Iterator:next(...).__Tag@122 == net/sourceforge/pebble/domain/RefererFilter
    //#presumption(bool removeFilter(String)): java.util.Iterator:next(...)@122 != null
    //#post(bool removeFilter(String)): init'ed(return_value)
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getRoot
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.File
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.util.regex.Pattern:compile
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.util.ArrayList:add
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.util.Collection:remove
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:store
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.FileWriter
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.BufferedWriter
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.BufferedWriter:write
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.BufferedWriter:newLine
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.BufferedWriter:flush
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.BufferedWriter:close
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:net.sourceforge.pebble.dao.PersistenceException
    //#unanalyzed(bool removeFilter(String)): Effects-of-calling:java.lang.Exception
    //#test_vector(bool removeFilter(String)): java.lang.String:equals(...)@124: {0}, {1}
      RefererFilterDAO dao = factory.getRefererFilterDAO();
    //#refererfiltermanager.java:117: Warning: method not available
    //#    -- call on RefererFilterDAO getRefererFilterDAO()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: bool removeFilter(String)
    //#    unanalyzed callee: RefererFilterDAO getRefererFilterDAO()

      Iterator it = filters.iterator();
      RefererFilter filter;
      while (it.hasNext()) {
        filter = (RefererFilter)it.next();

        if (filter.getExpression().equals(expression)) {
          // remove it from the persistent store
          dao.deleteRefererFilter(filter, rootBlog);
    //#refererfiltermanager.java:126: Warning: method not available
    //#    -- call on void deleteRefererFilter(RefererFilter, Blog)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: bool removeFilter(String)
    //#    unanalyzed callee: void deleteRefererFilter(RefererFilter, Blog)

          // and now remove the in-memory representation
          filters.remove(filter);

          return true;
        }
      }
    } catch (PersistenceException pe) {
      pe.printStackTrace();
    //#refererfiltermanager.java:135: Warning: method not available
    //#    -- call on void net.sourceforge.pebble.dao.PersistenceException:printStackTrace()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: bool removeFilter(String)
    //#    unanalyzed callee: void net.sourceforge.pebble.dao.PersistenceException:printStackTrace()
    }

    return false;
    //#refererfiltermanager.java:138: end of method: bool net.sourceforge.pebble.domain.RefererFilterManager.removeFilter(String)
  }

  /**
   * Gets a collection containing filters.
   *
   * @return  a Collection of RefererFilter instances
   */
  public Collection getFilters() {
    return Collections.unmodifiableCollection(filters);
    //#refererfiltermanager.java:147: method: Collection net.sourceforge.pebble.domain.RefererFilterManager.getFilters()
    //#input(Collection getFilters()): this
    //#input(Collection getFilters()): this.filters
    //#output(Collection getFilters()): return_value
    //#pre[2] (Collection getFilters()): init'ed(this.filters)
    //#post(Collection getFilters()): init'ed(return_value)
    //#refererfiltermanager.java:147: end of method: Collection net.sourceforge.pebble.domain.RefererFilterManager.getFilters()
  }

  /**
   * Filters a collection of referers using the filters
   * managed by this instance. Any urls matching a filter are removed.
   *
   * @param referers    the List of referers (CountedUrls) to be filtered
   * @return  a filtered List containing CountedUrls
   */
  public List filter(List referers) {
    List results = new ArrayList();
    //#refererfiltermanager.java:158: method: List net.sourceforge.pebble.domain.RefererFilterManager.filter(List)
    //#input(List filter(List)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[net/sourceforge/pebble/domain/RefererFilter]
    //#input(List filter(List)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[others]
    //#input(List filter(List)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.getCompiledExpression()Ljava/util/regex/Pattern;
    //#input(List filter(List)): referers
    //#input(List filter(List)): this
    //#input(List filter(List)): this.filters
    //#output(List filter(List)): new ArrayList(filter#1) num objects
    //#output(List filter(List)): return_value
    //#new obj(List filter(List)): new ArrayList(filter#1)
    //#pre[1] (List filter(List)): referers != null
    //#pre[3] (List filter(List)): (soft) this.filters != null
    //#presumption(List filter(List)): java.util.Iterator:next(...)@162 != null
    //#post(List filter(List)): return_value == &new ArrayList(filter#1)
    //#post(List filter(List)): new ArrayList(filter#1) num objects == 1
    //#unanalyzed(List filter(List)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(List filter(List)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(List filter(List)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(List filter(List)): Effects-of-calling:net.sourceforge.pebble.logging.CountedUrl:getUrl
    //#unanalyzed(List filter(List)): Effects-of-calling:java.util.regex.Pattern:matcher
    //#unanalyzed(List filter(List)): Effects-of-calling:java.util.regex.Matcher:matches
    //#test_vector(List filter(List)): java.util.Iterator:hasNext(...)@161: {1}, {0}
    Iterator it = referers.iterator();
    CountedUrl referer;
    while (it.hasNext()) {
      referer = (CountedUrl)it.next();
      if (!filter(referer)) {
        results.add(referer);
      }
    }

    return results;
    //#refererfiltermanager.java:168: end of method: List net.sourceforge.pebble.domain.RefererFilterManager.filter(List)
  }

  /**
   * Helper method to determine whether a single referer should
   * be filtered out.
   *
   * @param referer   a CountedUrl instance
   * @return  true if the referer should be filtered (i.e. matches one of the
   *          regular expressions), false otherwise
   */
  private boolean filter(CountedUrl referer) {

    if (referer.getUrl() == null) {
    //#refererfiltermanager.java:181: method: bool net.sourceforge.pebble.domain.RefererFilterManager.filter(CountedUrl)
    //#refererfiltermanager.java:181: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.logging.CountedUrl:getUrl()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: bool filter(CountedUrl)
    //#    unanalyzed callee: String net.sourceforge.pebble.logging.CountedUrl:getUrl()
    //#input(bool filter(CountedUrl)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[net/sourceforge/pebble/domain/RefererFilter]
    //#input(bool filter(CountedUrl)): net/sourceforge/pebble/domain/RefererFilter.__Descendant_Table[others]
    //#input(bool filter(CountedUrl)): net/sourceforge/pebble/domain/RefererFilter.__Dispatch_Table.getCompiledExpression()Ljava/util/regex/Pattern;
    //#input(bool filter(CountedUrl)): referer
    //#input(bool filter(CountedUrl)): this
    //#input(bool filter(CountedUrl)): this.filters
    //#output(bool filter(CountedUrl)): return_value
    //#pre[1] (bool filter(CountedUrl)): referer != null
    //#pre[3] (bool filter(CountedUrl)): (soft) this.filters != null
    //#presumption(bool filter(CountedUrl)): filter.compiledExpression@189 != null
    //#presumption(bool filter(CountedUrl)): java.util.Iterator:next(...).__Tag@189 == net/sourceforge/pebble/domain/RefererFilter
    //#presumption(bool filter(CountedUrl)): java.util.Iterator:next(...)@189 != null
    //#presumption(bool filter(CountedUrl)): java.util.regex.Pattern:matcher(...)@190 != null
    //#post(bool filter(CountedUrl)): init'ed(return_value)
    //#test_vector(bool filter(CountedUrl)): java.util.Iterator:hasNext(...)@188: {1}, {0}
    //#test_vector(bool filter(CountedUrl)): java.util.regex.Matcher:matches(...)@191: {0}, {1}
    //#test_vector(bool filter(CountedUrl)): net.sourceforge.pebble.logging.CountedUrl:getUrl(...)@181: Inverse{null}, Addr_Set{null}
      return false;
    }

    Iterator it = filters.iterator();
    RefererFilter filter;
    Matcher matcher;
    while (it.hasNext()) {
      filter = (RefererFilter)it.next();
      matcher = filter.getCompiledExpression().matcher(referer.getUrl());
    //#refererfiltermanager.java:190: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.logging.CountedUrl:getUrl()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.domain.RefererFilterManager
    //#    method: bool filter(CountedUrl)
    //#    unanalyzed callee: String net.sourceforge.pebble.logging.CountedUrl:getUrl()
      if (matcher.matches()) {
        return true;
      }
    }

    return false;
    //#refererfiltermanager.java:196: end of method: bool net.sourceforge.pebble.domain.RefererFilterManager.filter(CountedUrl)
  }

}    //#output(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Descendant_Table[net/sourceforge/pebble/domain/RefererFilterManager]
    //#output(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.addFilter(Lnet/sourceforge/pebble/domain/RefererFilter;)V
    //#output(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.filter(Ljava/util/List;)Ljava/util/List;
    //#output(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.filter(Lnet/sourceforge/pebble/logging/CountedUrl;)Z
    //#output(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.getFilters()Ljava/util/Collection;
    //#output(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.init()V
    //#output(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.removeFilter(Ljava/lang/String;)Z
    //#post(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Descendant_Table[net/sourceforge/pebble/domain/RefererFilterManager] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.addFilter(Lnet/sourceforge/pebble/domain/RefererFilter;)V == &addFilter
    //#post(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.filter(Ljava/util/List;)Ljava/util/List; == &filter
    //#post(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.filter(Lnet/sourceforge/pebble/logging/CountedUrl;)Z == &filter
    //#post(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.getFilters()Ljava/util/Collection; == &getFilters
    //#post(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.init()V == &init
    //#post(net.sourceforge.pebble.domain.RefererFilterManager__static_init): __Dispatch_Table.removeFilter(Ljava/lang/String;)Z == &removeFilter
    //#refererfiltermanager.java:: end of method: net.sourceforge.pebble.domain.RefererFilterManager.net.sourceforge.pebble.domain.RefererFilterManager__static_init
    //#refererfiltermanager.java:: end of class: net.sourceforge.pebble.domain.RefererFilterManager
