tikhomirov@480: /* tikhomirov@480: * Copyright (c) 2012 TMate Software Ltd tikhomirov@480: * tikhomirov@480: * This program is free software; you can redistribute it and/or modify tikhomirov@480: * it under the terms of the GNU General Public License as published by tikhomirov@480: * the Free Software Foundation; version 2 of the License. tikhomirov@480: * tikhomirov@480: * This program is distributed in the hope that it will be useful, tikhomirov@480: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@480: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@480: * GNU General Public License for more details. tikhomirov@480: * tikhomirov@480: * For information on how to redistribute this software under tikhomirov@480: * the terms of a license other than GNU General Public License tikhomirov@480: * contact TMate Software at support@hg4j.com tikhomirov@480: */ tikhomirov@480: package org.tmatesoft.hg.internal; tikhomirov@480: tikhomirov@480: import static org.tmatesoft.hg.util.LogFacility.Severity.Warn; tikhomirov@480: tikhomirov@480: import java.io.BufferedReader; tikhomirov@480: import java.io.File; tikhomirov@480: import java.io.FileReader; tikhomirov@480: import java.io.IOException; tikhomirov@480: import java.util.Collection; tikhomirov@480: tikhomirov@480: import org.tmatesoft.hg.repo.HgInvalidFileException; tikhomirov@480: import org.tmatesoft.hg.repo.ext.MqManager; tikhomirov@480: import org.tmatesoft.hg.util.LogFacility; tikhomirov@480: tikhomirov@480: /** tikhomirov@480: * Handy class to read line-based configuration files tikhomirov@480: * tikhomirov@480: * @author Artem Tikhomirov tikhomirov@480: * @author TMate Software Ltd. tikhomirov@480: */ tikhomirov@480: public final class LineReader { tikhomirov@480: tikhomirov@480: public interface LineConsumer { tikhomirov@480: // boolean begin(File f, T paramObj) throws IOException; tikhomirov@480: boolean consume(String line, T paramObj) throws IOException; tikhomirov@480: // boolean end(File f, T paramObj) throws IOException; tikhomirov@480: } tikhomirov@480: tikhomirov@480: public static class SimpleLineCollector implements LineReader.LineConsumer> { tikhomirov@480: tikhomirov@480: public boolean consume(String line, Collection result) throws IOException { tikhomirov@480: result.add(line); tikhomirov@480: return true; tikhomirov@480: } tikhomirov@480: } tikhomirov@480: tikhomirov@480: private final File file; tikhomirov@480: private final LogFacility log; tikhomirov@480: private boolean trimLines = true; tikhomirov@480: private boolean skipEmpty = true; tikhomirov@480: private String ignoreThatStarts = null; tikhomirov@480: tikhomirov@480: public LineReader(File f, LogFacility logFacility) { tikhomirov@480: file = f; tikhomirov@480: log = logFacility; tikhomirov@480: } tikhomirov@480: tikhomirov@480: /** tikhomirov@480: * default: true tikhomirov@480: * false to return line as is tikhomirov@480: */ tikhomirov@480: public LineReader trimLines(boolean trim) { tikhomirov@480: trimLines = trim; tikhomirov@480: return this; tikhomirov@480: } tikhomirov@480: tikhomirov@480: /** tikhomirov@480: * default: true tikhomirov@480: * false to pass empty lines to consumer tikhomirov@480: */ tikhomirov@480: public LineReader skipEmpty(boolean skip) { tikhomirov@480: skipEmpty = skip; tikhomirov@480: return this; tikhomirov@480: } tikhomirov@480: tikhomirov@480: /** tikhomirov@480: * default: doesn't skip any line. tikhomirov@480: * set e.g. to "#" or "//" to skip lines that start with such prefix tikhomirov@480: */ tikhomirov@480: public LineReader ignoreLineComments(String lineStart) { tikhomirov@480: ignoreThatStarts = lineStart; tikhomirov@480: return this; tikhomirov@480: } tikhomirov@480: tikhomirov@480: public void read(LineConsumer consumer, T paramObj) throws HgInvalidFileException { tikhomirov@480: BufferedReader statusFileReader = null; tikhomirov@480: try { tikhomirov@480: // consumer.begin(file, paramObj); tikhomirov@480: statusFileReader = new BufferedReader(new FileReader(file)); tikhomirov@480: String line; tikhomirov@480: boolean ok = true; tikhomirov@480: while (ok && (line = statusFileReader.readLine()) != null) { tikhomirov@480: if (trimLines) { tikhomirov@480: line = line.trim(); tikhomirov@480: } tikhomirov@480: if (ignoreThatStarts != null && line.startsWith(ignoreThatStarts)) { tikhomirov@480: continue; tikhomirov@480: } tikhomirov@480: if (!skipEmpty || line.length() > 0) { tikhomirov@480: ok = consumer.consume(line, paramObj); tikhomirov@480: } tikhomirov@480: } tikhomirov@480: } catch (IOException ex) { tikhomirov@480: throw new HgInvalidFileException(ex.getMessage(), ex, file); tikhomirov@480: } finally { tikhomirov@483: if (statusFileReader != null) { tikhomirov@483: try { tikhomirov@483: statusFileReader.close(); tikhomirov@483: } catch (IOException ex) { tikhomirov@483: log.dump(MqManager.class, Warn, ex, null); tikhomirov@483: } tikhomirov@480: } tikhomirov@480: // try { tikhomirov@480: // consumer.end(file, paramObj); tikhomirov@480: // } catch (IOException ex) { tikhomirov@480: // log.warn(MqManager.class, ex, null); tikhomirov@480: // } tikhomirov@480: } tikhomirov@480: } tikhomirov@480: }