org.geosdi.geoplatform.services.utility.PublishUtility.java Source code

Java tutorial

Introduction

Here is the source code for org.geosdi.geoplatform.services.utility.PublishUtility.java

Source

/**
 *
 *    geo-platform
 *    Rich webgis framework
 *    http://geo-platform.org
 *   ====================================================================
 *
 *   Copyright (C) 2008-2019 geoSDI Group (CNR IMAA - Potenza - ITALY).
 *
 *   This program is free software: you can redistribute it and/or modify it
 *   under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version. This program is distributed in the
 *   hope that it will be useful, but WITHOUT ANY WARRANTY; without
 *   even the implied warranty of MERCHANTABILITY or FITNESS FOR
 *   A PARTICULAR PURPOSE. See the GNU General Public License
 *   for more details. You should have received a copy of the GNU General
 *   Public License along with this program. If not, see http://www.gnu.org/licenses/
 *
 *   ====================================================================
 *
 *   Linking this library statically or dynamically with other modules is
 *   making a combined work based on this library. Thus, the terms and
 *   conditions of the GNU General Public License cover the whole combination.
 *
 *   As a special exception, the copyright holders of this library give you permission
 *   to link this library with independent modules to produce an executable, regardless
 *   of the license terms of these independent modules, and to copy and distribute
 *   the resulting executable under terms of your choice, provided that you also meet,
 *   for each linked independent module, the terms and conditions of the license of
 *   that module. An independent module is a module which is not derived from or
 *   based on this library. If you modify this library, you may extend this exception
 *   to your version of the library, but you are not obligated to do so. If you do not
 *   wish to do so, delete this exception statement from your version.
 */
package org.geosdi.geoplatform.services.utility;

import java.io.*;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.geosdi.geoplatform.exception.ResourceNotFoundFault;
import org.geosdi.geoplatform.gui.shared.publisher.LayerPublishAction;
import org.geosdi.geoplatform.responce.InfoPreview;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Nazzareno Sileno - CNR IMAA geoSDI Group
 * @email nazzareno.sileno@geosdi.org
 */
public class PublishUtility {

    private static Logger logger = LoggerFactory.getLogger(PublishUtility.class);
    //    public final static String GEOPORTAL = "geoportal";
    public static String TMPDIR;
    public final static String SHP_DIR_NAME = "shp";
    public final static String TIF_DIR_NAME = "tif";
    public final static String ZIP_DIR_NAME = "zip";
    public static final String FILE_NAME = "fileName";
    public static final String FILE_PATH = "filePath";
    public static final String USER_WORKSPACE = "userWorkSpace";
    public static final String PUBLISHER_SERVICE = "publisher_service";

    static {
        TMPDIR = System.getProperty("java.io.tmpdir");
        if (!TMPDIR.endsWith(System.getProperty("file.separator"))) {
            TMPDIR += System.getProperty("file.separator");
        }
    }

