Repository: openmeetings Updated Branches: refs/heads/master ae40f805f -> 466c0a04f
no jira: error handling while file upload is improved Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/466c0a04 Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/466c0a04 Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/466c0a04 Branch: refs/heads/master Commit: 466c0a04f566593fe94036b79ac5a97ca2ca51b8 Parents: ae40f80 Author: Maxim Solodovnik <[email protected]> Authored: Mon Oct 16 12:58:13 2017 +0700 Committer: Maxim Solodovnik <[email protected]> Committed: Mon Oct 16 12:58:13 2017 +0700 ---------------------------------------------------------------------- .../core/converter/BaseConverter.java | 47 ++++---- .../core/converter/DocumentConverter.java | 13 ++- .../core/converter/ImageConverter.java | 24 ++-- .../core/converter/InterviewConverter.java | 5 +- .../core/converter/RecordingConverter.java | 4 +- .../core/converter/VideoConverter.java | 81 +++++++++++++ .../core/data/file/FileProcessor.java | 116 +++++++++---------- .../util/process/ProcessResult.java | 3 +- .../util/process/ProcessResultList.java | 34 ++---- .../web/room/sidebar/UploadDialog.java | 5 +- 10 files changed, 201 insertions(+), 131 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/BaseConverter.java ---------------------------------------------------------------------- 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 7d814bd..5ba2a97 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 @@ -39,7 +39,6 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.directory.api.util.Strings; import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.file.FileItemLogDao; import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao; @@ -52,6 +51,8 @@ import org.apache.openmeetings.db.entity.record.RecordingMetaDelta; import org.apache.openmeetings.util.OmFileHelper; import org.apache.openmeetings.util.process.ProcessHelper; import org.apache.openmeetings.util.process.ProcessResult; +import org.apache.openmeetings.util.process.ProcessResultList; +import org.apache.wicket.util.string.Strings; import org.red5.io.flv.impl.FLVWriter; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; @@ -90,12 +91,13 @@ public abstract class BaseConverter { } private String getPath(String key, String app) { - String path = cfgDao.getString(key, ""); - if (!Strings.isEmpty(path) && !path.endsWith(File.separator)) { - path += File.separator; + final String cfg = cfgDao.getString(key, ""); + StringBuilder path = new StringBuilder(cfg); + if (!Strings.isEmpty(path) && !cfg.endsWith(File.separator)) { + path.append(File.separator); } - path += app; - return path; + path.append(app).append(EXEC_EXT); + return path.toString(); } public String getPathToFFMPEG() { @@ -107,7 +109,7 @@ public abstract class BaseConverter { } protected String getPathToConvert() { - return getPath(CONFIG_PATH_IMAGEMAGIC, "convert") + EXEC_EXT; + return getPath(CONFIG_PATH_IMAGEMAGIC, "convert"); } protected File getStreamFolder(Recording recording) { @@ -160,14 +162,14 @@ public abstract class BaseConverter { return argv.toArray(new String[0]); } - protected void stripAudioFirstPass(Recording recording, List<ProcessResult> returnLog, + protected void stripAudioFirstPass(Recording recording, ProcessResultList logs, List<File> waveFiles, File streamFolder) { - stripAudioFirstPass(recording, returnLog, waveFiles, streamFolder + stripAudioFirstPass(recording, logs, waveFiles, streamFolder , metaDataDao.getAudioMetaDataByRecording(recording.getId())); } - private String[] addSoxPad(List<ProcessResult> returnLog, String job, double length, double position, File inFile, File outFile) throws IOException { + private String[] addSoxPad(ProcessResultList logs, String job, double length, double position, File inFile, File outFile) throws IOException { if (length < 0 || position < 0) { log.debug("::addSoxPad {} Invalid parameters: length = {}; position = {}; inFile = {}", job, length, position, inFile); } @@ -175,7 +177,7 @@ public abstract class BaseConverter { , String.valueOf(length < 0 ? 0 : length) , String.valueOf(position < 0 ? 0 : position) }; - returnLog.add(ProcessHelper.executeScript(job, argv)); + logs.add(ProcessHelper.executeScript(job, argv)); return argv; } @@ -250,7 +252,7 @@ public abstract class BaseConverter { } protected void stripAudioFirstPass(Recording recording, - List<ProcessResult> returnLog, + ProcessResultList logs, List<File> waveFiles, File streamFolder, List<RecordingMetaData> metaDataList) { try { @@ -281,7 +283,7 @@ public abstract class BaseConverter { , "-af", "aresample=32k:min_comp=0.001:min_hard_comp=0.100000" , outputWav.getCanonicalPath()}; - returnLog.add(ProcessHelper.executeScript("stripAudioFromFLVs", argv)); + logs.add(ProcessHelper.executeScript("stripAudioFromFLVs", argv)); } if (outputWav.exists() && outputWav.length() != 0) { @@ -308,9 +310,9 @@ public abstract class BaseConverter { if (metaDelta.getDeltaTime() != null) { double gapSeconds = diffSeconds(metaDelta.getDeltaTime()); if (metaDelta.isStartPadding()) { - soxArgs = addSoxPad(returnLog, "fillGap", gapSeconds, 0, inputFile, outputGapFullWav); + soxArgs = addSoxPad(logs, "fillGap", gapSeconds, 0, inputFile, outputGapFullWav); } else if (metaDelta.isEndPadding()) { - soxArgs = addSoxPad(returnLog, "fillGap", 0, gapSeconds, inputFile, outputGapFullWav); + soxArgs = addSoxPad(logs, "fillGap", 0, gapSeconds, inputFile, outputGapFullWav); } } @@ -334,7 +336,7 @@ public abstract class BaseConverter { // Calculate delta at ending double endPad = diffSeconds(recording.getRecordEnd(), metaData.getRecordEnd()); - addSoxPad(returnLog, "addStartEndToAudio", startPad, endPad, outputGapFullWav, outputFullWav); + addSoxPad(logs, "addStartEndToAudio", startPad, endPad, outputGapFullWav, outputFullWav); // Fix for Audio Length - Invalid Audio Length in Recorded Files // Audio must match 100% the Video @@ -382,15 +384,15 @@ public abstract class BaseConverter { return argv; } - protected String convertToMp4(Recording r, List<String> _argv, List<ProcessResult> returnLog) throws IOException { + protected String convertToMp4(Recording r, List<String> _argv, ProcessResultList logs) throws IOException { String mp4path = r.getFile().getCanonicalPath(); List<String> argv = new ArrayList<>(Arrays.asList(getPathToFFMPEG(), "-y")); argv.addAll(_argv); - returnLog.add(ProcessHelper.executeScript("generate MP4", addMp4OutParams(r, argv, mp4path).toArray(new String[]{}))); + logs.add(ProcessHelper.executeScript("generate MP4", addMp4OutParams(r, argv, mp4path).toArray(new String[]{}))); return mp4path; } - protected void convertToPng(BaseFileItem f, String mp4path, List<ProcessResult> logs) throws IOException { + protected void convertToPng(BaseFileItem f, String mp4path, ProcessResultList logs) throws IOException { // Extract first Image for preview purpose // ffmpeg -i movie.mp4 -vf "thumbnail,scale=640:-1" -frames:v 1 movie.png File png = f.getFile(EXTENSION_PNG); @@ -400,7 +402,6 @@ public abstract class BaseConverter { , "-vf", "thumbnail,scale=640:-1" // , "-frames:v", "1" // , png.getCanonicalPath() }; - logs.add(ProcessHelper.executeScript(String.format("generate preview PNG :: %s", f.getHash()), argv)); } @@ -416,15 +417,15 @@ public abstract class BaseConverter { return new Dimension(100, 100); // will return 100x100 for non-video to be able to play } - protected void postProcess(Recording r, String mp4path, List<ProcessResult> logs, List<File> waveFiles) throws IOException { + protected void postProcess(Recording r, String mp4path, ProcessResultList logs, List<File> waveFiles) throws IOException { convertToPng(r, mp4path, logs); updateDuration(r); r.setStatus(Recording.Status.PROCESSED); logDao.delete(r); - for (ProcessResult returnMap : logs) { - logDao.add("generateFFMPEG", r, returnMap); + for (ProcessResult res : logs.getJobs()) { + logDao.add("generateFFMPEG", r, res); } // Delete Wave Files http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java ---------------------------------------------------------------------- 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 76b6305..3fc14d4 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 @@ -50,21 +50,23 @@ public class DocumentConverter { private ImageConverter imageConverter; public ProcessResultList convertPDF(FileItem f, StoredFile sf) throws Exception { - ProcessResultList result = new ProcessResultList(); + return convertPDF(f, sf, new ProcessResultList()); + } + public ProcessResultList convertPDF(FileItem f, StoredFile sf, ProcessResultList logs) throws Exception { boolean fullProcessing = !sf.isPdf(); File original = f.getFile(sf.getExt()); File pdf = f.getFile(EXTENSION_PDF); log.debug("fullProcessing: " + fullProcessing); if (fullProcessing) { log.debug("-- running JOD --"); - result.addItem("processOpenOffice", doJodConvert(original, pdf)); + logs.add(doJodConvert(original, pdf)); } else if (!EXTENSION_PDF.equals(sf.getExt())) { copyFile(original, pdf); } log.debug("-- generate page images --"); - return imageConverter.convertDocument(result, f, pdf); + return imageConverter.convertDocument(f, pdf, logs); } public static void createOfficeManager(String officePath, Consumer<OfficeManager> consumer) { @@ -100,8 +102,7 @@ public class DocumentConverter { log.error("doJodConvert", ex); return new ProcessResult("doJodConvert", ex.getMessage(), ex); } - ProcessResult result = new ProcessResult("doJodConvert", "Document converted successfully", null); - result.setExitCode(0); - return result; + return new ProcessResult("doJodConvert", "Document converted successfully", null) + .setExitCode(0); } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java ---------------------------------------------------------------------- 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 beefb99..b87b963 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 @@ -67,19 +67,21 @@ public class ImageConverter extends BaseConverter { private UserDao userDao; public ProcessResultList convertImage(BaseFileItem f, StoredFile sf) throws IOException { - ProcessResultList returnMap = new ProcessResultList(); + return convertImage(f, sf, new ProcessResultList()); + } + public ProcessResultList convertImage(BaseFileItem f, StoredFile sf, ProcessResultList logs) throws IOException { File jpg = f.getFile(EXTENSION_JPG); if (!sf.isJpg()) { File img = f.getFile(sf.getExt()); log.debug("##### convertImage destinationFile: " + jpg); - returnMap.addItem("processJPG", convertSingleJpg(img, jpg)); + logs.add(convertSingleJpg(img, jpg)); } else if (!jpg.exists()){ copyFile(f.getFile(sf.getExt()), jpg); } - returnMap.addItem("get JPG dimensions", initSize(f, jpg, JPG_MIME_TYPE)); - return returnMap; + logs.add(initSize(f, jpg, JPG_MIME_TYPE)); + return logs; } public ProcessResultList convertImageUserProfile(File file, Long userId, boolean skipConvertion) throws Exception { @@ -95,7 +97,7 @@ public class ImageConverter extends BaseConverter { File destinationFile = OmFileHelper.getNewFile(getUploadProfilesUserDir(userId), PROFILE_FILE_NAME, EXTENSION_JPG); if (!skipConvertion) { - returnMap.addItem("processJPG", convertSingleJpg(file, destinationFile)); + returnMap.add(convertSingleJpg(file, destinationFile)); } else { FileUtils.copyFile(file, destinationFile); } @@ -123,7 +125,7 @@ public class ImageConverter extends BaseConverter { return cfgDao.getString(CONFIG_DOCUMENT_QUALITY, "90"); } - private static ProcessResult initSize(BaseFileItem f, File img, String mime) { + private ProcessResult initSize(BaseFileItem f, File img, String mime) { ProcessResult res = new ProcessResult(); res.setProcess("get image dimensions :: " + f.getId()); final Parser parser = new ImageParser(); @@ -171,7 +173,7 @@ public class ImageConverter extends BaseConverter { * @return - result of conversion * @throws IOException in case IO exception occurred */ - public ProcessResultList convertDocument(ProcessResultList list, FileItem f, File pdf) throws IOException { + public ProcessResultList convertDocument(FileItem f, File pdf, ProcessResultList logs) throws IOException { log.debug("convertDocument"); String[] argv = new String[] { getPathToConvert() @@ -180,17 +182,17 @@ public class ImageConverter extends BaseConverter { , "-quality", getQuality() , new File(pdf.getParentFile(), PAGE_TMPLT).getCanonicalPath() }; - ProcessResult res = ProcessHelper.executeScript("convertDocument", argv); - list.addItem("convert PDF to images", res); + ProcessResult res = ProcessHelper.executeScript("convert PDF to images", argv); + logs.add(res); 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) { f.setCount(0); } else { f.setCount(pages.length); - list.addItem("get PNG page dimensions", initSize(f, pages[0], PNG_MIME_TYPE)); + logs.add(initSize(f, pages[0], PNG_MIME_TYPE)); } } - return list; + return logs; } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java index 5761869..d1b2d12 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/InterviewConverter.java @@ -34,8 +34,9 @@ import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao; import org.apache.openmeetings.db.entity.record.Recording; import org.apache.openmeetings.db.entity.record.RecordingMetaData; import org.apache.openmeetings.util.OmFileHelper; -import org.apache.openmeetings.util.process.ProcessResult; import org.apache.openmeetings.util.process.ProcessHelper; +import org.apache.openmeetings.util.process.ProcessResult; +import org.apache.openmeetings.util.process.ProcessResultList; import org.apache.wicket.util.string.Strings; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; @@ -107,7 +108,7 @@ public class InterviewConverter extends BaseConverter implements IRecordingConve r.setStatus(Recording.Status.CONVERTING); r = recordingDao.update(r); - List<ProcessResult> logs = new ArrayList<>(); + ProcessResultList logs = new ProcessResultList(); List<File> waveFiles = new ArrayList<>(); File streamFolder = getStreamFolder(r); List<RecordingMetaData> metaDataList = metaDataDao.getAudioMetaDataByRecording(r.getId()); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/RecordingConverter.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/RecordingConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/RecordingConverter.java index 4ecca4e..8701558 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/RecordingConverter.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/RecordingConverter.java @@ -34,8 +34,8 @@ import org.apache.openmeetings.db.entity.record.Recording; import org.apache.openmeetings.db.entity.record.RecordingMetaData; import org.apache.openmeetings.db.entity.record.RecordingMetaData.Status; import org.apache.openmeetings.util.OmFileHelper; -import org.apache.openmeetings.util.process.ProcessResult; import org.apache.openmeetings.util.process.ProcessHelper; +import org.apache.openmeetings.util.process.ProcessResultList; import org.apache.wicket.util.string.Strings; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; @@ -62,7 +62,7 @@ public class RecordingConverter extends BaseConverter implements IRecordingConve try { log.debug("recording " + r.getId()); - List<ProcessResult> logs = new ArrayList<>(); + ProcessResultList logs = new ProcessResultList(); List<File> waveFiles = new ArrayList<>(); File streamFolder = getStreamFolder(r); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..765f15e --- /dev/null +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings.core.converter; + +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; +import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4; +import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.apache.openmeetings.db.entity.file.BaseFileItem.Type; +import org.apache.openmeetings.db.entity.file.FileItem; +import org.apache.openmeetings.util.process.ProcessHelper; +import org.apache.openmeetings.util.process.ProcessResult; +import org.apache.openmeetings.util.process.ProcessResultList; +import org.red5.logging.Red5LoggerFactory; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +@Component +public class VideoConverter extends BaseConverter { + private static final Logger log = Red5LoggerFactory.getLogger(VideoConverter.class, getWebAppRootKey()); + + public void convertVideo(FileItem f, String ext, ProcessResultList logs) { + try { + File mp4 = f.getFile(EXTENSION_MP4); + f.setType(Type.Video); + String input = f.getFile(ext).getCanonicalPath(); + boolean sameExt = EXTENSION_MP4.equals(ext); + Path tmp = null; + if (sameExt) { + //we should do in-place conversion + tmp = Files.createTempFile("video", ".mp4"); + input = Files.move(mp4.toPath(), tmp, REPLACE_EXISTING).toFile().getCanonicalPath(); + } + String[] args = new String[] { getPathToFFMPEG(), "-y" + , "-i", input // + , "-c:v", "h264" // + , "-c:a", "libfaac" // + , "-c:a", "libfdk_aac" // + , "-pix_fmt", "yuv420p" // + , mp4.getCanonicalPath() }; + ProcessResult res = ProcessHelper.executeScript("convert to MP4 :: " + f.getHash(), args); + logs.add(res); + if (sameExt && tmp != null) { + if (res.isOk()) { + Files.delete(tmp); + } else { + //conversion fails, need to move temp file back + Files.move(tmp, mp4.toPath(), REPLACE_EXISTING); + } + } + //Parse the width height from the FFMPEG output + Dimension dim = getDimension(res.getError()); + f.setWidth(dim.getWidth()); + f.setHeight(dim.getHeight()); + convertToPng(f, mp4.getCanonicalPath(), logs); + } catch (Exception err) { + log.error("[convertToFLV]", err); + logs.add(new ProcessResult("convertToMP4", err.getMessage(), err)); + } + } +} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java ---------------------------------------------------------------------- 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 ca74063..1d90502 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,12 +25,11 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKe import java.io.File; import java.io.InputStream; -import java.util.List; import java.util.UUID; import org.apache.openmeetings.core.converter.DocumentConverter; -import org.apache.openmeetings.core.converter.FlvExplorerConverter; import org.apache.openmeetings.core.converter.ImageConverter; +import org.apache.openmeetings.core.converter.VideoConverter; import org.apache.openmeetings.db.dao.file.FileItemDao; import org.apache.openmeetings.db.entity.file.BaseFileItem.Type; import org.apache.openmeetings.db.entity.file.FileItem; @@ -48,7 +47,7 @@ public class FileProcessor { //Spring loaded Beans @Autowired - private FlvExplorerConverter flvExplorerConverter; + private VideoConverter videoConverter; @Autowired private FileItemDao fileDao; @Autowired @@ -58,87 +57,84 @@ public class FileProcessor { //TODO this method need to be refactored to throw exceptions public ProcessResultList processFile(FileItem f, InputStream is) throws Exception { - ProcessResultList result = new ProcessResultList(); + ProcessResultList logs = new ProcessResultList(); // Generate a random string to prevent any problems with // foreign characters and duplicates String hash = UUID.randomUUID().toString(); File temp = null; try { + temp = File.createTempFile(String.format("upload_%s", hash), ".tmp"); + copyInputStreamToFile(is, temp); + String ext = getFileExt(f.getName()); log.debug("file extension: {}", ext); - StoredFile sf = new StoredFile(hash, ext, is); - // Check variable to see if this file is a presentation - // check if this is a a file that can be converted by - // openoffice-service - boolean isOffice = sf.isOffice(); - boolean isPdf = sf.isPdf(); - boolean isImage = sf.isImage(); - boolean isChart = sf.isChart(); - boolean isAsIs = sf.isAsIs(); - boolean isVideo = sf.isVideo(); + //this method moves stream, so temp file MUST be created first + StoredFile sf = new StoredFile(hash, ext, temp); - log.debug("isAsIs: " + isAsIs); + log.debug("isAsIs: {}", sf.isAsIs()); - // add outputfolders for profiles - // if it is a presenation it will be copied to another place - if (!(isOffice || isPdf || isImage || isVideo || isAsIs)) { - result.addItem("wrongType", new ProcessResult("The file type cannot be converted")); - return result; - } - if (isImage) { + if (sf.isImage()) { f.setType(Type.Image); - } else if (isVideo) { + } else if (sf.isVideo()) { f.setType(Type.Video); - } else if (isChart) { + } else if (sf.isChart()) { f.setType(Type.PollChart); - } else if (isPdf || isOffice) { + } else if (sf.isPdf() || sf.isOffice()) { f.setType(Type.Presentation); + } else { + logs.add(new ProcessResult("The file type cannot be converted :: " + f.getName())); + return logs; } f.setHash(hash); - File file = f.getFile(ext); - log.debug("writing file to: {}", file); - if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) { - result.addItem("No parent", new ProcessResult("Unable to create parent for file: " + file.getCanonicalPath())); - return result; - } - - temp = File.createTempFile(String.format("upload_%s", hash), ".tmp"); - copyInputStreamToFile(is, temp); - log.debug("canBeConverted: {}", isOffice); - if (isOffice || isPdf) { - copyFile(temp, file); - // convert to pdf, thumbs, swf and xml-description - result = docConverter.convertPDF(f, sf); - } else if (isChart) { - //TODO should be implemented - log.debug("uploaded chart file"); - } else if (isImage) { - // convert it to JPG - log.debug("##### convert it to JPG: "); - copyFile(temp, file); - result = imageConverter.convertImage(f, sf); - } else if (isVideo) { - copyFile(temp, file); - List<ProcessResult> returnList = flvExplorerConverter.convertVideo(f, ext); - - int i = 0; - for (ProcessResult returnMap : returnList) { - result.addItem("processVideo " + i++, returnMap); - } - } - f = fileDao.update(f); - log.debug("fileId: {}", f.getId()); + processFile(f, sf, temp, logs); } catch (Exception e) { log.debug("Error while processing the file", e); - result.addItem("exception", new ProcessResult("Unexpected exception: " + e.getMessage())); + logs.add(new ProcessResult("Unexpected exception: " + e.getMessage())); throw e; } finally { if (temp != null && temp.exists() && temp.isFile()) { log.debug("Clean up was successful ? {}", temp.delete()); } } - return result; + return logs; + } + + private void processFile(FileItem f, StoredFile sf, File temp, ProcessResultList logs) throws Exception { + try { + File file = f.getFile(sf.getExt()); + log.debug("writing file to: {}", file); + if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) { + logs.add(new ProcessResult("Unable to create parent for file: " + file.getCanonicalPath())); + return; + } + switch(f.getType()) { + case Presentation: + log.debug("Office document: {}", file); + copyFile(temp, file); + // convert to pdf, thumbs, swf and xml-description + docConverter.convertPDF(f, sf, logs); + break; + case PollChart: + log.debug("uploaded chart file"); // NOT implemented yet + break; + case Image: + // convert it to JPG + log.debug("##### convert it to JPG: "); + copyFile(temp, file); + imageConverter.convertImage(f, sf); + break; + case Video: + copyFile(temp, file); + videoConverter.convertVideo(f, sf.getExt(), logs); + break; + default: + break; + } + } finally { + f = fileDao.update(f); + log.debug("fileId: {}", f.getId()); + } } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResult.java ---------------------------------------------------------------------- diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResult.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResult.java index 8bf7ec9..01c271f 100644 --- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResult.java +++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResult.java @@ -96,8 +96,9 @@ public class ProcessResult { return exitCode; } - public void setExitCode(Integer exitCode) { + public ProcessResult setExitCode(Integer exitCode) { this.exitCode = exitCode; + return this; } public boolean isOk() { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResultList.java ---------------------------------------------------------------------- diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResultList.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResultList.java index df89c7e..52677f4 100644 --- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResultList.java +++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessResultList.java @@ -18,14 +18,8 @@ */ package org.apache.openmeetings.util.process; -import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey; -import static org.red5.logging.Red5LoggerFactory.getLogger; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Map.Entry; - -import org.slf4j.Logger; +import java.util.ArrayList; +import java.util.List; /** * @@ -35,16 +29,10 @@ import org.slf4j.Logger; * */ public class ProcessResultList { - private static final Logger log = getLogger(ProcessResultList.class, getWebAppRootKey()); + private List<ProcessResult> jobs = new ArrayList<>(); - private Map<String, ProcessResult> jobs = new LinkedHashMap<>(); - - public ProcessResult addItem(String name, ProcessResult processResult) { - if (jobs.containsKey(name)) { - log.error("Duplicate key in jobslist:: " + name); - return null; - } - return jobs.put(name, processResult); + public void add(ProcessResult res) { + jobs.add(res); } /** @@ -53,8 +41,8 @@ public class ProcessResultList { * @return */ public boolean hasError() { - for (Entry<String, ProcessResult> entry : jobs.entrySet()) { - if (!entry.getValue().isOk()) { + for (ProcessResult res : jobs) { + if (!res.isOk()) { return true; } } @@ -68,11 +56,11 @@ public class ProcessResultList { */ public String getLogMessage() { StringBuilder logMessage = new StringBuilder(); - for (Entry<String, ProcessResult> entry : jobs.entrySet()) { + for (ProcessResult res : jobs) { logMessage.append("key: "); - logMessage.append(entry.getKey()); + logMessage.append(res.getProcess()); logMessage.append("\r\n"); - logMessage.append(entry.getValue().buildLogMessage()); + logMessage.append(res.buildLogMessage()); } return logMessage.toString(); } @@ -81,7 +69,7 @@ public class ProcessResultList { return jobs.size(); } - public Map<String, ProcessResult> getJobs() { + public List<ProcessResult> getJobs() { return jobs; } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/466c0a04/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java ---------------------------------------------------------------------- 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 d3f46a9..7923ba2 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 @@ -24,7 +24,6 @@ import static org.apache.openmeetings.web.app.WebSession.getUserId; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map.Entry; import org.apache.openmeetings.core.data.file.FileProcessor; import org.apache.openmeetings.db.dao.basic.ConfigurationDao; @@ -197,8 +196,8 @@ public class UploadDialog extends AbstractFormDialog<String> { try { ProcessResultList logs = getBean(FileProcessor.class).processFile(f, fu.getInputStream()); - for (Entry<String, ProcessResult> entry : logs.getJobs().entrySet()) { - getBean(FileItemLogDao.class).add(entry.getValue().getProcess(), f, entry.getValue()); + for (ProcessResult res : logs.getJobs()) { + getBean(FileItemLogDao.class).add(res.getProcess(), f, res); } room.getSidebar().updateFiles(target); if (logs.hasError()) {
