tikhomirov@525: /* tikhomirov@525: * Copyright (c) 2012-2013 TMate Software Ltd tikhomirov@525: * tikhomirov@525: * This program is free software; you can redistribute it and/or modify tikhomirov@525: * it under the terms of the GNU General Public License as published by tikhomirov@525: * the Free Software Foundation; version 2 of the License. tikhomirov@525: * tikhomirov@525: * This program is distributed in the hope that it will be useful, tikhomirov@525: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@525: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@525: * GNU General Public License for more details. tikhomirov@525: * tikhomirov@525: * For information on how to redistribute this software under tikhomirov@525: * the terms of a license other than GNU General Public License tikhomirov@525: * contact TMate Software at support@hg4j.com tikhomirov@525: */ tikhomirov@525: package org.tmatesoft.hg.internal; tikhomirov@525: tikhomirov@525: import java.io.File; tikhomirov@525: import java.io.FileOutputStream; tikhomirov@525: import java.io.IOException; tikhomirov@525: import java.nio.ByteBuffer; tikhomirov@525: import java.nio.channels.FileChannel; tikhomirov@525: tikhomirov@525: import org.tmatesoft.hg.repo.HgDataFile; tikhomirov@525: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@525: import org.tmatesoft.hg.util.ByteChannel; tikhomirov@525: import org.tmatesoft.hg.util.CancelledException; tikhomirov@525: import org.tmatesoft.hg.util.Path; tikhomirov@525: import org.tmatesoft.hg.util.LogFacility.Severity; tikhomirov@525: tikhomirov@525: /** tikhomirov@525: * tikhomirov@525: * @author Artem Tikhomirov tikhomirov@525: * @author TMate Software Ltd. tikhomirov@525: */ tikhomirov@525: public class WorkingDirFileWriter implements ByteChannel { tikhomirov@525: tikhomirov@525: tikhomirov@525: private final HgRepository repo; tikhomirov@525: private File dest; tikhomirov@525: private FileChannel destChannel; tikhomirov@525: private int totalBytesWritten; tikhomirov@525: tikhomirov@525: public WorkingDirFileWriter(HgRepository hgRepo) { tikhomirov@525: repo = hgRepo; tikhomirov@525: } tikhomirov@525: tikhomirov@525: public void processFile(HgDataFile df, int fileRevIndex) throws IOException { tikhomirov@525: try { tikhomirov@525: prepare(df.getPath()); tikhomirov@525: df.contentWithFilters(fileRevIndex, this); tikhomirov@525: } catch (CancelledException ex) { tikhomirov@525: repo.getSessionContext().getLog().dump(getClass(), Severity.Error, ex, "Our impl doesn't throw cancellation"); tikhomirov@525: } tikhomirov@525: finish(); tikhomirov@525: } tikhomirov@525: tikhomirov@525: public void prepare(Path fname) throws IOException { tikhomirov@525: String fpath = fname.toString(); tikhomirov@525: dest = new File(repo.getWorkingDir(), fpath); tikhomirov@525: if (fpath.indexOf('/') != -1) { tikhomirov@525: dest.getParentFile().mkdirs(); tikhomirov@525: } tikhomirov@525: destChannel = new FileOutputStream(dest).getChannel(); tikhomirov@525: totalBytesWritten = 0; tikhomirov@525: } tikhomirov@525: tikhomirov@525: public int write(ByteBuffer buffer) throws IOException, CancelledException { tikhomirov@525: int written = destChannel.write(buffer); tikhomirov@525: totalBytesWritten += written; tikhomirov@525: return written; tikhomirov@525: } tikhomirov@525: tikhomirov@525: public void finish() throws IOException { tikhomirov@525: destChannel.close(); tikhomirov@525: dest = null; tikhomirov@525: } tikhomirov@525: tikhomirov@525: public int bytesWritten() { tikhomirov@525: return totalBytesWritten; tikhomirov@525: } tikhomirov@525: }