@Override public MultiChunkId createNewMultiChunkId(Chunk firstChunk) { byte[] newMultiChunkId = new byte[firstChunk.getChecksum().length]; secureRandom.nextBytes(newMultiChunkId); return new MultiChunkId(newMultiChunkId); }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof MultiChunkEntry)) { return false; } MultiChunkEntry other = (MultiChunkEntry) obj; if (chunks == null) { if (other.chunks != null) { return false; } } else if (!chunks.equals(other.chunks)) { return false; } if (id == null) { if (other.id != null) { return false; } } else if (!id.equals(other.id)) { return false; } return true; }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((chunks == null) ? 0 : chunks.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; }
MultiChunkId multiChunkId = MultiChunkId.parseMultiChunkId(multChunkIdStr); long size = Long.parseLong(attributes.getValue("size"));
while (resultSet.next()) { result.put(ChunkChecksum.parseChunkChecksum(resultSet.getString("chunk_checksum")), MultiChunkId.parseMultiChunkId(resultSet.getString("multichunk_id")));
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof MultiChunk)) { return false; } MultiChunk other = (MultiChunk) obj; if (id == null) { if (other.id != null) { return false; } } else if (!id.equals(other.id)) { return false; } if (minSize != other.minSize) { return false; } if (size != other.size) { return false; } return true; } }
/** * 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 void writeMultiChunks(IndentXmlStreamWriter xmlOut, Collection<MultiChunkEntry> multiChunks) throws XMLStreamException { if (multiChunks.size() > 0) { xmlOut.writeStartElement("multiChunks"); for (MultiChunkEntry multiChunk : multiChunks) { xmlOut.writeStartElement("multiChunk"); xmlOut.writeAttribute("id", multiChunk.getId().toString()); xmlOut.writeAttribute("size", multiChunk.getSize()); xmlOut.writeStartElement("chunkRefs"); Collection<ChunkChecksum> multiChunkChunks = multiChunk.getChunks(); for (ChunkChecksum chunkChecksum : multiChunkChunks) { xmlOut.writeEmptyElement("chunkRef"); xmlOut.writeAttribute("ref", chunkChecksum.toString()); } xmlOut.writeEndElement(); // </chunkRefs> xmlOut.writeEndElement(); // </multiChunk> } xmlOut.writeEndElement(); // </multiChunks> } }
private Map<MultiChunkId, MultiChunkEntry> createMultiChunkEntriesWithChunks(ResultSet resultSet) throws SQLException { Map<MultiChunkId, MultiChunkEntry> multiChunkEntries = new HashMap<MultiChunkId, MultiChunkEntry>(); MultiChunkId currentMultiChunkId = null; while (resultSet.next()) { MultiChunkId multiChunkId = MultiChunkId.parseMultiChunkId(resultSet.getString("multichunk_id")); long multiChunkSize = resultSet.getLong("size"); MultiChunkEntry multiChunkEntry = null; if (currentMultiChunkId != null && currentMultiChunkId.equals(multiChunkId)) { multiChunkEntry = multiChunkEntries.get(multiChunkId); } else { multiChunkEntry = new MultiChunkEntry(multiChunkId, multiChunkSize); } multiChunkEntry.addChunk(ChunkChecksum.parseChunkChecksum(resultSet.getString("chunk_checksum"))); multiChunkEntries.put(multiChunkId, multiChunkEntry); currentMultiChunkId = multiChunkId; } return multiChunkEntries; } }
private MultiChunk createNewMultiChunk(File tempDir, MultiChunker customMultiChunker, Transformer transformer) { FileOutputStream fos; MultiChunkId multiChunkId = MultiChunkId.secureRandomMultiChunkId(); MultiChunk customChunk = null; try { fos = new FileOutputStream(tempDir.getAbsolutePath() + "/MultiChunk" + multiChunkId); customChunk = customMultiChunker.createMultiChunk(multiChunkId, transformer.createOutputStream(fos)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } assertEquals(customChunk.getId(), multiChunkId); return customChunk; } }
/** * Note: This method selects also {@link DatabaseVersionStatus#DIRTY DIRTY}. */ public MultiChunkId getMultiChunkId(ChunkChecksum chunkChecksum) { try (PreparedStatement preparedStatement = getStatement("multichunk.select.all.getMultiChunkIdForChunk.sql")) { preparedStatement.setString(1, chunkChecksum.toString()); try (ResultSet resultSet = preparedStatement.executeQuery()) { if (resultSet.next()) { return MultiChunkId.parseMultiChunkId(resultSet.getString("multichunk_id")); } } return null; } catch (SQLException e) { throw new RuntimeException(e); } }
public void writeMuddyMultiChunks(Map<DatabaseVersionHeader, Collection<MultiChunkEntry>> muddyMultiChunksPerDatabaseVersion) throws SQLException { PreparedStatement preparedStatement = getStatement("multichunk_muddy.insert.muddy.writeMuddyMultiChunks.sql"); for (DatabaseVersionHeader muddyDatabaseVersionHeader : muddyMultiChunksPerDatabaseVersion.keySet()) { Collection<MultiChunkEntry> muddyMultiChunks = muddyMultiChunksPerDatabaseVersion.get(muddyDatabaseVersionHeader); for (MultiChunkEntry muddyMultiChunk : muddyMultiChunks) { String multiChunkIdStr = muddyMultiChunk.getId().toString(); String clientName = muddyDatabaseVersionHeader.getClient(); Long clientVersion = muddyDatabaseVersionHeader.getVectorClock().getClock(clientName); preparedStatement.setString(1, multiChunkIdStr); preparedStatement.setString(2, clientName); preparedStatement.setLong(3, clientVersion); preparedStatement.addBatch(); } } preparedStatement.executeBatch(); preparedStatement.close(); }
public List<MultiChunkId> getDirtyMultiChunkIds() { List<MultiChunkId> dirtyMultiChunkIds = new ArrayList<MultiChunkId>(); try (PreparedStatement preparedStatement = getStatement("multichunk.select.dirty.getDirtyMultiChunkIds.sql")) { try (ResultSet resultSet = preparedStatement.executeQuery()) { while (resultSet.next()) { dirtyMultiChunkIds.add(MultiChunkId.parseMultiChunkId(resultSet.getString("multichunk_id"))); } return dirtyMultiChunkIds; } } catch (SQLException e) { throw new RuntimeException(e); } }
public static MultiChunkId secureRandomMultiChunkId() { return new MultiChunkId(ObjectId.secureRandomBytes(MULTICHUNK_ID_LENGTH)); }
public static MultiChunkId parseMultiChunkId(String s) { return new MultiChunkId(ObjectId.parseObjectId(s)); } }
private Map<MultiChunkId, MultiChunkEntry> createMultiChunkEntriesWithoutChunks(ResultSet resultSet) throws SQLException { Map<MultiChunkId, MultiChunkEntry> unusedMultiChunkIds = new HashMap<MultiChunkId, MultiChunkEntry>(); while (resultSet.next()) { MultiChunkId multiChunkId = MultiChunkId.parseMultiChunkId(resultSet.getString("id")); long multiChunkSize = resultSet.getLong("size"); unusedMultiChunkIds.put(multiChunkId, new MultiChunkEntry(multiChunkId, multiChunkSize)); } return unusedMultiChunkIds; }
/** * Returns a file path of a encrypted multichunk file, * given the identifier of a multichunk. */ public File getEncryptedMultiChunkFile(MultiChunkId multiChunkId) { return getFileInCache(FILE_FORMAT_MULTICHUNK_ENCRYPTED, multiChunkId.toString()); }
private void writeMultiChunkRefs(Connection connection, MultiChunkEntry multiChunk) throws SQLException { PreparedStatement preparedStatement = getStatement("multichunk.insert.all.writeMultiChunkRefs.sql"); for (ChunkChecksum chunkChecksum : multiChunk.getChunks()) { preparedStatement.setString(1, multiChunk.getId().toString()); preparedStatement.setString(2, chunkChecksum.toString()); preparedStatement.addBatch(); } preparedStatement.executeBatch(); preparedStatement.close(); }
/** * Initializes a new multichunk file, given a multichunk identifier * * @param multiChunkId The identifier of the multichunk * @throws StorageException Never throws an exception */ public MultichunkRemoteFile(MultiChunkId multiChunkId) throws StorageException { super(String.format(NAME_FORMAT, multiChunkId.toString())); }
@Override public MultiChunkId createNewMultiChunkId(Chunk firstChunk) { // Note: In the real implementation, this should be random return new MultiChunkId(firstChunk.getChecksum()); }