Author: seba.wagner
Date: Wed Dec 24 14:39:10 2008
New Revision: 1734
Modified:
trunk/webapp/filetest.keystore
trunk/webapp/src/app/hibernate.cfg.xml
trunk/webapp/src/app/org/openmeetings/app/data/record/BatikMethods.java
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/GenerateImage.java
trunk/webapp/src/app/org/openmeetings/app/hibernate/beans/recording/RecordingConversionJob.hbm.xml
trunk/webapp/src/app/org/openmeetings/app/hibernate/beans/recording/RecordingConversionJob.java
trunk/webapp/src/app/org/openmeetings/servlet/outputhandler/ExportToImage.java
trunk/webapp/src/test/org/openmeetings/test/record/BatchConversion.java
Log:
Fixes:
Issue 550 Rework of Recorder
Part SVG and PNG Conversion
Paint Tool Correct Export To SVG
Modified: trunk/webapp/filetest.keystore
==============================================================================
Binary files. No diff available.
Modified: trunk/webapp/src/app/hibernate.cfg.xml
==============================================================================
--- trunk/webapp/src/app/hibernate.cfg.xml (original)
+++ trunk/webapp/src/app/hibernate.cfg.xml Wed Dec 24 14:39:10 2008
@@ -3,8 +3,7 @@
<hibernate-configuration>
<session-factory>
-
- <!-- User / Password -->
+ <!-- User / Password -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
@@ -23,8 +22,8 @@
<!-- properties -->
- <property name="show_sql">true</property>
- <property name="format_sql">true</property>
+ <property name="show_sql">false</property>
+ <property name="format_sql">false</property>
<property name="use_outer_join">false</property>
<property
name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>
<property
name="connection.provider_class
">org.hibernate.connection.C3P0ConnectionProvider</property>
Modified:
trunk/webapp/src/app/org/openmeetings/app/data/record/BatikMethods.java
==============================================================================
--- trunk/webapp/src/app/org/openmeetings/app/data/record/BatikMethods.java
(original)
+++ trunk/webapp/src/app/org/openmeetings/app/data/record/BatikMethods.java
Wed Dec 24 14:39:10 2008
@@ -59,7 +59,13 @@
for (Iterator iter =
pointsList.keySet().iterator();iter.hasNext();) {
Map<Integer,Object> point = (Map<Integer,Object>)
pointsList.get(iter.next());
- this.drawThickLine2D(g2d,
Double.valueOf(point.get(1).toString()).doubleValue(),
+ log.debug("POINT FROM TO :" +
+
Double.valueOf(point.get(1).toString()).doubleValue()+","+
+
Double.valueOf(point.get(2).toString()).doubleValue()+","+
+
Double.valueOf(point.get(3).toString()).doubleValue()+","+
+
Double.valueOf(point.get(4).toString()).doubleValue());
+
+ this.drawThickLine2DPaint(g2d,
Double.valueOf(point.get(1).toString()).doubleValue(),
Double.valueOf(point.get(2).toString()).doubleValue(),
Double.valueOf(point.get(3).toString()).doubleValue(),
Double.valueOf(point.get(4).toString()).doubleValue(),
@@ -167,6 +173,29 @@
g2d.setPaint(col);
g2d.drawLine(x1, y1, x2, y2);
}
+
+ public void drawThickLine2DPaint(Graphics2D g2d, double x1, double y1,
double x2, double y2,
+ int width, Color c, double xObj, double yObj, float
alpha) throws
Exception {
+ g2d.setPaint(c);
+
+ int[] rules = new int[8];
+
+ //all possible Compositing Rules:
+ rules[0] = AlphaComposite.SRC_OVER;
+ rules[1] = AlphaComposite.DST_OVER;
+ rules[2] = AlphaComposite.CLEAR;
+ rules[3] = AlphaComposite.SRC;
+ rules[4] = AlphaComposite.SRC_IN;
+ rules[5] = AlphaComposite.DST_IN;
+ rules[6] = AlphaComposite.SRC_OUT;
+ rules[7] = AlphaComposite.DST_OUT;
+
+ g2d.setComposite( AlphaComposite.getInstance(
AlphaComposite.SRC,alpha));
+ g2d.setStroke(new BasicStroke(width, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_BEVEL));
+ Line2D line = new Line2D.Double(x1, y1, x2, y2);
+ g2d.draw(line);
+ }
+
public void drawThickLine2D(Graphics2D g2d, double x1, double y1,
double
x2, double y2,
int width, Color c, double xObj, double yObj, float
alpha) throws
Exception {
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
Wed Dec 24 14:39:10 2008
@@ -16,6 +16,7 @@
import org.openmeetings.app.data.record.dao.RecordingConversionJobDaoImpl;
import org.openmeetings.app.data.record.dao.RecordingDaoImpl;
import org.openmeetings.app.data.record.dao.WhiteBoardEventDaoImpl;
+import org.openmeetings.app.documents.GenerateImage;
import org.openmeetings.app.hibernate.beans.recording.Recording;
import
org.openmeetings.app.hibernate.beans.recording.RecordingConversionJob;
import org.openmeetings.app.hibernate.beans.recording.WhiteBoardEvent;
@@ -36,6 +37,9 @@
private static Long numberOfMilliseconds = 200L;
private static boolean isRunning = false;
+
+ //This is the
+ private static boolean isDebug = false;
private static final Log log =
LogFactory.getLog(WhiteboardConvertionJobManager.class);
@@ -78,9 +82,13 @@
}
+ //Do SVG Conversion for next 100 SVG Images,
that should fill one
Folder
+ for (int i=0;i<100;i++) {
+ this.processJobs();
+ }
- processJobs();
-
+ //Do SVG to PNG Batch Conversion
+ this.processConvertionJobs();
isRunning = false;
} else {
@@ -98,7 +106,7 @@
List<RecordingConversionJob> listOfConversionJobs =
RecordingConversionJobDaoImpl.getInstance().getRecordingConversionJobs();
- log.debug("processJobs: "+listOfConversionJobs.size());
+ //log.debug("processJobs:
"+listOfConversionJobs.size());
for (RecordingConversionJob recordingConversionJob :
listOfConversionJobs) {
@@ -194,6 +202,12 @@
log.debug("THIS FILE IS
PROCESSED: "+recordingConversionJob.getRecordingConversionJobId());
+ //FIXME: this should happen
only one time per conversion Job
+
+
recordingConversionJob.setEnded(new Date());
+
recordingConversionJob.setBatchProcessCounter(0L);
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+
}
}
@@ -202,6 +216,56 @@
} 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) {
+
+ int maxFolder =
Math.round(recordingConversionJob.getImageNumber() /
100);
+
+ 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().convertImageByTypeAndSize(
+
outputFileNames.get("input"),
+
outputFileNames.get("output"),
+ 660, 580);
+
+ //Add Count For next Round
+
recordingConversionJob.setBatchProcessCounter(recordingConversionJob.getBatchProcessCounter()+1);
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+
+ } else {
+
+ log.debug("Batch Processing Done");
+
+
recordingConversionJob.setEndPngConverted(new Date());
+
RecordingConversionJobDaoImpl.getInstance().updateRecordingConversionJobs(recordingConversionJob);
+
+ }
+
+ }
+
+ } catch (Exception err) {
+ log.error("[processConvertionJobs]",err);
+ }
}
private void generateFileAsSVG(Map whiteBoardObjects, String
roomRecordingInXML, RecordingConversionJob recordingConversionJob) throws
Exception {
@@ -250,8 +314,19 @@
//
// log.debug("stringWriter"+stringWriter.toString());
- String firstImageName =
this.generateSVGFileDebug(recordingConversionJob.getRecordingConversionJobId(),
recordingConversionJob.getImageNumber());
- log.debug("Write File To: " + firstImageName);
+ 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);
@@ -283,20 +358,96 @@
return batchFileSVGDir + File.separatorChar + imageNumber + ".svg";
}
- private String generateSVGFileName(Long conversionJobId, Long
fileNumber)
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();
- }
-
- return recordingFileDir + File.separatorChar + "record+" +
fileNumber + ".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 / 100);
+ 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";
}
}
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
Wed Dec 24 14:39:10 2008
@@ -57,6 +57,8 @@
Double width =
Double.valueOf(graphObject.get(graphObject.size()-3).toString()).doubleValue();
Double height =
Double.valueOf(graphObject.get(graphObject.size()-2).toString()).doubleValue();
+ log.debug("x,y,width,height:
"+x+","+y+","+width+","+height);
+
//Draw a Painting
SVGGraphics2D svgGenerator_temp = new
SVGGraphics2D(svgGenerator);
//SVGGraphics2D svgGenerator2 = new SVGGraphics2D(document);
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
Wed Dec 24 14:39:10 2008
@@ -53,11 +53,50 @@
return null;
}
+ /**
+ * get all Conversion Jobs where END Time is not set for
+ * the SVG Conversion
+ * and the Batch process is not yet started
+ *
+ * @return
+ */
public List<RecordingConversionJob> getRecordingConversionJobs() {
try {
String hql = "select c from RecordingConversionJob as c
" +
- "where c.ended IS NULL ";
+ "where c.ended IS NULL " +
+ "AND c.startedPngConverted IS
NULL";
+
+ Object idf = HibernateUtil.createSession();
+ Session session = HibernateUtil.getSession();
+ Transaction tx = session.beginTransaction();
+ Query query = session.createQuery(hql);
+ List<RecordingConversionJob> ll = query.list();
+ tx.commit();
+ HibernateUtil.closeSession(idf);
+
+ return ll;
+
+ } catch (HibernateException ex) {
+ log.error("[getRecordingConversionJobs]: " , ex);
+ } catch (Exception ex2) {
+ log.error("[getRecordingConversionJobs]: " , ex2);
+ }
+ return null;
+ }
+
+ /**
+ * Get all selected Conversion Jobs where SVG has
+ * finished but Batch Process not yet
+ *
+ * @return
+ */
+ public List<RecordingConversionJob>
getRecordingConversionBatchConversionJobs() {
+ try {
+
+ String hql = "select c from RecordingConversionJob as c
" +
+ "where c.ended IS NOT NULL " +
+ "AND c.endPngConverted IS NULL";
Object idf = HibernateUtil.createSession();
Session session = HibernateUtil.getSession();
Modified:
trunk/webapp/src/app/org/openmeetings/app/documents/GenerateImage.java
==============================================================================
--- trunk/webapp/src/app/org/openmeetings/app/documents/GenerateImage.java
(original)
+++ trunk/webapp/src/app/org/openmeetings/app/documents/GenerateImage.java
Wed Dec 24 14:39:10 2008
@@ -205,7 +205,7 @@
int exitVal = proc.waitFor();
returnMap.put("exitValue", exitVal);
- log.debug("ERROR: "+error);
+ log.debug("DEBUG: "+error);
return returnMap;
} catch (Throwable t) {
@@ -216,7 +216,7 @@
}
}
- public HashMap<String,Object> convertSingleImageByTypeAndSize(String
inputFile, String outputfile,
+ public HashMap<String,Object> convertImageByTypeAndSize(String
inputFile,
String outputfile,
int width, int height) {
HashMap<String,Object> returnMap = new HashMap<String,Object>();
returnMap.put("process", "convertSingleJpg");
@@ -293,7 +293,7 @@
int exitVal = proc.waitFor();
returnMap.put("exitValue", exitVal);
- log.debug("ERROR: "+error);
+ log.debug("DEBUG: "+error);
return returnMap;
} catch (Throwable t) {
@@ -303,6 +303,5 @@
return returnMap;
}
}
-
}
Modified:
trunk/webapp/src/app/org/openmeetings/app/hibernate/beans/recording/RecordingConversionJob.hbm.xml
==============================================================================
---
trunk/webapp/src/app/org/openmeetings/app/hibernate/beans/recording/RecordingConversionJob.hbm.xml
(original)
+++
trunk/webapp/src/app/org/openmeetings/app/hibernate/beans/recording/RecordingConversionJob.hbm.xml
Wed Dec 24 14:39:10 2008
@@ -12,5 +12,8 @@
<property name="ended" type="java.util.Date" column="ended"/>
<property name="currentWhiteBoardAsXml" type="text"
column="currentwhiteboardasxml"/>
<property name="endTimeInMilliSeconds" type="long"
column="endtimeinmilliseconds"/>
+ <property name="startedPngConverted" type="java.util.Date"
column="startedpngconverted"/>
+ <property name="endPngConverted" type="java.util.Date"
column="endpngconverted"/>
+ <property name="batchProcessCounter" type="long"
column="batchprocesscounter"/>
</class>
</hibernate-mapping>
Modified:
trunk/webapp/src/app/org/openmeetings/app/hibernate/beans/recording/RecordingConversionJob.java
==============================================================================
---
trunk/webapp/src/app/org/openmeetings/app/hibernate/beans/recording/RecordingConversionJob.java
(original)
+++
trunk/webapp/src/app/org/openmeetings/app/hibernate/beans/recording/RecordingConversionJob.java
Wed Dec 24 14:39:10 2008
@@ -14,9 +14,13 @@
private Long imageNumber = 0L;
private Recording recording;
private Date started;
+ //this is only the end Date for the SVG Conversion
private Date ended;
private String currentWhiteBoardAsXml;
private Long endTimeInMilliSeconds;
+ private Date startedPngConverted;
+ private Date endPngConverted;
+ private Long batchProcessCounter = 0L;
/**
*
@@ -105,6 +109,42 @@
}
public void setEndTimeInMilliSeconds(Long endTimeInMilliSeconds) {
this.endTimeInMilliSeconds = endTimeInMilliSeconds;
+ }
+
+ /**
+ * @hibernate.property
+ * column="startedpngconverted"
+ * type="java.util.Date"
+ */
+ public Date getStartedPngConverted() {
+ return startedPngConverted;
+ }
+ public void setStartedPngConverted(Date startedPngConverted) {
+ this.startedPngConverted = startedPngConverted;
+ }
+
+ /**
+ * @hibernate.property
+ * column="endpngconverted"
+ * type="java.util.Date"
+ */
+ public Date getEndPngConverted() {
+ return endPngConverted;
+ }
+ public void setEndPngConverted(Date endPngConverted) {
+ this.endPngConverted = endPngConverted;
+ }
+
+ /**
+ * @hibernate.property
+ * column="batchprocesscounter"
+ * type="long"
+ */
+ public Long getBatchProcessCounter() {
+ return batchProcessCounter;
+ }
+ public void setBatchProcessCounter(Long batchProcessCounter) {
+ this.batchProcessCounter = batchProcessCounter;
}
Modified:
trunk/webapp/src/app/org/openmeetings/servlet/outputhandler/ExportToImage.java
==============================================================================
---
trunk/webapp/src/app/org/openmeetings/servlet/outputhandler/ExportToImage.java
(original)
+++
trunk/webapp/src/app/org/openmeetings/servlet/outputhandler/ExportToImage.java
Wed Dec 24 14:39:10 2008
@@ -159,7 +159,7 @@
FileWriter out = new FileWriter(svgFile);
svgGenerator.stream(out, useCSS);
- HashMap<String,Object> returnError =
GenerateImage.getInstance().convertSingleImageByTypeAndSize(
+ HashMap<String,Object> returnError =
GenerateImage.getInstance().convertImageByTypeAndSize(
svgFile.getAbsolutePath(),
resultFile.getAbsolutePath(),
pBean.getWidth(),
pBean.getHeight());
Modified:
trunk/webapp/src/test/org/openmeetings/test/record/BatchConversion.java
==============================================================================
--- trunk/webapp/src/test/org/openmeetings/test/record/BatchConversion.java
(original)
+++ trunk/webapp/src/test/org/openmeetings/test/record/BatchConversion.java
Wed Dec 24 14:39:10 2008
@@ -17,7 +17,7 @@
public void testBatchConversion(){
try {
- for (int i=0;i<300;i++) {
+ for (int i=0;i<350;i++) {
WhiteboardConvertionJobManager.getInstance().initJobs();
}
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---