package org.zstack.utils.path; import org.apache.commons.codec.digest.DigestUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.io.File; import java.io.FileInputStream; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.List; public class PathUtil { private static final CLogger logger = Utils.getLogger(PathUtil.class); public static String join(String... paths) { assert paths != null && paths.length > 0; File parent = new File(paths[0]); for (int i=1; i<paths.length; i++) { parent = new File(parent, paths[i]); } return parent.getPath(); } public static String absPath(String path) { if (path.startsWith("~")) { path = path.replaceAll("~", System.getProperty("user.home")); } return new File(path).getAbsolutePath(); } public static String getZStackHomeFolder() { String homeDir = System.getProperty("user.home"); File f = new File(homeDir); if (!f.exists()) { f.mkdirs(); } return f.getAbsolutePath(); } public static String getFolderUnderZStackHomeFolder(String folder) { String path = join(getZStackHomeFolder(), folder); File f = new File(path); if (!f.exists()) { f.mkdirs(); } return f.getAbsolutePath(); } public static String getFilePathUnderZStackHomeFolder(String path) { String folder = getFolderUnderZStackHomeFolder(parentFolder(path)); return join(folder, new File(path).getName()); } public static String parentFolder(String fullPath) { if (! fullPath.contains(File.separator)) { return fullPath; } return fullPath.substring(0, fullPath.lastIndexOf(File.separator)); } public static String fileName(String fullPath) { return new File(fullPath).getName(); } public static File findFileOnClassPath(String fileName, boolean exceptionOnNotFound) { File f = findFileOnClassPath(fileName); if (f == null && exceptionOnNotFound) { throw new RuntimeException(String.format("unable to find file[%s] on classpath", fileName)); } return f; } public static boolean exists(String path) { File f = new File(path); return f.exists(); } public static File findFolderOnClassPath(String folderName, boolean exceptionOnNotFound) { File folder = findFolderOnClassPath(folderName); if (folder == null && exceptionOnNotFound) { throw new RuntimeException(String.format("The folder %s is not found on classpath or there is another resource has the same name.", folderName)); } return folder; } public static File findFolderOnClassPath(String folderName) { URL folderUrl = PathUtil.class.getClassLoader().getResource(folderName); if (folderUrl == null || !folderUrl.getProtocol().equals("file")) { logger.warn(String.format("The folder %s is not found on classpath or there is another resource has the same name.", folderName)); return null; } try { File folder = new File(folderUrl.toURI()); if (!folder.isDirectory()) { return null; } return folder; } catch (URISyntaxException e) { throw new RuntimeException(e); } } public static File findFileOnClassPath(String fileName) { URL fileUrl = PathUtil.class.getClassLoader().getResource(fileName); if (fileUrl == null || !fileUrl.getProtocol().equals("file")) { logger.warn(String.format("The file %s is not found in classpath or there is another resource has the same name.", fileName)); return null; } try { return new File(fileUrl.toURI()); } catch (URISyntaxException e) { throw new RuntimeException(e); } } public static boolean compareFileByMd5(File src, File dst) { try { FileInputStream srcIn = new FileInputStream(src); String srcMd5 = DigestUtils.md5Hex(srcIn); FileInputStream dstIn = new FileInputStream(dst); String dstMd5 = DigestUtils.md5Hex(dstIn); return srcMd5.equals(dstMd5); } catch (Exception e) { throw new RuntimeException(e); } } public static List<String> scanFolderOnClassPath(String folderName) { URL folderUrl = PathUtil.class.getClassLoader().getResource(folderName); if (folderUrl == null || !folderUrl.getProtocol().equals("file")) { String info = String.format("The folder %s is not found in classpath or there is another resource has the same name.",folderName); logger.warn(info); return new ArrayList<String>(); } try { File folder = new File(folderUrl.toURI()); List<String> ret = new ArrayList<>(); scanFolder(ret, folder.getAbsolutePath()); return ret; } catch (Exception e) { throw new RuntimeException(String.format("Unable to locate service portal configure files"), e); } } public static List<String> scanFolder(List<String> ret, String folderName) { try { File folder = new File(folderName); if (folder.isDirectory()) { File[] fileArray = folder.listFiles(); for(File f: fileArray) { if (f.isDirectory()) { scanFolder(ret, f.getAbsolutePath()); } else { ret.add(PathUtil.join(folder.getAbsolutePath(), f.getName())); } } } return ret; } catch (Exception e) { throw new RuntimeException(String.format("Unable to locate service portal configure files"), e); } } }