Skip to content
Snippets Groups Projects
Commit 93b8d7b0 authored by gnaegi's avatar gnaegi
Browse files

OO-363 fix some bugs in blog to make it more robust and not loose items

parent 4b115cb4
No related branches found
No related tags found
No related merge requests found
...@@ -306,6 +306,8 @@ public class Feed implements OLATResourceable, Serializable { ...@@ -306,6 +306,8 @@ public class Feed implements OLATResourceable, Serializable {
*/ */
public boolean remove(Item item) { public boolean remove(Item item) {
itemIds.remove(item.getGuid()); itemIds.remove(item.getGuid());
// Remove below works also when object identity is not the same as
// item.equals has been overwritten to match on the GUID
return items.remove(item); return items.remove(item);
} }
......
...@@ -344,6 +344,10 @@ public class Item implements Serializable, Dated { ...@@ -344,6 +344,10 @@ public class Item implements Serializable, Dated {
return guid == null ? 39745 : guid.hashCode(); return guid == null ? 39745 : guid.hashCode();
} }
/**
* Overwrite equals method so that different object in the vm that actually
* represent the same item are recognized as such. Eg in the remove method of the feed
*/
public boolean equals(Object obj) { public boolean equals(Object obj) {
if(this == obj) { if(this == obj) {
return true; return true;
......
...@@ -169,6 +169,10 @@ public class FeedMainController extends BasicController implements Activateable2 ...@@ -169,6 +169,10 @@ public class FeedMainController extends BasicController implements Activateable2
*/ */
@Override @Override
protected void event(UserRequest ureq, Component source, Event event) { protected void event(UserRequest ureq, Component source, Event event) {
// feed for this event and make sure the updated feed object is in the view
feed = feedManager.getFeed(feed);
vcInfo.contextPut("feed", feed);
if (source == editFeedButton) { if (source == editFeedButton) {
lock = feedManager.acquireLock(feed, ureq.getIdentity()); lock = feedManager.acquireLock(feed, ureq.getIdentity());
if (lock.isSuccess()) { if (lock.isSuccess()) {
......
...@@ -389,7 +389,10 @@ public class ItemsController extends BasicController implements Activateable2 { ...@@ -389,7 +389,10 @@ public class ItemsController extends BasicController implements Activateable2 {
@Override @Override
protected void event(UserRequest ureq, Component source, Event event) { protected void event(UserRequest ureq, Component source, Event event) {
FeedManager feedManager = FeedManager.getInstance(); FeedManager feedManager = FeedManager.getInstance();
// feed for this event and make sure the updated feed object is in the view
Feed feed = feedManager.getFeed(feedResource); Feed feed = feedManager.getFeed(feedResource);
vcItems.contextPut("feed", feed);
if (source == addItemButton) { if (source == addItemButton) {
currentItem = new Item(); currentItem = new Item();
currentItem.setDraft(true); currentItem.setDraft(true);
...@@ -403,14 +406,20 @@ public class ItemsController extends BasicController implements Activateable2 { ...@@ -403,14 +406,20 @@ public class ItemsController extends BasicController implements Activateable2 {
} else if (editButtons != null && editButtons.contains(source)) { } else if (editButtons != null && editButtons.contains(source)) {
currentItem = (Item) ((Link) source).getUserObject(); currentItem = (Item) ((Link) source).getUserObject();
lock = feedManager.acquireLock(feed, currentItem, getIdentity()); // check if still available, maybe deleted by other user in the meantime
if (lock.isSuccess()) { if (feed.getItems().contains(currentItem)) {
lock = feedManager.acquireLock(feed, currentItem, getIdentity());
itemFormCtr = uiFactory.createItemFormController(ureq, getWindowControl(), currentItem, feed); if (lock.isSuccess()) {
activateModalDialog(itemFormCtr);
itemFormCtr = uiFactory.createItemFormController(ureq, getWindowControl(), currentItem, feed);
activateModalDialog(itemFormCtr);
} else {
showInfo("feed.item.is.being.edited.by", lock.getOwner().getName());
}
} else { } else {
showInfo("feed.item.is.being.edited.by", lock.getOwner().getName()); showInfo("feed.item.is.being.edited.by", "unknown");
} }
} else if (deleteButtons != null && deleteButtons.contains(source)) { } else if (deleteButtons != null && deleteButtons.contains(source)) {
Item item = (Item) ((Link) source).getUserObject(); Item item = (Item) ((Link) source).getUserObject();
confirmDialogCtr = activateYesNoDialog(ureq, null, translate("feed.item.confirm.delete"), confirmDialogCtr); confirmDialogCtr = activateYesNoDialog(ureq, null, translate("feed.item.confirm.delete"), confirmDialogCtr);
...@@ -421,7 +430,16 @@ public class ItemsController extends BasicController implements Activateable2 { ...@@ -421,7 +430,16 @@ public class ItemsController extends BasicController implements Activateable2 {
displayItemController(ureq, item); displayItemController(ureq, item);
} else if (source == makeInternalButton) { } else if (source == makeInternalButton) {
feedManager.updateFeedMode(Boolean.FALSE, feed); if (feed.isUndefined()) {
feedManager.updateFeedMode(Boolean.FALSE, feed);
} else if (feed.isExternal()) {
// Very special case: another user concurrently changed feed to external. Do nothing
vcItems.setDirty(true);
return;
}
// else nothing to do, already set to internal by a concurrent user
// Add temporary item and open edit dialog
addItemButton = LinkFactory.createButton("feed.add.item", vcItems, this); addItemButton = LinkFactory.createButton("feed.add.item", vcItems, this);
addItemButton.setElementCssClass("o_sel_feed_item_new"); addItemButton.setElementCssClass("o_sel_feed_item_new");
currentItem = new Item(); currentItem = new Item();
...@@ -435,15 +453,19 @@ public class ItemsController extends BasicController implements Activateable2 { ...@@ -435,15 +453,19 @@ public class ItemsController extends BasicController implements Activateable2 {
activateModalDialog(itemFormCtr); activateModalDialog(itemFormCtr);
// do logging // do logging
ThreadLocalUserActivityLogger.log(FeedLoggingAction.FEED_EDIT, getClass(), LoggingResourceable.wrap(feed)); ThreadLocalUserActivityLogger.log(FeedLoggingAction.FEED_EDIT, getClass(), LoggingResourceable.wrap(feed));
} else if (source == makeExternalButton) { } else if (source == makeExternalButton) {
feedManager.updateFeedMode(Boolean.TRUE, feed); if (feed.isUndefined()) {
vcItems.setDirty(true); feedManager.updateFeedMode(Boolean.TRUE, feed);
// Ask listening FeedMainController to open and handle a new external vcItems.setDirty(true);
// feed dialog. // Ask listening FeedMainController to open and handle a new external
fireEvent(ureq, HANDLE_NEW_EXTERNAL_FEED_DIALOG_EVENT); // feed dialog.
// do logging fireEvent(ureq, HANDLE_NEW_EXTERNAL_FEED_DIALOG_EVENT);
ThreadLocalUserActivityLogger.log(FeedLoggingAction.FEED_EDIT, getClass(), LoggingResourceable.wrap(feed)); // do logging
ThreadLocalUserActivityLogger.log(FeedLoggingAction.FEED_EDIT, getClass(), LoggingResourceable.wrap(feed));
}
// else nothing to do, already set to external by a concurrent user
} else if (source == olderItemsLink) { } else if (source == olderItemsLink) {
helper.olderItems(); helper.olderItems();
...@@ -492,7 +514,11 @@ public class ItemsController extends BasicController implements Activateable2 { ...@@ -492,7 +514,11 @@ public class ItemsController extends BasicController implements Activateable2 {
dts.activate(ureq, dt, null); dts.activate(ureq, dt, null);
} }
} }
// Check if someone else added an item, reload everything
if (!isSameAllItems(feed.getFilteredItems(callback, ureq.getIdentity()))) {
resetItems(ureq, feed);
}
} }
/** /**
...@@ -501,7 +527,10 @@ public class ItemsController extends BasicController implements Activateable2 { ...@@ -501,7 +527,10 @@ public class ItemsController extends BasicController implements Activateable2 {
*/ */
protected void event(UserRequest ureq, Controller source, Event event) { protected void event(UserRequest ureq, Controller source, Event event) {
FeedManager feedManager = FeedManager.getInstance(); FeedManager feedManager = FeedManager.getInstance();
// reload feed for this event and make sure the updated feed object is in the view
Feed feed = feedManager.getFeed(feedResource); Feed feed = feedManager.getFeed(feedResource);
vcItems.contextPut("feed", feed);
if (source == cmc) { if (source == cmc) {
if (event.equals(CloseableModalController.CLOSE_MODAL_EVENT)) { if (event.equals(CloseableModalController.CLOSE_MODAL_EVENT)) {
removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(cmc);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment