Rice Pastry API

org.mpisws.p2p.transport.peerreview
Class PeerReviewImpl<Handle extends RawSerializable,Identifier extends RawSerializable>

java.lang.Object
  extended by org.mpisws.p2p.transport.peerreview.PeerReviewImpl<Handle,Identifier>
Type Parameters:
Handle - (Usually a NodeHandle)
Identifier - (Permanent Identifier), can get an Identifier from a Handle
All Implemented Interfaces:
HashProvider, CertificateManager<Handle,Identifier>, IdentityTransport<Handle,Identifier>, IdentityTransportCallback<Handle,Identifier>, StatusChangeListener<Identifier>, PeerReview<Handle,Identifier>, PeerReviewConstants, TransportLayer<Handle,java.nio.ByteBuffer>, TransportLayerCallback<Handle,java.nio.ByteBuffer>, Destructable

public class PeerReviewImpl<Handle extends RawSerializable,Identifier extends RawSerializable>
extends java.lang.Object
implements TransportLayer<Handle,java.nio.ByteBuffer>, TransportLayerCallback<Handle,java.nio.ByteBuffer>, PeerReview<Handle,Identifier>, StatusChangeListener<Identifier>

Author:
Jeff Hoye

Field Summary
 
Fields inherited from interface org.mpisws.p2p.transport.peerreview.PeerReview
DONT_COMMIT, PEER_REVIEW_COMMIT, PEER_REVIEW_PASSTHROUGH, RELEVANT_LENGTH
 
Fields inherited from interface org.mpisws.p2p.transport.peerreview.PeerReviewConstants
CHAL_AUDIT, CHAL_SEND, DEFAULT_AUTH_PUSH_INTERVAL_MICROS, DEFAULT_CHECKPOINT_INTERVAL_MICROS, DEFAULT_TIME_TOLERANCE_MICROS, EVT_ACK, EVT_CHECKPOINT, EVT_INIT, EVT_MAX_SOCKET_EVT, EVT_MIN_SOCKET_EVT, EVT_RECV, EVT_SEND, EVT_SENDSIGN, EVT_SIGN, EVT_SOCKET_CAN_READ, EVT_SOCKET_CAN_RW, EVT_SOCKET_CAN_WRITE, EVT_SOCKET_CLOSE, EVT_SOCKET_CLOSED, EVT_SOCKET_EXCEPTION, EVT_SOCKET_OPEN_INCOMING, EVT_SOCKET_OPEN_OUTGOING, EVT_SOCKET_OPENED_OUTGOING, EVT_SOCKET_READ, EVT_SOCKET_SHUTDOWN_OUTPUT, EVT_SOCKET_WRITE, EX_TYPE_ClosedChannel, EX_TYPE_IO, EX_TYPE_Unknown, FLAG_FULL_MESSAGES_ALL, FLAG_FULL_MESSAGES_SENDER, FLAG_INCLUDE_CHECKPOINT, MAINTENANCE_INTERVAL_MICROS, MAX_STATUS_INFO, MSG_ACCUSATION, MSG_ACK, MSG_AUTHPUSH, MSG_AUTHREQ, MSG_AUTHRESP, MSG_CHALLENGE, MSG_RESPONSE, MSG_USERDATA, MSG_USERDGRAM, PROOF_INCONSISTENT, PROOF_NONCONFORMANT, RESP_AUDIT, RESP_SEND, STATUS_EXPOSED, STATUS_SUSPECTED, STATUS_TRUSTED, TI_AUTH_PUSH, TI_CHECKPOINT, TI_MAINTENANCE, TI_MAX_RESERVED, TI_STATUS_INFO
 
