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<String, Nodeid> idsMap;
tikhomirov@248: 	private final TreeMap<String, String> flagsMap;
tikhomirov@248: 	private final Pool<Nodeid> idsPool;
tikhomirov@248: 	private final Pool<String> 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<Nodeid> nodeidPool, Pool<String> filenamePool) {
tikhomirov@248: 		idsPool = nodeidPool;
tikhomirov@248: 		namesPool = filenamePool;
tikhomirov@248: 		idsMap = new TreeMap<String, Nodeid>();
tikhomirov@248: 		flagsMap = new TreeMap<String, String>();
tikhomirov@248: 	}
tikhomirov@248: 	
tikhomirov@248: 	public Collection<String> 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<String, Pair<Nodeid, String>> 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: }