001package edu.wpi.first.wpilibj.networktables2.server;
002
003import edu.wpi.first.wpilibj.networktables2.*;
004import edu.wpi.first.wpilibj.networktables2.stream.*;
005import edu.wpi.first.wpilibj.networktables2.thread.*;
006import edu.wpi.first.wpilibj.networktables2.type.*;
007
008/**
009 * A server node in NetworkTables 2.0
010 * 
011 * @author Mitchell
012 *
013 */
014public class NetworkTableServer extends NetworkTableNode implements ServerIncomingConnectionListener{
015        private final ServerIncomingStreamMonitor incomingStreamMonitor;
016        private final WriteManager writeManager;
017        private final IOStreamProvider streamProvider;
018        private final ServerConnectionList connectionList;
019
020        /**
021         * Create a NetworkTable Server
022         * 
023         * @param streamProvider
024         * @param threadManager
025         * @param transactionPool
026         */
027        public NetworkTableServer(final IOStreamProvider streamProvider, final NetworkTableEntryTypeManager typeManager, final NTThreadManager threadManager){
028                ServerNetworkTableEntryStore entryStore;
029                init(entryStore = new ServerNetworkTableEntryStore(this));
030                this.streamProvider = streamProvider;
031                
032                connectionList = new ServerConnectionList();
033                writeManager = new WriteManager(connectionList, threadManager, getEntryStore(), Long.MAX_VALUE);
034
035                incomingStreamMonitor = new ServerIncomingStreamMonitor(streamProvider, entryStore, this, connectionList, typeManager, threadManager);
036                
037                getEntryStore().setIncomingReceiver(new TransactionDirtier(writeManager));
038                getEntryStore().setOutgoingReceiver(new TransactionDirtier(writeManager));
039                
040                incomingStreamMonitor.start();
041                writeManager.start();
042        }
043        /**
044         * Create a NetworkTable Server
045         * 
046         * @param streamProvider
047         */
048        public NetworkTableServer(final IOStreamProvider streamProvider){
049                this(streamProvider, new NetworkTableEntryTypeManager(), new DefaultThreadManager());
050        }
051        
052        public void close(){
053                try {
054                        incomingStreamMonitor.stop();
055                        writeManager.stop();
056                        connectionList.closeAll();
057                        Thread.sleep(1000);//To get around bug where an error will occur in select if the socket server is closed before all sockets finish closing
058                        streamProvider.close();
059                        Thread.sleep(1000);
060                } catch (Exception e) {
061                        e.printStackTrace();
062                }
063        }
064
065        public void onNewConnection(ServerConnectionAdapter connectionAdapter) {
066                connectionList.add(connectionAdapter);
067        }
068
069        
070        public boolean isConnected() {
071                return true;
072        }
073
074        
075        public boolean isServer() {
076                return true;
077        }
078
079}