Author: seba.wagner
Date: Mon Dec 29 07:15:25 2008
New Revision: 1741

Modified:
    trunk/webapp/filetest.keystore
     
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManager.java
     
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardMapToSVG.java
     
trunk/webapp/src/app/org/openmeetings/app/data/record/dao/RecordingConversionJobDaoImpl.java
    trunk/webapp/src/app/org/openmeetings/app/documents/GenerateSWF.java

Log:
Try to workaround SWFTools 1024 Problem with SWFCOMBINE

Modified: trunk/webapp/filetest.keystore
==============================================================================
Binary files. No diff available.

Modified:  
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManager.java
==============================================================================
---  
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManager.java
        
(original)
+++  
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardConvertionJobManager.java
        
Mon Dec 29 07:15:25 2008
@@ -7,6 +7,7 @@
  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;
@@ -223,11 +224,12 @@
                                        
                                        } else {
                                                
-                                               log.debug("THIS FILE IS  
PROCESSED: "+recordingConversionJob.getRecordingConversionJobId());
+                                               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);
                                                
@@ -274,16 +276,21 @@
                                                        660, 580, depth);
                                        
                                        //Add Count For next Round
-                                        
recordingConversionJob.setBatchProcessCounter(recordingConversionJob.getBatchProcessCounter()+1);
-                                        
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+                                       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());
                                        
-                                       
recordingConversionJob.setEndPngConverted(new Date());
-                                       
recordingConversionJob.setStartedSWFConverted(new Date());
-                                        
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+                                       
recordingConversionJobUpdate.setEndPngConverted(new Date());
+                                       
recordingConversionJobUpdate.setStartedSWFConverted(new Date());
+                                        
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobUpdate);
                                        
                                }
                                
@@ -316,6 +323,10 @@
                                        
                                        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");
                                                
                                        }
@@ -331,18 +342,69 @@
                                        
                                        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());
                                
-                               
GenerateSWF.getInstance().generateSWFByImages(images, output, 10);
+                               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);
                                
-                               recordingConversionJob.setEndSWFConverted(new 
Date());
-                                
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+                               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);
                                
                        }
                        
@@ -413,11 +475,16 @@

                FileWriter fileWriter = new FileWriter(firstImageName);
                svgGenerator.stream(fileWriter, useCSS);
+               
+               RecordingConversionJob recordingConversionJobToStore =  
RecordingConversionJobDaoImpl.getInstance().getRecordingConversionJobsByRecordingConversionJobsId(
+                               
recordingConversionJob.getRecordingConversionJobId());

-                
recordingConversionJob.setEndTimeInMilliSeconds(recordingConversionJob.getEndTimeInMilliSeconds()
  
+ numberOfMilliseconds);
-               
recordingConversionJob.setCurrentWhiteBoardAsXml(roomRecordingInXML);
-                
recordingConversionJob.setImageNumber(recordingConversionJob.getImageNumber()+1);
-                
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+                
recordingConversionJobToStore.setEndTimeInMilliSeconds(recordingConversionJob.getEndTimeInMilliSeconds()
  
+ numberOfMilliseconds);
+                
recordingConversionJobToStore.setCurrentWhiteBoardAsXml(roomRecordingInXML);
+                
recordingConversionJobToStore.setImageNumber(recordingConversionJob.getImageNumber()+1);
+               
+               log.debug("updateRecordingConversionJobs: generateFileAsSVG");
+                
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJobToStore);

        }
        
