tikhomirov@586: /* tikhomirov@586: * Copyright (c) 2013 TMate Software Ltd tikhomirov@586: * tikhomirov@586: * This program is free software; you can redistribute it and/or modify tikhomirov@586: * it under the terms of the GNU General Public License as published by tikhomirov@586: * the Free Software Foundation; version 2 of the License. tikhomirov@586: * tikhomirov@586: * This program is distributed in the hope that it will be useful, tikhomirov@586: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@586: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@586: * GNU General Public License for more details. tikhomirov@586: * tikhomirov@586: * For information on how to redistribute this software under tikhomirov@586: * the terms of a license other than GNU General Public License tikhomirov@586: * contact TMate Software at support@hg4j.com tikhomirov@586: */ tikhomirov@586: package org.tmatesoft.hg.internal; tikhomirov@586: tikhomirov@586: import java.io.File; tikhomirov@586: import java.io.FileInputStream; tikhomirov@586: import java.io.IOException; tikhomirov@586: import java.nio.ByteBuffer; tikhomirov@586: import java.nio.channels.FileChannel; tikhomirov@586: tikhomirov@586: import org.tmatesoft.hg.core.HgIOException; tikhomirov@618: import org.tmatesoft.hg.core.SessionContext; tikhomirov@618: import org.tmatesoft.hg.internal.DataSerializer.DataSource; tikhomirov@586: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@586: import org.tmatesoft.hg.util.Path; tikhomirov@586: tikhomirov@586: /** tikhomirov@618: * {@link DataSource} that reads from regular files tikhomirov@586: * tikhomirov@586: * @author Artem Tikhomirov tikhomirov@586: * @author TMate Software Ltd. tikhomirov@586: */ tikhomirov@618: public class FileContentSupplier implements DataSource { tikhomirov@618: private final File file; tikhomirov@618: private final SessionContext ctx; tikhomirov@586: tikhomirov@618: public FileContentSupplier(HgRepository repo, Path file) { tikhomirov@618: this(repo, new File(repo.getWorkingDir(), file.toString())); tikhomirov@586: } tikhomirov@586: tikhomirov@618: public FileContentSupplier(SessionContext.Source ctxSource, File f) { tikhomirov@618: ctx = ctxSource.getSessionContext(); tikhomirov@618: file = f; tikhomirov@586: } tikhomirov@586: tikhomirov@618: public void serialize(DataSerializer out) throws HgIOException { tikhomirov@618: FileInputStream fis = null; tikhomirov@618: try { tikhomirov@618: fis = new FileInputStream(file); tikhomirov@618: FileChannel fc = fis.getChannel(); tikhomirov@618: ByteBuffer buffer = ByteBuffer.allocate((int) Math.min(100*1024, fc.size())); tikhomirov@618: while (fc.read(buffer) != -1) { tikhomirov@618: buffer.flip(); tikhomirov@618: // #allocate() above ensures backing array tikhomirov@618: out.write(buffer.array(), 0, buffer.limit()); tikhomirov@618: buffer.clear(); tikhomirov@618: } tikhomirov@618: } catch (IOException ex) { tikhomirov@618: throw new HgIOException("Failed to get content of the file", ex, file); tikhomirov@618: } finally { tikhomirov@618: new FileUtils(ctx.getLog()).closeQuietly(fis); tikhomirov@586: } tikhomirov@586: } tikhomirov@618: tikhomirov@618: public int serializeLength() { tikhomirov@618: return Internals.ltoi(file.length()); tikhomirov@618: } tikhomirov@586: }