package org.korsakow.domain.command;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.xml.xpath.XPathExpressionException;
import org.apache.log4j.Logger;
import org.dsrg.soenea.domain.MapperException;
import org.dsrg.soenea.domain.command.CommandException;
import org.dsrg.soenea.uow.UoW;
import org.korsakow.domain.Settings;
import org.korsakow.domain.interf.IImage;
import org.korsakow.domain.interf.IMedia;
import org.korsakow.domain.interf.IProject;
import org.korsakow.domain.interf.ISettings;
import org.korsakow.domain.interf.ISound;
import org.korsakow.domain.interf.IText;
import org.korsakow.domain.interf.IVideo;
import org.korsakow.domain.mapper.input.MediaInputMapper;
import org.korsakow.domain.mapper.input.ProjectInputMapper;
import org.korsakow.domain.mapper.input.SettingsInputMapper;
import org.korsakow.domain.task.ITask;
import org.korsakow.domain.task.IWorker;
import org.korsakow.ide.Application;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.resources.ResourceType;
import org.korsakow.ide.task.AbstractTask;
import org.korsakow.ide.task.TaskException;
import org.korsakow.ide.task.UIWorker;
import org.korsakow.ide.util.ResourceManager;
import org.korsakow.services.export.ExportException;
import org.korsakow.services.export.Exporter;
import org.korsakow.services.export.IVideoEncodingProfile;
import org.korsakow.services.export.PropertiesVideoEncodingProfile;
public class ExportFlashProjectCommand extends AbstractCommand{
public static final String EXPORTER = "exporter";
public static final String WORKER = "worker";
public static final String PROJECT_ID = "project_id";
public static final String EXPORT_DIR = "export_dir";
public static final String INDEX_FILENAME = "index_filename";
public static final String EXPORT_ALL_MEDIA = "export_all_media";
public ExportFlashProjectCommand(Helper request, Helper response) {
super(request, response);
}
public void execute()
throws CommandException {
try {
long projectId = request.getLong(PROJECT_ID);
IProject project = ProjectInputMapper.map(projectId);
File exportDir = new File(request.getString(EXPORT_DIR));
if (exportDir.isFile() && exportDir.getParentFile() != null)
exportDir = exportDir.getParentFile();
String indexFilename = request.getString(INDEX_FILENAME);
if (indexFilename == null)
indexFilename = Exporter.FLASH_PLAYER_RESOURCE_INDEX;
boolean exportAllMedia = request.has(EXPORT_ALL_MEDIA) && request.getBoolean(EXPORT_ALL_MEDIA);
Exporter exporter = new Exporter();
IWorker exportWorker = new UIWorker();
// we want to do the setup in a task since its lengthy
// however we can't generate the other tasks from the exporter until that's done
// so the setup tasks does that and then adds them to the worker
exportWorker.addTask(new SetupExporterTask(exportWorker, exporter, exportDir, indexFilename, project, exportAllMedia));
response.set(WORKER, exportWorker);
response.set(EXPORTER, exporter);
} catch (Exception e) {
throw new CommandException(e);
}
}
private static class SetupExporterTask extends AbstractTask
{
private final IWorker uiWorker;
private final String indexFilename;
private final File exportDir;
private final Exporter exporter;
private final IProject project;
private final boolean exportAllMedia;
public SetupExporterTask(IWorker uiWorker, Exporter exporter, File exportDir, String indexFilename, IProject project, boolean exportOnlyReferencedMedia)
{
this.uiWorker = uiWorker;
this.exporter = exporter;
this.exportDir = exportDir;
this.indexFilename = indexFilename;
this.project = project;
exportAllMedia = exportOnlyReferencedMedia;
}
@Override
public void runTask() throws TaskException, InterruptedException {
UoW.newCurrent();
ISettings settings;
Collection<IMedia> media;
try {
settings = SettingsInputMapper.find();
media = exportAllMedia?project.getMedia():MediaInputMapper.findReferencedMedia();
} catch (XPathExpressionException e) {
throw new TaskException(e);
} catch (MapperException e) {
throw new TaskException(e);
} catch (SQLException e) {
throw new TaskException(e);
}
Collection<ISound> sounds = new HashSet<ISound>();
Collection<IVideo> videos = new HashSet<IVideo>();
Collection<IImage> images = new HashSet<IImage>();
Collection<IText> texts = new HashSet<IText>();
int i = 0;
int size = media.size();
long before = System.currentTimeMillis();
for (IMedia medium : media)
{
fireProgressChanged(0, ++i*100/size);
fireDisplayStringChanged("", medium.getName());
ResourceType resourceType = ResourceType.forId(medium.getType());
switch (resourceType)
{
case SOUND:
sounds.add((ISound)medium);
break;
case VIDEO:
videos.add((IVideo)medium);
break;
case IMAGE:
images.add((IImage)medium);
break;
case TEXT:
texts.add((IText)medium);
break;
default:
Logger.getLogger(ExportFlashProjectCommand.class).error("media list contains unknown media: " + medium.getClass().getCanonicalName(), new Exception("just-for-stacktrace"));
break;
}
}
long after = System.currentTimeMillis();
System.out.println("Determination: " + (after-before)/1000 + "\t" + media.size());
exporter.setExportFonts(settings.getBoolean(Settings.EXPORT_FONTS));
exporter.setIndexFilename(indexFilename);
exporter.setProject(project);
exporter.setSettings(settings);
exporter.setSnus(project.getSnus());
exporter.setSounds(sounds);
exporter.setImages(images);
exporter.setVideos(videos);
exporter.setInterfaces(project.getInterfaces());
exporter.setTexts(texts);
IVideoEncodingProfile videoEncodingProfile;
try {
videoEncodingProfile = new PropertiesVideoEncodingProfile(ResourceManager.getResourceStream("encodingprofiles/" + settings.getString("videoEncodingProfile") + ".properties"));
} catch (IOException e) {
Application.getInstance().showAlertDialog(String.format("Encoding profile not found: %s", settings.getString("videoEncodingProfile")), "Please check your project's export settings.");
try {
videoEncodingProfile = new PropertiesVideoEncodingProfile(ResourceManager.getResourceStream("encodingprofiles/" + "flv_low" + ".properties"));
} catch (IOException e2) {
throw new TaskException(e2);
}
}
exporter.setVideoEncodingProfile(videoEncodingProfile);
fireDisplayStringChanged("", LanguageBundle.getString("export.task.initializingtasks"));
List<ITask> exportTasks;
try {
exportTasks = exporter.createExportTasks(exportDir);
} catch (IOException e) {
throw new TaskException(e);
} catch (ExportException e) {
throw new TaskException(e);
}
uiWorker.addTasks(exportTasks);
}
@Override
public String getTitleString()
{
return LanguageBundle.getString("export.task.determiningmediatoexport");
}
}
}