tikhomirov@403: /* tikhomirov@403: * Copyright (c) 2012 TMate Software Ltd tikhomirov@403: * tikhomirov@403: * This program is free software; you can redistribute it and/or modify tikhomirov@403: * it under the terms of the GNU General Public License as published by tikhomirov@403: * the Free Software Foundation; version 2 of the License. tikhomirov@403: * tikhomirov@403: * This program is distributed in the hope that it will be useful, tikhomirov@403: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@403: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@403: * GNU General Public License for more details. tikhomirov@403: * tikhomirov@403: * For information on how to redistribute this software under tikhomirov@403: * the terms of a license other than GNU General Public License tikhomirov@403: * contact TMate Software at support@hg4j.com tikhomirov@403: */ tikhomirov@403: package org.tmatesoft.hg.internal; tikhomirov@403: tikhomirov@403: import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; tikhomirov@423: import static org.tmatesoft.hg.repo.HgRepository.NO_REVISION; tikhomirov@423: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@423: import static org.tmatesoft.hg.repo.HgRepository.WORKING_COPY; tikhomirov@403: tikhomirov@403: import java.io.File; tikhomirov@403: tikhomirov@403: import org.tmatesoft.hg.core.Nodeid; tikhomirov@403: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@403: import org.tmatesoft.hg.util.Path; tikhomirov@403: tikhomirov@403: /** tikhomirov@403: * Extras to record with exception to describe it better. tikhomirov@403: * XXX perhaps, not only with exception, may utilize it with status object? tikhomirov@403: * tikhomirov@403: * @author Artem Tikhomirov tikhomirov@403: * @author TMate Software Ltd. tikhomirov@403: */ tikhomirov@403: public class ExceptionInfo { tikhomirov@403: protected final T owner; tikhomirov@423: protected Integer revNumber = null; tikhomirov@403: protected Nodeid revision; tikhomirov@403: protected Path filename; tikhomirov@403: protected File localFile; tikhomirov@423: // next two make sense only when revNumber was set tikhomirov@423: private int rangeLeftBoundary = BAD_REVISION, rangeRightBoundary = BAD_REVISION; tikhomirov@403: tikhomirov@403: /** tikhomirov@403: * @param owner instance to return from setters tikhomirov@403: */ tikhomirov@403: public ExceptionInfo(T owner) { tikhomirov@403: this.owner = owner; tikhomirov@403: } tikhomirov@403: tikhomirov@403: /** tikhomirov@403: * @return not {@link HgRepository#BAD_REVISION} only when revision index was supplied at the construction time tikhomirov@403: */ tikhomirov@403: public int getRevisionIndex() { tikhomirov@423: return revNumber == null ? HgRepository.BAD_REVISION : revNumber; tikhomirov@403: } tikhomirov@403: tikhomirov@403: public T setRevisionIndex(int rev) { tikhomirov@403: revNumber = rev; tikhomirov@403: return owner; tikhomirov@403: } tikhomirov@403: tikhomirov@403: public boolean isRevisionIndexSet() { tikhomirov@423: return revNumber != null; tikhomirov@403: } tikhomirov@403: tikhomirov@403: /** tikhomirov@403: * @return non-null only when revision was supplied at construction time tikhomirov@403: */ tikhomirov@403: public Nodeid getRevision() { tikhomirov@403: return revision; tikhomirov@403: } tikhomirov@403: tikhomirov@403: public T setRevision(Nodeid r) { tikhomirov@403: revision = r; tikhomirov@403: return owner; tikhomirov@403: } tikhomirov@403: tikhomirov@403: public boolean isRevisionSet() { tikhomirov@403: return revision != null; tikhomirov@403: } tikhomirov@403: tikhomirov@403: /** tikhomirov@403: * @return non-null only if file name was set at construction time tikhomirov@403: */ tikhomirov@403: public Path getFileName() { tikhomirov@403: return filename; tikhomirov@403: } tikhomirov@403: tikhomirov@403: public T setFileName(Path name) { tikhomirov@403: filename = name; tikhomirov@403: return owner; tikhomirov@403: } tikhomirov@403: tikhomirov@403: public T setFile(File file) { tikhomirov@403: localFile = file; tikhomirov@403: return owner; tikhomirov@403: } tikhomirov@403: tikhomirov@403: /** tikhomirov@403: * @return file object that causes troubles, or null if specific file is unknown tikhomirov@403: */ tikhomirov@403: public File getFile() { tikhomirov@403: return localFile; tikhomirov@403: } tikhomirov@423: tikhomirov@423: public T setRevisionIndexBoundary(int revisionIndex, int rangeLeft, int rangeRight) { tikhomirov@423: setRevisionIndex(revisionIndex); tikhomirov@423: rangeLeftBoundary = rangeLeft; tikhomirov@423: rangeRightBoundary = rangeRight; tikhomirov@423: return owner; tikhomirov@423: } tikhomirov@403: tikhomirov@403: public StringBuilder appendDetails(StringBuilder sb) { tikhomirov@403: if (filename != null) { tikhomirov@403: sb.append("path:'"); tikhomirov@403: sb.append(filename); tikhomirov@403: sb.append('\''); tikhomirov@403: sb.append(';'); tikhomirov@403: sb.append(' '); tikhomirov@403: } tikhomirov@485: if (isRevisionIndexSet() || isRevisionSet()) { tikhomirov@485: if (isRevisionIndexSet()) { tikhomirov@485: if (rangeLeftBoundary != BAD_REVISION || rangeRightBoundary != BAD_REVISION) { tikhomirov@485: String sr; tikhomirov@485: switch (getRevisionIndex()) { tikhomirov@485: case BAD_REVISION: tikhomirov@485: sr = "UNKNOWN"; break; tikhomirov@485: case TIP: tikhomirov@485: sr = "TIP"; break; tikhomirov@485: case WORKING_COPY: tikhomirov@485: sr = "WORKING-COPY"; break; tikhomirov@485: case NO_REVISION: tikhomirov@485: sr = "NO REVISION"; break; tikhomirov@485: default: tikhomirov@485: sr = String.valueOf(getRevisionIndex()); tikhomirov@485: } tikhomirov@485: sb.append(String.format("%s is not from [%d..%d]", sr, rangeLeftBoundary, rangeRightBoundary)); tikhomirov@485: } else { tikhomirov@485: sb.append("rev:"); tikhomirov@485: sb.append(getRevisionIndex()); tikhomirov@485: if (isRevisionSet()) { tikhomirov@485: sb.append(':'); tikhomirov@485: // fall-through to get revision appended tikhomirov@485: } tikhomirov@423: } tikhomirov@403: } tikhomirov@485: if (isRevisionSet()) { tikhomirov@485: sb.append(getRevision().shortNotation()); tikhomirov@485: } tikhomirov@403: } tikhomirov@403: if (localFile != null) { tikhomirov@403: sb.append(';'); tikhomirov@403: sb.append(' '); tikhomirov@403: sb.append(" file:"); tikhomirov@403: sb.append(localFile.getPath()); tikhomirov@403: sb.append(','); tikhomirov@403: if (localFile.exists()) { tikhomirov@403: sb.append("EXISTS"); tikhomirov@403: } else { tikhomirov@403: sb.append("DOESN'T EXIST"); tikhomirov@403: } tikhomirov@403: } tikhomirov@403: return sb; tikhomirov@403: } tikhomirov@403: }