/*
* Created on Jun 3, 2006
*/
package com.openedit.page;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.openedit.OpenEditException;
import com.openedit.page.manage.PageManager;
import com.openedit.util.PathUtilities;
public class FileFinder
{
private static final Log log = LogFactory.getLog(FileFinder.class);
protected File fieldRoot;
protected PageManager fieldPageManager;
protected boolean fieldMatchPatterns = true;
protected boolean fieldRecursive = true;
protected Set fieldSkipFiles;
protected boolean skip(String inFileName)
{
return getSkipFiles().contains(inFileName);
}
protected Set getSkipFiles()
{
if (fieldSkipFiles == null)
{
fieldSkipFiles = new HashSet();
if( isMatchPatterns() )
{
fieldSkipFiles.add("*.versions*");
fieldSkipFiles.add("*/CVS/*");
}
else
{
fieldSkipFiles.add(".versions");
fieldSkipFiles.add("CVS");
}
}
return fieldSkipFiles;
}
public void addSkipFileName(String inName)
{
getSkipFiles().add(inName);
}
public List findPages(String inContains) throws OpenEditException
{
List paths = new ArrayList();
File dir = new File(getRoot(), PathUtilities.extractDirectoryPath(inContains));
findMatches(dir, getRoot().getAbsolutePath().length(), inContains, paths);
List pages = new ArrayList(paths.size());
for (Iterator iter = paths.iterator(); iter.hasNext();)
{
String path = (String) iter.next();
try
{
Page page = getPageManager().getPage(path);
pages.add(page);
}
catch ( Exception ex )
{
log.error( ex );
log.error( "could not load " + path);
}
}
getPageManager().clearCache();
return pages;
}
protected void findMatches(File inRoot, int from, String contains, List found)
{
if( inRoot.isDirectory())
{
File[] children = inRoot.listFiles( createSkipFilter() );
if( children != null)
{
for (int i = 0; i < children.length; i++)
{
File child = children[i];
if ( child.isDirectory())
{
if( isMatchPatterns() )
{
if( skipMatches( child.getName()) )
{
continue;
}
}
else if ( skip(child.getName()))
{
continue;
}
if( !isRecursive() )
{
continue;
}
}
findMatches(children[i], from, contains, found);
}
}
}
else
{
String path = inRoot.getAbsolutePath().substring(from);
path = path.replace('\\', '/');
if( isMatchPatterns() )
{
if( PathUtilities.match(path, contains))
{
if( !skipMatches( path ))
{
found.add(path);
}
}
}
else
{
if( path.indexOf(contains) > -1 )
{
if( !skip(path))
{
found.add(path);
}
}
}
}
}
protected FileFilter createSkipFilter()
{
return new FileFilter()
{
public boolean accept( File file )
{
if ( isMatchPatterns() )
{
return !skipMatches( file.getName() );
}
else
{
return !skip( file.getName() );
}
}
};
}
protected boolean skipMatches(String inPath)
{
for (Iterator iterator = getSkipFiles().iterator(); iterator.hasNext();)
{
String file = (String) iterator.next();
if( PathUtilities.match(inPath, file))
{
return true;
}
}
return false;
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
public File getRoot()
{
return fieldRoot;
}
public void setRoot(File inRoot)
{
fieldRoot = inRoot;
}
public boolean isMatchPatterns()
{
return fieldMatchPatterns;
}
public void setMatchPatterns(boolean inUseMatches)
{
fieldMatchPatterns = inUseMatches;
}
public boolean isRecursive()
{
return fieldRecursive;
}
public void setRecursive(boolean inRecursive)
{
fieldRecursive = inRecursive;
}
}