tikhomirov@591: /* tikhomirov@591: * Copyright (c) 2013 TMate Software Ltd tikhomirov@591: * tikhomirov@591: * This program is free software; you can redistribute it and/or modify tikhomirov@591: * it under the terms of the GNU General Public License as published by tikhomirov@591: * the Free Software Foundation; version 2 of the License. tikhomirov@591: * tikhomirov@591: * This program is distributed in the hope that it will be useful, tikhomirov@591: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@591: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@591: * GNU General Public License for more details. tikhomirov@591: * tikhomirov@591: * For information on how to redistribute this software under tikhomirov@591: * the terms of a license other than GNU General Public License tikhomirov@591: * contact TMate Software at support@hg4j.com tikhomirov@591: */ tikhomirov@591: package org.tmatesoft.hg.internal; tikhomirov@591: tikhomirov@591: import java.io.File; tikhomirov@591: import java.io.IOException; tikhomirov@591: import java.lang.ref.SoftReference; tikhomirov@591: import java.util.HashMap; tikhomirov@591: tikhomirov@591: import org.tmatesoft.hg.repo.HgInvalidControlFileException; tikhomirov@591: import org.tmatesoft.hg.util.Path; tikhomirov@591: tikhomirov@591: /** tikhomirov@591: * Factory to create {@link RevlogStream RevlogStreams}, cache-capable. tikhomirov@591: * tikhomirov@591: * @author Artem Tikhomirov tikhomirov@591: * @author TMate Software Ltd. tikhomirov@591: */ tikhomirov@591: public final class RevlogStreamFactory { tikhomirov@591: tikhomirov@591: private final Internals repo; tikhomirov@591: private final HashMap> streamsCache; tikhomirov@591: tikhomirov@591: tikhomirov@591: public RevlogStreamFactory(Internals hgRepo, boolean shallCacheRevlogs) { tikhomirov@591: repo = hgRepo; tikhomirov@591: if (shallCacheRevlogs) { tikhomirov@591: streamsCache = new HashMap>(); tikhomirov@591: } else { tikhomirov@591: streamsCache = null; tikhomirov@591: } tikhomirov@591: } tikhomirov@591: tikhomirov@591: /** tikhomirov@591: * Creates a stream for specified file, doesn't cache stream tikhomirov@591: */ tikhomirov@591: /*package-local*/ RevlogStream create(File f) { tikhomirov@591: return new RevlogStream(repo.getDataAccess(), f); tikhomirov@591: } tikhomirov@591: tikhomirov@591: /** tikhomirov@591: * Perhaps, should be separate interface, like ContentLookup tikhomirov@591: * @param path - normalized file name tikhomirov@591: * @return null if path doesn't resolve to a existing file tikhomirov@591: */ tikhomirov@591: /*package-local*/ RevlogStream resolveStoreFile(Path path) { tikhomirov@591: final SoftReference ref = shallCacheRevlogs() ? streamsCache.get(path) : null; tikhomirov@591: RevlogStream cached = ref == null ? null : ref.get(); tikhomirov@591: if (cached != null) { tikhomirov@591: return cached; tikhomirov@591: } tikhomirov@591: File f = repo.getFileFromDataDir(path); tikhomirov@591: if (f.exists()) { tikhomirov@591: RevlogStream s = create(f); tikhomirov@591: if (shallCacheRevlogs()) { tikhomirov@591: streamsCache.put(path, new SoftReference(s)); tikhomirov@591: } tikhomirov@591: return s; tikhomirov@591: } tikhomirov@591: return null; tikhomirov@591: } tikhomirov@591: tikhomirov@591: /*package-local*/ RevlogStream createStoreFile(Path path) throws HgInvalidControlFileException { tikhomirov@591: File f = repo.getFileFromDataDir(path); tikhomirov@591: try { tikhomirov@591: if (!f.exists()) { tikhomirov@591: f.getParentFile().mkdirs(); tikhomirov@591: f.createNewFile(); tikhomirov@591: } tikhomirov@591: RevlogStream s = create(f); tikhomirov@591: if (shallCacheRevlogs()) { tikhomirov@591: streamsCache.put(path, new SoftReference(s)); tikhomirov@591: } tikhomirov@591: return s; tikhomirov@591: } catch (IOException ex) { tikhomirov@591: throw new HgInvalidControlFileException("Can't create a file in the storage", ex, f); tikhomirov@591: } tikhomirov@591: } tikhomirov@591: tikhomirov@591: private boolean shallCacheRevlogs() { tikhomirov@591: return streamsCache != null; tikhomirov@591: } tikhomirov@591: }