package org.openedit.entermedia.modules; import java.util.ArrayList; 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.entermedia.upload.FileUpload; import org.openedit.Data; import org.openedit.data.Searcher; import org.openedit.entermedia.Asset; import org.openedit.entermedia.Category; import org.openedit.entermedia.EnterMedia; import org.openedit.entermedia.MediaArchive; import org.openedit.entermedia.scanner.AssetImporter; import org.openedit.entermedia.scanner.UploadQueue; import org.openedit.repository.ContentItem; import org.openedit.util.DateStorageUtil; import com.openedit.WebPageRequest; import com.openedit.hittracker.HitTracker; import com.openedit.hittracker.ListHitTracker; import com.openedit.hittracker.SearchQuery; import com.openedit.users.User; import com.openedit.util.PathUtilities; public class AssetSyncModule extends BaseMediaModule { private static final Log log = LogFactory.getLog(AssetSyncModule.class); protected FileUpload fieldFileUpload; protected AssetImporter fieldAssetAssetImporter; protected UploadQueue fieldUploadQueue; //map of assets being uploaded. clear out old oneson start, check owner, clear on error or completed protected UploadQueue getUploadQueue() { if (fieldUploadQueue == null) { fieldUploadQueue = (UploadQueue)getModuleManager().getBean("uploadQueue"); } return fieldUploadQueue; } protected void setUploadQueue(UploadQueue inUploadQueue) { fieldUploadQueue = inUploadQueue; } public AssetImporter getAssetImporter() { return fieldAssetAssetImporter; } public void setAssetImporter(AssetImporter inAssetAssetImporter) { fieldAssetAssetImporter = inAssetAssetImporter; } public FileUpload getFileUpload() { return fieldFileUpload; } public void setFileUpload(FileUpload inFileUpload) { fieldFileUpload = inFileUpload; } public void createAssetFromLocalPaths(WebPageRequest inReq) throws Exception { //TODO check for permissions String[] localpaths = inReq.getRequestParameters("localfilepath"); if( localpaths != null) { String[] names = inReq.getRequestParameters("name"); String[] parents = inReq.getRequestParameters("parentpath"); String[] sizes = inReq.getRequestParameters("filesize"); String[] sourcepath = inReq.getRequestParameters("sourcepath"); String[] prefixs = inReq.getRequestParameters("uploadprefix"); //log.info("Got: " + localpaths.length ); // move the upload into a source path with a valid asset object MediaArchive archive = getMediaArchive(inReq); String assethome = "users/" + inReq.getUserName(); Category cat = archive.getCategoryArchive().createCategoryTree(assethome); cat.setName(inReq.getUser().getScreenName()); //call the add new asset for this user based on the path they gave us //redirect to the catalog userpage to track status on these assets //TODO: deal with folders String[] fields = inReq.getRequestParameters("field"); List<String> allids = new ArrayList(); ListHitTracker tracker = new ListHitTracker(); for (int i = 0; i < localpaths.length; i++) { if( localpaths[i].trim().length() == 0) { continue; } String currentSourcePath = sourcepath[i]; Asset existing = archive.getAssetBySourcePath(currentSourcePath); Asset toadd = new Asset(); toadd.setId(archive.getAssetSearcher().nextAssetNumber()); if (existing != null) { String startpart = PathUtilities.extractPagePath(currentSourcePath); startpart = startpart + "_" + toadd.getId(); currentSourcePath = startpart + "." + PathUtilities.extractPageType(currentSourcePath); } toadd.setSourcePath(currentSourcePath); toadd.setProperty("localpath", localpaths[i]); toadd.setProperty("importstatus", "uploading"); toadd.setProperty("previewtatus", "0"); toadd.setProperty("editstatus", "1"); toadd.setProperty("filesize", sizes[i]); toadd.setProperty("owner", inReq.getUserName()); toadd.setProperty("datatype", "original"); toadd.setProperty("assetaddeddate", DateStorageUtil.getStorageUtil().formatForStorage(new Date())); toadd.setName(names[i]); toadd.addCategory(cat); // NOOO. The file is not uploaded yet you dolt! // Whoops, sorry. if( fields != null) { for (int f = 0; f < fields.length; f++) { String val = inReq.getRequestParameter(prefixs[i] + fields[f]+ ".value"); if( val != null) { toadd.setProperty(fields[f],val); } } } allids.add(toadd.getId()); tracker.add(toadd); } archive.saveAssets(tracker, inReq.getUser()); if(tracker.size() > 0) { archive.fireMediaEvent("assetuploadpending",inReq.getUser(),(Asset)tracker.first(),allids); } //TODO: Replace with a cached search using the assetid's SearchQuery query = archive.getAssetSearcher().createSearchQuery(); query.addMatches("editstatus", "1"); inReq.putPageValue("uploadedassets",tracker); log.info("Uploaded queued " + tracker.size()); inReq.setRequestParameter("reporttype","01newlyuploaded"); archive.getAssetSearcher().cachedSearch(inReq, query); } } public void searchForPendingAssets(WebPageRequest inReq) throws Exception { String applicationid = inReq.findValue("applicationid"); // String searchcurrentcatalogonly=inReq.findValue("searchcurrentcatalogonly"); Searcher searcher=null; // if (Boolean.parseBoolean(searchcurrentcatalogonly)) // { String catalogid = inReq.findValue("catalogid"); if( catalogid == null) { return; } searcher = getSearcherManager().getSearcher(catalogid, "asset"); // } // else // { // searcher = (CompositeSearcher)getSearcherManager().getSearcher(applicationid, "compositeLucene"); // } SearchQuery query = searcher.createSearchQuery(); query.addMatches("importstatus", "uploading"); query.addMatches("editstatus", "*"); //needed to override the filter User user = inReq.getUser(); if( user!= null ) { query.addMatches("owner", user.getUserName()); } else { log.debug("No user"); return; } query.setName("syncassets"); //log.info(inReq.getUser()); query.setFireSearchEvent(false); query.setResultType("search"); query.setHitsName("pendingassets"); HitTracker assets = new ListHitTracker(); HitTracker inprogress = searcher.cachedSearch(inReq, query); EnterMedia entermedia = getEnterMedia(inReq); if( inprogress != null && inprogress.size() > 0) { for (Iterator iterator = inprogress.getPageOfHits().iterator(); iterator.hasNext();) { Data data = (Data) iterator.next(); String localcatalogid = data.get("catalogid"); String sourcepath = data.getSourcePath(); Asset existing = entermedia.getAssetBySourcePath(localcatalogid, sourcepath); updateUploadStatus(localcatalogid, existing); assets.add(existing); } } inReq.putPageValue("pendingassets", assets); } public void searchForPendingAsset(WebPageRequest inReq) throws Exception { String assetid = inReq.getRequestParameter("assetid"); MediaArchive archive = getMediaArchive(inReq); Asset asset = archive.getAsset(assetid); updateUploadStatus(archive.getCatalogId(), asset); inReq.putPageValue("asset",asset); } protected void updateUploadStatus(String catalogid, Asset existing) { String status = existing.get("importstatus"); if( "uploading".equals(status)) //may be moving { String path = "/WEB-INF/data/" + catalogid + "/temp/" + existing.getSourcePath(); //must match UploadQueue.java ContentItem tmp = getPageManager().getRepository().getStub(path); existing.setProperty("uploadprogress", String.valueOf(tmp.getLength())); } } public void receiveData(WebPageRequest inReq) throws Exception { // Why would you want to upload to the produts root directory? EnterMedia entermedia = getEnterMedia(inReq); String appletname = inReq.getRequest().getHeader("x-appletname"); if( appletname == null) { log.error("No applet name passed in"); return; } getUploadQueue().processUpload(inReq, getFileUpload(), appletname, entermedia); } }