/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.node;
import freenet.keys.KeyBlock;
public class LowLevelPutException extends Exception {
private static final long serialVersionUID = 1L;
/** An internal error occurred */
public static final int INTERNAL_ERROR = 1;
/** The request could not go enough hops to store the data properly. */
public static final int ROUTE_NOT_FOUND = 2;
/** A downstream node is overloaded, and rejected the insert. We should
* reduce our rate of sending inserts. */
public static final int REJECTED_OVERLOAD = 3;
/** Insert could not get off the node at all */
public static final int ROUTE_REALLY_NOT_FOUND = 4;
/** Insert collided with pre-existing, different content. Can only happen with KSKs and SSKs. */
public static final int COLLISION = 5;
/** Failure code */
public final int code;
private KeyBlock collidedBlock;
static String getMessage(int reason) {
switch(reason) {
case INTERNAL_ERROR:
return "Internal error - probably a bug";
case ROUTE_NOT_FOUND:
return "Could not store the data on enough nodes";
case REJECTED_OVERLOAD:
return "A node downstream either timed out or was overloaded (retry)";
case ROUTE_REALLY_NOT_FOUND:
return "The insert could not get off the node at all";
case COLLISION:
return "The insert collided with different data of the same key already on the network";
default:
return "Unknown error code: "+reason;
}
}
public LowLevelPutException(int code, String message, Throwable t) {
super(message, t);
this.code = code;
}
public LowLevelPutException(int reason) {
super(getMessage(reason));
this.code = reason;
}
public LowLevelPutException(KeyBlock collided) {
super(getMessage(COLLISION));
this.code = COLLISION;
collidedBlock = collided;
}
public synchronized void setCollidedBlock(KeyBlock block) {
collidedBlock = block;
}
public synchronized KeyBlock getCollidedBlock() {
return collidedBlock;
}
}