package org.openedit.entermedia.scanner;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
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.entermedia.Asset;
import org.openedit.entermedia.MediaArchive;
import org.openedit.util.DateStorageUtil;
import com.openedit.hittracker.HitTracker;
import com.openedit.hittracker.SearchQuery;
public class PresetCreator
{
private static final Log log = LogFactory.getLog(PresetCreator.class);
protected Map<String,Collection> fieldPresetCache;
protected Collection getPresets(String rendertype)
{
if (fieldPresetCache == null)
{
fieldPresetCache = new HashMap<String,Collection>();
}
return fieldPresetCache.get(rendertype);
}
public int createMissingOnImport(MediaArchive mediaarchive, Searcher tasksearcher, Asset asset)
{
String rendertype = mediaarchive.getMediaRenderType(asset.getFileFormat());
int added = 0;
Collection hits = getPresets(rendertype);
if( hits == null )
{
Searcher presetsearcher = mediaarchive.getSearcher("convertpreset");
SearchQuery query = presetsearcher.createSearchQuery();
query.addMatches("onimport", "true");
query.addMatches("inputtype", rendertype);
hits = presetsearcher.search(query);
fieldPresetCache.put(rendertype, hits);
}
boolean missingconversion = false;
for (Iterator iterator = hits.iterator(); iterator.hasNext();)
{
Data preset = (Data) iterator.next();
//Data preset = (Data) presetsearcher.searchById(it.id);
added = added + createMissing(mediaarchive,tasksearcher,preset,asset);
}
return added;
}
public int createMissing(MediaArchive mediaarchive, Searcher tasksearcher, Data preset, Asset asset)
{
int added = 0;
boolean missingconversion = false;
if (!mediaarchive.doesAttachmentExist(asset,preset,0) )
{
missingconversion = true;
createPresetsForPage(tasksearcher, preset, asset,0);
added++;
}
String pages = asset.get("pages");
if( pages != null )
{
int npages = Integer.parseInt(pages);
if( npages > 1 )
{
for (int i = 1; i < npages; i++)
{
int pagenum = i + 1;
if (!mediaarchive.doesAttachmentExist(asset,preset,pagenum) )
{
missingconversion = true;
createPresetsForPage(tasksearcher, preset, asset, pagenum);
added++;
}
}
}
}
return added;
}
public Data createPresetsForPage(Searcher tasksearcher,Data preset,Asset asset)
{
return createPresetsForPage(tasksearcher,preset,asset,0);
}
public Data createPresetsForPage(Searcher tasksearcher,Data preset,Asset asset,int thepage)
{
Data found = createPresetsForPage(tasksearcher, preset, asset,thepage,false);
return found;
}
public Data createPresetsForPage(Searcher tasksearcher,Data preset,Asset asset,int thepage,boolean createall)
{
Data found = null;
if( !createall)
{
SearchQuery taskq = tasksearcher.createSearchQuery().append("assetid", asset.getId() ).append("presetid", preset.getId() ); //This is so dumb
if( thepage > 0 )
{
taskq.append("pagenumber",String.valueOf(thepage));
}
HitTracker hits = tasksearcher.search(taskq);
if ( hits.size() == 1 )
{
found = (Data)hits.first(); //there will be only once most of the time
}
else if ( hits.size() > 1 )
{
for (Iterator iterator = hits.iterator(); iterator.hasNext();)
{
Data hit = (Data)iterator.next();
if( hit.get("pagenumber") == null )
{
found = hit;
break;
}
}
}
}
if( found != null )
{
//If it is complete then the converter will mark it complete again
if( !"new".equals( found.get("status") ) )
{
found = (Data)tasksearcher.searchById(found.getId());
if( found != null )
{
found.setProperty("status", "new");
tasksearcher.saveData(found, null);
return found;
}
else
{
log.error("Conversion tasks index is out of date ${found.getId()}");
}
}
}
else
{
found = tasksearcher.createNewData();
found.setSourcePath(asset.getSourcePath());
found.setProperty("status", "new");
found.setProperty("assetid", asset.getId() );
found.setProperty("presetid", preset.getId() );
found.setProperty("ordering", preset.get("ordering") );
String nowdate = DateStorageUtil.getStorageUtil().formatForStorage(new Date() );
found.setProperty("submitted", nowdate);
if( thepage > 0 )
{
found.setProperty("pagenumber", String.valueOf(thepage));
}
tasksearcher.saveData(found, null);
return found;
}
return found;
}
}