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

📄 abstractfileprovider.java

📁 wiki建站资源 java编写的 很好用
💻 JAVA
字号:
/*     JSPWiki - a JSP-based WikiWiki clone.    Copyright (C) 2001-2002 Janne Jalkanen (Janne.Jalkanen@iki.fi)    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU Lesser General Public License as published by    the Free Software Foundation; either version 2.1 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU Lesser General Public License for more details.    You should have received a copy of the GNU Lesser General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */package com.ecyrd.jspwiki.providers;import java.io.*;import java.util.Properties;import java.util.Collection;import java.util.Date;import java.util.TreeSet;import java.util.ArrayList;import java.util.List;import org.apache.log4j.Logger;import com.ecyrd.jspwiki.*;/** *  Provides a simple directory based repository for Wiki pages. *  <P> *  All files have ".txt" appended to make life easier for those *  who insist on using Windows or other software which makes assumptions *  on the files contents based on its name. *  <p> *  This class functions as a superclass to all file based providers. * *  @since 2.1.21. * *  @author Janne Jalkanen */public abstract class AbstractFileProvider    implements WikiPageProvider{    private static final Logger   log = Logger.getLogger(AbstractFileProvider.class);    private String m_pageDirectory = "/tmp/";        protected String m_encoding;    /**     *  Name of the property that defines where page directories are.     */    public static final String      PROP_PAGEDIR = "jspwiki.fileSystemProvider.pageDir";    /**     *  All files should have this extension to be recognized as JSPWiki files.     *  We default to .txt, because that is probably easiest for Windows users,     *  and guarantees correct handling.     */    public static final String FILE_EXT = ".txt";    public static final String DEFAULT_ENCODING = "ISO-8859-1";    private boolean m_WindowsHackNeeded = false;        /**     *  @throws FileNotFoundException If the specified page directory does not exist.     *  @throws IOException In case the specified page directory is a file, not a directory.     */    public void initialize( WikiEngine engine, Properties properties )        throws NoRequiredPropertyException,               IOException    {        log.debug("Initing FileSystemProvider");        m_pageDirectory = WikiEngine.getRequiredProperty( properties, PROP_PAGEDIR );        File f = new File(m_pageDirectory);        if( !f.exists() )        {            f.mkdirs();        }        else if( !f.isDirectory() )        {            throw new IOException("Page directory is not a directory: "+m_pageDirectory);        }        m_encoding = properties.getProperty( WikiEngine.PROP_ENCODING,                                              DEFAULT_ENCODING );        String os = System.getProperty( "os.name" ).toLowerCase();                if( os.startsWith("windows") || os.equals("nt") )        {            m_WindowsHackNeeded = true;        }                log.info( "Wikipages are read from '" + m_pageDirectory + "'" );    }    String getPageDirectory()    {        return m_pageDirectory;    }    private static final String[] WINDOWS_DEVICE_NAMES =    {        "con", "prn", "nul", "aux", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9",        "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9"    };        /**     *  This makes sure that the queried page name     *  is still readable by the file system.     */    protected String mangleName( String pagename )    {        pagename = TextUtil.urlEncode( pagename, m_encoding );                pagename = TextUtil.replaceString( pagename, "/", "%2F" );        if( m_WindowsHackNeeded )        {            String pn = pagename.toLowerCase();            for( int i = 0; i < WINDOWS_DEVICE_NAMES.length; i++ )            {                if( WINDOWS_DEVICE_NAMES[i].equals(pn) )                {                    pagename = "$$$" + pagename;                }            }        }                return pagename;    }    /**     *  This makes the reverse of mangleName.     */    protected String unmangleName( String filename )    {        // The exception should never happen.        try        {            if( m_WindowsHackNeeded && filename.startsWith( "$$$") && filename.length() > 3 )            {                filename = filename.substring(3);            }                        return TextUtil.urlDecode( filename, m_encoding );        }        catch( UnsupportedEncodingException e )         {            throw new InternalWikiException("Faulty encoding; should never happen");        }    }        /**     *  Finds a Wiki page from the page repository.     */    protected File findPage( String page )    {        return new File( m_pageDirectory, mangleName(page)+FILE_EXT );    }        public boolean pageExists( String page )    {        File pagefile = findPage( page );        return pagefile.exists();            }    /**     *  This implementation just returns the current version, as filesystem     *  does not provide versioning information for now.     */    public String getPageText( String page, int version )        throws ProviderException    {        return getPageText( page );    }    /**     *  Read the text directly from the correct file.     */    private String getPageText( String page )    {        String result  = null;        InputStream in = null;        File pagedata = findPage( page );        if( pagedata.exists() )        {            if( pagedata.canRead() )            {                try                {                              in = new FileInputStream( pagedata );                    result = FileUtil.readContents( in, m_encoding );                }                catch( IOException e )                {                    log.error("Failed to read", e);                }                finally                {                    try                    {                        if( in  != null ) in.close();                    }                    catch( Exception e )                     {                        log.fatal("Closing failed",e);                    }                }            }            else            {                log.warn("Failed to read page '"+page+"' from '"+pagedata.getAbsolutePath()+"', possibly a permissions problem");            }        }        else        {            // This is okay.            log.info("New page '"+page+"'");        }        return result;    }    public void putPageText( WikiPage page, String text )                throws ProviderException    {        File file = findPage( page.getName() );        PrintWriter out = null;        try        {            out = new PrintWriter(new OutputStreamWriter( new FileOutputStream( file ),                                                          m_encoding ));            out.print( text );        }        catch( IOException e )        {            log.error( "Saving failed" );        }        finally        {            if( out != null ) out.close();        }    }    public Collection getAllPages()        throws ProviderException    {        log.debug("Getting all pages...");        ArrayList set = new ArrayList();        File wikipagedir = new File( m_pageDirectory );        File[] wikipages = wikipagedir.listFiles( new WikiFileFilter() );        if( wikipages == null )        {            log.error("Wikipages directory '" + m_pageDirectory + "' does not exist! Please check " + PROP_PAGEDIR + " in jspwiki.properties.");            throw new InternalWikiException("Page directory does not exist");        }        for( int i = 0; i < wikipages.length; i++ )        {            String wikiname = wikipages[i].getName();            int cutpoint = wikiname.lastIndexOf( FILE_EXT );            WikiPage page = getPageInfo( unmangleName(wikiname.substring(0,cutpoint)),                                         WikiPageProvider.LATEST_VERSION );            if( page == null )            {                // This should not really happen.                // FIXME: Should we throw an exception here?                log.error("Page "+wikiname+" was found in directory listing, but could not be located individually.");                continue;            }                        set.add( page );        }        return set;            }    public Collection getAllChangedSince( Date date )    {        return new ArrayList(); // FIXME    }    public int getPageCount()    {        File wikipagedir = new File( m_pageDirectory );        File[] wikipages = wikipagedir.listFiles( new WikiFileFilter() );        return wikipages.length;    }    /**     * Iterates through all WikiPages, matches them against the given query,     * and returns a Collection of SearchResult objects.     */    public Collection findPages( QueryItem[] query )    {        File wikipagedir = new File( m_pageDirectory );        TreeSet res = new TreeSet( new SearchResultComparator() );        SearchMatcher matcher = new SearchMatcher( query );        File[] wikipages = wikipagedir.listFiles( new WikiFileFilter() );        for( int i = 0; i < wikipages.length; i++ )        {            FileInputStream input = null;            // log.debug("Searching page "+wikipages[i].getPath() );            String filename = wikipages[i].getName();            int cutpoint    = filename.lastIndexOf( FILE_EXT );            String wikiname = filename.substring( 0, cutpoint );            wikiname = unmangleName( wikiname );            try            {                input = new FileInputStream( wikipages[i] );                String pagetext = FileUtil.readContents( input, m_encoding );                SearchResult comparison = matcher.matchPageContent( wikiname, pagetext );                if( comparison != null )                {                    res.add( comparison );                }            }            catch( IOException e )            {                log.error( "Failed to read " + filename, e );            }            finally            {                try                {                    if( input != null ) input.close();                }                catch( IOException e ) {} // It's fine to fail silently.            }        }        return res;    }    /**     *  Always returns the latest version, since FileSystemProvider     *  does not support versioning.     */    public WikiPage getPageInfo( String page, int version )        throws ProviderException    {        File file = findPage( page );        if( !file.exists() )        {            return null;        }        WikiPage p = new WikiPage( page );        p.setLastModified( new Date(file.lastModified()) );        return p;    }    /**     *  The FileSystemProvider provides only one version.     */    public List getVersionHistory( String page )        throws ProviderException    {        ArrayList list = new ArrayList();        list.add( getPageInfo( page, WikiPageProvider.LATEST_VERSION ) );        return list;    }    public String getProviderInfo()    {        return "";    }    public void deleteVersion( String pageName, int version )        throws ProviderException    {        if( version == WikiProvider.LATEST_VERSION )        {            File f = findPage( pageName );            f.delete();        }    }    public void deletePage( String pageName )        throws ProviderException    {        File f = findPage( pageName );        f.delete();    }    public class WikiFileFilter        implements FilenameFilter    {        public boolean accept( File dir, String name )        {            return name.endsWith( FILE_EXT );        }    }}

⌨️ 快捷键说明

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