/** * * geo-platform * Rich webgis framework * http://geo-platform.org * ==================================================================== * * Copyright (C) 2008-2017 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; } }