Changeset 110a0a1


Ignore:
Timestamp:
Nov 23, 2015 6:19:17 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
6081856
Parents:
c7d68c2
Message:

Remove singleton SAMv3DatagramServer; hang off of SAMBridge
SAMv3DatagramSession whitespace fixes
@since change to 0.9.24

Location:
apps/sam/java/src/net/i2p/sam
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • apps/sam/java/src/net/i2p/sam/ReadLine.java

    rc7d68c2 r110a0a1  
    1212 * Modified from I2PTunnelHTTPServer
    1313 *
    14  * @since 0.9.22
     14 * @since 0.9.24
    1515 */
    1616class ReadLine {
  • apps/sam/java/src/net/i2p/sam/SAMBridge.java

    rc7d68c2 r110a0a1  
    6161    private final File _configFile;
    6262    private volatile Thread _runner;
     63    private final Object _v3DGServerLock = new Object();
     64    private SAMv3DatagramServer _v3DGServer;
    6365
    6466    /**
     
    9698    public static final String PROP_DATAGRAM_PORT = "sam.udp.port";
    9799    protected static final String DEFAULT_DATAGRAM_HOST = "127.0.0.1";
    98     protected static final String DEFAULT_DATAGRAM_PORT = "7655";
     100    protected static final int DEFAULT_DATAGRAM_PORT_INT = 7655;
     101    protected static final String DEFAULT_DATAGRAM_PORT = Integer.toString(DEFAULT_DATAGRAM_PORT_INT);
    99102
    100103
     
    354357        }
    355358    }
     359
     360    /**
     361     * Was a static singleton, now a singleton for this bridge.
     362     * Instantiate and start server if it doesn't exist.
     363     * We only listen on one host and port, as specified in the
     364     * sam.udp.host and sam.udp.port properties.
     365     * TODO we could have multiple servers on different hosts/ports in the future.
     366     *
     367     * @param props non-null instantiate and start server if it doesn't exist
     368     * @param return non-null
     369     * @throws IOException if can't bind to host/port, or if different than existing
     370     * @since 0.9.24
     371     */
     372    SAMv3DatagramServer getV3DatagramServer(Properties props) throws IOException {
     373        String host = props.getProperty(PROP_DATAGRAM_HOST, DEFAULT_DATAGRAM_HOST);
     374        int port;
     375        String portStr = props.getProperty(PROP_DATAGRAM_PORT, DEFAULT_DATAGRAM_PORT);
     376        try {
     377            port = Integer.parseInt(portStr);
     378        } catch (NumberFormatException e) {
     379            port = DEFAULT_DATAGRAM_PORT_INT;
     380        }
     381        synchronized (_v3DGServerLock) {
     382            if (_v3DGServer == null) {
     383                _v3DGServer = new SAMv3DatagramServer(this, host, port, props);
     384                _v3DGServer.start();
     385            } else {
     386                if (_v3DGServer.getPort() != port || !_v3DGServer.getHost().equals(host))
     387                    throw new IOException("Already have V3 DatagramServer with host=" + host + " port=" + port);
     388            }
     389            return _v3DGServer;
     390        }
     391    }
     392
    356393
    357394    ////// begin ClientApp interface, use only if using correct construtor
     
    751788    }
    752789
    753     /** @since 0.9.22 */
     790    /** @since 0.9.24 */
    754791    public void saveConfig() throws IOException {
    755792        DataHelper.storeProps(i2cpProps, _configFile);
  • apps/sam/java/src/net/i2p/sam/SAMMessageSession.java

    rc7d68c2 r110a0a1  
    250250        }
    251251
    252         /** @since 0.9.22 */
     252        /** @since 0.9.24 */
    253253        public void messageAvailable(I2PSession session, int msgId, long size,
    254254                                     int proto, int fromPort, int toPort) {
  • apps/sam/java/src/net/i2p/sam/SAMv3DatagramServer.java

    rc7d68c2 r110a0a1  
    2727
    2828/**
    29  *  This is a singleton listening on 127.0.0.1:7655 or as specified by
     29 *  This is the thread listening on 127.0.0.1:7655 or as specified by
    3030 *  sam.udp.host and sam.udp.port properties.
    3131 *  This is used for both repliable and raw datagrams.
    3232 *
    33  *  @since 0.9.22 moved from SAMv3Handler
     33 *  @since 0.9.24 moved from SAMv3Handler
    3434 */
    3535class SAMv3DatagramServer implements Handler {
    3636       
    37         private static SAMv3DatagramServer _instance;
    38         private static DatagramChannel server;
     37        private final DatagramChannel _server;
    3938        private final Thread _listener;
    4039        private final SAMBridge _parent;
    41        
    42         /**
    43          *  Returns the singleton.
    44          *  If this is the first call, will be instantiated and will listen
    45          *  on the default host:port 127.0.0.1:7655.
    46          *  Don't make this the first call.
    47          */
    48         public static SAMv3DatagramServer getInstance() throws IOException {
    49                 return getInstance(null, new Properties());
    50         }
    51                
    52         /**
    53          *  Returns the singleton.
    54          *  If this is the first call, will be instantiated and will listen
    55          *  on the specified host:port, default 127.0.0.1:7655.
    56          *  Properties are sam.udp.host and sam.udp.port.
    57          *
    58          *  @param props ignored unless this is the first call
    59          */
    60         public static SAMv3DatagramServer getInstance(SAMBridge parent, Properties props) throws IOException {
    61                 synchronized(SAMv3DatagramServer.class) {
    62                         if (_instance==null) {
    63                                 _instance = new SAMv3DatagramServer(parent, props);
    64                                 _instance.start();
    65                         }
    66                 }
    67                 return _instance;
    68         }
     40        private final String _host;
     41        private final int _port;
    6942       
    7043        /**
     
    7346         *
    7447         *  @param parent may be null
     48         *  @param props ignored for now
    7549         */
    76         private SAMv3DatagramServer(SAMBridge parent, Properties props) throws IOException {
     50        public SAMv3DatagramServer(SAMBridge parent, String host, int port, Properties props) throws IOException {
    7751                _parent = parent;
    78                 synchronized(SAMv3DatagramServer.class) {
    79                         if (server==null)
    80                                 server = DatagramChannel.open();
    81                 }
     52                _server = DatagramChannel.open();
    8253               
    83                 String host = props.getProperty(SAMBridge.PROP_DATAGRAM_HOST, SAMBridge.DEFAULT_DATAGRAM_HOST);
    84                 String portStr = props.getProperty(SAMBridge.PROP_DATAGRAM_PORT, SAMBridge.DEFAULT_DATAGRAM_PORT);
    85                 int port ;
    86                 try {
    87                         port = Integer.parseInt(portStr);
    88                 } catch (NumberFormatException e) {
    89                         port = Integer.parseInt(SAMBridge.DEFAULT_DATAGRAM_PORT);
    90                 }
    91                
    92                 server.socket().bind(new InetSocketAddress(host, port));
    93                 _listener = new I2PAppThread(new Listener(server), "SAM DatagramListener " + port);
     54                _server.socket().bind(new InetSocketAddress(host, port));
     55                _listener = new I2PAppThread(new Listener(_server), "SAM DatagramListener " + port);
     56                _host = host;
     57                _port = port;
    9458        }
    9559       
     
    9862         *  @since 0.9.22
    9963         */
    100         private synchronized void start() {
     64        public synchronized void start() {
    10165                _listener.start();
    10266                if (_parent != null)
     
    10973         */
    11074        public synchronized void stopHandling() {
    111                 synchronized(SAMv3DatagramServer.class) {
    112                         if (server != null) {
    113                                 try {
    114                                         server.close();
    115                                 } catch (IOException ioe) {}
    116                                 server = null;
    117                         }
    118                 }
     75                try {
     76                        _server.close();
     77                } catch (IOException ioe) {}
    11978                _listener.interrupt();
    12079                if (_parent != null)
     
    12382       
    12483        public void send(SocketAddress addr, ByteBuffer msg) throws IOException {
    125                 server.send(msg, addr);
    126         }
     84                _server.send(msg, addr);
     85        }
     86
     87        /** @since 0.9.24 */
     88        public String getHost() { return _host; }
     89
     90        /** @since 0.9.24 */
     91        public int getPort() { return _port; }
    12792
    12893        private static class Listener implements Runnable {
  • apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java

    rc7d68c2 r110a0a1  
    3131         *   build a DatagramSession according to informations registered
    3232         *   with the given nickname
     33         *
    3334         * @param nick nickname of the session
    3435         * @throws IOException
     
    3637         * @throws I2PSessionException
    3738         */
    38         public SAMv3DatagramSession(String nick)
    39         throws IOException, DataFormatException, I2PSessionException, SAMException {
    40                
     39        public SAMv3DatagramSession(String nick, SAMv3DatagramServer dgServer)
     40                        throws IOException, DataFormatException, I2PSessionException, SAMException {
    4141                super(SAMv3Handler.sSessionsHash.get(nick).getDest(),
    4242                                SAMv3Handler.sSessionsHash.get(nick).getProps(),
    4343                                null  // to be replaced by this
    4444                                );
    45                 this.nick = nick ;
    46                 this.recv = this ;  // replacement
    47                 this.server = SAMv3DatagramServer.getInstance() ;
     45                this.nick = nick;
     46                this.recv = this;  // replacement
     47                this.server = dgServer;
    4848
    4949                SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick);
    50         if ( rec==null ) throw new SAMException("Record disappeared for nickname : \""+nick+"\"") ;
     50                if (rec == null)
     51                        throw new SAMException("Record disappeared for nickname : \""+nick+"\"");
    5152
    52         this.handler = rec.getHandler();
     53                this.handler = rec.getHandler();
    5354               
    54         Properties props = rec.getProps();
    55         String portStr = props.getProperty("PORT") ;
    56         if ( portStr==null ) {
    57                 _log.debug("receiver port not specified. Current socket will be used.");
    58                 this.clientAddress = null;
    59         }
    60         else {
    61                 int port = Integer.parseInt(portStr);
    62        
    63                 String host = props.getProperty("HOST");
    64                 if ( host==null ) {             
    65                         host = rec.getHandler().getClientIP();
    66                         _log.debug("no host specified. Taken from the client socket : " + host+':'+port);
    67                 }
    68 
    69        
    70                 this.clientAddress = new InetSocketAddress(host,port);
    71         }
     55                Properties props = rec.getProps();
     56                String portStr = props.getProperty("PORT");
     57                if (portStr == null) {
     58                        if (_log.shouldDebug())
     59                                _log.debug("receiver port not specified. Current socket will be used.");
     60                        this.clientAddress = null;
     61                } else {
     62                        int port = Integer.parseInt(portStr);
     63                        String host = props.getProperty("HOST");
     64                        if (host == null) {             
     65                                host = rec.getHandler().getClientIP();
     66                                if (_log.shouldDebug())
     67                                        _log.debug("no host specified. Taken from the client socket : " + host+':'+port);
     68                        }
     69                        this.clientAddress = new InetSocketAddress(host, port);
     70                }
    7271        }
    7372
  • apps/sam/java/src/net/i2p/sam/SAMv3Handler.java

    rc7d68c2 r110a0a1  
    251251         *  For SAMv3DatagramServer
    252252         *  @return may be null
    253          *  @since 0.9.22
     253         *  @since 0.9.24
    254254         */
    255255        Session getSession() {
     
    593593
    594594                                if (style.equals("RAW")) {
    595                                         SAMv3DatagramServer.getInstance(bridge, i2cpProps);
    596                                         SAMv3RawSession v3 = newSAMRawSession(nick);
     595                                        SAMv3DatagramServer dgs = bridge.getV3DatagramServer(props);
     596                                        SAMv3RawSession v3 = new SAMv3RawSession(nick, dgs);
    597597                                        rawSession = v3;
    598598                                        this.session = v3;
    599599                                } else if (style.equals("DATAGRAM")) {
    600                                         SAMv3DatagramServer.getInstance(bridge, i2cpProps);
    601                                         SAMv3DatagramSession v3 = newSAMDatagramSession(nick);
     600                                        SAMv3DatagramServer dgs = bridge.getV3DatagramServer(props);
     601                                        SAMv3DatagramSession v3 = new SAMv3DatagramSession(nick, dgs);
    602602                                        datagramSession = v3;
    603603                                        this.session = v3;
     
    653653        }
    654654
    655         private static SAMv3RawSession newSAMRawSession(String login )
    656                         throws IOException, DataFormatException, SAMException, I2PSessionException
    657         {
    658                 return new SAMv3RawSession( login ) ;
    659         }
    660 
    661         private static SAMv3DatagramSession newSAMDatagramSession(String login )
    662                         throws IOException, DataFormatException, SAMException, I2PSessionException
    663         {
    664                 return new SAMv3DatagramSession( login ) ;
    665         }
    666 
    667655        /* Parse and execute a STREAM message */
    668656        @Override
     
    864852        }
    865853       
    866         /** @since 0.9.22 */
     854        /** @since 0.9.24 */
    867855        public static void notifyStreamIncomingConnection(SocketChannel client, Destination d,
    868856                                                          int fromPort, int toPort) throws IOException {
     
    872860        }
    873861
    874         /** @since 0.9.22 */
     862        /** @since 0.9.24 */
    875863        private boolean execAuthMessage(String opcode, Properties props) {
    876864                if (opcode.equals("ENABLE")) {
     
    911899         * Handle a PING.
    912900         * Send a PONG.
    913          * @since 0.9.22
     901         * @since 0.9.24
    914902         */
    915903        private void execPingMessage(StringTokenizer tok) {
     
    925913        /**
    926914         * Handle a PONG.
    927          * @since 0.9.22
     915         * @since 0.9.24
    928916         */
    929917        private void execPongMessage(StringTokenizer tok) {
  • apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java

    rc7d68c2 r110a0a1  
    3737         * @throws I2PSessionException
    3838         */
    39         public SAMv3RawSession(String nick) throws IOException, DataFormatException, I2PSessionException {
     39        public SAMv3RawSession(String nick, SAMv3DatagramServer dgServer)
     40                        throws IOException, DataFormatException, I2PSessionException {
    4041                super(SAMv3Handler.sSessionsHash.get(nick).getDest(),
    4142                      SAMv3Handler.sSessionsHash.get(nick).getProps(),
     
    4445                this.nick = nick ;
    4546                this.recv = this ;  // replacement
    46                 this.server = SAMv3DatagramServer.getInstance() ;
     47                this.server = dgServer;
     48
    4749                SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick);
    4850                if (rec == null)
  • apps/sam/java/src/net/i2p/sam/SSLServerSocketChannel.java

    rc7d68c2 r110a0a1  
    2020 * Cannot be used for asynch ops.
    2121 *
    22  * @since 0.9.22
     22 * @since 0.9.24
    2323 */
    2424class SSLServerSocketChannel extends ServerSocketChannel {
  • apps/sam/java/src/net/i2p/sam/SSLSocketChannel.java

    rc7d68c2 r110a0a1  
    1919 * Cannot be used for asynch ops.
    2020 *
    21  * @since 0.9.22
     21 * @since 0.9.24
    2222 */
    2323class SSLSocketChannel extends SocketChannel {
  • apps/sam/java/src/net/i2p/sam/SSLUtil.java

    rc7d68c2 r110a0a1  
    2121 * Utilities for SAM SSL server sockets.
    2222 *
    23  * @since 0.9.22 adopted from net.i2p.i2ptunnel.SSLClientUtil
     23 * @since 0.9.24 adopted from net.i2p.i2ptunnel.SSLClientUtil
    2424 */
    2525class SSLUtil {
Note: See TracChangeset for help on using the changeset viewer.