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());
 					}