diff src/org/tmatesoft/hg/core/HgInvalidRevisionException.java @ 347:8da7ade36c57

Add specific IAE subclass to handle wrong (e.g. outdated after rollback) revisions
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Tue, 22 Nov 2011 05:25:57 +0100
parents
children 8107b95f4280
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org/tmatesoft/hg/core/HgInvalidRevisionException.java	Tue Nov 22 05:25:57 2011 +0100
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2011 TMate Software Ltd
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * For information on how to redistribute this software under
+ * the terms of a license other than GNU General Public License
+ * contact TMate Software at support@hg4j.com
+ */
+package org.tmatesoft.hg.core;
+
+import org.tmatesoft.hg.internal.Experimental;
+import org.tmatesoft.hg.repo.HgRepository;
+
+/**
+ * Use of revision or local revision index that is not valid for a given revlog.
+ *  
+ * @author Artem Tikhomirov
+ * @author TMate Software Ltd.
+ */
+@SuppressWarnings("serial")
+@Experimental(reason="1) Whether to use checked or runtime exception is not yet decided. 2) Perhaps, its use not bound to wrong arguments")
+public class HgInvalidRevisionException extends IllegalArgumentException {
+	private Nodeid rev;
+	private Integer revIdx;
+	// next two make sense only when revIdx is present
+	private int rangeLeftBoundary = -1, rangeRightBoundary = -1;
+
+	/**
+	 * 
+	 * this exception is not expected to be initialized with another exception, although those who need to, 
+	 * may still use {@link #initCause(Throwable)}
+	 * @param message optional description of the issue
+	 * @param revision invalid revision, may be  <code>null</code> if revisionIndex is used
+	 * @param revisionIndex invalid revision index, may be <code>null</code> if not known and revision is supplied 
+	 */
+	public HgInvalidRevisionException(String message, Nodeid revision, Integer revisionIndex) {
+		super(message);
+		assert revision != null || revisionIndex != null; 
+		rev = revision;
+		revIdx = revisionIndex;
+	}
+
+	public HgInvalidRevisionException(Nodeid revision) {
+		this(null, revision, null);
+	}
+	
+	public HgInvalidRevisionException(int revisionIndex) {
+		this(null, null, revisionIndex);
+	}
+
+	public Nodeid getRevision() {
+		return rev;
+	}
+	
+	public Integer getRevisionIndex() {
+		return revIdx;
+	}
+
+	public HgInvalidRevisionException setRevision(Nodeid revision) {
+		assert revision != null;
+		rev = revision;
+		return this;
+	}
+	
+	// int, not Integer is on purpose, not to clear exception completely
+	public HgInvalidRevisionException setRevisionIndex(int revisionIndex) {
+		revIdx = revisionIndex;
+		return this;
+	}
+
+	public HgInvalidRevisionException setRevisionIndex(int revisionIndex, int rangeLeft, int rangeRight) {
+		revIdx = revisionIndex;
+		rangeLeftBoundary = rangeLeft;
+		rangeRightBoundary = rangeRight;
+		return this;
+	}
+
+	@Override
+	public String getMessage() {
+		String msg = super.getMessage();
+		if (msg != null) {
+			return msg;
+		}
+		StringBuilder sb = new StringBuilder();
+		sb.append('[');
+		if (rev != null) {
+			sb.append(rev.shortNotation());
+			sb.append(' ');
+		}
+		if (revIdx != null) {
+			String sr;
+			switch (revIdx) {
+			case HgRepository.BAD_REVISION : sr = "UNKNOWN"; break;
+			case HgRepository.TIP : sr = "TIP"; break;
+			case HgRepository.WORKING_COPY: sr = "WORKING-COPY"; break;
+			default : sr = revIdx.toString();
+			}
+			if (rangeLeftBoundary != -1 || rangeRightBoundary != -1) {
+				sb.append(String.format("%s is not from [%d..%d]", sr, rangeLeftBoundary, rangeRightBoundary));
+			} else {
+				sb.append(sr);
+			}
+		}
+		sb.append(']');
+		return sb.toString();
+	}
+}