package com.openedit.util;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openedit.repository.ContentItem;
import com.openedit.page.manage.PageManager;
import com.openedit.users.User;
public abstract class PathProcessor
{
protected String fieldRootPath;
protected PageManager fieldPageManager;
protected long fieldExecCount;
protected List fieldIncludeExtensions;
protected List fieldExcludeMatches;
protected boolean fieldRecursive = true;
private static final Log log = LogFactory.getLog(PathProcessor.class);
public String getRootPath()
{
return fieldRootPath;
}
public void setRootPath(String inRootPath)
{
fieldRootPath = inRootPath;
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
public List getExcludeMatches()
{
return fieldExcludeMatches;
}
/**
* List of extensions we will include
* @param inFilter
public void setFilter(String inFilter)
{
fieldFilter = inFilter;
if( inFilter != null && inFilter.equals("*.*"))
{
fieldFilter = null;
return;
}
if (inFilter != null && inFilter.length() > 0)
{
fieldIncludeExtensions = new ArrayList();
String[] extns = inFilter.split(",");
for (int i = 0; i < extns.length; i++)
{
fieldIncludeExtensions.add(extns[i].trim());
}
}
}
*/
public void process()
{
List paths = getPageManager().getChildrenPaths(
getRootPath());
for (Iterator iterator = paths.iterator(); iterator.hasNext();)
{
String path = (String) iterator.next();
process(path);
}
// process(getRootPath());
}
public void process(String inPath, User inUser)
{
process(getPageManager().getRepository().getStub(inPath), inUser);
}
public void process(String inPath)
{
ContentItem item = getPageManager().getRepository().getStub(inPath);
if( !item.exists() )
{
log.info(inPath + " Did not exist");
return;
}
process(item, null);
}
public void process(ContentItem inInput, User inUser)
{
if (inInput.isFolder())
{
if (acceptDir(inInput))
{
processDir(inInput);
List paths = getPageManager().getChildrenPaths(
inInput.getPath());
for (Iterator iterator = paths.iterator(); iterator.hasNext();)
{
String path = (String) iterator.next();
ContentItem item = getPageManager().getRepository()
.getStub(path);
if( isRecursive() || !item.isFolder() )
{
process(item, inUser);
}
}
}
}
else
{
if (acceptFile(inInput))
{
processFile(inInput, inUser);
}
}
}
public boolean acceptFile(ContentItem inItem)
{
if( inItem.getLength() == 0 )
{
return false;
}
if (getIncludeExtensions() != null)
{
String ext = PathUtilities.extractPageType(inItem.getPath());
if( ext != null)
{
for (Iterator iterator = getIncludeExtensions().iterator(); iterator.hasNext();)
{
String validExt = (String) iterator.next();
if (validExt.equals(ext.toLowerCase()))
{
return true;
}
}
}
return false; //Include only specific files
}
if (fieldExcludeMatches != null)
{
String path = inItem.getPath();
for (Iterator iterator = getExcludeMatches().iterator(); iterator.hasNext();)
{
String match = (String) iterator.next();
if (PathUtilities.match(path, match))
{
return false;
}
}
}
return true;
}
public boolean acceptDir(ContentItem inDir)
{
String path = inDir.getPath();
if (path.endsWith("/CVS") || path.endsWith("/.versions") || path.endsWith("/.svn"))
{
return false;
}
if (fieldExcludeMatches != null)
{
for (Iterator iterator = getExcludeMatches().iterator(); iterator.hasNext();)
{
String match = (String) iterator.next();
if (PathUtilities.match(path, match))
{
return false;
}
}
}
return true;
}
public long getExecCount()
{
return fieldExecCount;
}
public void setExecCount(long inExecCount)
{
fieldExecCount = inExecCount;
}
public long incrementCount()
{
fieldExecCount++;
return fieldExecCount;
}
protected File[] findFiles(File inParent, final String inAccept)
{
FileFilter filter = new FileFilter() {
public boolean accept(File inDir)
{
String inName = inDir.getName();
if (inName.startsWith("."))
{
return false;
}
if (inDir.isDirectory())
{
return true;
}
if (inAccept != null)
{
if (!PathUtilities.match(inDir.getName().toLowerCase(),
inAccept.toLowerCase()))
{
return false;
}
}
return true;
}
};
return inParent.listFiles(filter);
}
/**
* @deprecated Is this really needed? We use Page Managers now
* @param inSearchDirectory
* @param inAll
* @param inFilter
*/
protected void findFiles(File inSearchDirectory, List inAll,
FileFilter inFilter)
{
File[] toadd = inSearchDirectory.listFiles(inFilter);
for (int i = 0; i < toadd.length; i++)
{
File file = toadd[i];
if (file.isDirectory())
{
findFiles(file, inAll, inFilter);
}
else
{
inAll.add(file);
}
}
}
public abstract void processFile(ContentItem inContent, User inUser);
public void processDir(ContentItem inContent)
{
}
public boolean isRecursive()
{
return fieldRecursive;
}
public void setRecursive(boolean inRecursive)
{
fieldRecursive = inRecursive;
}
public List getIncludeExtensions()
{
return fieldIncludeExtensions;
}
public void setIncludeExtensions(List inIncludeExtensions)
{
fieldIncludeExtensions = inIncludeExtensions;
}
public void setIncludeExtensions(String inIncludeFilter)
{
if (inIncludeFilter != null && inIncludeFilter.length() > 0)
{
fieldIncludeExtensions = EmStringUtils.split(inIncludeFilter);
}
}
/**
* Comma separated values
* @param inExcludeFilter
*/
public void setExcludeMatches(String inExcludeFilter)
{
if (inExcludeFilter != null && inExcludeFilter.length() > 0)
{
fieldExcludeMatches = EmStringUtils.split(inExcludeFilter);
}
}
public void setExcludeMatches(List inExcludeFilter)
{
fieldExcludeMatches = inExcludeFilter;
}
}