Author: seba.wagner
Date: Mon Dec 29 07:16:17 2008
New Revision: 1742
Added:
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManagerSWFTools.java
Log:
Backup of Conversion Job Using SWFTools
Added:
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManagerSWFTools.java
==============================================================================
--- (empty file)
+++
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManagerSWFTools.java
Mon Dec 29 07:16:17 2008
@@ -0,0 +1,650 @@
+package org.openmeetings.app.data.record;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.batik.dom.GenericDOMImplementation;
+import org.apache.batik.dom.svg.SVGDOMImplementation;
+import org.apache.batik.svggen.SVGGraphics2D;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openmeetings.app.data.record.dao.RecordingConversionJobDaoImpl;
+import org.openmeetings.app.data.record.dao.RecordingDaoImpl;
+import org.openmeetings.app.data.record.dao.RoomRecordingDaoImpl;
+import org.openmeetings.app.data.record.dao.WhiteBoardEventDaoImpl;
+import org.openmeetings.app.documents.GenerateImage;
+import org.openmeetings.app.documents.GenerateSWF;
+import org.openmeetings.app.hibernate.beans.recording.Recording;
+import
org.openmeetings.app.hibernate.beans.recording.RecordingConversionJob;
+import org.openmeetings.app.hibernate.beans.recording.RoomRecording;
+import org.openmeetings.app.hibernate.beans.recording.WhiteBoardEvent;
+import org.openmeetings.app.remote.Application;
+import org.openmeetings.app.remote.StreamService;
+import org.openmeetings.utils.math.CalendarPatterns;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.XppDriver;
+
+public class WhiteboardConvertionJobManagerSWFTools {
+
+ //This is the amount of time the Conversion Job will create an SVN
+ //So 200 Milliseconds == 5 Images per second
+ private static Long numberOfMilliseconds = 200L;
+
+ //This is the number of Images of SVG Files per Folder
+ //Its rather small as ImageMagick seems to have problems in
+ //processing bigger numbers
+ private static Long maxNumberOfBatchFolderSize = 10L;
+
+ //This is the bpp (Bits per Pixel) BUT in this case its meant
+ //for each channel ... RGB each one 8Bit
+ //by default ImageMagick uses 16 buts it seems like SWFTools only can
+ //take 8Bit
+ private static int depth = 8;
+
+ //This is the number of SVGs that will be created in one
+ //quartz scheduler run
+ private static int svgBatchProcessByQuery = 100;
+
+ private static boolean isRunning = false;
+
+ //in JUnit tests you have to change that to true
+ //see also Methods on bottom to change the Default Out dir in JUnit
+ private static boolean isDebug = false;
+
+ private static final Log log =
LogFactory.getLog(WhiteboardConvertionJobManagerSWFTools.class);
+
+ private WhiteboardConvertionJobManagerSWFTools() {
+ }
+
+ private static WhiteboardConvertionJobManagerSWFTools instance = null;
+
+ public static synchronized WhiteboardConvertionJobManagerSWFTools
getInstance() {
+ if (instance == null) {
+ instance = new WhiteboardConvertionJobManagerSWFTools();
+ }
+
+ return instance;
+ }
+
+ public synchronized void initJobs() {
+ try {
+ if (!isRunning) {
+ isRunning = true;
+
+ List<Recording> recordingsNonConversionStarted
=
RecordingDaoImpl.getInstance().getRecordingWhiteboardToConvert();
+
+ for (Recording recording :
recordingsNonConversionStarted) {
+ recording.setWhiteBoardConverted(true);
+
RecordingDaoImpl.getInstance().updateRecording(recording);
+ }
+ //log.debug("initJobs:
"+recordingsNonConversionStarted.size());
+
+ for (Recording recording :
recordingsNonConversionStarted) {
+
+ RecordingConversionJob
recordingConversionJob = new
RecordingConversionJob();
+
recordingConversionJob.setRecording(recording);
+ recordingConversionJob.setStarted(new
Date());
+
recordingConversionJob.setEndTimeInMilliSeconds(0L);
+
recordingConversionJob.setImageNumber(0L);
+
recordingConversionJob.setCurrentWhiteBoardAsXml("");
+
+
RecordingConversionJobDaoImpl.getInstance().addRecordingConversionJob(recordingConversionJob);
+
+ }
+
+ //Do SVG Conversion for next 100 SVG Images,
that should fill one
Folder
+ for (int i=0;i<svgBatchProcessByQuery;i++) {
+ this.processJobs();
+ }
+
+ //Do SVG to PNG Batch Conversion
+ this.processConvertionJobs();
+
+ //Do PNG to SWF Conversion
+ this.processConvertionSWFJobs();
+
+ isRunning = false;
+ } else {
+
+ log.debug("CANNOT PROCESS WAIT FOR FREE SLOT");
+
+ }
+ } catch (Exception err) {
+ log.error("[initJobs]",err);
+ }
+ }
+
+ public synchronized void processJobs() {
+ try {
+
+ List<RecordingConversionJob> listOfConversionJobs =
RecordingConversionJobDaoImpl.getInstance().getRecordingConversionJobs();
+
+ //log.debug("processJobs:
"+listOfConversionJobs.size());
+
+ for (RecordingConversionJob recordingConversionJob :
listOfConversionJobs) {
+
+ //log.debug("TIME
INITIAL : "+recordingConversionJob.getEndTimeInMilliSeconds());
+
+ if
(recordingConversionJob.getEndTimeInMilliSeconds().equals(0L)) {
+
+ log.debug("DRAW INITIAL IMAGE");
+
+ XStream xStream_temp = new XStream(new
XppDriver());
+
xStream_temp.setMode(XStream.NO_REFERENCES);
+
+ String roomRecordingInXML =
recordingConversionJob.getRecording().getRoomRecording().getInitwhiteboardvarsInXml();
+
+ Map initWhiteBoardObjects = (Map)
xStream_temp.fromXML(roomRecordingInXML);
+
+
this.generateFileAsSVG(initWhiteBoardObjects, roomRecordingInXML,
recordingConversionJob);
+
+ } else {
+
+ log.debug("DRAW NEXT IMAGE");
+
+ if
(recordingConversionJob.getRecording().getDuration() >=
recordingConversionJob.getEndTimeInMilliSeconds()) {
+
+ List<WhiteBoardEvent>
whiteBoardEventList =
WhiteBoardEventDaoImpl.getInstance().
+
getWhiteboardEventsInRange(
+
recordingConversionJob.getEndTimeInMilliSeconds(),
+
recordingConversionJob.getEndTimeInMilliSeconds()+(numberOfMilliseconds-1),
+
recordingConversionJob.getRecording().getRoomRecording().getRoomrecordingId());
+
+
+ log.debug("whiteBoardEventList
SIZE "+whiteBoardEventList.size());
+
+ XStream xStream_temp = new
XStream(new XppDriver());
+
xStream_temp.setMode(XStream.NO_REFERENCES);
+
+ String roomRecordingInXML =
recordingConversionJob.getCurrentWhiteBoardAsXml();
+ Map whiteBoardObjects = (Map)
xStream_temp.fromXML(roomRecordingInXML);
+
+ //Do simulate Whiteboard Events
in Temp Object
+
+ for (WhiteBoardEvent
whiteBoardEvent : whiteBoardEventList) {
+
+
log.debug("whiteBoardEvent: "+whiteBoardEvent.getStarttime());
+
+ XStream
xStream_temp_action = new XStream(new XppDriver());
+
xStream_temp_action.setMode(XStream.NO_REFERENCES);
+
+ Map actionObj = (Map)
xStream_temp_action.fromXML(whiteBoardEvent.getAction());
+
+
log.debug("whiteBoardEvent: "+actionObj);
+
+ Date dateOfEvent =
(Date) actionObj.get(1);
+ String action =
actionObj.get(2).toString();
+ Map actionObject =
(Map) actionObj.get(3);
+
+ log.debug("action:
"+action);
+
+ if
(action.equals("draw") || action.equals("redo")){
+
+
//log.debug(actionObject);
+
//log.debug(actionObject.size()-1);
+
//log.debug(actionObject.get(actionObject.size()-1));
+
+ String
objectOID =
actionObject.get(actionObject.size()-1).toString();
+
log.debug("objectOID: "+objectOID);
+
whiteBoardObjects.put(objectOID, actionObject);
+ } else if
(action.equals("clear")) {
+
whiteBoardObjects = new HashMap<String,Map>();
+ } else if
(action.equals("delete") || action.equals("undo")) {
+ String
objectOID =
actionObject.get(actionObject.size()-1).toString();
+
log.debug("removal of objectOID: "+objectOID);
+
whiteBoardObjects.remove(objectOID);
+ } else if
(action.equals("size") || action.equals("editProp")
+ ||
action.equals("editText")) {
+ String
objectOID =
actionObject.get(actionObject.size()-1).toString();
+ //Map roomItem
= (Map) whiteBoardObjects.get(objectOID);
+
whiteBoardObjects.put(objectOID, actionObject);
+
+ } else {
+
log.warn("Unkown Type: "+action+" actionObject: "+actionObject);
+ }
+
+ }
+
+ XStream xStream_temp_store =
new XStream(new XppDriver());
+
xStream_temp_store.setMode(XStream.NO_REFERENCES);
+ String roomRecordingInXMLToSave
=
xStream_temp_store.toXML(whiteBoardObjects);
+
+
this.generateFileAsSVG(whiteBoardObjects, roomRecordingInXMLToSave,
recordingConversionJob);
+
+ } else {
+
+ log.debug("THIS FILE IS
PROCESSED
UPDATE: "+recordingConversionJob.getRecordingConversionJobId());
+
+ //FIXME: this should happen
only one time per conversion Job
+
+
recordingConversionJob.setEnded(new Date());
+
recordingConversionJob.setStartedPngConverted(new Date());
+
recordingConversionJob.setBatchProcessCounter(0L);
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+
+ }
+ }
+
+ }
+
+ } catch (Exception err) {
+ log.error("[processJobs]",err);
+ }
+
+ }
+
+ public synchronized void processConvertionJobs() {
+ try {
+
+ List<RecordingConversionJob> listOfConversionJobs =
RecordingConversionJobDaoImpl.getInstance().getRecordingConversionBatchConversionJobs();
+
+ //log.debug("processBatchJobs SIZE:
"+listOfConversionJobs.size());
+
+ for (RecordingConversionJob recordingConversionJob :
listOfConversionJobs) {
+
+ Double maxFolderDoub =
Math.floor(recordingConversionJob.getImageNumber() /
maxNumberOfBatchFolderSize);
+
+ int maxFolder = maxFolderDoub.intValue();
+
+ if (maxFolder >=
recordingConversionJob.getBatchProcessCounter()) {
+
+ Map<String,String> outputFileNames =
null;
+ if (isDebug) {
+ outputFileNames =
this.generateBatchFileDebug(recordingConversionJob.getRecordingConversionJobId(),
+
recordingConversionJob.getBatchProcessCounter());
+ } else {
+ outputFileNames =
this.generateBatchFile(recordingConversionJob.getRecordingConversionJobId(),
+
recordingConversionJob.getBatchProcessCounter());
+ }
+
+
+
+
GenerateImage.getInstance().convertImageByTypeAndSizeAndDepth(
+
outputFileNames.get("input"),
+
outputFileNames.get("output"),
+ 660, 580, depth);
+
+ //Add Count For next Round
+ RecordingConversionJob
recordingConversionJobUpdate =
RecordingConversionJobDaoImpl.getInstance().
+
getRecordingConversionJobsByRecordingConversionJobsId(recordingConversionJob.getRecordingConversionJobId());
+
+
recordingConversionJobUpdate.setBatchProcessCounter(recordingConversionJob.getBatchProcessCounter()+1);
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobUpdate);
+
+ } else {
+
+ log.debug("Batch Processing Done");
+ RecordingConversionJob
recordingConversionJobUpdate =
RecordingConversionJobDaoImpl.getInstance().
+
getRecordingConversionJobsByRecordingConversionJobsId(recordingConversionJob.getRecordingConversionJobId());
+
+
recordingConversionJobUpdate.setEndPngConverted(new Date());
+
recordingConversionJobUpdate.setStartedSWFConverted(new Date());
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobUpdate);
+
+ }
+
+ }
+
+ } catch (Exception err) {
+ log.error("[processConvertionJobs]",err);
+ }
+ }
+
+ public synchronized void processConvertionSWFJobs() {
+ try {
+
+ List<RecordingConversionJob> listOfSWFConversionJobs =
RecordingConversionJobDaoImpl.getInstance().getRecordingConversionSWFConversionJobs();
+
+ log.debug("processSWFJobs SIZE:
"+listOfSWFConversionJobs.size());
+
+ for (RecordingConversionJob recordingConversionJob :
listOfSWFConversionJobs) {
+
+ //Get All Images
+
+ Double maxFolderDoub =
Math.floor(recordingConversionJob.getImageNumber() /
maxNumberOfBatchFolderSize);
+ long maxFolder = maxFolderDoub.longValue();
+
+ List<String> images = new LinkedList<String>();
+
+ for (long i=0;i<maxFolder;i++) {
+
+ String folderName =
this.getBatchFileFolder(recordingConversionJob.getRecordingConversionJobId(),
i);
+
+ for (int
k=0;k<maxNumberOfBatchFolderSize;k++) {
+
+ //three times to simulate a FPS
of 30 while we only generate
+ //an image every 200
milliseconds (would be fps of 10)
+ images.add(folderName+k+".png");
+ images.add(folderName+k+".png");
+ images.add(folderName+k+".png");
+
+ }
+
+ }
+
+ //restImages will be always smaller then
maxNumberOfBatchFolderSize
+ long restImages =
recordingConversionJob.getImageNumber() -
(maxFolder*maxNumberOfBatchFolderSize);
+
+ log.debug("restImages: "+restImages);
+
+ for (int k=0;k<restImages;k++) {
+
+ String folderName =
this.getBatchFileFolder(recordingConversionJob.getRecordingConversionJobId(),
maxFolder);
+
+ //three times to simulate a FPS of 30
while we only generate
+ //an image every 200 milliseconds
(would be fps of 10)
+ images.add(folderName+k+".png");
+ images.add(folderName+k+".png");
+ images.add(folderName+k+".png");
+
+ }
+
+ log.debug("images: "+images);
+ log.debug("images: "+images.size());
+
+ String output =
this.getSWFFileForResult(recordingConversionJob.getRecordingConversionJobId());
+
+ String outputFolder =
this.getSWFFolderForResult(recordingConversionJob.getRecordingConversionJobId());
+
+ //Generate that SWF only by 1000 Files as
png2swf.c has a
MAX_INPUT_FILE of 1024
+
+ //This workaround is just to workaround the
1024 File LIMIT of
SWFTools!!!
+
+ List<String> outputfiles = new
LinkedList<String>();
+
+ int maxnumber =
Double.valueOf(Math.floor(images.size() /
1000)).intValue();
+
+ log.debug("maxnumber: "+maxnumber);
+
+ if (maxnumber > 0) {
+ for (int i=0;i<=maxnumber;i++) {
+
+ log.debug("Generate SWF for
Items: "+i+" TO : "+(i*1000));
+ String fileName = outputFolder
+ File.separatorChar
+ "whiteboard"+i+".swf";
+ outputfiles.add(fileName);
+
+ List<String> imageForConvert =
new LinkedList<String>();
+ for (int k=0;k<1000;k++) {
+ int index = k+(i*1000);
+ log.debug("index Number
"+index+" size: "+images.size());
+ if (index <
images.size()) {
+
imageForConvert.add(images.get(index));
+ } else {
+ break;
+ }
+ }
+
+
GenerateSWF.getInstance().generateSWFByImages(imageForConvert,
fileName, 30);
+ }
+
+ //Combine Resulting SWFs to one SWF
+
+ //FIXME: IT SEEMS LIKE SWFCOMBINE DOES
PRODUCE INVALID Files!!
+
GenerateSWF.getInstance().generateSWFByCombine(outputfiles, output,
30);
+
+ } else {
+
+ //Directly write to SWF
+
GenerateSWF.getInstance().generateSWFByImages(images, output, 30);
+
+
+ }
+ RecordingConversionJob
recordingConversionJobUpdate =
RecordingConversionJobDaoImpl.getInstance().
+
getRecordingConversionJobsByRecordingConversionJobsId(recordingConversionJob.getRecordingConversionJobId());
+
+
recordingConversionJobUpdate.setEndSWFConverted(new Date());
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobUpdate);
+
+ }
+
+ } catch (Exception err) {
+ log.error("[processConvertionSWFJobs]",err);
+ }
+ }
+
+ private void generateFileAsSVG(Map whiteBoardObjects, String
roomRecordingInXML, RecordingConversionJob recordingConversionJob) throws
Exception {
+
+ // Get a DOMImplementation.
+ DOMImplementation domImpl =
+ GenericDOMImplementation.getDOMImplementation();
+
+ // Create an instance of org.w3c.dom.Document.
+ //String svgNS = "http://www.w3.org/2000/svg";
+ String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
+
+ Document document = domImpl.createDocument(svgNS, "svg", null);
+
+ // Get the root element (the 'svg' element).
+ Element svgRoot = document.getDocumentElement();
+
+
+ // Set the width and height attributes on the root 'svg' element.
+ svgRoot.setAttributeNS(null, "width", ""+660);
+ svgRoot.setAttributeNS(null, "height", ""+620);
+
+
+ // Create an instance of the SVG Generator.
+ SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
+
+ svgGenerator =
WhiteboardMapToSVG.getInstance().convertMapToSVG(svgGenerator,
whiteBoardObjects);
+
+ // Finally, stream out SVG to the standard output using
+ // UTF-8 encoding.
+ boolean useCSS = true; // we want to use CSS style attributes
+ //Writer out = new OutputStreamWriter(System.out, "UTF-8");
+
+ //log.debug(out.toString());
+
+// String firstImageName =
this.generateFileName(recordingConversionJob.getRecordingConversionJobId(),
fileNumber);
+// log.debug("Write File To: "+firstImageName);
+//
+// FileWriter fileWriter = new FileWriter(firstImageName);
+//
+// svgGenerator.stream(fileWriter, useCSS);
+
+// StringWriter stringWriter = new StringWriter();
+//
+// svgGenerator.stream(stringWriter, useCSS);
+//
+// log.debug("stringWriter"+stringWriter.toString());
+
+ String firstImageName = "";
+
+ if (isDebug) {
+ firstImageName = this.generateSVGFileDebug(
+
recordingConversionJob.getRecordingConversionJobId(),
+
recordingConversionJob.getImageNumber());
+ } else {
+ firstImageName = this.generateSVGFileName(
+
recordingConversionJob.getRecordingConversionJobId(),
+ recordingConversionJob.getImageNumber());
+ }
+
+ log.debug("Write File To: " + firstImageName);
+
+ FileWriter fileWriter = new FileWriter(firstImageName);
+ svgGenerator.stream(fileWriter, useCSS);
+
+ RecordingConversionJob recordingConversionJobToStore =
RecordingConversionJobDaoImpl.getInstance().getRecordingConversionJobsByRecordingConversionJobsId(
+
recordingConversionJob.getRecordingConversionJobId());
+
+
recordingConversionJobToStore.setEndTimeInMilliSeconds(recordingConversionJob.getEndTimeInMilliSeconds()
+ numberOfMilliseconds);
+
recordingConversionJobToStore.setCurrentWhiteBoardAsXml(roomRecordingInXML);
+
recordingConversionJobToStore.setImageNumber(recordingConversionJob.getImageNumber()+1);
+
+ log.debug("updateRecordingConversionJobs: generateFileAsSVG");
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobToStore);
+
+ }
+
+ private String generateSVGFileDebug(Long conversionJobId, Long
imageNumber) throws Exception {
+ String recordingRootDir
=
"/Users/swagner/Documents/work/red5_distros/red5_r3200_snapshot/webapps/openmeetings/test/";
+
+ String recordingFileDir = recordingRootDir + File.separatorChar +
conversionJobId;
+ File recordingFileDirFolder = new File(recordingFileDir);
+ if (!recordingFileDirFolder.exists()) {
+ recordingFileDirFolder.mkdir();
+ }
+ Double numberOfFolder = Math.floor(imageNumber /
maxNumberOfBatchFolderSize);
+ String folderDir = ""+numberOfFolder.intValue();
+
+ String batchFileSVGDir = recordingFileDir + File.separatorChar +
folderDir;
+ File recordingBatchFileDirFolder = new File(batchFileSVGDir);
+ if (!recordingBatchFileDirFolder.exists()) {
+ recordingBatchFileDirFolder.mkdir();
+ }
+
+ return batchFileSVGDir + File.separatorChar + imageNumber + ".svg";
+ }
+
+ /**
+ * This won't work in Debug(=>means JUnit!) Modus as the batch File-Dir
is relative to the Server-Path
+ *
+ * @param conversionJobId
+ * @param folderNumber
+ * @return
+ * @throws Exception
+ */
+ private Map<String, String> generateBatchFileDebug(Long conversionJobId,
+ Long folderNumber) throws Exception {
+ String recordingRootDir
=
"/Users/swagner/Documents/work/red5_distros/red5_r3200_snapshot/webapps/openmeetings/test/";
+
+ // The Folders must already exist here otherwise no Image could
exist
+ // here, so no need to
+ // check for existance
+ String recordingFileDir = recordingRootDir + File.separatorChar
+ + conversionJobId;
+ String batchFileSVGDir = recordingFileDir + File.separatorChar
+ + folderNumber;
+
+ String batchFilePNGDir = batchFileSVGDir + File.separatorChar +
"PNG";
+ File recordingBatchFilePNGDirFolder = new File(batchFilePNGDir);
+ if (!recordingBatchFilePNGDirFolder.exists()) {
+ recordingBatchFilePNGDirFolder.mkdir();
+ }
+
+ Map<String, String> returnMap = new HashMap<String, String>();
+
+ returnMap.put("input", batchFileSVGDir + File.separatorChar +
"*.svg");
+ returnMap
+ .put("output", batchFilePNGDir +
File.separatorChar + "%d.png");
+
+ return returnMap;
+ }
+
+ private Map<String, String> generateBatchFile(Long conversionJobId,
+ Long folderNumber) throws Exception {
+
+ String recordingRootDir = Application.webAppPath +
File.separatorChar
+ + "upload" + File.separatorChar
+ + StreamService.folderForRecordings;
+
+ // The Folders must already exist here otherwise no Image could
exist
+ // here, so no need to
+ // check for existance
+ String recordingFileDir = recordingRootDir + File.separatorChar
+
conversionJobId;
+ String batchFileSVGDir = recordingFileDir + File.separatorChar
+
folderNumber;
+
+ String batchFilePNGDir = batchFileSVGDir + File.separatorChar +
"PNG";
+ File recordingBatchFilePNGDirFolder = new File(batchFilePNGDir);
+ if (!recordingBatchFilePNGDirFolder.exists()) {
+ recordingBatchFilePNGDirFolder.mkdir();
+ }
+
+ Map<String, String> returnMap = new HashMap<String, String>();
+
+ returnMap.put("input", batchFileSVGDir + File.separatorChar +
"*.svg");
+ returnMap.put("output", batchFilePNGDir + File.separatorChar +
"%d.png");
+
+ return returnMap;
+ }
+
+ private String generateSVGFileName(Long conversionJobId, Long
imageNumber) throws Exception {
+
+ String recordingRootDir = Application.webAppPath +
File.separatorChar
+ + "upload" + File.separatorChar
+ + StreamService.folderForRecordings;
+
+ File recordingRootDirFolder = new File(recordingRootDir);
+ if (!recordingRootDirFolder.exists()) {
+ recordingRootDirFolder.mkdir();
+ }
+
+ String recordingFileDir = recordingRootDir + File.separatorChar
+
conversionJobId;
+ File recordingFileDirFolder = new File(recordingFileDir);
+ if (!recordingFileDirFolder.exists()) {
+ recordingFileDirFolder.mkdir();
+ }
+ Double numberOfFolder = Math.floor(imageNumber /
maxNumberOfBatchFolderSize);
+ String folderDir = "" + numberOfFolder.intValue();
+
+ String batchFileSVGDir = recordingFileDir + File.separatorChar
+
folderDir;
+ File recordingBatchFileDirFolder = new File(batchFileSVGDir);
+ if (!recordingBatchFileDirFolder.exists()) {
+ recordingBatchFileDirFolder.mkdir();
+ }
+
+ return batchFileSVGDir + File.separatorChar + imageNumber +
".svg";
+ }
+
+ private String getBatchFileFolder(Long conversionJobId,
+ Long folderNumber) throws Exception {
+
+ String recordingRootDir = Application.webAppPath +
File.separatorChar
+ + "upload" + File.separatorChar
+ + StreamService.folderForRecordings;
+
+ // The Folders must already exist here otherwise no Image could
exist
+ // here, so no need to
+ // check for existance
+ String recordingFileDir = recordingRootDir + File.separatorChar
+
conversionJobId;
+ String batchFileSVGDir = recordingFileDir + File.separatorChar
+
folderNumber;
+ String batchFilePNGDir = batchFileSVGDir + File.separatorChar +
"PNG" +
File.separatorChar;
+
+ File f = new File(batchFilePNGDir);
+ return f.getAbsolutePath() + File.separatorChar;
+ }
+
+ private String getSWFFolderForResult(Long conversionJobId) throws
Exception {
+
+ String recordingRootDir = Application.webAppPath +
File.separatorChar
+ + "upload" + File.separatorChar
+ + StreamService.folderForRecordings;
+
+ // The Folders must already exist here otherwise no Image could
exist
+ // here, so no need to
+ // check for existance
+ String recordingFileDir = recordingRootDir + File.separatorChar
+
conversionJobId;
+ String recordingFileDirAbsolute = (new
File(recordingFileDir)).getAbsolutePath();
+
+ return recordingFileDirAbsolute + File.separatorChar;
+ }
+
+ private String getSWFFileForResult(Long conversionJobId) throws
Exception
{
+
+ String recordingRootDir = Application.webAppPath +
File.separatorChar
+ + "upload" + File.separatorChar
+ + StreamService.folderForRecordings;
+
+ // The Folders must already exist here otherwise no Image could
exist
+ // here, so no need to
+ // check for existance
+ String recordingFileDir = recordingRootDir + File.separatorChar
+
conversionJobId;
+ String recordingFileDirAbsolute = (new
File(recordingFileDir)).getAbsolutePath();
+
+ String swfFile = recordingFileDirAbsolute + File.separatorChar
+ "whiteboard.swf";
+ return swfFile;
+ }
+
+}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"OpenMeetings developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/openmeetings-dev?hl=en
-~----------~----~----~----~------~----~------~--~---