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.entermedia.Asset;
import org.openedit.entermedia.AssetUtilities;
import org.openedit.entermedia.MediaArchive;
import org.openedit.repository.ContentItem;
import org.openedit.util.DateStorageUtil;
import com.openedit.OpenEditException;
import com.openedit.users.User;
import com.openedit.util.FileUtils;
import com.openedit.util.PathProcessor;
import com.openedit.util.PathUtilities;
public class AssetPathProcessor extends PathProcessor
{
private static final Log log = LogFactory.getLog(AssetPathProcessor.class);
protected MediaArchive fieldMediaArchive;
protected Boolean fieldOnWindows;
protected boolean fieldSkipModificationCheck;
public boolean isSkipModificationCheck()
{
return fieldSkipModificationCheck;
}
public void setSkipModificationCheck(boolean inSkipModificationCheck)
{
fieldSkipModificationCheck = inSkipModificationCheck;
}
protected AssetUtilities fieldAssetUtilities;
protected Collection fieldAttachmentFilters;
protected FileUtils fieldFileUtils = new FileUtils();
final List<String> assetsids = new ArrayList<String>();
final List<Asset> fieldAssetsToSave = new ArrayList<Asset>();
protected List<Asset> getAssetsToSave()
{
return fieldAssetsToSave;
}
public Collection getAttachmentFilters()
{
return fieldAttachmentFilters;
}
public void setAttachmentFilters(Collection inAttachmentFilters)
{
fieldAttachmentFilters = inAttachmentFilters;
}
public MediaArchive getMediaArchive()
{
return fieldMediaArchive;
}
protected void saveImportedAssets(User inUser) throws OpenEditException
{
if (getAssetsToSave().size() == 0)
{
return;
}
Asset eventasset = (Asset)getAssetsToSave().get(0);
List<String> someids = new ArrayList();
List existingassets = new ArrayList();
for (Iterator iter = getAssetsToSave().iterator(); iter.hasNext();)
{
Asset asset = (Asset) iter.next();
if( asset.get("recordmodificationdate") != null )
{
existingassets.add(asset);
}
}
getMediaArchive().saveAssets(new ArrayList(getAssetsToSave())); //this clears the list
for (Iterator iter = getAssetsToSave().iterator(); iter.hasNext();)
{
Asset asset = (Asset) iter.next();
someids.add(asset.getId() );
if( existingassets.contains(asset) )
{
getMediaArchive().fireMediaEvent("asset/originalmodified",inUser, asset);
}
else
{
getMediaArchive().fireMediaEvent("asset/assetcreated",inUser, asset);
}
}
assetsids.addAll(someids);
getMediaArchive().fireMediaEvent("importing/assetsimported", inUser, eventasset, someids);
getAssetsToSave().clear();
}
public void setMediaArchive(MediaArchive inMediaArchive)
{
fieldMediaArchive = inMediaArchive;
}
@Override
public boolean acceptFile(ContentItem inItem)
{
String path = inItem.getPath();
if (isOnWindows())
{
int absolutepathlimit = 260;
if (path.length() > absolutepathlimit)
{
log.info("Path too long. Couldn't save " + path);
return false;
}
}
if( !fieldFileUtils.isLegalFilename(path))
{
log.info("Path is not web friendly. Couldn't import " + path);
return false;
}
return super.acceptFile(inItem);
}
public void process(ContentItem inInput, User inUser)
{
if (inInput.isFolder())
{
if (acceptDir(inInput))
{
processAssetFolder( inInput, inUser);
}
}
else
{
if (acceptFile(inInput))
{
processFile(inInput, inUser);
}
}
}
protected void processAssetFolder(ContentItem inInput, User inUser)
{
String sourcepath = getAssetUtilities().extractSourcePath(inInput, getMediaArchive());
Asset asset = getMediaArchive().getAssetSearcher().getAssetBySourcePath(sourcepath);
if( asset != null)
{
//check this one primary asset to see if it changed
if( asset.getPrimaryFile() != null)
{
inInput = getPageManager().getRepository().getStub(inInput.getPath() + "/" + asset.getPrimaryFile());
asset = getAssetUtilities().populateAsset(asset, inInput, getMediaArchive(), sourcepath, inUser);
if( asset != null)
{
getAssetsToSave().add(asset);
if (getAssetsToSave().size() > 100)
{
saveImportedAssets(inUser);
}
}
}
//dont process sub-folders
}
else
{
//look deeper for assets
List paths = getPageManager().getChildrenPaths(inInput.getPath());
if( paths.size() == 0 )
{
return;
}
boolean processchildren = true;
if( createAttachments(paths) )
{
ContentItem found = findPrimary(paths);
if( found == null )
{
return; //no good files in here
}
//Use the first file that is not a folder
String soucepath = getAssetUtilities().extractSourcePath(inInput, getMediaArchive());
asset = getMediaArchive().createAsset(soucepath);
asset.setFolder(true);
asset.setProperty("datatype", "original");
if( inUser != null )
{
asset.setProperty("owner", inUser.getUserName());
}
asset.setProperty("assetaddeddate",DateStorageUtil.getStorageUtil().formatForStorage(new Date()));
asset.setProperty("assetviews", "1");
asset.setProperty("importstatus", "imported");
String foundprimary = PathUtilities.extractFileName(found.getPath());
asset.setPrimaryFile(foundprimary);
getAssetUtilities().readMetadata(asset, found, getMediaArchive());
getAssetUtilities().populateCategory(asset, inInput, getMediaArchive(), inUser);
//asset = getAssetUtilities().createAssetIfNeeded(item, getMediaArchive(), inUser);
//set the primary file
getAssetsToSave().add(asset);
if (getAssetsToSave().size() > 100)
{
saveImportedAssets(inUser);
}
processchildren = false;
}
else
{
processchildren = true;
}
if( processchildren && isRecursive())
{
for (Iterator iterator = paths.iterator(); iterator.hasNext();)
{
String path = (String) iterator.next();
ContentItem item = getPageManager().getRepository().getStub(path);
if( item.isFolder() )
{
if (acceptDir(item))
{
// if( deep > 2 )
// {
// ignoretime = true; //If we are deeper than 3 and still showed a mod stamp then check everything
// }
processAssetFolder( item, inUser);
}
}
else
{
if (acceptFile(item))
{
if( isSkipModificationCheck() )
{
//we dont need to load the asset so dont load it
String filesourcepath = getAssetUtilities().extractSourcePath(item, getMediaArchive());
String filepath = "/WEB-INF/data/" + getMediaArchive().getCatalogId() + "/assets/" + filesourcepath;
if( !getPageManager().getRepository().doesExist(filepath) )
{
processFile(item, inUser); //Loads the asset and does a check on mod date
}
}
else
{
processFile(item, inUser);
}
}
}
}
}
}
}
public Boolean isOnWindows()
{
if (fieldOnWindows == null)
{
if (System.getProperty("os.name").toUpperCase().contains("WINDOWS"))
{
fieldOnWindows = Boolean.TRUE;
}
else
{
fieldOnWindows = Boolean.FALSE;
}
}
return fieldOnWindows;
}
protected ContentItem findPrimary(List inPaths)
{
for (Iterator iterator = inPaths.iterator(); iterator.hasNext();)
{
String path = (String) iterator.next();
ContentItem item = getPageManager().getRepository().getStub(path);
if( !item.isFolder() && acceptFile(item))
{
return item;
}
}
return null;
}
public void processFile(ContentItem inContent, User inUser)
{
Asset asset = getAssetUtilities().createAssetIfNeeded(inContent, getMediaArchive(), inUser);
if( asset != null)
{
getAssetsToSave().add(asset);
if (getAssetsToSave().size() > 100)
{
saveImportedAssets(inUser);
}
}
}
public AssetUtilities getAssetUtilities()
{
return fieldAssetUtilities;
}
public void setAssetUtilities(AssetUtilities inAssetUtilities)
{
fieldAssetUtilities = inAssetUtilities;
}
protected boolean createAttachments(List inPaths)
{
if( fieldAttachmentFilters == null )
{
return false;
}
for (Iterator iterator = getAttachmentFilters().iterator(); iterator.hasNext();)
{
String check = (String) iterator.next();
for (Iterator iterator2 = inPaths.iterator(); iterator2.hasNext();)
{
String path = (String) iterator2.next();
if( PathUtilities.match(path, check) )
{
return true;
}
}
}
return false;
}
public void processAssets(String inStartingPoint, User inUser)
{
process(inStartingPoint, inUser);
saveImportedAssets(inUser);
}
}