Commit 72a55925 authored by Robin Collier's avatar Robin Collier Committed by rcollier

OF-16,OF-17 Checks when max_items is not set and replaces items with same ids

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/trunk@11274 b35dd754-fafc-0310-a699-88a17e54d16e
parent 93d9bd14
...@@ -106,12 +106,9 @@ public class LeafNode extends Node { ...@@ -106,12 +106,9 @@ public class LeafNode extends Node {
} }
synchronized (publishedItems) { synchronized (publishedItems) {
// Remove stored published items based on the new max items // Remove stored published items based on the new max items
while (!publishedItems.isEmpty() && publishedItems.size() > maxPublishedItems) { while (!publishedItems.isEmpty() && isMaxItemsReached())
PublishedItem removedItem = publishedItems.remove(0); {
itemsByID.remove(removedItem.getID()); removeItem(0);
// Add the removed item to the queue of items to delete from the database. The
// queue is going to be processed by another thread
service.queueItemToRemove(removedItem);
} }
} }
} }
...@@ -158,11 +155,7 @@ public class LeafNode extends Node { ...@@ -158,11 +155,7 @@ public class LeafNode extends Node {
synchronized (publishedItems) { synchronized (publishedItems) {
// Remove stored published items // Remove stored published items
while (!publishedItems.isEmpty()) { while (!publishedItems.isEmpty()) {
PublishedItem removedItem = publishedItems.remove(0); removeItem(0);
itemsByID.remove(removedItem.getID());
// Add the removed item to the queue of items to delete from the database. The
// queue is going to be processed by another thread
service.queueItemToRemove(removedItem);
} }
} }
} }
...@@ -236,12 +229,12 @@ public class LeafNode extends Node { ...@@ -236,12 +229,12 @@ public class LeafNode extends Node {
payload = entries.isEmpty() ? null : (Element) entries.get(0); payload = entries.isEmpty() ? null : (Element) entries.get(0);
// Create a published item from the published data and add it to the node and the db // Create a published item from the published data and add it to the node and the db
synchronized (publishedItems) { synchronized (publishedItems) {
// Make sure that the published item has an ID and that it's unique in the node // Make sure that the published item has a unique ID if NOT assigned by publisher
if (itemID == null) { if (itemID == null) {
itemID = StringUtils.randomString(15); do {
} itemID = StringUtils.randomString(15);
while (itemsByID.get(itemID) != null) { }
itemID = StringUtils.randomString(15); while (itemsByID.containsKey(itemID));
} }
// Create a new published item // Create a new published item
...@@ -250,16 +243,22 @@ public class LeafNode extends Node { ...@@ -250,16 +243,22 @@ public class LeafNode extends Node {
// Add the new item to the list of published items // Add the new item to the list of published items
newPublishedItems.add(newItem); newPublishedItems.add(newItem);
// Check and remove any existing items that have the matching ID,
// generated ID's won't match since we already checked.
PublishedItem duplicate = itemsByID.get(newItem.getID());
if (duplicate != null)
{
removeItem(findIndexById(duplicate.getID()));
}
// Add the published item to the list of items to persist (using another thread) // Add the published item to the list of items to persist (using another thread)
// but check that we don't exceed the limit. Remove oldest items if required. // but check that we don't exceed the limit. Remove oldest items if required.
while (!publishedItems.isEmpty() && publishedItems.size() >= maxPublishedItems) while (!publishedItems.isEmpty() && isMaxItemsReached())
{ {
PublishedItem removedItem = publishedItems.remove(0); removeItem(0);
itemsByID.remove(removedItem.getID());
// Add the removed item to the queue of items to delete from the database. The
// queue is going to be processed by another thread
service.queueItemToRemove(removedItem);
} }
addPublishedItem(newItem); addPublishedItem(newItem);
// Add the new published item to the queue of items to add to the database. The // Add the new published item to the queue of items to add to the database. The
// queue is going to be processed by another thread // queue is going to be processed by another thread
...@@ -285,6 +284,31 @@ public class LeafNode extends Node { ...@@ -285,6 +284,31 @@ public class LeafNode extends Node {
} }
} }
/**
* Must be called from code synchronized on publishedItems
*/
private int findIndexById(String id) {
for (int i=0; i<publishedItems.size(); i++)
{
PublishedItem item = publishedItems.get(i);
if (item.getID().equals(id))
return i;
}
return -1;
}
/**
* Must be called from code synchronized on publishedItems
*/
private void removeItem(int index) {
PublishedItem removedItem = publishedItems.remove(index);
itemsByID.remove(removedItem.getID());
// Add the removed item to the queue of items to delete from the database. The
// queue is going to be processed by another thread
service.queueItemToRemove(removedItem);
}
/** /**
* Deletes the list of published items from the node. Event notifications may be sent to * Deletes the list of published items from the node. Event notifications may be sent to
* subscribers for the deleted items. When an affiliate has many subscriptions to the node, * subscribers for the deleted items. When an affiliate has many subscriptions to the node,
...@@ -460,4 +484,9 @@ public class LeafNode extends Node { ...@@ -460,4 +484,9 @@ public class LeafNode extends Node {
broadcastNodeEvent(message, false); broadcastNodeEvent(message, false);
} }
} }
private boolean isMaxItemsReached()
{
return (maxPublishedItems > -1 ) && (publishedItems.size() >= maxPublishedItems);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment