private void send(MessageStartView startView) { LogWriter.log( replica.getReplicaID(), "Sending message STARTVIEW to Replica " + receiverID + Constants.NEWLINE + startView.toString()); DataOutputStream dataOutput = null; try { dataOutput = new DataOutputStream(clientSocket.getOutputStream()); byte[] messageIDBytes = MyByteUtils.toByteArray(startView.getMessageID()); dataOutput.writeInt(messageIDBytes.length); dataOutput.write(messageIDBytes); byte[] viewNumberBytes = MyByteUtils.toByteArray(startView.getViewNumber()); dataOutput.writeInt(viewNumberBytes.length); dataOutput.write(viewNumberBytes); // log ReplicaLog log = startView.getLog(); if (log != null && log.size() > 0) { dataOutput.writeInt(log.size()); for (int i = 0; i < log.size(); i++) { // BEGINING OF REQUEST // -------------------------------------------------------------------- MessageRequest request = log.get(i).getRequest(); byte[] requestMessageIDBytes = MyByteUtils.toByteArray(request.getMessageID()); dataOutput.writeInt(requestMessageIDBytes.length); dataOutput.write(requestMessageIDBytes); byte[] operationIDBytes = MyByteUtils.toByteArray(request.getOperation().getOperationID()); dataOutput.writeInt(operationIDBytes.length); dataOutput.write(operationIDBytes); byte[] operationPathBytes = MyByteUtils.toByteArray(request.getOperation().getPath()); dataOutput.writeInt(operationPathBytes.length); dataOutput.write(operationPathBytes); if (request.getOperation().getOperationID() == 1) { byte[] operationFile = request.getOperation().getFile(); if (operationFile != null) { dataOutput.writeInt(operationFile.length); dataOutput.write(operationFile); } else { dataOutput.writeInt(1); byte[] nullFile = new byte[1]; nullFile[0] = 0; dataOutput.write(nullFile); } } byte[] clientIDBytes = MyByteUtils.toByteArray(request.getClientID()); dataOutput.writeInt(clientIDBytes.length); dataOutput.write(clientIDBytes); byte[] requestNumberBytes = MyByteUtils.toByteArray(request.getRequestNumber()); dataOutput.writeInt(requestNumberBytes.length); dataOutput.write(requestNumberBytes); byte[] requestViewNumberBytes = MyByteUtils.toByteArray(request.getViewNumber()); dataOutput.writeInt(requestViewNumberBytes.length); dataOutput.write(requestViewNumberBytes); // END OF REQUEST -------------------------------------------------------------------- // opNumber byte[] operationNumberBytes = MyByteUtils.toByteArray(log.get(i).getOperationNumber()); dataOutput.writeInt(operationNumberBytes.length); dataOutput.write(operationNumberBytes); // isCommited byte[] isCommitedBytes = MyByteUtils.toByteArray(log.get(i).isCommited()); dataOutput.writeInt(isCommitedBytes.length); dataOutput.write(isCommitedBytes); } } else { dataOutput.writeInt(0); dataOutput.writeInt(1); byte[] nullFile = new byte[1]; nullFile[0] = 0; dataOutput.write(nullFile); } byte[] lastCommitedBytes = MyByteUtils.toByteArray(startView.getLastCommited()); dataOutput.writeInt(lastCommitedBytes.length); dataOutput.write(lastCommitedBytes); } catch (IOException ex) { Logger.getLogger(ReplicaClientRunnable.class.getName()).log(Level.SEVERE, null, ex); } finally { try { dataOutput.flush(); dataOutput.close(); clientSocket.close(); } catch (IOException ex) { Logger.getLogger(ReplicaClientRunnable.class.getName()).log(Level.SEVERE, null, ex); } } }