tikhomirov@248: /* tikhomirov@248: * Copyright (c) 2011 TMate Software Ltd tikhomirov@248: * tikhomirov@248: * This program is free software; you can redistribute it and/or modify tikhomirov@248: * it under the terms of the GNU General Public License as published by tikhomirov@248: * the Free Software Foundation; version 2 of the License. tikhomirov@248: * tikhomirov@248: * This program is distributed in the hope that it will be useful, tikhomirov@248: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@248: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@248: * GNU General Public License for more details. tikhomirov@248: * tikhomirov@248: * For information on how to redistribute this software under tikhomirov@248: * the terms of a license other than GNU General Public License tikhomirov@248: * contact TMate Software at support@hg4j.com tikhomirov@248: */ tikhomirov@248: package org.tmatesoft.hg.internal; tikhomirov@248: tikhomirov@248: import java.util.Collection; tikhomirov@248: import java.util.TreeMap; tikhomirov@248: tikhomirov@248: import org.tmatesoft.hg.core.Nodeid; tikhomirov@248: import org.tmatesoft.hg.repo.HgManifest; tikhomirov@248: tikhomirov@248: /** tikhomirov@248: * Specific revision of the manifest. tikhomirov@248: * Note, suited to keep single revision only ({@link #changeset()}). tikhomirov@248: * tikhomirov@248: * @author Artem Tikhomirov tikhomirov@248: * @author TMate Software Ltd. tikhomirov@248: */ tikhomirov@248: public final class ManifestRevision implements HgManifest.Inspector { tikhomirov@248: private final TreeMap idsMap; tikhomirov@248: private final TreeMap flagsMap; tikhomirov@248: private final Pool idsPool; tikhomirov@248: private final Pool namesPool; tikhomirov@248: private Nodeid changeset; tikhomirov@248: private int changelogRev; tikhomirov@248: tikhomirov@248: // optional pools for effective management of nodeids and filenames (they are likely tikhomirov@248: // to be duplicated among different manifest revisions tikhomirov@248: public ManifestRevision(Pool nodeidPool, Pool filenamePool) { tikhomirov@248: idsPool = nodeidPool; tikhomirov@248: namesPool = filenamePool; tikhomirov@248: idsMap = new TreeMap(); tikhomirov@248: flagsMap = new TreeMap(); tikhomirov@248: } tikhomirov@248: tikhomirov@248: public Collection files() { tikhomirov@248: return idsMap.keySet(); tikhomirov@248: } tikhomirov@248: tikhomirov@248: public Nodeid nodeid(String fname) { tikhomirov@248: return idsMap.get(fname); tikhomirov@248: } tikhomirov@248: tikhomirov@248: public String flags(String fname) { tikhomirov@248: return flagsMap.get(fname); tikhomirov@248: } tikhomirov@248: tikhomirov@248: /** tikhomirov@248: * @return identifier of the changeset this manifest revision corresponds to. tikhomirov@248: */ tikhomirov@248: public Nodeid changeset() { tikhomirov@248: return changeset; tikhomirov@248: } tikhomirov@248: tikhomirov@248: public int changesetLocalRev() { tikhomirov@248: return changelogRev; tikhomirov@248: } tikhomirov@248: tikhomirov@248: // tikhomirov@248: tikhomirov@248: public boolean next(Nodeid nid, String fname, String flags) { tikhomirov@248: if (namesPool != null) { tikhomirov@248: fname = namesPool.unify(fname); tikhomirov@248: } tikhomirov@248: if (idsPool != null) { tikhomirov@248: nid = idsPool.unify(nid); tikhomirov@248: } tikhomirov@248: idsMap.put(fname, nid); tikhomirov@248: if (flags != null) { tikhomirov@248: // TreeMap$Entry takes 32 bytes. No reason to keep null for such price tikhomirov@248: // Perhaps, Map> might be better solution tikhomirov@248: flagsMap.put(fname, flags); tikhomirov@248: } tikhomirov@248: return true; tikhomirov@248: } tikhomirov@248: tikhomirov@248: public boolean end(int revision) { tikhomirov@248: // in fact, this class cares about single revision tikhomirov@248: return false; tikhomirov@248: } tikhomirov@248: tikhomirov@248: public boolean begin(int revision, Nodeid nid, int changelogRevision) { tikhomirov@248: if (changeset != null) { tikhomirov@248: idsMap.clear(); tikhomirov@248: flagsMap.clear(); tikhomirov@248: } tikhomirov@248: changeset = nid; tikhomirov@248: changelogRev = changelogRevision; tikhomirov@248: return true; tikhomirov@248: } tikhomirov@248: }