001    /* 
002        Licensed to the Apache Software Foundation (ASF) under one
003        or more contributor license agreements.  See the NOTICE file
004        distributed with this work for additional information
005        regarding copyright ownership.  The ASF licenses this file
006        to you under the Apache License, Version 2.0 (the
007        "License"); you may not use this file except in compliance
008        with the License.  You may obtain a copy of the License at
009    
010           http://www.apache.org/licenses/LICENSE-2.0
011    
012        Unless required by applicable law or agreed to in writing,
013        software distributed under the License is distributed on an
014        "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015        KIND, either express or implied.  See the License for the
016        specific language governing permissions and limitations
017        under the License.  
018     */
019    package org.apache.wiki.providers;
020    
021    import java.io.*;
022    import java.util.Properties;
023    
024    import org.apache.log4j.Logger;
025    import org.apache.wiki.*;
026    import org.apache.wiki.api.exceptions.ProviderException;
027    
028    /**
029     *  Provides a simple directory based repository for Wiki pages.
030     *  <P>
031     *  All files have ".txt" appended to make life easier for those
032     *  who insist on using Windows or other software which makes assumptions
033     *  on the files contents based on its name.
034     *
035     */
036    public class FileSystemProvider
037        extends AbstractFileProvider
038    {
039        private static final Logger   log = Logger.getLogger(FileSystemProvider.class);
040        /**
041         *  All metadata is stored in a file with this extension.
042         */
043        public static final String PROP_EXT = ".properties";
044    
045        /**
046         *  {@inheritDoc}
047         */
048        public void putPageText( WikiPage page, String text )        
049            throws ProviderException
050        {
051            try
052            {
053                super.putPageText( page, text );
054                putPageProperties( page );
055            }
056            catch( IOException e )
057            {
058                log.error( "Saving failed" );
059            }
060        }
061    
062        /**
063         *  Stores basic metadata to a file.
064         */
065        private void putPageProperties( WikiPage page )        
066            throws IOException
067        {
068            Properties props = new Properties();        
069            OutputStream out = null;
070    
071            try
072            {
073                String author = page.getAuthor();
074                String changenote = (String)page.getAttribute( WikiPage.CHANGENOTE );
075                
076                if( author != null )
077                {
078                    props.setProperty( "author", author );
079                }
080                
081                if( changenote != null )
082                {
083                    props.setProperty( "changenote", changenote );
084                }
085                
086                File file = new File( getPageDirectory(), 
087                                      mangleName(page.getName())+PROP_EXT );
088         
089                out = new FileOutputStream( file );
090    
091                props.store( out, "JSPWiki page properties for page "+page.getName() );
092            }
093            finally
094            {
095                if( out != null ) out.close();
096            }
097        }
098    
099        /**
100         *  Gets basic metadata from file.
101         */
102        private void getPageProperties( WikiPage page )
103            throws IOException
104        {
105            Properties  props = new Properties();
106            InputStream in    = null;
107    
108            try
109            {
110                File file = new File( getPageDirectory(), 
111                                      mangleName(page.getName())+PROP_EXT );
112    
113                if( file.exists() )
114                {
115                    in = new FileInputStream( file );
116    
117                    props.load(in);
118    
119                    page.setAuthor( props.getProperty( "author" ) );
120                    
121                    String changenote = props.getProperty( "changenote" );
122                    if( changenote != null )
123                    {
124                        page.setAttribute( WikiPage.CHANGENOTE, changenote );
125                    }
126                }            
127            }
128            finally
129            {
130                if( in != null ) in.close();
131            }
132        }
133    
134        /**
135         *  {@inheritDoc}
136         */
137        public WikiPage getPageInfo( String page, int version )
138            throws ProviderException
139        {
140            WikiPage p = super.getPageInfo( page, version );
141    
142            if( p != null )
143            {
144                try
145                {
146                    getPageProperties( p );
147                }
148                catch( IOException e )
149                {
150                    log.error("Unable to read page properties", e );
151                    throw new ProviderException("Unable to read page properties, check logs.");
152                }
153            }
154    
155            return p;
156        }
157    
158        /**
159         *  {@inheritDoc}
160         */
161        public void deletePage(String pageName) throws ProviderException
162        {
163            super.deletePage(pageName);
164    
165            File file = new File( getPageDirectory(), 
166                                  mangleName(pageName)+PROP_EXT );
167            
168            if( file.exists() ) file.delete();
169        }
170    
171        /**
172         *  {@inheritDoc}
173         */
174        public void movePage( String from,
175                              String to )
176            throws ProviderException
177        {
178            File fromPage = findPage( from );
179            File toPage = findPage( to );
180            
181            fromPage.renameTo( toPage );
182        }
183    }