package org.entermedia.attachments;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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.data.XmlFileSearcher;
import org.openedit.entermedia.Asset;
import org.openedit.entermedia.MediaArchive;
import org.openedit.entermedia.scanner.MetaDataReader;
import com.openedit.WebPageRequest;
import com.openedit.hittracker.HitTracker;
import com.openedit.hittracker.SearchQuery;
import com.openedit.page.Page;
import com.openedit.page.manage.PageManager;
public class AttachmentManager
{
private static final Log log = LogFactory.getLog(AttachmentManager.class);
protected SearcherManager fieldSearcherManager;
protected PageManager fieldPageManager;
protected MetaDataReader fieldMetaDataReader;
public MetaDataReader getMetaDataReader()
{
return fieldMetaDataReader;
}
public void setMetaDataReader(MetaDataReader inMetaDataReader)
{
fieldMetaDataReader = inMetaDataReader;
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
public SearcherManager getSearcherManager()
{
return fieldSearcherManager;
}
public void setSearcherManager(SearcherManager inSearcherManager)
{
fieldSearcherManager = inSearcherManager;
}
public void processAttachments(MediaArchive inArchive, Asset inAsset, boolean reprocess)
{
// HitTracker hittracker = new ListHitTracker();
String inCatalogId = inArchive.getCatalogId();
Searcher attachmentSearcher = getAttachmentSearcher(inCatalogId);
String root = "/WEB-INF/data/" + inCatalogId + "/originals/";
syncFolder(attachmentSearcher, inArchive, inAsset.getId(), root, inAsset.getSourcePath(), inAsset.getSourcePath(), reprocess);
}
public HitTracker listChildren(WebPageRequest inReq, MediaArchive inArchive, String inFolderSourcePath)
{
String root = "/WEB-INF/data/" + inArchive.getCatalogId() + "/originals/";
Searcher attachmentSearcher = getAttachmentSearcher(inArchive.getCatalogId());
SearchQuery query = attachmentSearcher.createSearchQuery();
query.addExact("parentsourcepath", inFolderSourcePath);
HitTracker hits = attachmentSearcher.cachedSearch(inReq, query);
return hits;
}
protected void syncFolder(Searcher attachmentSearcher, MediaArchive inArchive, String inAssetId, String inRootFolder, String inFolderSourcePath, String inAssetSourcePath, boolean inReprocess)
{
SearchQuery query = attachmentSearcher.createSearchQuery();
query.addExact("assetid", inAssetId);
query.addExact("parentsourcepath", inFolderSourcePath);
//List known data children for this one folder
HitTracker hits = attachmentSearcher.search(query);
if (inReprocess || hits.size() == 0) //Could not find any existing children, add a child
{
Map alreadyhave = new HashMap();
if (inReprocess)
{
for (Iterator iterator2 = hits.iterator(); iterator2.hasNext();)
{
Data data = (Data) iterator2.next();
alreadyhave.put(data.get("name"), data);
}
}
//see what files are already there
List files = getPageManager().getChildrenPaths(inRootFolder + inFolderSourcePath);
for (Iterator iterator = files.iterator(); iterator.hasNext();)
{
String file = (String) iterator.next();
Page page = getPageManager().getPage(file);
if( page.getName().startsWith(".") )
{
continue;
}
if (!alreadyhave.containsKey(page.getName()))
{
// need a new entry
Data attachment = attachmentSearcher.createNewData();
attachment.setSourcePath(inAssetSourcePath);
attachment.setProperty("name", page.getName());
attachment.setProperty("assetid", inAssetId);
attachment.setProperty("folder", String.valueOf(page.isFolder()));
attachment.setProperty("parentsourcepath", inFolderSourcePath);
Asset asset = new Asset();
getMetaDataReader().populateAsset(inArchive, page.getContentItem(), asset);
for (Iterator iterator2 = asset.getProperties().keySet().iterator(); iterator2.hasNext();)
{
String key = (String) iterator2.next();
String value = asset.get(key);
attachment.setProperty(key, value);
}
attachmentSearcher.saveData(attachment, null);
}
else
{
alreadyhave.remove(page.getName());
}
if (page.isFolder())
{
syncFolder(attachmentSearcher, inArchive, inAssetId, inRootFolder, inFolderSourcePath + "/" + page.getName(), inAssetSourcePath, inReprocess);
}
}
//delete old records
for (Iterator iterextra = alreadyhave.values().iterator(); iterextra.hasNext();)
{
Data data = (Data) iterextra.next();
attachmentSearcher.delete(data, null);
}
}
}
private void deleteEntries(Asset inAsset, Searcher inAttachmentSearcher)
{
HitTracker hits = inAttachmentSearcher.fieldSearch("assetid", inAsset.getId());
for (Iterator iterator = hits.iterator(); iterator.hasNext();)
{
Data hit = (Data) iterator.next();
inAttachmentSearcher.delete(hit, null);
}
}
public Searcher getAttachmentSearcher(String inCatalogId)
{
Searcher attachmentSearcher = getSearcherManager().getSearcher(inCatalogId, "attachment");
return attachmentSearcher;
}
public void syncAttachments(WebPageRequest inReq, MediaArchive inArchive, Asset inAsset, boolean inReload)
{
if (inReload)
{
processAttachments(inArchive, inAsset, inReload);
}
else
{
HitTracker hits = listChildren(inReq, inArchive, inAsset.getSourcePath());
if (hits.size() == 0)
{
processAttachments(inArchive, inAsset, inReload);
}
}
//log.info("Found " + summary.getCount() + " attachments for asset " + inAsset.getId() );
}
public void createFolder(WebPageRequest inReq, MediaArchive inArchive, Asset inAsset, String inParentid, String inName)
{
Searcher attachmentSearcher = getAttachmentSearcher(inArchive.getCatalogId());
String sourcepath = null;
if (inParentid != null)
{
Data parent = (Data) attachmentSearcher.searchById(inParentid);
if( parent == null)
{
sourcepath = inAsset.getSourcePath();
}
else
{
sourcepath = parent.get("parentsourcepath") + "/" + parent.getName();
}
}
else
{
sourcepath = inAsset.getSourcePath();
}
// parentsourcepath
String root = "/WEB-INF/data/" + inArchive.getCatalogId() + "/originals/";
String parentsourcepath = root + sourcepath + "/" + inName;
Page folder = getPageManager().getPage( parentsourcepath + "/");
getPageManager().putPage(folder);
//syncFolder(attachmentSearcher, inArchive, inAsset.getId(), root, inAsset.getSourcePath(), inAsset.getSourcePath(), true);
processAttachments(inArchive,inAsset,true);
}
public void delete(WebPageRequest inReq, MediaArchive inArchive, Asset inAsset, String inFileid)
{
Searcher attachmentSearcher = getAttachmentSearcher(inArchive.getCatalogId());
Data file = (Data) attachmentSearcher.searchById(inFileid);
String root = "/WEB-INF/data/" + inArchive.getCatalogId() + "/originals/";
String sourcepath = file.get("parentsourcepath") + "/" + file.getName();
Page page = getPageManager().getPage(root + sourcepath);
getPageManager().removePage(page);
attachmentSearcher.delete(file, inReq.getUser());
}
public void renameFilder(WebPageRequest inReq, MediaArchive inArchive, Asset inAsset, String inFolderId, String inNewName)
{
Searcher attachmentSearcher = getAttachmentSearcher(inArchive.getCatalogId());
String sourcepath = null;
if (inFolderId == null)
{
return;
}
Data parent = (Data) attachmentSearcher.searchById(inFolderId);
sourcepath = parent.get("parentsourcepath") + "/" + parent.getName();
String root = "/WEB-INF/data/" + inArchive.getCatalogId() + "/originals/";
Page oldfolder = getPageManager().getPage(root + sourcepath + "/");
if (oldfolder.exists())
{
String parentpath = oldfolder.getParentPath();
parentpath = parentpath.substring(0, parentpath.lastIndexOf("/"));
Page newfolder = getPageManager().getPage(parentpath + "/" + inNewName);
getPageManager().movePage(oldfolder, newfolder);
}
}
public void clearAttachmentData(WebPageRequest inReq, MediaArchive inArchive, Asset inAsset, boolean inB)
{
Searcher attachmentSearcher = (Searcher) getAttachmentSearcher(inArchive.getCatalogId());
SearchQuery query = attachmentSearcher.createSearchQuery();
query.addMatches("assetid", inAsset.getId());
//query.addMatches("parentsourcepath", inAsset.getSourcePath());
HitTracker hits = attachmentSearcher.search(query);
if (hits.size() > 0)
{
for (Iterator iterator2 = hits.iterator(); iterator2.hasNext();)
{
Data data = (Data) iterator2.next();
attachmentSearcher.delete(data, inReq.getUser());
}
}
}
public String parseFileSubPath(String inAssetSourcePath, String inParentSourcePath, String inFilename)
{
String folder = inParentSourcePath.substring(inAssetSourcePath.length());
if( folder.length() > 0)
{
folder = folder + "/";
}
return folder + inFilename;
}
}