Constructor Summary
PeerReviewImpl(IdentityTransport<Handle,Identifier> transport, Environment env, Serializer<Handle> handleSerializer, Serializer<Identifier> idSerializer, IdentifierExtractor<Handle,Identifier> identifierExtractor, IdStrTranslator<Identifier> stringTranslator, AuthenticatorSerializer authenticatorSerialilzer, EvidenceSerializer evidenceSerializer)
           
 
Method Summary
 void acceptMessages(boolean b)
          Toggle accepting incoming messages.
 void acceptSockets(boolean b)
          Toggle accepting new sockets.
 boolean addAuthenticatorIfValid(AuthenticatorStore<Identifier> store, Identifier subject, Authenticator auth)
          Helper function called internally from the library.
 void challengeSuspectedNode(Handle handle)
           
 void destroy()
           
 Authenticator extractAuthenticator(Identifier id, long seq, short entryType, byte[] entryHash, byte[] hTopMinusOne, byte[] signature)
          A helper function that extracts an authenticator from an incoming message and adds it to our local store.
 PeerReviewCallback<Handle,Identifier> getApp()
           
 AuthenticatorSerializer getAuthenticatorSerializer()
           
 byte[] getEmptyHash()
           
 Environment getEnvironment()
           
 long getEvidenceSeq()
           
 EvidenceSerializer getEvidenceSerializer()
           
 Serializer<Handle> getHandleSerializer()
           
 short getHashSizeBytes()
           
 int getHashSizeInBytes()
           
 IdentifierExtractor<Handle,Identifier> getIdentifierExtractor()
           
 Serializer<Identifier> getIdSerializer()
           
 Identifier getLocalId()
           
 Handle getLocalIdentifier()
          The local node.
 short getSignatureSizeBytes()
           
 int getSignatureSizeInBytes()
           
 long getTime()
          Current time in millis, however, we depend on there being a timesource that is more discritized than the "wall" clock.
 boolean hasCertificate(Identifier id)
           
 byte[] hash(java.nio.ByteBuffer... hashMe)
           
 byte[] hash(long seq, short type, byte[] nodeHash, byte[] contentHash)
           
 void incomingSocket(P2PSocket<Handle> s)
          Notification of a new socket.
 void init(java.lang.String dirname)
           
 void messageReceived(Handle handle, java.nio.ByteBuffer message, java.util.Map<java.lang.String,java.lang.Object> options)
          Called when a new message is received.
 void notifyCertificateAvailable(Identifier id)
           
 void notifyStatusChange(Identifier id, int newStatus)
           
 SocketRequestHandle<Handle> openSocket(Handle i, SocketCallback<Handle> deliverSocketToMe, java.util.Map<java.lang.String,java.lang.Object> options)
          Open a socket to the Identifier
 void panic(java.lang.String s)
           
 Cancellable requestCertificate(Handle source, Identifier certHolder, Continuation<java.security.cert.X509Certificate,java.lang.Exception> c, java.util.Map<java.lang.String,java.lang.Object> options)
           
 void sendEvidenceToWitnesses(Identifier subject, long timestamp, Evidence evidence)
          Called internally by other classes if they have found evidence against one of our peers.
 MessageRequestHandle<Handle,java.nio.ByteBuffer> sendMessage(Handle target, java.nio.ByteBuffer message, MessageCallback<Handle,java.nio.ByteBuffer> deliverAckToMe, java.util.Map<java.lang.String,java.lang.Object> options)
          Send the message to the identifier
 void setApp(PeerReviewCallback<Handle,Identifier> callback)
           
 void setCallback(TransportLayerCallback<Handle,java.nio.ByteBuffer> callback)
          Set the callback for incoming sockets/messages
 void setErrorHandler(ErrorHandler<Handle> handler)
          To be notified of problems not related to an outgoing messaage/socket.
 byte[] sign(byte[] bytes)
           
 void statusChange(Identifier id, int newStatus)
           
 void transmit(Handle dest, PeerReviewMessage message, MessageCallback<Handle,java.nio.ByteBuffer> deliverAckToMe, java.util.Map<java.lang.String,java.lang.Object> options)
          Note, must include PEER_REVIEW_COMMIT and the type
 void verify(Identifier id, java.nio.ByteBuffer msg, java.nio.ByteBuffer signature)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

PeerReviewImpl

public PeerReviewImpl(IdentityTransport<Handle,Identifier> transport,
                      Environment env,
                      Serializer<Handle> handleSerializer,
                      Serializer<Identifier> idSerializer,
                      IdentifierExtractor<Handle,Identifier> identifierExtractor,
                      IdStrTranslator<Identifier> stringTranslator,
                      AuthenticatorSerializer authenticatorSerialilzer,
                      EvidenceSerializer evidenceSerializer)
Method Detail

notifyStatusChange

public void notifyStatusChange(Identifier id,
                               int newStatus)
Specified by:
notifyStatusChange in interface StatusChangeListener<Identifier extends RawSerializable>

init

public void init(java.lang.String dirname)
          throws java.io.IOException
Throws:
java.io.IOException

getApp

public PeerReviewCallback<Handle,Identifier> getApp()
Specified by:
getApp in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

openSocket

public SocketRequestHandle<Handle> openSocket(Handle i,
                                              SocketCallback<Handle> deliverSocketToMe,
                                              java.util.Map<java.lang.String,java.lang.Object> options)
Description copied from interface: TransportLayer
Open a socket to the Identifier

Specified by:
openSocket in interface TransportLayer<Handle extends RawSerializable,java.nio.ByteBuffer>
Parameters:
i - who to open the socket to
deliverSocketToMe - the callback when the socket is opened
options - options on how to open the socket (don't source route, encrypt etc) (may not be respected if layer cannot provide service)
Returns:
an object to cancel opening the socket if it takes to long, or is no longer relevant

incomingSocket

public void incomingSocket(P2PSocket<Handle> s)
                    throws java.io.IOException
Description copied from interface: TransportLayerCallback
Notification of a new socket.

Specified by:
incomingSocket in interface TransportLayerCallback<Handle extends RawSerializable,java.nio.ByteBuffer>
Parameters:
s - the incoming socket
Throws:
java.io.IOException

sendMessage

public MessageRequestHandle<Handle,java.nio.ByteBuffer> sendMessage(Handle target,
                                                                    java.nio.ByteBuffer message,
                                                                    MessageCallback<Handle,java.nio.ByteBuffer> deliverAckToMe,
                                                                    java.util.Map<java.lang.String,java.lang.Object> options)
Description copied from interface: TransportLayer
Send the message to the identifier

Specified by:
sendMessage in interface TransportLayer<Handle extends RawSerializable,java.nio.ByteBuffer>
Parameters:
target - the destination
message - the message
deliverAckToMe - layer dependent notification when the message is sent (can indicate placed on the wire, point-to-point acknowledgment, or end-to-end acknowledgement)
options - delivery options (don't source route, encrypt etc) (may not be respected if layer cannot provide service)
Returns:
ability to cancel the message if no longer relevant

messageReceived

public void messageReceived(Handle handle,
                            java.nio.ByteBuffer message,
                            java.util.Map<java.lang.String,java.lang.Object> options)
                     throws java.io.IOException
Description copied from interface: TransportLayerCallback
Called when a new message is received.

Specified by:
messageReceived in interface TransportLayerCallback<Handle extends RawSerializable,java.nio.ByteBuffer>
Parameters:
handle - The node it is coming from
message - the message
options - describe how the message arrived (udp/tcp, encrypted etc)
Throws:
java.io.IOException - if there is a problem decoding the message

panic

public void panic(java.lang.String s)

acceptMessages

public void acceptMessages(boolean b)
Description copied from interface: TransportLayer
Toggle accepting incoming messages. Useful in flow control if overwhelmed by incoming sockets. Default: true

Specified by:
acceptMessages in interface TransportLayer<Handle extends RawSerializable,java.nio.ByteBuffer>

acceptSockets

public void acceptSockets(boolean b)
Description copied from interface: TransportLayer
Toggle accepting new sockets. Useful in flow control if overwhelmed by incoming sockets. Default: true

Specified by:
acceptSockets in interface TransportLayer<Handle extends RawSerializable,java.nio.ByteBuffer>

getLocalId

public Identifier getLocalId()

getLocalIdentifier

public Handle getLocalIdentifier()
Description copied from interface: TransportLayer
The local node.

Specified by:
getLocalIdentifier in interface TransportLayer<Handle extends RawSerializable,java.nio.ByteBuffer>
Returns:
The local node.

setApp

public void setApp(PeerReviewCallback<Handle,Identifier> callback)

setCallback

public void setCallback(TransportLayerCallback<Handle,java.nio.ByteBuffer> callback)
Description copied from interface: TransportLayer
Set the callback for incoming sockets/messages

Specified by:
setCallback in interface TransportLayer<Handle extends RawSerializable,java.nio.ByteBuffer>
Parameters:
callback - the callback for incoming sockets/messages

setErrorHandler

public void setErrorHandler(ErrorHandler<Handle> handler)
Description copied from interface: TransportLayer
To be notified of problems not related to an outgoing messaage/socket. Or to be notified if a callback isn't provided.

Specified by:
setErrorHandler in interface TransportLayer<Handle extends RawSerializable,java.nio.ByteBuffer>
Parameters:
handler - to be notified of problems not related to a specific messaage/socket.

destroy

public void destroy()
Specified by:
destroy in interface Destructable

getAuthenticatorSerializer

public AuthenticatorSerializer getAuthenticatorSerializer()
Specified by:
getAuthenticatorSerializer in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

getEnvironment

public Environment getEnvironment()
Specified by:
getEnvironment in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

getIdSerializer

public Serializer<Identifier> getIdSerializer()
Specified by:
getIdSerializer in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

getTime

public long getTime()
Description copied from interface: PeerReview
Current time in millis, however, we depend on there being a timesource that is more discritized than the "wall" clock. It is only advanced on a timeout or a message receipt.

Specified by:
getTime in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>
Returns:

extractAuthenticator

public Authenticator extractAuthenticator(Identifier id,
                                          long seq,
                                          short entryType,
                                          byte[] entryHash,
                                          byte[] hTopMinusOne,
                                          byte[] signature)
                                   throws java.io.IOException
A helper function that extracts an authenticator from an incoming message and adds it to our local store.

Specified by:
extractAuthenticator in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>
Throws:
java.io.IOException

addAuthenticatorIfValid

public boolean addAuthenticatorIfValid(AuthenticatorStore<Identifier> store,
                                       Identifier subject,
                                       Authenticator auth)
Helper function called internally from the library. It takes a (potentially new) authenticator and adds it to our local store if (a) it hasn't been recorded before, and (b) its signature is valid.

Specified by:
addAuthenticatorIfValid in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

getEvidenceSeq

public long getEvidenceSeq()
Specified by:
getEvidenceSeq in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

getHandleSerializer

public Serializer<Handle> getHandleSerializer()
Specified by:
getHandleSerializer in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

getHashSizeInBytes

public int getHashSizeInBytes()
Specified by:
getHashSizeInBytes in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

getSignatureSizeInBytes

public int getSignatureSizeInBytes()
Specified by:
getSignatureSizeInBytes in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

getIdentifierExtractor

public IdentifierExtractor<Handle,Identifier> getIdentifierExtractor()
Specified by:
getIdentifierExtractor in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

challengeSuspectedNode

public void challengeSuspectedNode(Handle handle)
Specified by:
challengeSuspectedNode in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>

sendEvidenceToWitnesses

public void sendEvidenceToWitnesses(Identifier subject,
                                    long timestamp,
                                    Evidence evidence)
Called internally by other classes if they have found evidence against one of our peers. We ask the EvidenceTransferProtocol to send it to the corresponding witness set.

Specified by:
sendEvidenceToWitnesses in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>
Parameters:
subject - the "bad" guy

transmit

public void transmit(Handle dest,
                     PeerReviewMessage message,
                     MessageCallback<Handle,java.nio.ByteBuffer> deliverAckToMe,
                     java.util.Map<java.lang.String,java.lang.Object> options)
Note, must include PEER_REVIEW_COMMIT and the type

Specified by:
transmit in interface PeerReview<Handle extends RawSerializable,Identifier extends RawSerializable>
Parameters:
dest -
message -
deliverAckToMe -
options -

notifyCertificateAvailable

public void notifyCertificateAvailable(Identifier id)
Specified by:
notifyCertificateAvailable in interface IdentityTransportCallback<Handle extends RawSerializable,Identifier extends RawSerializable>

statusChange

public void statusChange(Identifier id,
                         int newStatus)
Specified by:
statusChange in interface IdentityTransportCallback<Handle extends RawSerializable,Identifier extends RawSerializable>

hasCertificate

public boolean hasCertificate(Identifier id)
Specified by:
hasCertificate in interface CertificateManager<Handle extends RawSerializable,Identifier extends RawSerializable>

requestCertificate

public Cancellable requestCertificate(Handle source,
                                      Identifier certHolder,
                                      Continuation<java.security.cert.X509Certificate,java.lang.Exception> c,
                                      java.util.Map<java.lang.String,java.lang.Object> options)
Specified by:
requestCertificate in interface CertificateManager<Handle extends RawSerializable,Identifier extends RawSerializable>

sign

public byte[] sign(byte[] bytes)
Specified by:
sign in interface CertificateManager<Handle extends RawSerializable,Identifier extends RawSerializable>

getSignatureSizeBytes

public short getSignatureSizeBytes()
Specified by:
getSignatureSizeBytes in interface CertificateManager<Handle extends RawSerializable,Identifier extends RawSerializable>

verify

public void verify(Identifier id,
                   java.nio.ByteBuffer msg,
                   java.nio.ByteBuffer signature)
            throws java.security.SignatureException,
                   UnknownCertificateException
Specified by:
verify in interface CertificateManager<Handle extends RawSerializable,Identifier extends RawSerializable>
Throws:
java.security.SignatureException
UnknownCertificateException

getEmptyHash

public byte[] getEmptyHash()
Specified by:
getEmptyHash in interface HashProvider

getHashSizeBytes

public short getHashSizeBytes()
Specified by:
getHashSizeBytes in interface HashProvider

hash

public byte[] hash(long seq,
                   short type,
                   byte[] nodeHash,
                   byte[] contentHash)
Specified by:
hash in interface HashProvider

hash

public byte[] hash(java.nio.ByteBuffer... hashMe)
Specified by:
hash in interface HashProvider

getEvidenceSerializer

public EvidenceSerializer getEvidenceSerializer()

Rice Pastry API

Copyright © 2001-2005 - Rice Pastry.