else if (!checksum.equals(other.checksum)) { return false;
private void compareChecksum(FileVersionComparison fileComparison) { boolean isChecksumEqual = FileChecksum.fileChecksumEquals(fileComparison.expectedFileProperties.getChecksum(), fileComparison.actualFileProperties.getChecksum()); if (!isChecksumEqual) { fileComparison.fileChanges.add(FileChange.CHANGED_CHECKSUM); logger.log(Level.INFO, " - " + fileComparison.fileChanges + ": Local file DIFFERS from file version, expected CHECKSUM = {0}, but actual CHECKSUM = {1}, for file {2}", new Object[] { fileComparison.expectedFileProperties.checksum, fileComparison.actualFileProperties.checksum, fileComparison.actualFileProperties.getRelativePath() }); } }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((checksum == null) ? 0 : checksum.hashCode()); result = prime * result + ((dosAttributes == null) ? 0 : dosAttributes.hashCode()); result = prime * result + ((lastModified == null) ? 0 : lastModified.hashCode()); result = prime * result + ((linkTarget == null) ? 0 : linkTarget.hashCode()); result = prime * result + ((path == null) ? 0 : path.hashCode()); result = prime * result + ((posixPermissions == null) ? 0 : posixPermissions.hashCode()); result = prime * result + ((size == null) ? 0 : size.hashCode()); result = prime * result + ((status == null) ? 0 : status.hashCode()); result = prime * result + ((type == null) ? 0 : type.hashCode()); result = prime * result + ((updated == null) ? 0 : updated.hashCode()); result = prime * result + ((version == null) ? 0 : version.hashCode()); return result; }
fileContent.setChecksum(FileChecksum.parseFileChecksum(checksumStr)); fileContent.setSize(size); fileVersion.setChecksum(FileChecksum.parseFileChecksum(checksumStr));
try { if (fileProperties.size > 0) { fileProperties.checksum = new FileChecksum(FileUtil.createChecksum(file, checksumAlgorithm));
byte[] reconstructedFileExpectedChecksum = fileContent.getChecksum().getBytes(); byte[] reconstructedFileActualChecksum = reconstructedFileChecksum.digest();
if (fileProperties.getChecksum() != null) { Collection<PartialFileHistory> fileHistoriesWithSameChecksum = localDatabase .getFileHistoriesWithLastVersionByChecksumSizeAndModifiedDate(fileProperties.getChecksum().toString(), fileProperties.getSize(), new Date(fileProperties.getLastModified()));
&& FileChecksum.fileChecksumEquals(fileVersion.getChecksum(), lastFileVersion.getChecksum())) {
xmlOut.writeAttribute("checksum", fileVersion.getChecksum().toString());
String fileContentChecksumStr = (fileVersion.getChecksum() != null) ? fileVersion.getChecksum().toString() : null;
else if (!checksum.equals(other.checksum)) { return false;
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; }
PreparedStatement preparedStatement = getStatement(connection, "filecontent.insert.all.writeFileContents.sql"); preparedStatement.setString(1, fileContent.getChecksum().toString()); preparedStatement.setLong(2, databaseVersionId); preparedStatement.setLong(3, fileContent.getSize());
@Override public void onFileEnd(File file, byte[] rawFileChecksum) { // Get file attributes (get them while file exists) // Note: Do NOT move any File-methods (file.anything()) below the file.exists()-part, // because the file could vanish! FileChecksum fileChecksum = (rawFileChecksum != null) ? new FileChecksum(rawFileChecksum) : null; endFileProperties = fileVersionComparator.captureFileProperties(file, fileChecksum, false); // Check if file has vanished boolean fileIsLocked = endFileProperties.isLocked(); boolean fileVanished = !endFileProperties.exists(); boolean fileHasChanged = startFileProperties.getSize() != endFileProperties.getSize() || startFileProperties.getLastModified() != endFileProperties.getLastModified(); if (fileVanished || fileIsLocked || fileHasChanged) { logger.log(Level.FINER, "- /File: {0}", file); logger.log(Level.INFO, " * NOT ADDING because file has VANISHED (" + !endFileProperties.exists() + "), is LOCKED (" + endFileProperties.isLocked() + "), or has CHANGED (" + fileHasChanged + ")"); resetFileEnd(); return; } // If it's still there, add it to the database addFileVersion(endFileProperties); // Reset resetFileEnd(); }
/** * Note: This method selects also {@link DatabaseVersionStatus#DIRTY DIRTY}. */ public List<MultiChunkId> getMultiChunkIds(FileChecksum fileChecksum) { List<MultiChunkId> multiChunkIds = new ArrayList<MultiChunkId>(); if (fileChecksum == null) { return multiChunkIds; } else { try (PreparedStatement preparedStatement = getStatement("multichunk.select.all.getMultiChunkIdsForFileChecksum.sql")) { preparedStatement.setString(1, fileChecksum.toString()); try (ResultSet resultSet = preparedStatement.executeQuery()) { while (resultSet.next()) { multiChunkIds.add(MultiChunkId.parseMultiChunkId(resultSet.getString("multichunk_id"))); } return multiChunkIds; } } catch (SQLException e) { throw new RuntimeException(e); } } }
private FileContent getFileContentWithChunkChecksums(FileChecksum fileChecksum) { try (PreparedStatement preparedStatement = getStatement("filecontent.select.all.getFileContentByChecksumWithChunkChecksums.sql")) { preparedStatement.setString(1, fileChecksum.toString()); try (ResultSet resultSet = preparedStatement.executeQuery()) { FileContent fileContent = null; while (resultSet.next()) { if (fileContent == null) { fileContent = new FileContent(); fileContent.setChecksum(FileChecksum.parseFileChecksum(resultSet.getString("checksum"))); fileContent.setSize(resultSet.getLong("size")); } // Add chunk references ChunkChecksum chunkChecksum = ChunkChecksum.parseChunkChecksum(resultSet.getString("chunk_checksum")); fileContent.addChunk(chunkChecksum); } return fileContent; } } catch (SQLException e) { throw new RuntimeException(e); } }
private Map<FileChecksum, FileContent> createFileContents(ResultSet resultSet) throws SQLException { Map<FileChecksum, FileContent> fileContents = new HashMap<FileChecksum, FileContent>(); FileChecksum currentFileChecksum = null; while (resultSet.next()) { FileChecksum fileChecksum = FileChecksum.parseFileChecksum(resultSet.getString("checksum")); FileContent fileContent = null; if (currentFileChecksum != null && currentFileChecksum.equals(fileChecksum)) { fileContent = fileContents.get(fileChecksum); } else { fileContent = new FileContent(); fileContent.setChecksum(fileChecksum); fileContent.setSize(resultSet.getLong("size")); } ChunkChecksum chunkChecksum = ChunkChecksum.parseChunkChecksum(resultSet.getString("chunk_checksum")); fileContent.addChunk(chunkChecksum); fileContents.put(fileChecksum, fileContent); currentFileChecksum = fileChecksum; } return fileContents; }
private void writeFileContents(IndentXmlStreamWriter xmlOut, Collection<FileContent> fileContents) throws XMLStreamException { if (fileContents.size() > 0) { xmlOut.writeStartElement("fileContents"); for (FileContent fileContent : fileContents) { xmlOut.writeStartElement("fileContent"); xmlOut.writeAttribute("checksum", fileContent.getChecksum().toString()); xmlOut.writeAttribute("size", fileContent.getSize()); xmlOut.writeStartElement("chunkRefs"); Collection<ChunkChecksum> fileContentChunkChunks = fileContent.getChunks(); for (ChunkChecksum chunkChecksum : fileContentChunkChunks) { xmlOut.writeEmptyElement("chunkRef"); xmlOut.writeAttribute("ref", chunkChecksum.toString()); } xmlOut.writeEndElement(); // </chunkRefs> xmlOut.writeEndElement(); // </fileContent> } xmlOut.writeEndElement(); // </fileContents> } }
private FileContent getFileContentWithoutChunkChecksums(FileChecksum fileChecksum) { try (PreparedStatement preparedStatement = getStatement("filecontent.select.all.getFileContentByChecksumWithoutChunkChecksums.sql")) { preparedStatement.setString(1, fileChecksum.toString()); try (ResultSet resultSet = preparedStatement.executeQuery()) { if (resultSet.next()) { FileContent fileContent = new FileContent(); fileContent.setChecksum(FileChecksum.parseFileChecksum(resultSet.getString("checksum"))); fileContent.setSize(resultSet.getLong("size")); return fileContent; } } return null; } catch (SQLException e) { throw new RuntimeException(e); } }
public static FileChecksum parseFileChecksum(String s) { return new FileChecksum(ObjectId.parseObjectId(s)); }