    public static String createDir(String path) {
        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdir();
        }
        return path + System.getProperty("file.separator");
    }

    public static boolean deleteFile(String filePath) {
        File file = new File(filePath);
        return file.delete();
    }

    public static boolean deleteDir(String directory) {
        return deleteDir(new File(directory));
    }

    public static boolean deleteDir(File directory) {
        if (directory.isDirectory()) {
            String[] children = directory.list();
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(directory, children[i]));
                if (!success) {
                    //                    logger.error("Failed deleting operation");
                    return false;
                }
            }
        }
        return directory.delete();
    }

    /**
     * **********************
     *
     * @param out the archive stream where compressing the inFile
     * @param inFile the file to compress
     * @return
     * @throws IOException this exception is raised when inFile does not exist
     * this method at the first opens and compresses the fileinFile, then it
     * inserts it in the out stream
     */
    public static ZipOutputStream compress(ZipOutputStream out, File inFile) throws IOException {
        FileInputStream inShpFil = new FileInputStream(inFile); // Stream to read file
        ZipEntry entryShp = new ZipEntry(inFile.getName()); // Make a ZipEntry
        out.putNextEntry(entryShp); // Store entry
        byte[] buffer = new byte[4096]; // Create a buffer for copying
        int bytesRead;
        while ((bytesRead = inShpFil.read(buffer)) != -1) {
            out.write(buffer, 0, bytesRead);
        }
        inShpFil.close();
        return out;
    }

    public static File generateGeoPortalDirInUserHome() {
        String geoportalDir = System.getProperty("user.home") + System.getProperty("file.separator") + "Geoportal"
                + System.getProperty("file.separator");
        logger.info("Geoportal dir: " + geoportalDir);
        File geoportalDirFile = new File(geoportalDir);
        geoportalDirFile.mkdir();
        return geoportalDirFile;
    }

    public static File copyFile(File origin, String destinationPathDir, String destinationFileName,
            boolean overwrite) {
        File destination = new File(destinationPathDir);
        destination.mkdirs();
        destination = new File(destination, destinationFileName);
        if (!destination.exists() || overwrite) {
            try {
                InputStream in = new FileInputStream(origin);
                OutputStream out = new FileOutputStream(destination);
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                in.close();
                out.close();
                //            } catch (FileNotFoundException ex) {
                //                logger.error(ex.getMessage() + " in the specified directory.");
            } catch (IOException e) {
                logger.error(e.getMessage());
            }
        }
        return destination;
    }

    private static boolean renameZipShp(String userName, InfoPreview infoPreview, String tempUserDir)
            throws ResourceNotFoundFault {
        String tempUserZipDir = PublishUtility.createDir(tempUserDir + PublishUtility.ZIP_DIR_NAME);
        boolean result = false;
        LayerPublishAction layerPublishAction = infoPreview.getLayerPublishAction();
        String newName = userName + "_shp_" + infoPreview.getNewName();
        if (layerPublishAction != null && layerPublishAction.equals(LayerPublishAction.RENAME) && newName != null
                && !newName.equalsIgnoreCase(infoPreview.getDataStoreName())) {
            String fileName = tempUserZipDir + infoPreview.getDataStoreName() + ".zip";
            File previousFile = new File(fileName);
            ZipFile zipSrc = null;
            String renameDirPath = tempUserZipDir + "rename" + System.getProperty("file.separator");
            try {
                PublishUtility.createDir(renameDirPath);
                logger.debug("********* ManageRename renameDirPath: " + renameDirPath);
                //Decomprime il contenuto dello zip nella cartella rename
                zipSrc = new ZipFile(previousFile);
                Enumeration<? extends ZipEntry> entries = zipSrc.entries();
                while (entries.hasMoreElements()) {
                    ZipEntry entry = entries.nextElement();
                    PublishUtility.extractEntryToFile(entry, zipSrc, renameDirPath);
                }
                logger.debug("********* ManageRename element unzipped");
                //Dopo l'estrazione rinominare e creare zip
                compressFiles(tempUserZipDir, renameDirPath, newName + ".zip", infoPreview.getDataStoreName(),
                        newName);
                logger.debug("********* ManageRename after compress file");
                //Cancellare vecchio zip
                previousFile.delete();
                logger.debug("********* ManageRename after delete previous file");
                result = Boolean.TRUE;
            } catch (Exception e) {
                logger.error("ERRORE : " + e);
                throw new ResourceNotFoundFault(e.getMessage());
            } finally {
                try {
                    zipSrc.close();
                    //Cancella cartella rename
                    PublishUtility.deleteDir(renameDirPath);
                    logger.debug("********* ManageRename succesfully removed rename dir");
                } catch (IOException ex) {
                }
            }
            logger.debug("Shape Zip renamed: " + result);
            if (result) {
                infoPreview.setDataStoreName(newName);
            }
        }
        return result;
    }

    private static boolean renameTif(String userName, InfoPreview infoPreview, String tempUserDir)
            throws ResourceNotFoundFault {
        boolean result = false;
        String tempUserTifDir = PublishUtility.createDir(tempUserDir + PublishUtility.TIF_DIR_NAME);
        LayerPublishAction layerPublishAction = infoPreview.getLayerPublishAction();
        String newName = userName + "_" + infoPreview.getNewName();

        if (layerPublishAction != null && layerPublishAction.equals(LayerPublishAction.RENAME) && newName != null
                && !newName.equalsIgnoreCase(infoPreview.getDataStoreName())) {
            //Rinominare il file nuovo con il nuovo nome

        } else if (layerPublishAction != null && layerPublishAction.equals(LayerPublishAction.OVERRIDE)) {
            //Cancellare il vecchio file e rinominare il file nuovo con il vecchio nome
            logger.debug("renameTif in Override operation");
            String fileName = tempUserTifDir + infoPreview.getDataStoreName() + ".tif";
            File previousFile = new File(fileName);
            previousFile.delete();
            newName = infoPreview.getDataStoreName();
            logger.debug("renameTif after Override operation: " + newName);
        }
        String origName = infoPreview.getFileName();
        String fileName = tempUserTifDir + origName + ".tif";
        File previousFile = new File(fileName);
        previousFile.renameTo(new File(tempUserTifDir + newName + ".tif"));
        //
        String SLDFileName = origName + ".sld";
        File fileSLD = new File(tempUserTifDir, SLDFileName);
        if (fileSLD.exists()) {
            File filePublished = PublishUtility.copyFile(fileSLD, tempUserTifDir, newName + ".sld", true);
            fileSLD.delete();
        }
        //
        String TFWFileName = origName + ".tfw";
        File fileTFW = new File(tempUserTifDir, TFWFileName);
        if (fileTFW.exists()) {
            PublishUtility.copyFile(fileTFW, tempUserTifDir, newName + ".tfw", true);
            fileTFW.delete();
        }
        String PRJFileName = origName + ".prj";
        File filePRJ = new File(tempUserTifDir, PRJFileName);
        if (filePRJ.exists()) {
            PublishUtility.copyFile(filePRJ, tempUserTifDir, newName + ".prj", true);
            filePRJ.delete();
        }
        infoPreview.setDataStoreName(newName);
        result = Boolean.TRUE;
        logger.debug("Tif renamed: " + result);
        return result;
    }

    public static boolean manageRename(String userName, InfoPreview infoPreview, String tempUserDir)
            throws ResourceNotFoundFault {
        boolean result;
        if (infoPreview.isIsShape()) {
            result = renameZipShp(userName, infoPreview, tempUserDir);
        } else {
            result = renameTif(userName, infoPreview, tempUserDir);
        }
        return result;
    }

    //    public static void copyTifFiles(String origName, String tempUserTifDir,
    //            String userName, LayerInfo info) {
    //        String SLDFileName = origName + ".sld";
    //        File fileSLD = new File(tempUserTifDir, SLDFileName);
    //        if (fileSLD.exists()) {
    //            File filePublished = PublishUtility.copyFile(fileSLD,
    //                    tempUserTifDir, userName + "_" + info.name + ".sld", true);
    //            fileSLD.delete();
    //            info.sld = this.publishSLD(filePublished, info.name);
    //        } else {
    //            info.sld = "default_raster";
    //        }
    //        String TFWFileName = origName + ".tfw";
    //        File fileTFW = new File(tempUserTifDir, TFWFileName);
    //        if (fileTFW.exists()) {
    //            PublishUtility.copyFile(fileTFW,
    //                    tempUserTifDir, userName + "_" + info.name + ".tfw", true);
    //            fileTFW.delete();
    //        }
    //        String PRJFileName = origName + ".prj";
    //        File filePRJ = new File(tempUserTifDir, PRJFileName);
    //        if (filePRJ.exists()) {
    //            PublishUtility.copyFile(filePRJ,
    //                    tempUserTifDir, userName + "_" + info.name + ".prj", true);
    //            filePRJ.delete();
    //        }
    //    }
    public static File getFileNameToLowerCase(File file) {
        File fileToReturn = new File(
                FilenameUtils.getFullPath(file.getAbsolutePath()) + file.getName().toLowerCase());
        try {
            FileUtils.moveFile(file, fileToReturn);
        } catch (IOException ex) {
            logger.error("Error renaming file: " + ex);
        }
        return fileToReturn;
    }

    /**
     * Method usefull to remove special characters from the passed string to
     * clean
     *
     * @param stringToClean
     * @return
     */
    public static String removeSpecialCharactersFromString(String stringToClean) {
        Pattern pt = Pattern.compile("[^a-zA-Z0-9_]");
        Matcher match = pt.matcher(stringToClean);
        while (match.find()) {
            String s = match.group();
            stringToClean = stringToClean.replaceAll("\\" + s, "");
        }
        return stringToClean;
    }

    public static String extractFileExtension(String fileName) {
        return fileName.substring(fileName.length() - 3);
    }

    public static String extractFileName(String fileName) {
        return fileName.substring(0, fileName.lastIndexOf("."));
    }

    public static void extractEntryToFile(ZipEntry entry, ZipFile zipSrc, String tempUserDir)
            throws ResourceNotFoundFault {
        String entryName;
        FileOutputStream fileoutputstream = null;
        InputStream zipinputstream = null;
        try {
            zipinputstream = zipSrc.getInputStream(entry);
            int lastIndex = entry.getName().lastIndexOf('/');
            entryName = entry.getName().substring(lastIndex + 1).toLowerCase();
            String fileName = entryName.toLowerCase();
            String fileExtension = extractFileExtension(fileName);
            fileName = extractFileName(fileName);
            entryName = removeSpecialCharactersFromString(fileName) + "." + fileExtension;
            logger.info("INFO: Found file " + entryName);
            fileoutputstream = new FileOutputStream(tempUserDir + entryName);
            byte[] buf = new byte[1024];
            int n;
            while ((n = zipinputstream.read(buf, 0, 1024)) > -1) {
                fileoutputstream.write(buf, 0, n);
            }
        } catch (IOException ioe) {
            logger.error("ERROR on extractEntryToFile(): " + ioe.getMessage());
            throw new ResourceNotFoundFault(ioe.getMessage());
        } finally {
            try {
                fileoutputstream.close();
                zipinputstream.close();
            } catch (IOException e) {
            }
        }
    }

    /**
     * ***************
     *
     * @param zipFileName the name of the resulting zip file
     * @param shpFileName the name of the shp file to compress
     * @return
     *
     */
    public static ZipOutputStream compressFiles(String tempUserZipDir, String tempUserDir, String zipFileName,
            String origName, String destName) {
        ZipOutputStream out;
        try {
            out = new ZipOutputStream(new FileOutputStream(tempUserZipDir + zipFileName));
            File shpFile = new File(tempUserDir + origName + ".shp");
            File dbfFile = new File(tempUserDir + origName + ".dbf");
            File shxFile = new File(tempUserDir + origName + ".shx");//sbn&&sbx&&CPG
            File prjFile = new File(tempUserDir + origName + ".prj");

            File shpDestFile = shpFile;
            File dbfDestFile = dbfFile;
            File shxDestFile = shxFile;
            File prjDestFile = prjFile;

            File sldFile = new File(tempUserDir + origName + ".sld");
            File sldDestFile = sldFile;
            File cpgFile = new File(tempUserDir + origName + ".cpg");
            File cpgDestFile = cpgFile;

            if (destName != null) {
                shpDestFile = new File(tempUserDir + destName + ".shp");
                shpFile.renameTo(shpDestFile);
                dbfDestFile = new File(tempUserDir + destName + ".dbf");
                dbfFile.renameTo(dbfDestFile);
                shxDestFile = new File(tempUserDir + destName + ".shx");
                shxFile.renameTo(shxDestFile);
                prjDestFile = new File(tempUserDir + destName + ".prj");
                prjFile.renameTo(prjDestFile);
                sldDestFile = new File(tempUserDir + destName + ".sld");
                sldFile.renameTo(sldDestFile);
                cpgDestFile = new File(tempUserDir + destName + ".cpg");
                cpgFile.renameTo(cpgDestFile);
            }
            out = PublishUtility.compress(out, shpDestFile);
            out = PublishUtility.compress(out, dbfDestFile);
            out = PublishUtility.compress(out, shxDestFile);
            out = PublishUtility.compress(out, prjDestFile);
            if (sldDestFile.exists()) {
                out = PublishUtility.compress(out, sldDestFile);
            }
            if (cpgDestFile.exists()) {
                out = PublishUtility.compress(out, cpgDestFile);
            }
            out.close();
        } catch (Exception ex) {
            logger.error("Exception compressing: " + zipFileName + " - " + ex);
            return null;
        }
        return out;
    }
}