Beispiel #1
0
        public void request(Object obj)
        // //throws InvalidOperationException, JCSPNetworkException
        {
            if (this.data.state == ConnectionDataState.CLIENT_STATE_MADE_REQ)
            {
                throw new InvalidOperationException("Cannot call request(Object) twice without calling reply()");
            }
            if (this.data.state == ConnectionDataState.DESTROYED)
            {
                throw new JCSPNetworkException("Client connection end has been destroyed");
            }
            if (this.data.state == ConnectionDataState.BROKEN)
            {
                throw new JCSPNetworkException("Client connection end has broken");
            }

            if (this.In.pending())
            {
                NetworkMessage message = (NetworkMessage)this.In.read();

                lock (this.data)
                {
                    if (message.type == NetworkProtocol.LINK_LOST)
                    {
                        this.data.state = ConnectionDataState.BROKEN;
                        ConnectionManager.getInstance().removeConnection(this.data);
                        throw new JCSPNetworkException("Link to server Node lost.  Send cannot complete");
                    }
                    Node.err.log(this.GetType(), "Connection " + this.data.vconnn + " reports unexpected message");
                    throw new JCSPNetworkException("NetAltingConnecionClient received an unexpected message");
                }
            }

            NetworkMessage msg = new NetworkMessage();

            if (this.data.state == ConnectionDataState.CLIENT_STATE_CLOSED)
            {
                msg.type = NetworkProtocol.OPEN;
            }
            else
            {
                msg.type = NetworkProtocol.REQUEST;
            }

            msg.attr1 = this.serverLocation.getVConnN();
            msg.attr2 = this.data.vconnn;

            try
            {
                msg.jsonData = this.outputFilter.filterTXtoJSON(obj);

                lock (this.data)
                {
                    this.data.state = ConnectionDataState.CLIENT_STATE_MADE_REQ;
                }

                if (!this.isLocal)
                {
                    this.toLinkTX.write(msg);
                }
                else
                {
                    lock (this.localConnection)
                    {
                        switch (this.localConnection.state)
                        {
                        case ConnectionDataState.SERVER_STATE_CLOSED:
                        case ConnectionDataState.SERVER_STATE_OPEN:
                        case ConnectionDataState.SERVER_STATE_RECEIVED:
                            msg.toLink = this.data.toConnection;
                            this.localConnection.openServer.write(msg);
                            break;

                        default:
                            this.data.state = ConnectionDataState.BROKEN;
                            ConnectionManager.getInstance().removeConnection(this.data);
                            throw new JCSPNetworkException("Connection rejected during request");
                        }
                    }
                }
            }
            catch (IOException ioe)
            {
                throw new JCSPNetworkException("Error when trying to convert the message for sending");
            }

            NetworkMessage reply = (NetworkMessage)this.In.read();

            if (reply.type == NetworkProtocol.REJECT_CONNECTION)
            {
                this.data.state = ConnectionDataState.BROKEN;
                ConnectionManager.getInstance().removeConnection(this.data);
                throw new JCSPNetworkException("Connection rejected during request");
            }
            else if (reply.type == NetworkProtocol.LINK_LOST)
            {
                this.data.state = ConnectionDataState.BROKEN;
                ConnectionManager.getInstance().removeConnection(this.data);
                throw new JCSPNetworkException("Link to server Node was lost.  Request cannot complete");
            }
            else if (reply.type == NetworkProtocol.REQUEST_ACK)
            {
                return;
            }
            else
            {
                Node.err.log(this.GetType(), "Connection " + this.data.vconnn + " reports unexpected message.");
                throw new JCSPNetworkException("NetAltingConnectionClient received an unexpected message");
            }
        }
Beispiel #2
0
        public Object reply()
        ////throws InvalidOperationException, JCSPNetworkException
        {
            if (this.data.state != ConnectionDataState.CLIENT_STATE_MADE_REQ)
            {
                throw new InvalidOperationException("Can only call reply() after a request()");
            }
            if (this.data.state == ConnectionDataState.DESTROYED)
            {
                throw new JCSPNetworkException("Client connection end has been destroyed");
            }
            if (this.data.state == ConnectionDataState.BROKEN)
            {
                throw new JCSPNetworkException("Client connection end has broken");
            }

            while (true)
            {
                NetworkMessage msg = (NetworkMessage)this.In.read();

                try
                {
                    lock (this.data)
                    {
                        switch (msg.type)
                        {
                        case NetworkProtocol.REPLY:
                        {
                            Object         toReturn = this.inputFilter.filterRXfromJSON(msg.jsonData);
                            NetworkMessage ack      = new NetworkMessage();
                            ack.type  = NetworkProtocol.REPLY_ACK;
                            ack.attr1 = msg.attr2;
                            ack.attr2 = -1;
                            this.toLinkTX.write(ack);
                            this.data.state = ConnectionDataState.CLIENT_STATE_OPEN;
                            return(toReturn);
                        }

                        case NetworkProtocol.REPLY_AND_CLOSE:
                        {
                            Object         toReturn = this.inputFilter.filterRXfromJSON(msg.jsonData);
                            NetworkMessage ack      = new NetworkMessage();
                            ack.attr1 = msg.attr2;
                            ack.attr2 = -1;
                            this.toLinkTX.write(ack);
                            this.data.state = ConnectionDataState.CLIENT_STATE_CLOSED;
                            return(toReturn);
                        }

                        case NetworkProtocol.LINK_LOST:
                        {
                            this.data.state = ConnectionDataState.BROKEN;
                            ConnectionManager.getInstance().removeConnection(this.data);
                            throw new JCSPNetworkException("Link to server Node was lost.  Reply cannot complete");
                        }

                        case NetworkProtocol.REJECT_CONNECTION:
                        {
                            this.data.state = ConnectionDataState.BROKEN;
                            ConnectionManager.getInstance().removeConnection(this.data);
                            throw new JCSPNetworkException("Server connection rejected previous request");
                        }

                        default:
                        {
                            this.data.state = ConnectionDataState.BROKEN;
                            ConnectionManager.getInstance().removeConnection(this.data);
                            Node.err.log(this.GetType(), "Connection " + this.data.vconnn
                                         + " received unexpected message");
                            throw new JCSPNetworkException("NetAltingConnectionClient received unexpected message");
                        }
                        }
                    }
                }
                catch (IOException ioe)
                {
                    throw new JCSPNetworkException("Incoming message was corrupted");
                }
            }
        }