comparison src/org/tmatesoft/hg/core/HgCallbackTargetException.java @ 215:41a778e3fd31

Issue 5: Facilities for progress and cancellation. More specific exceptions. Exceptions from callbacks as RuntimeException
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Tue, 17 May 2011 00:56:54 +0200
parents
children c251bbc979cf
comparison
equal deleted inserted replaced
214:4252faa556cd 215:41a778e3fd31
1 /*
2 * Copyright (c) 2011 TMate Software Ltd
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * For information on how to redistribute this software under
14 * the terms of a license other than GNU General Public License
15 * contact TMate Software at support@hg4j.com
16 */
17 package org.tmatesoft.hg.core;
18
19 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION;
20
21 import org.tmatesoft.hg.repo.HgRepository;
22 import org.tmatesoft.hg.util.Path;
23
24 /**
25 * Checked exception that indicates errors in client code and tries to supply extra information about the context it occured in.
26 *
27 * @author Artem Tikhomirov
28 * @author TMate Software Ltd.
29 */
30 @SuppressWarnings("serial")
31 public class HgCallbackTargetException extends HgException {
32 private int revNumber = BAD_REVISION;
33 private Nodeid revision;
34 private Path filename;
35
36 /**
37 * @param cause can't be <code>null</code>
38 */
39 public HgCallbackTargetException(Throwable cause) {
40 super((Throwable) null);
41 if (cause == null) {
42 throw new IllegalArgumentException();
43 }
44 if (cause.getClass() == Wrap.class) {
45 // eliminate wrapper
46 initCause(cause.getCause());
47 } else {
48 initCause(cause);
49 }
50 }
51
52 /**
53 * @return not {@link HgRepository#BAD_REVISION} only when local revision number was supplied at the construction time
54 */
55 public int getRevisionNumber() {
56 return revNumber;
57 }
58
59 public HgCallbackTargetException setRevisionNumber(int rev) {
60 revNumber = rev;
61 return this;
62 }
63
64 /**
65 * @return non-null only when revision was supplied at construction time
66 */
67 public Nodeid getRevision() {
68 return revision;
69 }
70
71 public HgCallbackTargetException setRevision(Nodeid r) {
72 revision = r;
73 return this;
74 }
75
76 /**
77 * @return non-null only if file name was set at construction time
78 */
79 public Path getFileName() {
80 return filename;
81 }
82
83 public HgCallbackTargetException setFileName(Path name) {
84 filename = name;
85 return this;
86 }
87
88 @SuppressWarnings("unchecked")
89 public <T extends Exception> T getTargetException() {
90 return (T) getCause();
91 }
92
93 /**
94 * Despite this exception is merely a way to give users access to their own exceptions, it may still supply
95 * valuable debugging information about what led to the error.
96 */
97 @Override
98 public String getMessage() {
99 StringBuilder sb = new StringBuilder();
100 if (filename != null) {
101 sb.append(filename);
102 sb.append(':');
103 sb.append(' ');
104 }
105 if (revNumber != BAD_REVISION) {
106 sb.append(revNumber);
107 if (revision != null) {
108 sb.append(':');
109 }
110 }
111 if (revision != null) {
112 sb.append(revision.shortNotation());
113 }
114 return sb.toString();
115 }
116
117 /**
118 * Given the approach high-level handlers throw RuntimeExceptions to indicate errors, and
119 * a need to throw reasonable checked exception from client code, clients may utilize this class
120 * to get their checked exceptions unwrapped by {@link HgCallbackTargetException} and serve as that
121 * exception cause, eliminating {@link RuntimeException} mediator.
122 */
123 public static final class Wrap extends RuntimeException {
124
125 public Wrap(Throwable cause) {
126 super(cause);
127 if (cause == null) {
128 throw new IllegalArgumentException();
129 }
130 }
131 }
132 }