001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2006-2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.replication.server; 028 029 import java.util.SortedMap; 030 import java.util.TreeMap; 031 032 import org.opends.server.replication.common.ChangeNumber; 033 import org.opends.server.replication.protocol.UpdateMessage; 034 035 /** 036 * This class is used to build ordered lists of UpdateMessage. 037 * The order is defined by the order of the ChangeNumber of the UpdateMessage. 038 */ 039 040 public class MsgQueue 041 { 042 private SortedMap<ChangeNumber, UpdateMessage> map = 043 new TreeMap<ChangeNumber, UpdateMessage>(); 044 045 /** 046 * Return the first UpdateMessage in the MsgQueue. 047 * 048 * @return The first UpdateMessage in the MsgQueue. 049 */ 050 public UpdateMessage first() 051 { 052 return map.get(map.firstKey()); 053 } 054 055 /** 056 * Return the last UpdateMessage in the MsgQueue. 057 * 058 * @return The last UpdateMessage in the MsgQueue. 059 */ 060 public UpdateMessage last() 061 { 062 return map.get(map.lastKey()); 063 } 064 065 /** 066 * Returns the number of elements in this MsgQueue. 067 * 068 * @return The number of elements in this MsgQueue. 069 */ 070 public int size() 071 { 072 return map.size(); 073 } 074 075 /** 076 * Returns <tt>true</tt> if this MsgQueue contains no UpdateMessage. 077 * 078 * @return <tt>true</tt> if this MsgQueue contains no UpdateMessage. 079 */ 080 public boolean isEmpty() 081 { 082 return map.isEmpty(); 083 } 084 085 086 /** 087 * Add an UpdateMessage to this MessageQueue. 088 * 089 * @param update The UpdateMessage to add to this MessageQueue. 090 */ 091 public void add(UpdateMessage update) 092 { 093 map.put(update.getChangeNumber(), update); 094 } 095 096 /** 097 * Get and remove the first UpdateMessage in this MessageQueue. 098 * 099 * @return The first UpdateMessage in this MessageQueue. 100 */ 101 public UpdateMessage removeFirst() 102 { 103 UpdateMessage msg = map.get(map.firstKey()); 104 map.remove(msg.getChangeNumber()); 105 return msg; 106 } 107 108 /** 109 * Returns <tt>true</tt> if this map contains an UpdateMessage 110 * with the same ChangeNumber as the given UpdateMessage. 111 * 112 * @param msg UpdateMessage whose presence in this queue is to be tested. 113 * 114 * @return <tt>true</tt> if this map contains an UpdateMessage 115 * with the same ChangeNumber as the given UpdateMessage. 116 * 117 */ 118 public boolean contains(UpdateMessage msg) 119 { 120 return map.containsKey(msg.getChangeNumber()); 121 } 122 123 /** 124 * Removes all UpdateMessage form this queue. 125 */ 126 public void clear() 127 { 128 map.clear(); 129 } 130 }