@@ -547,6 +614,21 @@

                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  
{

Modified:  
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardMapToSVG.java
==============================================================================
---  
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardMapToSVG.java   
 
(original)
+++  
trunk/webapp/src/app/org/openmeetings/app/data/record/WhiteboardMapToSVG.java   
 
Mon Dec 29 07:15:25 2008
@@ -34,14 +34,14 @@
        
        public SVGGraphics2D convertMapToSVG(SVGGraphics2D svgGenerator, Map  
whiteBoardMap) throws Exception {
                
-               log.debug("convertMapToSVG: "+whiteBoardMap.size());
+               //log.debug("convertMapToSVG: "+whiteBoardMap.size());
                
          for (Iterator iter =  
whiteBoardMap.keySet().iterator();iter.hasNext();) {
                Map graphObject = (Map) whiteBoardMap.get(iter.next());
                
                String graphType = graphObject.get(0).toString();
                
-               log.debug("graphType: "+graphType);
+               //log.debug("graphType: "+graphType);
                
                if (graphType.equals("paint")) {
                        

Modified:  
trunk/webapp/src/app/org/openmeetings/app/data/record/dao/RecordingConversionJobDaoImpl.java
==============================================================================
---  
trunk/webapp/src/app/org/openmeetings/app/data/record/dao/RecordingConversionJobDaoImpl.java
     
(original)
+++  
trunk/webapp/src/app/org/openmeetings/app/data/record/dao/RecordingConversionJobDaoImpl.java
     
Mon Dec 29 07:15:25 2008
@@ -52,6 +52,31 @@
                }
                return null;
        }
+
+       public RecordingConversionJob  
getRecordingConversionJobsByRecordingConversionJobsId(long  
recordingConversionJobId) {
+               try {
+                       
+                       String hql = "select c from RecordingConversionJob as c 
" +
+                                               "where 
c.recordingConversionJobId = :recordingConversionJobId ";
+                       
+                       Object idf = HibernateUtil.createSession();
+                       Session session = HibernateUtil.getSession();
+                       Transaction tx = session.beginTransaction();
+                       Query query = session.createQuery(hql);
+                       query.setLong("recordingConversionJobId", 
recordingConversionJobId);
+                       RecordingConversionJob recordingConversionJob =  
(RecordingConversionJob) query.uniqueResult();
+                       tx.commit();
+                       HibernateUtil.closeSession(idf);
+                       
+                       return recordingConversionJob;
+       
+               } catch (HibernateException ex) {
+                       
log.error("[getRecordingConversionJobsByRecordingConversionJobsId]: " ,  
ex);
+               } catch (Exception ex2) {
+                       
log.error("[getRecordingConversionJobsByRecordingConversionJobsId]: " ,  
ex2);
+               }
+               return null;
+       }
        
        public RecordingConversionJob 
getRecordingConversionJobsByRecording(long  
recording_id) {
                try {
@@ -176,6 +201,7 @@
                        Session session = HibernateUtil.getSession();
                        Transaction tx = session.beginTransaction();
                        session.update(recordingConversionJob);
+                       
                        tx.commit();
                        HibernateUtil.closeSession(idf);
                        

Modified:  
trunk/webapp/src/app/org/openmeetings/app/documents/GenerateSWF.java
==============================================================================
--- trunk/webapp/src/app/org/openmeetings/app/documents/GenerateSWF.java        
 
(original)
+++ trunk/webapp/src/app/org/openmeetings/app/documents/GenerateSWF.java        
 
Mon Dec 29 07:15:25 2008
@@ -113,8 +113,7 @@
        }
        
        /**
-        * This Function generate a SWF but 3 times faster then the input fps
-        * as the resulting SWF has  to have a FPS of 30
+        * This Function generate a SWF
         * @param images
         * @param outputfile
         * @param fps
@@ -159,13 +158,105 @@
                        //Create the Content of the Converter Script (.bat or 
.sh File)
                        String fileContent = pathToSWFTools + "png2swf"
                                        + " -o " + "\"" + outputfile + "\""
-                                       + " -r " + (fps*3)
+                                       + " -r " + fps
                                        + " -z ";
                        
                        for (Iterator<String> iter = 
images.iterator();iter.hasNext();) {
                                String fileName = iter.next();
                                fileContent += " " + "\"" + fileName +"\"";
-                               fileContent += " " + "\"" + fileName +"\"";
+                       }
+                       
+                       fileContent += Application.lineSeperator + "exit";
+                               
+                       //execute the Script
+                       FileOutputStream fos = new 
FileOutputStream(executable_fileName);
+                       fos.write(fileContent.getBytes());
+                       fos.close();
+                       
+                       //make new shell script executable
+                       //in JAVA6 this can be done directly through the api
+                       if 
(System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") ==  
-1) {
+                               
MakeExectuable.getInstance().setExecutable(executable_fileName);
+                       }
+                       
+                       Runtime rt = Runtime.getRuntime();                      
+                       
+                       for (int i=0;i<cmd.length;i++){
+                               log.debug("cmd: "+cmd[i]);
+                       }
+                       
+                       returnMap.put("command", cmd.toString());
+                       Process proc = rt.exec(cmd);
+                       InputStream stderr = proc.getErrorStream();
+                       InputStreamReader isr = new InputStreamReader(stderr);
+                       BufferedReader br = new BufferedReader(isr);
+                       String line = null;
+                       String error = "";
+                       while ((line = br.readLine()) != null)
+                               error += line;
+                       returnMap.put("error", error);
+                       int exitVal = proc.waitFor();
+                       returnMap.put("exitValue", exitVal);
+                       return returnMap;
+               } catch (Throwable t) {
+                       t.printStackTrace();
+                       returnMap.put("error", t.getMessage());
+                       returnMap.put("exitValue", -1);
+                       return returnMap;
+               }
+       }
+       
+       /**
+        * Combines a bunch of SWFs to one swf by concatenate
+        * @param swfs
+        * @param outputswf
+        * @param fps
+        * @return
+        */
+       public HashMap<String,Object> generateSWFByCombine(List<String> swfs,  
String outputswf, int fps) {
+               HashMap<String,Object> returnMap = new HashMap<String,Object>();
+               returnMap.put("process", "generateSWFByImages");                
+               try {
+                       
+                       //Init variables
+                       String[] cmd;
+                       String executable_fileName = "";        
+                       String pathToSWFTools =  
Configurationmanagement.getInstance().getConfKey(3,"swftools_path").getConf_value();
+                       //If SWFTools Path is not blank a File.seperator at the 
end of the path  
is needed
+                       if(!pathToSWFTools.equals("")  
&& !pathToSWFTools.endsWith(File.separator)){
+                               pathToSWFTools = pathToSWFTools + 
File.separator;
+                       }
+                       
+
+                       //If no Windows Platform
+                       if 
(System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") ==  
-1) {
+                               String runtimeFile = "swfconverter.sh";
+                               executable_fileName = 
Application.batchFileFir+"SWFCOMBINE_"
+                                               + 
CalendarPatterns.getTimeForStreamId(new Date()) +"_"+ runtimeFile;
+               
+                               cmd = new String[1];
+                               cmd[0] = executable_fileName;
+                       } else {
+                               String runtimeFile = "swfconverter.bat";
+                               executable_fileName = 
Application.batchFileFir+"SWFIMAGECONVERT_"
+                                               + 
CalendarPatterns.getTimeForStreamId(new Date()) +"_"+ runtimeFile;
+                               
+                               cmd = new String[4];
+                               cmd[0] = "cmd.exe";
+                               cmd[1] = "/C";
+                               cmd[2] = "start";
+                               cmd[3] = executable_fileName;
+                       }
+                       log.debug("executable_fileName: "+executable_fileName);
+                       
+                       //Create the Content of the Converter Script (.bat or 
.sh File)
+                       String fileContent = pathToSWFTools + "swfcombine"
+                                       + " -o " + "\"" + outputswf + "\""
+                                       + " -r " + fps
+                                       + " -z -a ";
+                       
+                       for (Iterator<String> iter = 
swfs.iterator();iter.hasNext();) {
+                               String fileName = iter.next();
                                fileContent += " " + "\"" + fileName +"\"";
                        }
                        

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to