@Override public FileVersion clone() { try { FileVersion clone = (FileVersion) super.clone(); clone.setChecksum(getChecksum()); clone.setLastModified(getLastModified()); clone.setUpdated(getUpdated()); clone.setPath(getPath()); clone.setType(getType()); clone.setVersion(getVersion()); clone.setSize(getSize()); clone.setDosAttributes(getDosAttributes()); clone.setPosixPermissions(getPosixPermissions()); clone.setLinkTarget(getLinkTarget()); clone.setStatus(getStatus()); return clone; } catch (Exception ex) { throw new RuntimeException(ex); } }
fileVersion = new FileVersion(); fileVersion.setVersion(1L); fileVersion.setStatus(FileStatus.NEW); fileVersion = lastFileVersion.clone(); fileVersion.setVersion(lastFileVersion.getVersion() + 1); fileVersion.setPath(fileProperties.getRelativePath()); fileVersion.setLinkTarget(fileProperties.getLinkTarget()); fileVersion.setType(fileProperties.getType()); fileVersion.setSize(fileProperties.getSize()); fileVersion.setChecksum(fileProperties.getChecksum()); fileVersion.setLastModified(new Date(fileProperties.getLastModified())); fileVersion.setUpdated(new Date()); fileVersion.setDosAttributes(fileProperties.getDosAttributes()); if (fileVersion.getType() == FileType.FOLDER) { fileVersion.setPosixPermissions(DEFAULT_POSIX_PERMISSIONS_FOLDER); fileVersion.setPosixPermissions(DEFAULT_POSIX_PERMISSIONS_FILE); fileVersion.setPosixPermissions(fileProperties.getPosixPermissions()); fileVersion.setDosAttributes(DEFAULT_DOS_ATTRIBUTES); if (fileVersion.getType() == FileType.FILE && FileChecksum.fileChecksumEquals(fileVersion.getChecksum(), lastFileVersion.getChecksum())) { fileVersion.setStatus(FileStatus.CHANGED);
private void printOneVersion(FileVersion fileVersion, int longestVersion, int longestSize) { String fileStatus = formatFileStatusShortStr(fileVersion.getStatus()); String fileType = formatFileTypeShortStr(fileVersion.getType()); String posixPermissions = (fileVersion.getPosixPermissions() != null) ? fileVersion.getPosixPermissions() : ""; String dosAttributes = (fileVersion.getDosAttributes() != null) ? fileVersion.getDosAttributes() : ""; String fileChecksum = formatObjectId(fileVersion.getChecksum()); String fileHistoryId = formatObjectId(fileVersion.getFileHistoryId()); String path = (fileVersion.getType() == FileType.SYMLINK) ? fileVersion.getPath() + " -> " + fileVersion.getLinkTarget() : fileVersion.getPath(); out.printf("%s %s %s %9s %4s %" + longestSize + "d %" + checksumLength + "s %" + checksumLength + "s %"+longestVersion+"d %s\n", DATE_FORMAT.format(fileVersion.getUpdated()), fileStatus, fileType, posixPermissions, dosAttributes, fileVersion.getSize(), fileChecksum, fileHistoryId, fileVersion.getVersion(), path); }
private PartialFileHistory createFileHistoryForDeletion(PartialFileHistory fileHistory, FileVersion lastLocalVersion) { PartialFileHistory deletedFileHistory = new PartialFileHistory(fileHistory.getFileHistoryId()); FileVersion deletedVersion = lastLocalVersion.clone(); deletedVersion.setStatus(FileStatus.DELETED); deletedVersion.setVersion(fileHistory.getLastVersion().getVersion() + 1); deletedVersion.setUpdated(new Date()); deletedFileHistory.addFileVersion(deletedVersion); return deletedFileHistory; }
public FileVersion createFileVersionFromRow(ResultSet resultSet) throws SQLException { FileVersion fileVersion = new FileVersion(); fileVersion.setFileHistoryId(FileHistoryId.parseFileId(resultSet.getString("filehistory_id"))); fileVersion.setVersion(resultSet.getLong("version")); fileVersion.setPath(resultSet.getString("path")); fileVersion.setType(FileType.valueOf(resultSet.getString("type"))); fileVersion.setStatus(FileStatus.valueOf(resultSet.getString("status"))); fileVersion.setSize(resultSet.getLong("size")); fileVersion.setLastModified(new Date(resultSet.getTimestamp("lastmodified").getTime())); if (resultSet.getString("linktarget") != null) { fileVersion.setLinkTarget(resultSet.getString("linktarget")); } if (resultSet.getString("filecontent_checksum") != null) { FileChecksum fileChecksum = FileChecksum.parseFileChecksum(resultSet.getString("filecontent_checksum")); fileVersion.setChecksum(fileChecksum); } if (resultSet.getString("updated") != null) { fileVersion.setUpdated(new Date(resultSet.getTimestamp("updated").getTime())); } if (resultSet.getString("posixperms") != null) { fileVersion.setPosixPermissions(resultSet.getString("posixperms")); } if (resultSet.getString("dosattrs") != null) { fileVersion.setDosAttributes(resultSet.getString("dosattrs")); } return fileVersion; }
public static FileVersion createFileVersion(String path) { FileVersion fileVersion = new FileVersion(); fileVersion.setChecksum(new FileChecksum(TestFileUtil.createRandomArray(20))); fileVersion.setLastModified(new Date()); fileVersion.setPath(path); fileVersion.setStatus(FileStatus.NEW); fileVersion.setType(FileType.FILE); fileVersion.setUpdated(new Date()); fileVersion.setVersion(1L); return fileVersion; }
public static FileVersion createFileVersion(String path, FileVersion basedOnFileVersion) { FileVersion fileVersion = basedOnFileVersion.clone(); fileVersion.setPath(path); fileVersion.setStatus(FileStatus.CHANGED); fileVersion.setVersion(basedOnFileVersion.getVersion() + 1); return fileVersion; }
private PartialFileHistory getFileHistoryByPathFromDatabaseVersion(DatabaseVersion databaseVersion, String path) { // TODO [medium] Extremely performance intensive, because this is called inside a loop above. Implement better caching for database version!!! for (PartialFileHistory fileHistory : databaseVersion.getFileHistories()) { FileVersion lastVersion = fileHistory.getLastVersion(); if (lastVersion.getStatus() != FileStatus.DELETED && lastVersion.getPath().equals(path)) { return fileHistory; } } return null; }
FileVersion lastVersion = fileHistoryWithSameChecksum.getLastVersion(); if (fileProperties.getLastModified() != lastVersion.getLastModified().getTime() || fileProperties.getSize() != lastVersion.getSize()) { continue; File lastVersionOnLocalDisk = new File(config.getLocalDir() + File.separator + lastVersion.getPath()); if (lastVersion.getStatus() != FileStatus.DELETED && !FileUtil.exists(lastVersionOnLocalDisk)) { if (lastFileHistory == null) { lastFileHistory = fileHistoryWithSameChecksum; String currentPreviousPath = lastFileHistory.getLastVersion().getPath(); String candidatePreviousPath = fileHistoryWithSameChecksum.getLastVersion().getPath();
private int compareByFullName(FileSystemAction a1, FileSystemAction a2) { // For deleted, do the longest path first if (a1.getClass().equals(DeleteFileSystemAction.class)) { return -1 * a1.getFile2().getPath().compareTo(a2.getFile2().getPath()); } // For new folder actions, do the shortest path first else if (a1.getClass().equals(NewFileSystemAction.class)) { return a1.getFile2().getPath().compareTo(a2.getFile2().getPath()); } return 0; }
public Integer apply(FileVersion fileVersion) { return (""+fileVersion.getVersion()).length(); } });
private NormalizedPath findTargetPath() throws Exception { NormalizedPath targetPath = null; if (relativeTargetPath == null) { String restoredSuffix = "restored version " + fileVersion2.getVersion(); targetPath = new NormalizedPath(config.getLocalDir(), fileVersion2.getPath()).withSuffix(restoredSuffix, false); } else { targetPath = new NormalizedPath(config.getLocalDir(), relativeTargetPath); } return targetPath; } }
PartialFileHistory fileHistory = getLastVersionByFileHistoryId(fileHistoryId); boolean resultIsLatestVersion = fileHistory.getLastVersion().getVersion() == resultSet.getLong("version"); boolean resultIsNotDelete = fileHistory.getLastVersion().getStatus() != FileVersion.FileStatus.DELETED;
private void printGroupedHistories(LsOperationResult operationResult, int longestSize, int longestVersion) { Iterator<FileVersion> fileVersionIterator = operationResult.getFileList().iterator(); while (fileVersionIterator.hasNext()) { FileVersion fileVersion = fileVersionIterator.next(); PartialFileHistory fileHistory = operationResult.getFileVersions().get(fileVersion.getFileHistoryId()); out.printf("File %s, %s\n", formatObjectId(fileHistory.getFileHistoryId()), fileVersion.getPath()); for (FileVersion fileVersionInHistory : fileHistory.getFileVersions().values()) { if (fileVersionInHistory.equals(fileVersion)) { out.print(" * "); } else { out.print(" "); } printOneVersion(fileVersionInHistory, longestVersion, longestSize); } if (fileVersionIterator.hasNext()) { out.println(); } } }
protected void createSymlink(FileVersion reconstructedFileVersion) throws Exception { File reconstructedFileAtFinalLocation = getAbsolutePathFile(reconstructedFileVersion.getPath()); if (EnvironmentUtil.symlinksSupported()) { // Make directory if it does not exist File reconstructedFileParentDir = reconstructedFileAtFinalLocation.getParentFile(); if (!FileUtil.exists(reconstructedFileParentDir)) { logger.log(Level.INFO, " - Parent folder does not exist, creating " + reconstructedFileParentDir + " ..."); reconstructedFileParentDir.mkdirs(); } // Make link logger.log(Level.INFO, " - Creating symlink at " + reconstructedFileAtFinalLocation + " (target: " + reconstructedFileVersion.getLinkTarget() + ") ..."); FileUtil.createSymlink(reconstructedFileVersion.getLinkTarget(), reconstructedFileAtFinalLocation); } else { logger.log(Level.INFO, " - Skipping symlink (not supported) at " + reconstructedFileAtFinalLocation + " (target: " + reconstructedFileVersion.getLinkTarget() + ") ..."); } }
protected void setFileAttributes(FileVersion reconstructedFileVersion, File reconstructedFilesAtFinalLocation) throws IOException { if (EnvironmentUtil.isWindows()) { if (reconstructedFileVersion.getDosAttributes() != null) { logger.log(Level.INFO, " - Setting DOS attributes: " + reconstructedFileVersion.getDosAttributes() + " ..."); DosFileAttributes dosAttrs = FileUtil.dosAttrsFromString(reconstructedFileVersion.getDosAttributes()); Path filePath = Paths.get(reconstructedFilesAtFinalLocation.getAbsolutePath()); if (reconstructedFileVersion.getPosixPermissions() != null) { logger.log(Level.INFO, " - Setting POSIX permissions: " + reconstructedFileVersion.getPosixPermissions() + " ..."); Set<PosixFilePermission> posixPerms = PosixFilePermissions.fromString(reconstructedFileVersion.getPosixPermissions());
logger.log(Level.INFO, " - Creating file " + fileVersion.getPath() + " to " + reconstructedFileInCache + " ..."); FileContent fileContent = localDatabase.getFileContent(fileVersion.getChecksum(), true); fileContent = memoryDatabase.getContent(fileVersion.getChecksum()); if (fileContent == null && fileVersion.getChecksum() != null) { throw new Exception("Cannot determine file content for checksum "+fileVersion.getChecksum());
private void downloadMultiChunks(FileVersion restoreFileVersion) throws StorageException, IOException { Set<MultiChunkId> multiChunksToDownload = new HashSet<MultiChunkId>(); FileChecksum restoreFileChecksum = restoreFileVersion.getChecksum(); if (restoreFileChecksum != null) { multiChunksToDownload.addAll(localDatabase.getMultiChunkIds(restoreFileChecksum)); logger.log(Level.INFO, "Downloading " + multiChunksToDownload.size() + " multichunk(s) to restore file ..."); downloader.downloadAndDecryptMultiChunks(multiChunksToDownload); } } }
protected void setLastModified(FileVersion reconstructedFileVersion, File reconstructedFilesAtFinalLocation) { // Using Files.setLastModifiedTime() instead of File.setLastModified() // due to pre-1970 issue. See #374 for details. try { FileTime newLastModifiedTime = FileTime.fromMillis(reconstructedFileVersion.getLastModified().getTime()); Files.setLastModifiedTime(reconstructedFilesAtFinalLocation.toPath(), newLastModifiedTime); } catch (IOException e) { logger.log(Level.WARNING, "Warning: Could not set last modified date for file " + reconstructedFilesAtFinalLocation + "; Ignoring error.", e); } }