This is an automated email from the ASF dual-hosted git repository. zjffdu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/master by this push: new bbdc641 [ZEPPELIN-4476] Running Trash Restore will result in an error bbdc641 is described below commit bbdc641eb4d36b9b3e606f4361196d56c82423ec Author: LeeDongMyeong <dev.dm...@gmail.com> AuthorDate: Wed Dec 11 00:55:13 2019 +0800 [ZEPPELIN-4476] Running Trash Restore will result in an error ### What is this PR for? If you run a restore when there are two or more notes or folders, an error occurs. <img width="1447" alt="Screen Shot 2019-12-09 at 10 19 15 PM" src="https://user-images.githubusercontent.com/42430609/70450056-65be6c00-1ae6-11ea-9cb8-8ab5668d9d80.png"> ### What type of PR is it? [Bug Fix] ### Todos * [x] - Update note list after emptying the Trash * [x] - Fixes an error when running Trash restore ### What is the Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-4476 ### How should this be tested? (before)   (after)   Author: LeeDongMyeong <dev.dm...@gmail.com> Author: eldiem <dev.dm...@gmail.com> Closes #3549 from eldiem/zeppelin-4476 and squashes the following commits: 14a2cd76d [eldiem] Add a comment 992d38c4d [LeeDongMyeong] [ZEPPELIN-4476] Fixes an error when running Trash restore 1976130cb [LeeDongMyeong] [ZEPPELIN-4476] Update note list after emptying the Trash --- .../main/java/org/apache/zeppelin/socket/NotebookServer.java | 8 +++++++- .../src/main/java/org/apache/zeppelin/notebook/Notebook.java | 11 ++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index ce3f9b6..702efd5 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -1031,7 +1031,13 @@ public class NotebookServer extends WebSocketServlet private void emptyTrash(NotebookSocket conn, Message fromMessage) throws IOException { getNotebookService().emptyTrash(getServiceContext(fromMessage), - new WebSocketServiceCallback(conn)); + new WebSocketServiceCallback(conn) { + @Override + public void onSuccess(Object result, ServiceContext context) throws IOException { + super.onSuccess(result, context); + broadcastNoteList(context.getAutheInfo(), context.getUserAndRoles()); + } + }); } private void updateParagraph(NotebookSocket conn, diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java index 79bad1e..5805160 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java @@ -17,7 +17,6 @@ package org.apache.zeppelin.notebook; -import com.google.common.collect.Sets; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -43,6 +42,8 @@ import org.apache.zeppelin.interpreter.InterpreterNotFoundException; import org.apache.zeppelin.interpreter.InterpreterSetting; import org.apache.zeppelin.interpreter.InterpreterSettingManager; import org.apache.zeppelin.interpreter.ManagedInterpreterGroup; +import org.apache.zeppelin.notebook.NoteManager.Folder; +import org.apache.zeppelin.notebook.NoteManager.NoteNode; import org.apache.zeppelin.notebook.repo.NotebookRepo; import org.apache.zeppelin.notebook.repo.NotebookRepoSync; import org.apache.zeppelin.notebook.repo.NotebookRepoWithVersionControl; @@ -297,11 +298,15 @@ public class Notebook { public void restoreAll(AuthenticationInfo subject) throws IOException { NoteManager.Folder trash = noteManager.getTrashFolder(); // restore notes under trash folder - for (NoteManager.NoteNode noteNode : trash.getNotes().values()) { + // If the value changes in the loop, a concurrent modification exception is thrown. + // Collector implementation of collect methods to maintain immutability. + List<NoteNode> notes = trash.getNotes().values().stream().collect(Collectors.toList()); + for (NoteManager.NoteNode noteNode : notes) { moveNote(noteNode.getNoteId(), noteNode.getNotePath().replace("/~Trash", ""), subject); } // restore folders under trash folder - for (NoteManager.Folder folder : trash.getFolders().values()) { + List<Folder> folders = trash.getFolders().values().stream().collect(Collectors.toList()); + for (NoteManager.Folder folder : folders) { moveFolder(folder.getPath(), folder.getPath().replace("/~Trash", ""), subject); } }