package org.openedit.entermedia.scanner;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openedit.Data;
import org.openedit.data.Searcher;
import org.openedit.data.SearcherManager;
import org.openedit.entermedia.MediaArchive;
import org.openedit.entermedia.util.TimeParser;
import org.openedit.repository.Repository;
import org.openedit.repository.filesystem.FileRepository;
import org.openedit.repository.filesystem.XmlVersionRepository;
import org.openedit.util.DateStorageUtil;
import com.openedit.WebServer;
import com.openedit.page.Page;
import com.openedit.page.manage.PageManager;
import com.openedit.util.EmStringUtils;
public class HotFolderManager
{
private static final Log log = LogFactory.getLog(HotFolderManager.class);
protected PageManager fieldPageManager;
protected SearcherManager fieldSearcherManager;
protected WebServer fieldWebServer;
public WebServer getWebServer()
{
return fieldWebServer;
}
public void setWebServer(WebServer inWebServer)
{
fieldWebServer = inWebServer;
}
public SearcherManager getSearcherManager()
{
return fieldSearcherManager;
}
public void setSearcherManager(SearcherManager inSearcherManager)
{
fieldSearcherManager = inSearcherManager;
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
public void saveMounts(String inCatalogId)
{
//remove any old hot folders for this catalog
List configs = new ArrayList(getPageManager().getRepositoryManager().getRepositories());
String path = "/WEB-INF/data/" + inCatalogId + "/";
List extras = new ArrayList();
for (Iterator iterator = configs.iterator(); iterator.hasNext();)
{
Repository config = (Repository) iterator.next();
if( config.getPath().startsWith(path))
{
extras.add( config.getPath());
}
}
//We should see if they are already configured?
List<Repository> mounts = new ArrayList<Repository>();
Collection folders = loadFolders(inCatalogId);
for (Iterator iterator = folders.iterator(); iterator.hasNext();)
{
Data folder = (Data) iterator.next();
String external = folder.get("externalpath");
String folderpath = folder.get("subfolder");
String originalpath = "/WEB-INF/data/" + inCatalogId + "/originals";
String fullpath = originalpath + "/" + folderpath;
String versioncontrol = folder.get("versioncontrol");
if( addOrEdit(configs,mounts,fullpath,external,Boolean.parseBoolean(versioncontrol)) )
{
extras.remove(fullpath);
}
String generatedpath = "/WEB-INF/data/" + inCatalogId + "/generated";
String fullgeneratedpath = generatedpath + "/" + folderpath;
String genversioncontrol = folder.get("generatedversioncontrol");
if( addOrEdit(configs,mounts,fullgeneratedpath,null,Boolean.parseBoolean(genversioncontrol)) )
{
extras.remove(fullgeneratedpath); //remove the old
}
}
for (Iterator iterator = extras.iterator(); iterator.hasNext();)
{
String fullpath = (String) iterator.next();
getPageManager().getRepositoryManager().removeRepository(fullpath);
}
configs = getPageManager().getRepositoryManager().getRepositories();
configs.addAll(mounts);
getWebServer().saveMounts(configs);
//getPageManager().getRepositoryManager().setRepositories(configs);
//save the file
}
/**
* return true if we should just keep the old one
*/
protected boolean addOrEdit(List configs, List<Repository> mounts, String inPath, String externalpath, boolean useversioncontrol)
{
if( externalpath == null && !useversioncontrol)
{
return false; //this will remove it
}
Repository existing = findRepoByPath( configs, inPath );
//Do we need to create one?
boolean keepexisting = true;
if( existing != null)
{
existing.setExternalPath(externalpath);
if( useversioncontrol && !(existing instanceof XmlVersionRepository) )
{
configs.remove(existing);
existing = null;
}
if( !useversioncontrol && (existing instanceof XmlVersionRepository) )
{
configs.remove(existing);
existing = null;
}
}
if( existing == null)
{
existing = createRepo(useversioncontrol);
existing.setPath(inPath);
existing.setExternalPath(externalpath);
mounts.add(existing);
keepexisting = false;
}
return keepexisting;
}
protected Repository createRepo(boolean versioncontrol)
{
Repository repo;
if( versioncontrol )
{
repo = new XmlVersionRepository();
repo.setRepositoryType("versionRepository");
}
else
{
repo = new FileRepository();
}
return repo;
}
protected Repository findRepoByPath(List inConfigs, String inFullpath)
{
for (Iterator iterator = inConfigs.iterator(); iterator.hasNext();)
{
Repository config = (Repository) iterator.next();
if (config.getPath().startsWith(inFullpath))
{
return config;
}
}
return null;
}
public Collection loadFolders(String inCatalogId)
{
Searcher hfsearcher = getFolderSearcher(inCatalogId);
return hfsearcher.getAllHits();
}
public Searcher getFolderSearcher(String inCatalogId)
{
return getSearcherManager().getSearcher(inCatalogId, "hotfolder");
}
public Data getFolderByPathEnding(String inCatalogId, String inFolder)
{
for (Iterator iterator = loadFolders(inCatalogId).iterator(); iterator.hasNext();)
{
Data folder = (Data) iterator.next();
String subfolder = folder.get("subfolder");
if(inFolder.equals(subfolder) )
{
return folder;
}
}
return null;
}
public void deleteFolder(String inCatalogId, Data inExisting)
{
getFolderSearcher(inCatalogId).delete(inExisting, null);
saveMounts(inCatalogId);
}
public void saveFolder(String inCatalogId, Data inNewrow)
{
getFolderSearcher(inCatalogId).saveData(inNewrow, null);
saveMounts(inCatalogId);
}
public List<String> importHotFolder(MediaArchive inArchive, Data inFolder)
{
String base = "/WEB-INF/data/" + inArchive.getCatalogId() + "/originals";
String name = inFolder.get("subfolder");
String path = base + "/" + name;
// Page local = getPageManager().getPage(path + "/");
// if( !local.exists() )
// {
// getPageManager().putPage(local);
// }
AssetImporter importer = (AssetImporter)getWebServer().getModuleManager().getBean("assetImporter");
String excludes = inFolder.get("excludes");
if( excludes != null )
{
List<String> list = EmStringUtils.split(excludes);
for (int i = 0; i < list.size(); i++)
{
String row = list.get(i).trim();
if( row.startsWith("/") && !row.startsWith(path))
{
row = path + row;
}
list.set(i, row);
}
importer.setExcludeMatches(list);
}
importer.setIncludeExtensions(inFolder.get("includes"));
String attachments = inFolder.get("attachmenttrigger");
if( attachments != null )
{
Collection attachmentslist = EmStringUtils.split(attachments);
importer.setAttachmentFilters(attachmentslist);
}
Date started = new Date();
long sincedate = 0;
String since = inFolder.get("lastscanstart");
if( since != null )
{
sincedate = DateStorageUtil.getStorageUtil().parseFromStorage(since).getTime();
}
boolean skipmodcheck = false;
if( since != null )
{
long now = System.currentTimeMillis();
String mod = inArchive.getCatalogSettingValue("importing_modification_interval");
if( mod == null)
{
mod = "1d";
}
long time = new TimeParser().parse(mod);
sincedate = sincedate + time; //once a week
if( sincedate > now )
{
skipmodcheck = true;
}
}
log.info(path + " scan started. skip mod check = " + skipmodcheck );
List<String> paths = importer.processOn(base, path, inArchive, skipmodcheck, null);
if( !skipmodcheck )
{
inFolder.setProperty("lastscanstart", DateStorageUtil.getStorageUtil().formatForStorage(started));
getFolderSearcher(inArchive.getCatalogId()).saveData(inFolder, null);
}
log.info(inFolder + " Imported " + paths.size() );
return paths;
}
}