dbfiltermanager.java

来自「Jive是基于JSP/JAVA技术构架的一个大型BBS论坛系统,这是Jive论坛」· Java 代码 · 共 381 行

JAVA
381
字号
/** * $RCSfile: DbFilterManager.java,v $ * $Revision: 1.7 $ * $Date: 2002/06/14 16:43:41 $ * * Copyright (C) 1999-2002 CoolServlets, Inc. All rights reserved. * * This software is the proprietary information of CoolServlets, Inc. * Use is subject to license terms. */package com.jivesoftware.forum.database;import com.jivesoftware.util.*;import com.jivesoftware.forum.*;import com.jivesoftware.forum.util.*;import java.util.*;import java.io.*;import com.jivesoftware.jdom.*;import com.jivesoftware.jdom.output.*;/** * Manages filters for a given context (global filters, or filters local to * a single forum). Filters are persisted to a a file called * <tt>jive_filters.xml</tt> * * @see FilterManager * @author Matt Tucker */public class DbFilterManager implements FilterManager {    /**     * The list of the class names of the filters that are available for     * installation by default. These values are automatically added into     * the <tt>jive_filters.xml</tt> file when it is first created. Further     * classes can be defined by editing the <tt>jiveFilters.filterClasses</tt>     * property.     */    public static final String [] DEFAULT_FILTER_CLASSES = new String [] {            "com.jivesoftware.forum.filter.HTMLFilter",            "com.jivesoftware.forum.filter.Newline",            "com.jivesoftware.forum.filter.TextStyle",            "com.jivesoftware.forum.filter.URLConverter",            "com.jivesoftware.forum.filter.Profanity",            "com.jivesoftware.forum.filter.JavaCodeHighlighter",            "com.jivesoftware.forum.filter.WordBreak",            "com.jivesoftware.forum.filter.QuoteFilter",            "com.jivesoftware.forum.filter.Emoticon"        };    private static XMLProperties properties = null;    private static ForumMessageFilter [] availableFilters = null;    private ForumMessageFilter [] filters;    private int uncacheableIndex = -1;    private DbForumFactory factory;    String context = null;    /**     * Creates a new filter manager.     *     * @param forumID the forumID to manage filters on, or -1 to manage     *      global filters.     * @param factory a forum factory to use for various tasks.     */    public DbFilterManager(long forumID, DbForumFactory factory) {        this.factory = factory;        String name = null;        if (forumID == -1) {            name = "global";        }        else {            name = "forum" + forumID;        }        // Make sure properties are loaded.        loadProperties();        // Now load up filters for this manager.        context = name + ".";        // See if a record for this context exists yet. If not, create one.        String fCount = properties.getProperty(context + "filterCount");        if (fCount == null) {            fCount = "0";        }        int filterCount = 0;        try {            filterCount = Integer.parseInt(fCount);        }        catch (NumberFormatException nfe) { }        // Load up all filters        filters = new ForumMessageFilter[filterCount];        for (int i=0; i<filterCount; i++) {            try {                String filterContext = context + "filter" + i + ".";                String className = properties.getProperty(filterContext + "className");                filters[i] = (ForumMessageFilter)Class.forName(className).newInstance();                // If this filter isn't cacheable, then no further filters can                // be cached.                if (!filters[i].isCacheable()) {                     uncacheableIndex = i;                }                // Load filter properties.                String [] propNames = properties.getChildrenProperties(                        filterContext + "properties");                Map filterProps = new HashMap();                for (int j=0; j<propNames.length; j++) {                    // Get the bean property name, which is everything after                    // the last '.' in the xml property name.                    filterProps.put(propNames[j], properties.getProperty(                            filterContext + "properties." + propNames[j]));                }                // Set properties on the bean                BeanUtils.setProperties(filters[i], filterProps);            }            catch (Exception e) {                System.err.println("Error loading filter " + i + " for context "                        + context);                e.printStackTrace();            }        }    }    public ForumMessageFilter getFilter(int index) {        if (index < 0 || index > filters.length-1) {            throw new IllegalArgumentException("Index " + index + " is not valid.");        }        return filters[index];    }    public int getFilterCount() {        return filters.length;    }    public void addFilter(ForumMessageFilter filter) {        addFilter(filter, filters.length);    }    public void addFilter(ForumMessageFilter filter, int index) {        ArrayList newFilters = new ArrayList(filters.length+1);        for (int i=0; i<filters.length; i++) {            newFilters.add(filters[i]);        }        newFilters.add(index, filter);        ForumMessageFilter[] newArray = new ForumMessageFilter[newFilters.size()];        for (int i=0; i<newArray.length; i++) {            newArray[i] = (ForumMessageFilter)newFilters.get(i);        }        // Loop through the array to find the uncacheable index.        uncacheableIndex = -1;        for (int i=0; i<newArray.length; i++) {            if (!newArray[i].isCacheable()) {                uncacheableIndex = i;                break;            }        }        // Finally, overwrite filters with the new array        filters = newArray;        saveFilters();    }    public synchronized void saveFilters() {        // Delete all filters from context.        properties.deleteProperty(context.substring(0, context.length()-1));        if (filters.length > 0) {            properties.setProperty(context + "filterCount",                    Integer.toString(filters.length));        }        // Now write them out again.        for (int i=0; i<filters.length; i++) {            String filterContext = context + "filter" + i + ".";            // Write out class name.            properties.setProperty(filterContext+"className",                    filters[i].getClass().getName());            // Write out all properties.            Map filterProps = BeanUtils.getProperties(filters[i]);            for (Iterator iter = filterProps.keySet().iterator(); iter.hasNext(); ) {                String name = (String)iter.next();                String value = (String)filterProps.get(name);                properties.setProperty(filterContext + "properties." + name, value);            }        }        // Finally, clear the message cache. This is necessary to erase cached        // filter results.        factory.cacheManager.messageCache.clear();    }    public void removeFilter(int index)  {        ArrayList newFilters = new ArrayList(filters.length);        for (int i=0; i<filters.length; i++) {            newFilters.add(filters[i]);        }        newFilters.remove(index);        ForumMessageFilter[] newArray = new ForumMessageFilter[newFilters.size()];        for (int i=0; i<newArray.length; i++) {            newArray[i] = (ForumMessageFilter)newFilters.get(i);        }        // Loop through the array to find the uncacheable index.        uncacheableIndex = -1;        for (int i=0; i<newArray.length; i++) {            if (!newArray[i].isCacheable()) {                uncacheableIndex = i;                break;            }        }        // Finally, overwrite filters with the new array        filters = newArray;        saveFilters();    }    public ForumMessage applyFilters(ForumMessage message) {        // Loop through cacheable filters and apply them        for (int i=0; i < filters.length; i++) {            if (filters[i] != null) {                message = filters[i].clone(message);            }        }        return message;    }    public ForumMessage applyCacheableFilters(ForumMessage message) {        if (uncacheableIndex == -1) {            return applyFilters(message);        }        else {            // Loop through cacheable filters and apply them            for (int i=0; i < uncacheableIndex; i++) {                if (filters[i] != null) {                    message = filters[i].clone(message);                }            }            return message;        }    }    public ForumMessage applyUncacheableFilters(ForumMessage message) {        if (uncacheableIndex == -1) {            return message;        }        else {            // Loop through uncacheable filters and apply them            for (int i=uncacheableIndex; i < filters.length; i++) {                if (filters[i] != null) {                    message = filters[i].clone(message);                }            }            return message;        }    }    public boolean hasUncacheableFilters() {        return uncacheableIndex != -1;    }    static ForumMessageFilter [] getAvailableFilters() {        if (availableFilters == null) {            // Load filter classes            String [] classNames = properties.getChildrenProperties("filterClasses");            List filterList = new ArrayList();            for (int i=0; i<classNames.length; i++) {                try {                    String className = properties.getProperty(                            "filterClasses." + classNames[i]);                    Class filterClass = Class.forName(className);                    // Attempt a cast. If it fails, we'll skip this class.                    ForumMessageFilter filter =                            (ForumMessageFilter)filterClass.newInstance();                    filterList.add(filter);                }                catch (Exception e) {  }            }            availableFilters = new ForumMessageFilter[filterList.size()];            for (int i=0; i<availableFilters.length; i++) {                availableFilters[i] = (ForumMessageFilter)filterList.get(i);            }        }        return availableFilters;    }    public static synchronized void addFilterClass(String className)            throws ClassNotFoundException, IllegalArgumentException    {        // Try to load class. If found in classpath and is a filter, add it to        // the list        Class newClass = Class.forName(className);        try {            Object newFilter = newClass.newInstance();            if (!(newFilter instanceof ForumMessageFilter)) {                throw new IllegalArgumentException("Class is not a ForumMessageFilter");            }            ForumMessageFilter [] newFilters =                    new ForumMessageFilter[availableFilters.length + 1];            for (int i=0; i<newFilters.length-1; i++) {                newFilters[i] = availableFilters[i];            }            newFilters[newFilters.length -1] = (ForumMessageFilter)newFilter;            availableFilters = newFilters;            // Write out new classes names.            properties.deleteProperty("filterClasses");            for (int i=0; i<availableFilters.length; i++) {                String cName = availableFilters[i].getClass().getName();                properties.setProperty("filterClasses.filter" + i, cName);            }        }        catch (IllegalAccessException e) {            throw new IllegalArgumentException(e.getMessage());        }        catch (InstantiationException e2) {            throw new IllegalArgumentException(e2.getMessage());        }    }    /**     * Loads a property manager for filter persistence if it isn't already     * loaded. If an XML file for the filters isn't already created, it will     * attempt to make a file with default value.     */    private static void loadProperties() {        if (properties == null) {            String filterXML = JiveGlobals.getJiveHome() + File.separator +                "jive_filters.xml";            // Make sure the file actually exists. If it doesn't, a new file            // will be created.            File file = new File(filterXML);            // If it doesn't exists we have to create it.            if (!file.exists()) {                Document doc = new Document(new Element("jiveFilters"));                Element filterClasses = new Element("filterClasses");                doc.getRootElement().addContent(filterClasses);                // Add in default list of available filter classes.                for (int i=0; i<DEFAULT_FILTER_CLASSES.length; i++) {                    Element newClass = new Element("filter" + i);                    newClass.setText(DEFAULT_FILTER_CLASSES[i]);                    filterClasses.addContent(newClass);                }                // Set default global filters -- HTML and Newline                Element defaultFilters = new Element("global");                doc.getRootElement().addContent(defaultFilters);                defaultFilters.addContent(new Element("filterCount").addContent("3"));                Element filter0 = new Element("filter0");                filter0.addContent(new Element("className").addContent(                        "com.jivesoftware.forum.filter.HTMLFilter"));                Element filter1 = new Element("filter1");                filter1.addContent(new Element("className").addContent(                        "com.jivesoftware.forum.filter.TextStyle"));                Element filter2 = new Element("filter2");                filter2.addContent(new Element("className").addContent(                        "com.jivesoftware.forum.filter.Newline"));                defaultFilters.addContent(filter0);                defaultFilters.addContent(filter1);                defaultFilters.addContent(filter2);                // Now, write out to the file.                OutputStream out = null;                try {                    // Use JDOM's XMLOutputter to do the writing and formatting.                    XMLOutputter outputter = new XMLOutputter("    ", true);                    out = new BufferedOutputStream(new FileOutputStream(file));                    outputter.output(doc, out);                }                catch (Exception e) {                    e.printStackTrace();                }                finally {                    try {  out.close();  }                    catch (Exception e) { }                }            }            // Finally, create xml properties with the file.            try {                properties = new XMLProperties(filterXML);            }            catch (IOException ioe) {                ioe.printStackTrace();            }        }    }}

⌨️ 快捷键说明

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