⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contentfilter.java

📁 基于Jabber协议的即时消息服务器
💻 JAVA
字号:
/** * $RCSfile$ * $Revision: 1594 $ * $Date: 2005-07-04 18:08:42 +0100 (Mon, 04 Jul 2005) $ * * Copyright (C) 2004 Jive Software. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */package org.jivesoftware.wildfire.plugin;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.dom4j.Element;import org.xmpp.packet.Message;import org.xmpp.packet.Packet;/** * Filters message content using regular expressions. If a content mask is * provided message content will be altered. * * @author Conor Hayes */public class ContentFilter {    private String patterns;    private Collection<Pattern> compiledPatterns = new ArrayList<Pattern>();    private String mask;    /**     * A default instance will allow all message content.     *     * @see #setPatterns(String)     * @see #setMask(String)     */    public ContentFilter() {    }    /**     * Set the patterns to use for searching content.     *     * @param regExps a comma separated String of regular expressions     */    public void setPatterns(String patterns) {        if (patterns != null) {            this.patterns = patterns;            String[] data = patterns.split(",");            compiledPatterns.clear();            for (int i = 0; i < data.length; i++) {                compiledPatterns.add(Pattern.compile(data[i]));            }        }        else {            clearPatterns();        }    }    public String getPatterns() {        return this.patterns;    }    /**     * Clears all patterns. Calling this method means that all message content     * will be allowed.     */    public void clearPatterns() {        patterns = null;        compiledPatterns.clear();    }    /**     * Set the content replacement mask.     *     * @param mask the mask to use when replacing content     */    public void setMask(String mask) {        this.mask = mask;    }    /**     * @return the current mask or null if none has been set     */    public String getMask() {        return mask;    }    /**     * Clears the content mask.     *     * @see #filter(Message)     */    public void clearMask() {        mask = null;    }    /**     * @return true if the filter is currently masking content, false otherwise     */    public boolean isMaskingContent() {        return mask != null;    }        /**     * Filters packet content.     *     * @param packet the packet to filter, its content may be altered if there     *            are content matches and a content mask is set     * @return true if the msg content matched up, false otherwise     */    public boolean filter(Packet p) {                return process(p.getElement());    }    private boolean process(Element element) {                boolean matched = mask(element);                if (!matched || isMaskingContent())        {            //only check children if no match has yet been found                        //or all content must be masked            Iterator iter = element.elementIterator();            while (iter.hasNext()) {                matched |= process((Element)iter.next());            }        }                return matched;    }        private boolean mask(Element element) {                boolean match = false;                String content = element.getText();                if ((content != null) && (content.length() > 0)) {                        for (Pattern pattern : compiledPatterns) {                                                Matcher matcher = pattern.matcher(content);                                if (matcher.find()) {                                        match = true;                                        if (isMaskingContent()) {                        content = matcher.replaceAll(mask);                        element.setText(content);                    }                }              }            }                return match;    }        /**     * Applies mask to the given <code>content</code>     *      * @param content     * @return masked content     */    private String mask(String content) {                for (Pattern pattern : compiledPatterns) {            Matcher m = pattern.matcher(content);            content = m.replaceAll(mask);        }                return content;    }    /**     * Applies patterns against the given <code>content</code>. Terminates on     * first match.     *     * @param content the content to search against     * @return true if a match is found, false otherwise     */    private boolean hasMatch(String content) {                boolean hasMatch = false;        for (Pattern pattern : compiledPatterns) {            Matcher matcher = pattern.matcher(content);            if (matcher.find()) {                hasMatch = true;                break;            }        }        return hasMatch;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -