2004-04-08 04:41:54 +00:00
package net.i2p.data.i2np ;
/ *
* free ( adj . ) : unencumbered ; not under the control of others
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
* Written by jrandom in 2003 and released into the public domain
* with no warranty of any kind , either expressed or implied .
* It probably won ' t make your computer catch on fire , or eat
2004-04-08 04:41:54 +00:00
* your children , but it might . Use at your own risk .
*
* /
import java.io.IOException ;
import java.util.ArrayList ;
import java.util.List ;
2004-05-17 03:38:53 +00:00
import net.i2p.I2PAppContext ;
2004-04-08 04:41:54 +00:00
import net.i2p.data.DataHelper ;
import net.i2p.data.Hash ;
import net.i2p.util.Log ;
/ * *
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
* Defines the message a router sends to another router in response to a
* search ( DatabaseFindNearest or DatabaseLookup ) when it doesn ' t have the value ,
2004-04-08 04:41:54 +00:00
* specifying what routers it would search .
*
* @author jrandom
* /
public class DatabaseSearchReplyMessage extends I2NPMessageImpl {
private final static Log _log = new Log ( DatabaseSearchReplyMessage . class ) ;
public final static int MESSAGE_TYPE = 3 ;
private Hash _key ;
2004-07-27 17:34:36 +00:00
private List _peerHashes ;
2004-04-08 04:41:54 +00:00
private Hash _from ;
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
public DatabaseSearchReplyMessage ( I2PAppContext context ) {
super ( context ) ;
2004-07-25 23:35:50 +00:00
_context . statManager ( ) . createRateStat ( " netDb.searchReplyMessageSend " , " How many search reply messages we send " , " Network Database " , new long [ ] { 60 * 1000 , 5 * 60 * 1000 , 10 * 60 * 1000 , 60 * 60 * 1000 } ) ;
_context . statManager ( ) . createRateStat ( " netDb.searchReplyMessageReceive " , " How many search reply messages we receive " , " Network Database " , new long [ ] { 60 * 1000 , 5 * 60 * 1000 , 10 * 60 * 1000 , 60 * 60 * 1000 } ) ;
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
setSearchKey ( null ) ;
2004-07-27 17:34:36 +00:00
_peerHashes = new ArrayList ( 3 ) ;
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
setFromHash ( null ) ;
2004-04-08 04:41:54 +00:00
}
/ * *
* Defines the key being searched for
* /
public Hash getSearchKey ( ) { return _key ; }
public void setSearchKey ( Hash key ) { _key = key ; }
2004-07-27 17:34:36 +00:00
public int getNumReplies ( ) { return _peerHashes . size ( ) ; }
public Hash getReply ( int index ) { return ( Hash ) _peerHashes . get ( index ) ; }
public void addReply ( Hash peer ) { _peerHashes . add ( peer ) ; }
//public void addReplies(Collection replies) { _peerHashes.addAll(replies); }
2004-04-08 04:41:54 +00:00
public Hash getFromHash ( ) { return _from ; }
public void setFromHash ( Hash from ) { _from = from ; }
2004-10-08 02:08:10 +00:00
public void readMessage ( byte data [ ] , int offset , int dataSize , int type ) throws I2NPMessageException , IOException {
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
if ( type ! = MESSAGE_TYPE ) throw new I2NPMessageException ( " Message type is incorrect for this message " ) ;
2004-10-08 02:08:10 +00:00
int curIndex = offset ;
byte keyData [ ] = new byte [ Hash . HASH_LENGTH ] ;
System . arraycopy ( data , curIndex , keyData , 0 , Hash . HASH_LENGTH ) ;
curIndex + = Hash . HASH_LENGTH ;
_key = new Hash ( keyData ) ;
int num = ( int ) DataHelper . fromLong ( data , curIndex , 1 ) ;
curIndex + + ;
_peerHashes . clear ( ) ;
for ( int i = 0 ; i < num ; i + + ) {
byte peer [ ] = new byte [ Hash . HASH_LENGTH ] ;
System . arraycopy ( data , curIndex , peer , 0 , Hash . HASH_LENGTH ) ;
curIndex + = Hash . HASH_LENGTH ;
addReply ( new Hash ( peer ) ) ;
}
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
2004-10-08 02:08:10 +00:00
byte from [ ] = new byte [ Hash . HASH_LENGTH ] ;
System . arraycopy ( data , curIndex , from , 0 , Hash . HASH_LENGTH ) ;
curIndex + = Hash . HASH_LENGTH ;
_from = new Hash ( from ) ;
2004-07-25 23:35:50 +00:00
2004-10-08 02:08:10 +00:00
_context . statManager ( ) . addRateData ( " netDb.searchReplyMessageReceive " , num * 32 + 64 , 1 ) ;
2004-04-08 04:41:54 +00:00
}
2004-10-07 19:19:51 +00:00
/** calculate the message body's length (not including the header and footer */
protected int calculateWrittenLength ( ) {
return Hash . HASH_LENGTH + 1 + getNumReplies ( ) * Hash . HASH_LENGTH + Hash . HASH_LENGTH ;
}
/** write the message body to the output array, starting at the given index */
protected int writeMessageBody ( byte out [ ] , int curIndex ) throws I2NPMessageException {
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
if ( _key = = null )
throw new I2NPMessageException ( " Key in reply to not specified " ) ;
2004-07-27 17:34:36 +00:00
if ( _peerHashes = = null )
throw new I2NPMessageException ( " Peer replies are null " ) ;
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
if ( _from = = null )
throw new I2NPMessageException ( " No 'from' address specified! " ) ;
2004-07-25 23:35:50 +00:00
2004-10-07 19:19:51 +00:00
System . arraycopy ( _key . getData ( ) , 0 , out , curIndex , Hash . HASH_LENGTH ) ;
curIndex + = Hash . HASH_LENGTH ;
byte len [ ] = DataHelper . toLong ( 1 , _peerHashes . size ( ) ) ;
out [ curIndex + + ] = len [ 0 ] ;
for ( int i = 0 ; i < getNumReplies ( ) ; i + + ) {
System . arraycopy ( getReply ( i ) . getData ( ) , 0 , out , curIndex , Hash . HASH_LENGTH ) ;
curIndex + = Hash . HASH_LENGTH ;
2004-04-08 04:41:54 +00:00
}
2004-10-07 19:19:51 +00:00
System . arraycopy ( _from . getData ( ) , 0 , out , curIndex , Hash . HASH_LENGTH ) ;
curIndex + = Hash . HASH_LENGTH ;
return curIndex ;
2004-04-08 04:41:54 +00:00
}
public int getType ( ) { return MESSAGE_TYPE ; }
public boolean equals ( Object object ) {
if ( ( object ! = null ) & & ( object instanceof DatabaseSearchReplyMessage ) ) {
DatabaseSearchReplyMessage msg = ( DatabaseSearchReplyMessage ) object ;
return DataHelper . eq ( getSearchKey ( ) , msg . getSearchKey ( ) ) & &
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
DataHelper . eq ( getFromHash ( ) , msg . getFromHash ( ) ) & &
2004-07-27 17:34:36 +00:00
DataHelper . eq ( _peerHashes , msg . _peerHashes ) ;
2004-04-08 04:41:54 +00:00
} else {
return false ;
}
}
public int hashCode ( ) {
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
return DataHelper . hashCode ( getSearchKey ( ) ) +
DataHelper . hashCode ( getFromHash ( ) ) +
2004-07-27 17:34:36 +00:00
DataHelper . hashCode ( _peerHashes ) ;
2004-04-08 04:41:54 +00:00
}
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
public String toString ( ) {
2004-04-08 04:41:54 +00:00
StringBuffer buf = new StringBuffer ( ) ;
buf . append ( " [DatabaseSearchReplyMessage: " ) ;
buf . append ( " \ n \ tSearch Key: " ) . append ( getSearchKey ( ) ) ;
buf . append ( " \ n \ tReplies: # = " ) . append ( getNumReplies ( ) ) ;
big ol' update to strip out the singletons, replacing them with
a rooted app context. The core itself has its own I2PAppContext
(see its javadoc for, uh, docs), and the router extends that to
expose the router's singletons. The main point of this is to
make it so that we can run multiple routers in the same JVM, even
to allow different apps in the same JVM to switch singleton
implementations (e.g. run some routers with one set of profile
calculators, and other routers with a different one).
There is still some work to be done regarding the actual boot up
of multiple routers in a JVM, as well as their configuration,
though the plan is to have the RouterContext override the
I2PAppContext's getProperty/getPropertyNames methods to read from
a config file (seperate ones per context) instead of using the
System.getProperty that the base I2PAppContext uses.
Once the multi-router is working, i'll shim in a VMCommSystem
that doesn't depend upon sockets or threads to read/write (and
that uses configurable message send delays / disconnects / etc,
perhaps using data from the routerContext.getProperty to drive it).
I could hold off until the sim is all working, but there's a
truckload of changes in here and I hate dealing with conflicts ;)
Everything works - I've been running 'er for a while and kicked
the tires a bit, but if you see something amiss, please let me
know.
2004-04-24 11:54:35 +00:00
for ( int i = 0 ; i < getNumReplies ( ) ; i + + ) {
buf . append ( " \ n \ t \ tReply [ " ) . append ( i ) . append ( " ]: " ) . append ( getReply ( i ) ) ;
}
2004-04-08 04:41:54 +00:00
buf . append ( " \ n \ tFrom: " ) . append ( getFromHash ( ) ) ;
buf . append ( " ] " ) ;
return buf . toString ( ) ;
}
}