org.openmeetings.app.data.file.FileProcessor.java Source code

Java tutorial

Introduction

Here is the source code for org.openmeetings.app.data.file.FileProcessor.java

Source

/*
 * 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.openmeetings.app.data.file;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.openmeetings.app.OpenmeetingsVariables;
import org.openmeetings.app.data.file.dao.FileExplorerItemDaoImpl;
import org.openmeetings.app.data.flvrecord.converter.FlvExplorerConverter;
import org.openmeetings.app.documents.GenerateImage;
import org.openmeetings.app.documents.GeneratePDF;
import org.openmeetings.app.documents.GenerateThumbs;
import org.openmeetings.app.persistence.beans.files.FileExplorerItem;
import org.openmeetings.utils.StoredFile;
import org.openmeetings.utils.crypt.MD5;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

public class FileProcessor {

    private static final Logger log = Red5LoggerFactory.getLogger(FileProcessor.class,
            OpenmeetingsVariables.webAppRootKey);

    //Spring loaded Beans
    @Autowired
    private FlvExplorerConverter flvExplorerConverter;
    @Autowired
    private FileExplorerItemDaoImpl fileExplorerItemDao;
    @Autowired
    private GenerateImage generateImage;
    @Autowired
    private GenerateThumbs generateThumbs;
    @Autowired
    private GeneratePDF generatePDF;

    private String workingDir = "";
    private String working_dirppt = "";

    private void prepareFolderStructure(String current_dir) throws Exception {

        this.workingDir = current_dir + OpenmeetingsVariables.UPLOAD_DIR + File.separatorChar + "files"
                + File.separatorChar;

        // System.out.println("IS SYSTEM PROFILE");
        // Add the Folder for the Room if it does not exist yet
        File localFolder = new File(workingDir);
        if (!localFolder.exists()) {
            localFolder.mkdir();
        }

        this.working_dirppt = current_dir + OpenmeetingsVariables.UPLOAD_TEMP_DIR + File.separatorChar + "files"
                + File.separatorChar;

        // add Temp Folder Structure
        File localFolderppt = new File(working_dirppt);
        if (!localFolderppt.exists()) {
            localFolderppt.mkdir();
        }

        log.debug("this.workingDir: " + this.workingDir);

    }

    public HashMap<String, HashMap<String, String>> processFile(Long userId, Long room_id, boolean isOwner,
            InputStream is, Long parentFolderId, String fileSystemName, String current_dir, Map<String, Object> hs,
            Long externalFileId, String externalType) throws Exception {

        HashMap<String, HashMap<String, String>> returnError = new HashMap<String, HashMap<String, String>>();

        HashMap<String, String> returnAttributes = new HashMap<String, String>();
        returnAttributes.put("process", "");
        returnAttributes.put("command", "");
        returnAttributes.put("exitValue", "0");
        returnAttributes.put("error", "");

        //prepare the necessary folders
        this.prepareFolderStructure(current_dir);

        int dotidx = fileSystemName.lastIndexOf('.');

        // Generate a random string to prevent any problems with
        // foreign characters and duplicates
        Date d = new Date();
        String newFileSystemName = MD5.do_checksum("FILE_" + d.getTime());

        String newFileExtDot = fileSystemName.substring(dotidx, fileSystemName.length()).toLowerCase();
        String newFileExt = newFileExtDot.substring(1);
        log.debug("newFileExt: " + newFileExt);
        StoredFile storedFile = new StoredFile(newFileSystemName, newFileExt);

        // 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 canBeConverted = storedFile.isConvertable();
        boolean isPdf = storedFile.isPdf();
        boolean isImage = storedFile.isImage();
        boolean isChart = storedFile.isChart();
        boolean isAsIs = storedFile.isAsIs();
        boolean isVideo = storedFile.isVideo();

        String completeName = "";
        log.debug("isAsIs: " + isAsIs);

        // add outputfolders for profiles
        // if it is a presenation it will be copied to another place
        if (!(canBeConverted || isPdf || isImage || isVideo || isAsIs)) {
            returnAttributes.put("error", "The file type cannot be converted");
            returnAttributes.put("exitValue", "-1");
            return returnError;
        }

        if (isAsIs) {
            // check if this is a room file or UserProfile
            completeName = workingDir + newFileSystemName;
        } else {
            completeName = working_dirppt + newFileSystemName;
        }
        log.debug("writing file to: " + completeName + newFileExtDot);

        returnAttributes.put("completeName", completeName);

        FileOutputStream fos = new FileOutputStream(completeName + newFileExtDot);
        byte[] buffer = new byte[1024];
        int len = 0;

        while (len != (-1)) {
            len = is.read(buffer, 0, 1024);
            if (len != (-1))
                fos.write(buffer, 0, len);
        }

        fos.close();
        is.close();

        Long ownerId = null;
        if (parentFolderId == -2) {
            parentFolderId = 0L;
            ownerId = userId;
        }
        if (isOwner) {
            ownerId = userId;
        }

        String fileHashName = newFileSystemName + newFileExtDot;
        Boolean isPresentation = false;
        if (canBeConverted || isPdf) {
            // In case of a presentation the hash is a folder-name
            fileHashName = newFileSystemName;
            isPresentation = true;
        }
        if (isImage) {
            fileHashName = newFileSystemName + ".jpg";
        }
        if (isVideo) {
            fileHashName = newFileSystemName + ".flv";
        }

        FileExplorerItem fileExplorerItem = fileExplorerItemDao.getFileExplorerItemsById(parentFolderId);

        if (fileExplorerItem != null) {
            if (fileExplorerItem.getIsFolder() == null || !fileExplorerItem.getIsFolder()) {
                parentFolderId = 0L;
            }
        }

        Long fileExplorerItemId = fileExplorerItemDao.add(fileSystemName, fileHashName, // The Hashname of the file
                parentFolderId, ownerId, room_id, userId, false, // isFolder
                isImage, isPresentation, "", false, isChart, externalFileId, externalType);
        log.debug("fileExplorerItemId: " + fileExplorerItemId);

        returnAttributes.put("fileExplorerItemId", "" + fileExplorerItemId);

        log.debug("canBeConverted: " + canBeConverted);
        if (canBeConverted) {
            // convert to pdf, thumbs, swf and xml-description
            returnError = generatePDF.convertPDF(current_dir, newFileSystemName, newFileExtDot, "files", true,
                    completeName);
        } else if (isPdf) {
            // convert to thumbs, swf and xml-description
            returnError = generatePDF.convertPDF(current_dir, newFileSystemName, newFileExtDot, "files", false,
                    completeName);
        } else if (isChart) {
            log.debug("uploaded chart file");
        } else if (isImage && !isAsIs) {
            // convert it to JPG
            log.debug("##### convert it to JPG: ");
            returnError = generateImage.convertImage(current_dir, newFileSystemName, newFileExtDot, "files",
                    newFileSystemName, false);
        } else if (isAsIs) {
            HashMap<String, String> processThumb = generateThumbs.generateThumb("_thumb_", current_dir,
                    completeName, 50);
            returnError.put("processThumb", processThumb);
        } else if (isVideo) {
            List<HashMap<String, String>> returnList = flvExplorerConverter.startConversion(fileExplorerItemId,
                    completeName + newFileExtDot);

            int i = 0;
            for (HashMap<String, String> returnMap : returnList) {
                returnError.put("processFLV " + i, returnMap);
            }

        }

        returnError.put("returnAttributes", returnAttributes);

        return returnError;

    }

}