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"); } }
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"); } } }