/* 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.clients.fcp;
import java.io.Serializable;
import java.net.MalformedURLException;
import freenet.client.FailureCodeTracker;
import freenet.client.InsertException;
import freenet.client.InsertException.InsertExceptionMode;
import freenet.keys.FreenetURI;
import freenet.node.Node;
import freenet.support.SimpleFieldSet;
public class PutFailedMessage extends FCPMessage implements Serializable {
private static final long serialVersionUID = 1L;
final InsertExceptionMode code;
final String codeDescription;
final String extraDescription;
final String shortCodeDescription;
final FailureCodeTracker tracker;
final FreenetURI expectedURI;
final String identifier;
final boolean global;
final boolean isFatal;
/**
* zero arg c'tor for db4o on jamvm
*/
@SuppressWarnings("unused")
private PutFailedMessage() {
tracker = null;
shortCodeDescription = null;
isFatal = false;
identifier = null;
global = false;
extraDescription = null;
expectedURI = null;
codeDescription = null;
code = null;
}
public PutFailedMessage(InsertException e, String identifier, boolean global) {
this.code = e.getMode();
this.codeDescription = InsertException.getMessage(code);
this.shortCodeDescription = InsertException.getShortMessage(code);
this.extraDescription = e.extra;
this.tracker = e.errorCodes;
this.expectedURI = e.uri;
this.identifier = identifier;
this.global = global;
this.isFatal = InsertException.isFatal(code);
}
/**
* Construct from a fieldset. Used in serialization of persistent requests.
* Will need to be made more tolerant of syntax errors if is used in an FCP
* client library. FIXME.
* @param useVerboseFields If true, read in verbose fields (CodeDescription
* etc), if false, reconstruct them from the error code.
* @throws MalformedURLException
*/
public PutFailedMessage(SimpleFieldSet fs, boolean useVerboseFields) throws MalformedURLException {
identifier = fs.get("Identifier");
if(identifier == null) throw new NullPointerException();
global = fs.getBoolean("Global", false);
code = InsertExceptionMode.getByCode(Integer.parseInt(fs.get("Code")));
if(useVerboseFields) {
codeDescription = fs.get("CodeDescription");
isFatal = fs.getBoolean("Fatal", false);
shortCodeDescription = fs.get("ShortCodeDescription");
} else {
codeDescription = InsertException.getMessage(code);
isFatal = InsertException.isFatal(code);
shortCodeDescription = InsertException.getShortMessage(code);
}
extraDescription = fs.get("ExtraDescription");
String euri = fs.get("ExpectedURI");
if(euri != null && euri.length() > 0)
expectedURI = new FreenetURI(euri);
else
expectedURI = null;
SimpleFieldSet trackerSubset = fs.subset("Errors");
if(trackerSubset != null) {
tracker = new FailureCodeTracker(true, trackerSubset);
} else {
tracker = null;
}
}
@Override
public SimpleFieldSet getFieldSet() {
return getFieldSet(true);
}
public SimpleFieldSet getFieldSet(boolean verbose) {
SimpleFieldSet fs = new SimpleFieldSet(true);
if(identifier == null)
throw new NullPointerException();
fs.putSingle("Identifier", identifier);
fs.put("Global", global);
fs.put("Code", code.code);
if(verbose)
fs.putSingle("CodeDescription", codeDescription);
if(extraDescription != null)
fs.putSingle("ExtraDescription", extraDescription);
if(tracker != null) {
fs.tput("Errors", tracker.toFieldSet(verbose));
}
if(verbose)
fs.put("Fatal", isFatal);
if(verbose)
fs.putSingle("ShortCodeDescription", shortCodeDescription);
if(expectedURI != null)
fs.putSingle("ExpectedURI", expectedURI.toString());
return fs;
}
@Override
public String getName() {
return "PutFailed";
}
@Override
public void run(FCPConnectionHandler handler, Node node)
throws MessageInvalidException {
throw new MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, "PutFailed goes from server to client not the other way around", identifier, global);
}
public String getShortFailedMessage() {
return shortCodeDescription;
}
public String getLongFailedMessage() {
if(extraDescription != null)
return shortCodeDescription + ": " + extraDescription;
else
return shortCodeDescription;
}
}