/*
* Created on May 2, 2006
*/
package org.openedit.entermedia.generators;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openedit.Data;
import org.openedit.entermedia.Asset;
import org.openedit.entermedia.MediaArchive;
import org.openedit.entermedia.modules.MediaArchiveModule;
import org.openedit.entermedia.orders.Order;
import org.openedit.entermedia.orders.OrderManager;
import com.openedit.ModuleManager;
import com.openedit.OpenEditException;
import com.openedit.WebPageRequest;
import com.openedit.generators.BaseGenerator;
import com.openedit.generators.Output;
import com.openedit.hittracker.HitTracker;
import com.openedit.page.Page;
import com.openedit.util.OutputFiller;
import com.openedit.util.ZipUtil;
public class OrderZipGenerator extends BaseGenerator
{
private static final Log log = LogFactory.getLog(OrderZipGenerator.class);
protected ModuleManager fieldModuleManager;
public ModuleManager getModuleManager()
{
return fieldModuleManager;
}
public void setModuleManager(ModuleManager moduleManager)
{
fieldModuleManager = moduleManager;
}
public void generate(WebPageRequest inReq, Page inPage, Output inOut) throws OpenEditException
{
ZipOutputStream zos = null;
try {
MediaArchiveModule archiveModule = (MediaArchiveModule) getModuleManager().getBean("MediaArchiveModule");
MediaArchive archive = archiveModule.getMediaArchive(inReq);
String orderid = inReq.getRequestParameter("orderid");
OrderManager manager = (OrderManager) archive.getModuleManager().getBean(archive.getCatalogId(), "orderManager");
Order order = manager.loadOrder(archive.getCatalogId(), orderid);
HitTracker orderitems = manager.findOrderItems(inReq, archive.getCatalogId(), orderid);
String catalogid = archive.getCatalogId();
ZipUtil util = new ZipUtil();
zos = new ZipOutputStream(inOut.getStream());
zos.setLevel(1); // for speed since these are jpegs
OutputFiller filler = new OutputFiller();
List<Asset> missing = new ArrayList<Asset>();
List<Asset> okAssets = new ArrayList<Asset>();
Set<String> fileset = new HashSet<String>();//set of unique filenames
StringBuilder buf = new StringBuilder();//some accounting of filenames that are renamed
for (Iterator iterator = orderitems.iterator(); iterator.hasNext();) {
Data orderitem = (Data) iterator.next();
Data preset = archive.getSearcherManager().getData(catalogid, "convertpreset", orderitem.get("presetid"));
String queid = orderitem.get("publishqueueid");
if( queid == null )
{
log.error("publishqueueid should never be null, 0 for browser");
continue;
}
Data publishtask = archive.getSearcherManager().getData(catalogid, "publishqueue", queid);
Asset asset = archive.getAssetBySourcePath(orderitem.get("assetsourcepath"));
Page target = null;
String filename = publishtask.get("exportname");
if(filename == null){
throw new OpenEditException("Filename was not set on publish task: " + publishtask.getId());
}
//handle duplicate filenames
if (fileset.contains(filename)){
buf.append(filename).append("\t").append(asset.getSourcePath()).append("\t");
String filetype = "";
if (filename.contains(".")){
filetype = filename.substring(filename.lastIndexOf("."));
filename = filename.substring(0,filename.lastIndexOf("."));
}
filename = new StringBuilder()
.append(filename).append("_")
.append(String.valueOf( (int) (Math.random() * 1000)))
.append(filetype)
.toString();
buf.append(filename).append("\n");
fileset.add(filename);
} else {
fileset.add(filename);
}
if(preset.getId().equals("0")){
target = archive.getOriginalDocument(asset);
util.addTozip(target.getContentItem(),filename , zos);
}
else{
String pathToFile = "/WEB-INF/data/" + archive.getCatalogId() + "/generated/" + orderitem.get("assetsourcepath") + "/" + preset.get("outputfile");
target = archive.getPageManager().getPage(pathToFile);
util.addTozip(target.getContentItem(),filename , zos);
}
// <a class="btn small" href="$home/${applicationid}/views/modules/asset/downloads/generated/${asset.sourcepath}/${convertpreset.outputfile}/${publishqueue.exportname}">Download</a>
}
if (!buf.toString().isEmpty()){
util.addTozip("Original Name\tSource Path\tNew Name\n"+buf.toString(),"files.txt",zos);
}
} catch (IOException e) {
throw new OpenEditException(e);
} finally{
try {
zos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// ZipGroup zip = new ZipGroup();
// zip.setEnterMedia(archiveModule.getEnterMedia(inReq.findValue("applicationid")));
// zip.setUser(inReq.getUser());
// zip.zipItems(assets, inOut.getStream());
}
public boolean canGenerate(WebPageRequest inReq)
{
boolean ok = inReq.getPage().getMimeType().equals("application/x-zip");
return ok;
}
}