// $Id: Message.java,v 1.5 2004-11-05 12:07:19 tigran Exp $ package diskCacheV111.vehicles; import javax.security.auth.Subject; import java.io.Serializable; import dmg.cells.nucleus.HasDiagnosticContext; import org.dcache.auth.Subjects; // Base class for all Messages public class Message implements Serializable, HasDiagnosticContext { private boolean _replyRequired; private boolean _isReply; private int _returnCode; private Object _errorObject; private long _id; private Subject _subject; private static final long serialVersionUID = 2056896713066252504L; public Message(){ } public Message(boolean replyRequired){ _replyRequired = replyRequired; } @Override public String toString(){ return _returnCode==0?"":"("+_returnCode+")="+_errorObject ; } public void setSucceeded(){ setReply(0,null); } public void setFailedConditionally(int rc, Serializable errorObject) { if (getReturnCode() == 0) { setFailed(rc, errorObject); } } public void setFailed(int errorCode, Serializable errorObject){ setReply(errorCode, errorObject); } public void setReply(){ _isReply = true ; } public void setReply(int returnCode, Serializable errorObject){ _isReply = true; _returnCode = returnCode; _errorObject = errorObject; } public boolean isReply(){ return _isReply; } public void clearReply(){ //allows us to reuse message objects _isReply = false; _returnCode = 0; _errorObject = null; } public int getReturnCode(){ return _returnCode; } public Serializable getErrorObject(){ return (Serializable) _errorObject; } public boolean getReplyRequired(){ return _replyRequired; } public void setReplyRequired(boolean replyRequired){ _replyRequired = replyRequired; } public void setId( long id ){ _id = id ; } public long getId(){ return _id ; } public void setSubject(Subject subject) { _subject = subject; } public Subject getSubject() { return (_subject == null) ? Subjects.ROOT : _subject; } /** * Returns a human readable name of the message class. By default * this is the short class name with the "Message" or "Msg" suffix * removed. */ public String getMessageName() { String name = getClass().getSimpleName(); int length = name.length(); if ((length > 7) && name.endsWith("Message")) { name = name.substring(0, name.length() - 7); } else if ((length > 3) && name.endsWith("Msg")) { name = name.substring(0, name.length() - 3); } return name; } @Override public String getDiagnosticContext() { return getMessageName(); } /** * Returns true if this message could possibly change the effect * or result of <code>message</code>. * * In a message queue, a message can be used to fold other * messages as long as it is not invalidated by any intermediate * messages. */ public boolean invalidates(Message message) { return true; } /** * Folds the reply of another Messages into this Message. * * For some Messages the correct reply can be derived from the * reply of another Message. In those cases processing of this * Message can be skipped and instead the reply of the other * Message can be folded into this Message. * * A prerequiste for folding to succeed is that this Message is * side effect free. It does however not matter whether the other * Message has side effects. * * This method updates this Message by extracting the correct * reply from the Message given as an argument. If successfull, * this Message can be send as a valid reply back to the * requestor. If not successful, this Message is unmodified. * * @param message Another Message to fold into this Message * @return true if the operation succeeded, false otherwise * @see invalidates */ public boolean fold(Message message) { return false; } }