You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2019/06/06 05:32:26 UTC
[openmeetings] branch 4.0.x updated: [OPENMEETINGS-2055] progress
for one file should be more or less visible
This is an automated email from the ASF dual-hosted git repository.
solomax pushed a commit to branch 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/4.0.x by this push:
new b7fa4c5 [OPENMEETINGS-2055] progress for one file should be more or less visible
b7fa4c5 is described below
commit b7fa4c5ca525cc76b44d251fdc7f69fed40779af
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Jun 6 12:32:16 2019 +0700
[OPENMEETINGS-2055] progress for one file should be more or less visible
---
.../apache/openmeetings/core/converter/BaseConverter.java | 1 +
.../openmeetings/core/converter/DocumentConverter.java | 10 +++++++---
.../apache/openmeetings/core/converter/ImageConverter.java | 14 ++++++++++----
.../apache/openmeetings/core/converter/VideoConverter.java | 10 +++++++++-
.../apache/openmeetings/core/data/file/FileProcessor.java | 14 ++++++++------
.../apache/openmeetings/web/room/sidebar/UploadDialog.java | 7 +++++--
.../apache/openmeetings/core/file/TestFileProcessor.java | 3 ++-
.../org/apache/openmeetings/webservice/FileWebService.java | 3 ++-
8 files changed, 44 insertions(+), 18 deletions(-)
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
index 5cc0074..2484c96 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java
@@ -68,6 +68,7 @@ public abstract class BaseConverter {
private static final Logger log = Red5LoggerFactory.getLogger(BaseConverter.class, getWebAppRootKey());
private static final Pattern p = Pattern.compile("\\d{2,5}(x)\\d{2,5}");
public static final String EXEC_EXT = System.getProperty("os.name").toUpperCase(Locale.ROOT).indexOf("WINDOWS") < 0 ? "" : ".exe";
+ public static final double HALF_STEP = 1. / 2;
@Autowired
protected ConfigurationDao cfgDao;
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
index dcdcc14..f4305cb 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
@@ -19,12 +19,15 @@
package org.apache.openmeetings.core.converter;
import static org.apache.commons.io.FileUtils.copyFile;
+import static org.apache.openmeetings.core.converter.BaseConverter.HALF_STEP;
import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_OFFICE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
import java.io.File;
+import java.util.Optional;
import java.util.function.Consumer;
+import java.util.function.DoubleConsumer;
import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
import org.apache.openmeetings.db.entity.file.FileItem;
@@ -50,10 +53,10 @@ public class DocumentConverter {
private ImageConverter imageConverter;
public ProcessResultList convertPDF(FileItem f, StoredFile sf) throws Exception {
- return convertPDF(f, sf, new ProcessResultList());
+ return convertPDF(f, sf, new ProcessResultList(), Optional.empty());
}
- public ProcessResultList convertPDF(FileItem f, StoredFile sf, ProcessResultList logs) throws Exception {
+ public ProcessResultList convertPDF(FileItem f, StoredFile sf, ProcessResultList logs, Optional<DoubleConsumer> progress) throws Exception {
boolean fullProcessing = !sf.isPdf();
File original = f.getFile(sf.getExt());
File pdf = f.getFile(EXTENSION_PDF);
@@ -64,9 +67,10 @@ public class DocumentConverter {
} else if (!EXTENSION_PDF.equals(sf.getExt())) {
copyFile(original, pdf);
}
+ progress.ifPresent(theProgress -> theProgress.accept(HALF_STEP));
log.debug("-- generate page images --");
- return imageConverter.convertDocument(f, pdf, logs);
+ return imageConverter.convertDocument(f, pdf, logs, progress);
}
public static void createOfficeManager(String officePath, Consumer<OfficeManager> consumer) {
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
index cefda06..2d7bda9 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
@@ -35,6 +35,8 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
+import java.util.Optional;
+import java.util.function.DoubleConsumer;
import org.apache.commons.io.FileUtils;
import org.apache.openmeetings.db.dao.user.UserDao;
@@ -65,11 +67,11 @@ public class ImageConverter extends BaseConverter {
@Autowired
private UserDao userDao;
- public ProcessResultList convertImage(BaseFileItem f, StoredFile sf) throws IOException {
- return convertImage(f, sf, new ProcessResultList());
+ public ProcessResultList convertImage(BaseFileItem f, StoredFile sf, Optional<DoubleConsumer> progress) throws IOException {
+ return convertImage(f, sf, new ProcessResultList(), progress);
}
- public ProcessResultList convertImage(BaseFileItem f, StoredFile sf, ProcessResultList logs) throws IOException {
+ public ProcessResultList convertImage(BaseFileItem f, StoredFile sf, ProcessResultList logs, Optional<DoubleConsumer> progress) throws IOException {
File png = f.getFile(EXTENSION_PNG);
if (!sf.isPng()) {
File img = f.getFile(sf.getExt());
@@ -79,7 +81,9 @@ public class ImageConverter extends BaseConverter {
} else if (!png.exists()){
copyFile(f.getFile(sf.getExt()), png);
}
+ progress.ifPresent(theProgress -> theProgress.accept(HALF_STEP));
logs.add(initSize(f, png, PNG_MIME_TYPE));
+ progress.ifPresent(theProgress -> theProgress.accept(HALF_STEP));
return logs;
}
@@ -173,7 +177,7 @@ public class ImageConverter extends BaseConverter {
* @return - result of conversion
* @throws IOException in case IO exception occurred
*/
- public ProcessResultList convertDocument(FileItem f, File pdf, ProcessResultList logs) throws IOException {
+ public ProcessResultList convertDocument(FileItem f, File pdf, ProcessResultList logs, Optional<DoubleConsumer> progress) throws IOException {
log.debug("convertDocument");
String[] argv = new String[] {
getPathToConvert()
@@ -184,6 +188,7 @@ public class ImageConverter extends BaseConverter {
};
ProcessResult res = ProcessHelper.executeScript("convert PDF to images", argv);
logs.add(res);
+ progress.ifPresent(theProgress -> theProgress.accept(1. / 4));
if (res.isOk()) {
File[] pages = pdf.getParentFile().listFiles(fi -> fi.isFile() && fi.getName().startsWith(DOC_PAGE_PREFIX) && fi.getName().endsWith(EXTENSION_PNG));
if (pages == null || pages.length == 0) {
@@ -193,6 +198,7 @@ public class ImageConverter extends BaseConverter {
logs.add(initSize(f, pages[0], PNG_MIME_TYPE));
}
}
+ progress.ifPresent(theProgress -> theProgress.accept(1. / 4));
return logs;
}
}
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java
index dce14b9..632aa85 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java
@@ -29,6 +29,8 @@ import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
+import java.util.function.DoubleConsumer;
import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
import org.apache.openmeetings.db.entity.file.FileItem;
@@ -43,8 +45,9 @@ import org.springframework.stereotype.Component;
@Component
public class VideoConverter extends BaseConverter {
private static final Logger log = Red5LoggerFactory.getLogger(VideoConverter.class, getWebAppRootKey());
+ private static final double STEP = 1. / 5;
- public void convertVideo(FileItem f, StoredFile sf, ProcessResultList logs) {
+ public void convertVideo(FileItem f, StoredFile sf, ProcessResultList logs, Optional<DoubleConsumer> progress) {
try {
final File mp4 = f.getFile(EXTENSION_MP4);
f.setType(Type.Video);
@@ -57,6 +60,7 @@ public class VideoConverter extends BaseConverter {
tmp = Files.createTempFile("video", ".mp4");
input = Files.move(mp4.toPath(), tmp, REPLACE_EXISTING).toFile().getCanonicalPath();
}
+ progress.ifPresent(theProgress -> theProgress.accept(STEP));
List<String> args = new ArrayList<>(Arrays.asList(getPathToFFMPEG(), "-y"));
if (sf.isAudio()) {
// need to add background image, it should be jpg since black on transparent will be invisible
@@ -74,6 +78,7 @@ public class VideoConverter extends BaseConverter {
args.add(mp4.getCanonicalPath());
ProcessResult res = ProcessHelper.executeScript("convert to MP4 :: " + f.getHash(), args.toArray(new String[0]));
logs.add(res);
+ progress.ifPresent(theProgress -> theProgress.accept(STEP));
if (sameExt && tmp != null) {
if (res.isOk()) {
Files.delete(tmp);
@@ -82,11 +87,14 @@ public class VideoConverter extends BaseConverter {
Files.move(tmp, mp4.toPath(), REPLACE_EXISTING);
}
}
+ progress.ifPresent(theProgress -> theProgress.accept(STEP));
//Parse the width height from the FFMPEG output
Dimension dim = getDimension(res.getError());
+ progress.ifPresent(theProgress -> theProgress.accept(STEP));
f.setWidth(dim.getWidth());
f.setHeight(dim.getHeight());
convertToPng(f, mp4.getCanonicalPath(), logs);
+ progress.ifPresent(theProgress -> theProgress.accept(STEP));
} catch (Exception err) {
log.error("[convertVideo]", err);
logs.add(new ProcessResult("convertToMP4", err.getMessage(), err));
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
index d37844b..a19f795 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
@@ -25,7 +25,9 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKe
import java.io.File;
import java.io.InputStream;
+import java.util.Optional;
import java.util.UUID;
+import java.util.function.DoubleConsumer;
import org.apache.openmeetings.core.converter.DocumentConverter;
import org.apache.openmeetings.core.converter.ImageConverter;
@@ -56,7 +58,7 @@ public class FileProcessor {
@Autowired
private DocumentConverter docConverter;
- public ProcessResultList processFile(FileItem f, InputStream is) throws Exception {
+ public ProcessResultList processFile(FileItem f, InputStream is, Optional<DoubleConsumer> progress) throws Exception {
ProcessResultList logs = new ProcessResultList();
// Generate a random string to prevent any problems with
// foreign characters and duplicates
@@ -87,7 +89,7 @@ public class FileProcessor {
}
f.setHash(hash);
- processFile(f, sf, temp, logs);
+ processFile(f, sf, temp, logs, progress);
} catch (Exception e) {
log.debug("Error while processing the file", e);
throw e;
@@ -99,7 +101,7 @@ public class FileProcessor {
return logs;
}
- private void processFile(FileItem f, StoredFile sf, File temp, ProcessResultList logs) throws Exception {
+ private void processFile(FileItem f, StoredFile sf, File temp, ProcessResultList logs, Optional<DoubleConsumer> progress) throws Exception {
try {
File file = f.getFile(sf.getExt());
log.debug("writing file to: {}", file);
@@ -112,7 +114,7 @@ public class FileProcessor {
log.debug("Office document: {}", file);
copyFile(temp, file);
// convert to pdf, thumbs, swf and xml-description
- docConverter.convertPDF(f, sf, logs);
+ docConverter.convertPDF(f, sf, logs, progress);
break;
case PollChart:
log.debug("uploaded chart file"); // NOT implemented yet
@@ -121,11 +123,11 @@ public class FileProcessor {
// convert it to PNG
log.debug("##### convert it to PNG: ");
copyFile(temp, file);
- imageConverter.convertImage(f, sf);
+ imageConverter.convertImage(f, sf, progress);
break;
case Video:
copyFile(temp, file);
- videoConverter.convertVideo(f, sf, logs);
+ videoConverter.convertVideo(f, sf, logs, progress);
break;
default:
break;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
index bbd4953..44c7563 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
@@ -26,6 +26,8 @@ import static org.apache.openmeetings.web.app.WebSession.getUserId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
+import java.util.function.DoubleConsumer;
import org.apache.openmeetings.core.data.file.FileProcessor;
import org.apache.openmeetings.db.dao.file.FileItemLogDao;
@@ -240,7 +242,7 @@ public class UploadDialog extends AbstractFormDialog<String> {
progress = 0;
timer.restart(target);
setTitle(target, getString("upload.dlg.convert.title"));
- target.add(progressBar.setVisible(true), form.setVisible(false));
+ target.add(progressBar.setModelObject(progress).setVisible(true), form.setVisible(false));
final Application app = Application.get();
final WebSession session = WebSession.get();
@@ -286,7 +288,8 @@ public class UploadDialog extends AbstractFormDialog<String> {
}
f.setInsertedBy(getUserId());
- ProcessResultList logs = getBean(FileProcessor.class).processFile(f, fu.getInputStream());
+ ProcessResultList logs = getBean(FileProcessor.class).processFile(f, fu.getInputStream()
+ , Optional.<DoubleConsumer>of(part -> progress += (int)(100 * part * size / totalSize)));
for (ProcessResult res : logs.getJobs()) {
getBean(FileItemLogDao.class).add(res.getProcess(), f, res);
}
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java b/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
index 2b77103..6973829 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertFalse;
import java.io.FileInputStream;
import java.io.InputStream;
+import java.util.Optional;
import java.util.UUID;
import org.apache.openmeetings.AbstractJUnitDefaults;
@@ -50,7 +51,7 @@ public class TestFileProcessor extends AbstractJUnitDefaults {
.setHash(UUID.randomUUID().toString())
.setType(BaseFileItem.Type.Recording).get();
try (InputStream is = new FileInputStream(getDefaultProfilePicture())) {
- ProcessResultList result = processor.processFile(f, is);
+ ProcessResultList result = processor.processFile(f, is, Optional.empty());
assertFalse("Conversion should be successful", result.hasError());
assertEquals("Type should be image", BaseFileItem.Type.Image, f.getType());
}
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
index 37768d7..ade82af 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
@@ -23,6 +23,7 @@ import static org.apache.openmeetings.webservice.Constants.TNS;
import java.io.InputStream;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
import javax.jws.WebMethod;
@@ -158,7 +159,7 @@ public class FileWebService extends BaseWebService {
f.setInsertedBy(sd.getUserId());
if (stream != null) {
try {
- ProcessResultList result = getBean(FileProcessor.class).processFile(f, stream);
+ ProcessResultList result = getBean(FileProcessor.class).processFile(f, stream, Optional.empty());
if (result.hasError()) {
throw new ServiceException(result.getLogMessage());
}