blob: 7994234d9a50d1b6581a8a46a6fb8219433b0f72 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Google, Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stefan Xenos (Google) - Initial implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.nd;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jdt.internal.core.nd.db.ModificationLog.MemoryAccessLog;
import org.eclipse.jdt.internal.core.nd.db.Database;
import org.eclipse.jdt.internal.core.nd.db.IndexException;
import org.eclipse.jdt.internal.core.nd.db.RelatedAddress;
import org.eclipse.jdt.internal.core.nd.field.IField;
/**
* Given a set of memory ranges, this class constructs detailed error messages.
*/
public final class IndexExceptionBuilder {
private final Database db;
private final List<RelatedAddress> relatedAddresses = new ArrayList<>();
/**
* Constructs a new {@link IndexExceptionBuilder}
*/
public IndexExceptionBuilder(Database db) {
this.db = db;
}
/**
* Adds an address range to this problem description, given the first address that may be corrupt,
* the size of the possibly-corrupt address range, and a custom description for the memory at this
* address range.
*/
public IndexExceptionBuilder addProblemAddress(String description, long dataBlockAddress, int rangeSize) {
MemoryAccessLog lastWrite = this.db.getLog().getReportFor(dataBlockAddress, rangeSize);
this.relatedAddresses.add(new RelatedAddress(description, dataBlockAddress, rangeSize, lastWrite));
return this;
}
/**
* Adds an address range to this problem description, given a field that may be corrupt, the base
* address for its struct, and a custom description for the field.
*
* @return this
*/
public IndexExceptionBuilder addProblemAddress(String description, IField field, long address) {
long offset = field.getOffset();
int size = field.getRecordSize();
return addProblemAddress(description, address + offset, size);
}
/**
* Adds an address range to this problem description, given the field that may be corrupt
* and the base address for its struct.
*
* @return this
*/
public IndexExceptionBuilder addProblemAddress(IField field, long address) {
return addProblemAddress(field.getFieldName(), field, address);
}
/**
* Returns a newly constructed {@link IndexException} containing the given message and all the addresses collected
* by this object.
*/
public IndexException build(String description) {
IndexException toThrow = new IndexException(description);
if (this.db.getLog().enabled()) {
toThrow.setTime(this.db.getLog().getWriteCount());
}
attachTo(toThrow);
return toThrow;
}
/**
* Attaches the addresses collected by the receiver to the given exception.
*/
public void attachTo(IndexException exception) {
for (RelatedAddress next : this.relatedAddresses) {
exception.addRelatedAddress(next);
}
}
}