1 /* 2 * #%L 3 * PendingMessage.java - mongodb-async-driver - Allanbank Consulting, Inc. 4 * %% 5 * Copyright (C) 2011 - 2014 Allanbank Consulting, Inc. 6 * %% 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * #L% 19 */ 20 package com.allanbank.mongodb.client.message; 21 22 import com.allanbank.mongodb.client.Message; 23 import com.allanbank.mongodb.client.callback.ReplyCallback; 24 25 /** 26 * Container for a pending message. Before the message is sent the message id 27 * will be zero. After it will contain the assigned message id for the 28 * connection. 29 * 30 * @api.no This class is <b>NOT</b> part of the drivers API. This class may be 31 * mutated in incompatible ways between any two releases of the driver. 32 * @copyright 2011-2014, Allanbank Consulting, Inc., All Rights Reserved 33 */ 34 public class PendingMessage { 35 36 /** The message sent. */ 37 private Message myMessage; 38 39 /** The message id assigned to the sent message. */ 40 private int myMessageId; 41 42 /** The callback for the reply to the message. */ 43 private ReplyCallback myReplyCallback; 44 45 /** The timestamp of the message. */ 46 private long myTimestamp; 47 48 /** 49 * Create a new PendingMessage. 50 */ 51 public PendingMessage() { 52 this(0, null, null); 53 } 54 55 /** 56 * Create a new PendingMessage. 57 * 58 * @param messageId 59 * The id assigned to the message. 60 * @param message 61 * The sent message. 62 */ 63 public PendingMessage(final int messageId, final Message message) { 64 this(messageId, message, null); 65 } 66 67 /** 68 * Create a new PendingMessage. 69 * 70 * @param messageId 71 * The id assigned to the message. 72 * @param message 73 * The sent message. 74 * @param replyCallback 75 * The callback for the reply to the message. 76 * 77 */ 78 public PendingMessage(final int messageId, final Message message, 79 final ReplyCallback replyCallback) { 80 myMessageId = messageId; 81 myMessage = message; 82 myReplyCallback = replyCallback; 83 } 84 85 /** 86 * Clears the state of the message allowing the referenced objects to be 87 * garbage collected. 88 */ 89 public void clear() { 90 myTimestamp = 0; 91 myMessageId = 0; 92 myMessage = null; 93 myReplyCallback = null; 94 } 95 96 /** 97 * Returns the sent message. 98 * 99 * @return The sent message. 100 */ 101 public Message getMessage() { 102 return myMessage; 103 } 104 105 /** 106 * Returns the message id assigned to the sent message. 107 * 108 * @return The message id assigned to the sent message. 109 */ 110 public int getMessageId() { 111 return myMessageId; 112 } 113 114 /** 115 * Returns the callback for the reply to the message. 116 * 117 * @return The callback for the reply to the message. 118 */ 119 public ReplyCallback getReplyCallback() { 120 return myReplyCallback; 121 } 122 123 /** 124 * Determines the latency of the message in nano-seconds. If the message 125 * does not have a time stamp then zero is returned. 126 * 127 * @return The current latency for the message. 128 */ 129 public long latency() { 130 final long timestamp = myTimestamp; 131 132 if (timestamp == 0) { 133 return 0; 134 } 135 136 return System.nanoTime() - timestamp; 137 } 138 139 /** 140 * Sets the state of the pending message. 141 * 142 * @param messageId 143 * The id of the sent message. 144 * @param message 145 * The sent message. 146 * @param replyCallback 147 * The callback for the message. May be null. 148 */ 149 public void set(final int messageId, final Message message, 150 final ReplyCallback replyCallback) { 151 myMessageId = messageId; 152 myMessage = message; 153 myReplyCallback = replyCallback; 154 myTimestamp = System.nanoTime(); 155 } 156 157 /** 158 * Sets the state of the pending message. 159 * 160 * @param other 161 * The pending message to copy from. 162 */ 163 public void set(final PendingMessage other) { 164 myMessageId = other.getMessageId(); 165 myMessage = other.getMessage(); 166 myReplyCallback = other.getReplyCallback(); 167 myTimestamp = other.myTimestamp; 168 } 169 170 /** 171 * Sets the time stamp of the message to now. 172 */ 173 public void timestampNow() { 174 myTimestamp = System.nanoTime(); 175 } 176 }