private void updateFilenameHistoryCache() { // TODO [medium] Performance: This throws away the unchanged entries. It should only update new database version filenameHistoryCache.clear(); for (PartialFileHistory cacheFileHistory : fullDatabaseVersionCache.getFileHistories()) { FileVersion lastVersion = cacheFileHistory.getLastVersion(); String fileName = lastVersion.getPath(); if (lastVersion.getStatus() != FileStatus.DELETED) { filenameHistoryCache.put(fileName, cacheFileHistory); } } }
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; }
boolean resultIsNotDelete = fileHistory.getLastVersion().getStatus() != FileVersion.FileStatus.DELETED;
private void determineActionWithLocalVersionAndLocalFileDiffers(FileVersion winningLastVersion, File winningLastFile, FileVersion localLastVersion, File localLastFile, MemoryDatabase winnersDatabase, List<FileSystemAction> fileSystemActions, FileVersionComparison localFileToVersionComparison) { if (localFileToVersionComparison.getFileChanges().contains(FileChange.DELETED)) { boolean winningLastVersionDeleted = winningLastVersion.getStatus() == FileStatus.DELETED; if (!winningLastVersionDeleted) { FileSystemAction action = new ChangeFileSystemAction(config, winnersDatabase, assembler, localLastVersion, winningLastVersion); fileSystemActions.add(action); logger.log(Level.INFO, " -> (14) Content changed: Local file does NOT exist, and winning version changed: local file = "+localLastFile+", local version = "+localLastVersion+", winning version = "+winningLastVersion); logger.log(Level.INFO, " -> "+action); changeSet.getChangedFiles().add(winningLastVersion.getPath()); } else { logger.log(Level.INFO, " -> (15) Doing nothing: Local file does NOT exist, and winning version is marked DELETED: local file = "+localLastFile+", local version = "+localLastVersion+", winning version = "+winningLastVersion); } } else { FileSystemAction action = new ChangeFileSystemAction(config, winnersDatabase, assembler, winningLastVersion, localLastVersion); fileSystemActions.add(action); logger.log(Level.INFO, " -> (16) Content changed: Local file differs from last version: local file = "+localLastFile+", local version = "+localLastVersion+", winning version = "+winningLastVersion); logger.log(Level.INFO, " -> "+action); changeSet.getChangedFiles().add(winningLastVersion.getPath()); } }
private void findAndAppendDeletedFiles(ChangeSet localChanges, Map<String, FileVersion> filesInDatabase) { for (FileVersion lastLocalVersion : filesInDatabase.values()) { // Check if file exists, remove if it doesn't File lastLocalVersionOnDisk = new File(config.getLocalDir() + File.separator + lastLocalVersion.getPath()); // Ignore this file history if the last version is marked "DELETED" if (lastLocalVersion.getStatus() == FileStatus.DELETED) { continue; } // If file has VANISHED, mark as DELETED if (!FileUtil.exists(lastLocalVersionOnDisk)) { localChanges.getDeletedFiles().add(lastLocalVersion.getPath()); } } }
preparedStatement.setString(4, fileVersion.getPath()); preparedStatement.setString(5, fileVersion.getType().toString()); preparedStatement.setString(6, fileVersion.getStatus().toString()); preparedStatement.setLong(7, fileVersion.getSize()); preparedStatement.setTimestamp(8, new Timestamp(fileVersion.getLastModified().getTime()));
if (lastVersion.getStatus() != FileStatus.DELETED && !FileUtil.exists(lastVersionOnLocalDisk)) { if (lastFileHistory == null) { lastFileHistory = fileHistoryWithSameChecksum;
/** * This method fills a {@link ChangeSet} with the files and changes that are uploaded, to include in * the {@link UpOperationResult}. * * @param newDatabaseVersion {@link DatabaseVersion} that contains the changes. * @param resultChanges {@ChangeSet} to which these changes are to be added. */ private void addNewDatabaseChangesToResultChanges(DatabaseVersion newDatabaseVersion, ChangeSet resultChanges) { for (PartialFileHistory partialFileHistory : newDatabaseVersion.getFileHistories()) { FileVersion lastFileVersion = partialFileHistory.getLastVersion(); switch (lastFileVersion.getStatus()) { case NEW: resultChanges.getNewFiles().add(lastFileVersion.getPath()); break; case CHANGED: case RENAMED: resultChanges.getChangedFiles().add(lastFileVersion.getPath()); break; case DELETED: resultChanges.getDeletedFiles().add(lastFileVersion.getPath()); break; } } }
public FileProperties captureFileProperties(FileVersion fileVersion) { if (fileVersion == null) { return null; } FileProperties fileProperties = new FileProperties(); fileProperties.lastModified = fileVersion.getLastModified().getTime(); fileProperties.size = fileVersion.getSize(); fileProperties.relativePath = fileVersion.getPath(); fileProperties.linkTarget = fileVersion.getLinkTarget(); fileProperties.checksum = fileVersion.getChecksum(); fileProperties.type = fileVersion.getType(); fileProperties.posixPermissions = fileVersion.getPosixPermissions(); fileProperties.dosAttributes = fileVersion.getDosAttributes(); fileProperties.exists = fileVersion.getStatus() != FileStatus.DELETED; fileProperties.locked = false; return fileProperties; }
if (fileVersion2.getStatus() == FileStatus.DELETED) { logger.log(Level.INFO, " - (7) Original does NOT match, target file does not exist (and SHOUDN'T): Nothing to do!");
private void removeDeletedFiles(DatabaseVersion newDatabaseVersion, List<File> deletedFiles) { logger.log(Level.FINER, "- Looking for deleted files ..."); for (File deletedFile : deletedFiles) { String path = FileUtil.getRelativeDatabasePath(config.getLocalDir(), deletedFile); PartialFileHistory fileHistory = localDatabase.getFileHistoriesWithLastVersionByPath(path); // Ignore this file history if it has been updated in this database version before (file probably renamed!) if (newDatabaseVersion.getFileHistory(fileHistory.getFileHistoryId()) != null) { continue; } // Check if file exists, remove if it doesn't FileVersion lastLocalVersion = fileHistory.getLastVersion(); File lastLocalVersionOnDisk = new File(config.getLocalDir() + File.separator + lastLocalVersion.getPath()); // Ignore this file history if the last version is marked "DELETED" if (lastLocalVersion.getStatus() == FileStatus.DELETED) { continue; } // Add this file history if a new file with this name has been added (file type change) PartialFileHistory newFileWithSameName = getFileHistoryByPathFromDatabaseVersion(newDatabaseVersion, fileHistory.getLastVersion() .getPath()); // If file has VANISHED, mark as DELETED if (!FileUtil.exists(lastLocalVersionOnDisk) || newFileWithSameName != null) { PartialFileHistory fileHistoryForDeletion = createFileHistoryForDeletion(fileHistory, lastLocalVersion); newDatabaseVersion.addFileHistory(fileHistoryForDeletion); logger.log(Level.FINER, " + Deleted: Adding DELETED version: {0}", fileHistoryForDeletion.getLastVersion()); logger.log(Level.FINER, " based on: {0}", lastLocalVersion); } } }
FileVersion fileVersion = fileHistory.getLastVersion(); switch (fileVersion.getStatus()) { case NEW: changedFiles.getNewFiles().add(fileVersion.getPath());
for (FileVersion fileVersion : fileVersions) { if (fileVersion.getVersion() == null || fileVersion.getType() == null || fileVersion.getPath() == null || fileVersion.getStatus() == null || fileVersion.getSize() == null || fileVersion.getLastModified() == null) { xmlOut.writeAttribute("version", fileVersion.getVersion()); xmlOut.writeAttribute("type", fileVersion.getType().toString()); xmlOut.writeAttribute("status", fileVersion.getStatus().toString());
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); }
@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); } }