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 bda5f353742..0dc4a524ab7 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 @@ -283,6 +283,9 @@ public void onMessage(NotebookSocket conn, String msg) { case LIST_REVISION_HISTORY: listRevisionHistory(conn, notebook, messagereceived); break; + case SET_NOTE_REVISION: + setNoteRevision(conn, userAndRoles, notebook, messagereceived); + break; case NOTE_REVISION: getNoteByRevision(conn, notebook, messagereceived); break; @@ -1473,6 +1476,46 @@ private void listRevisionHistory(NotebookSocket conn, Notebook notebook, conn.send(serializeMessage(new Message(OP.LIST_REVISION_HISTORY) .put("revisionList", revisions))); } + + private void setNoteRevision(NotebookSocket conn, HashSet userAndRoles, + Notebook notebook, Message fromMessage) throws IOException { + + String noteId = (String) fromMessage.get("noteId"); + String revisionId = (String) fromMessage.get("revisionId"); + AuthenticationInfo subject = new AuthenticationInfo(fromMessage.principal); + + NotebookAuthorization notebookAuthorization = notebook.getNotebookAuthorization(); + if (!notebookAuthorization.isWriter(noteId, userAndRoles)) { + permissionError(conn, "update", fromMessage.principal, + userAndRoles, notebookAuthorization.getWriters(noteId)); + return; + } + + Note headNote = null; + boolean setRevisionStatus; + try { + headNote = notebook.setNoteRevision(noteId, revisionId, subject); + setRevisionStatus = headNote != null; + } catch (Exception e) { + setRevisionStatus = false; + LOG.error("Failed to set given note revision", e); + } + if (setRevisionStatus) { + notebook.loadNoteFromRepo(noteId, subject); + } + + conn.send(serializeMessage(new Message(OP.SET_NOTE_REVISION) + .put("status", setRevisionStatus))); + + if (setRevisionStatus) { + Note reloadedNote = notebook.getNote(headNote.getId()); + broadcastNote(reloadedNote); + } else { + conn.send(serializeMessage(new Message(OP.ERROR_INFO).put("info", + "Couldn't set note to the given revision. " + + "Please check the logs for more details."))); + } + } private void getNoteByRevision(NotebookSocket conn, Notebook notebook, Message fromMessage) throws IOException { @@ -1483,7 +1526,7 @@ private void getNoteByRevision(NotebookSocket conn, Notebook notebook, Message f conn.send(serializeMessage(new Message(OP.NOTE_REVISION) .put("noteId", noteId) .put("revisionId", revisionId) - .put("data", revisionNote))); + .put("note", revisionNote))); } /** diff --git a/zeppelin-web/src/app/app.js b/zeppelin-web/src/app/app.js index 93f6a996ab3..c1a73c746dc 100644 --- a/zeppelin-web/src/app/app.js +++ b/zeppelin-web/src/app/app.js @@ -62,6 +62,10 @@ templateUrl: 'app/notebook/notebook.html', controller: 'NotebookCtrl' }) + .when('/notebook/:noteId/revision/:revisionId', { + templateUrl: 'app/notebook/notebook.html', + controller: 'NotebookCtrl' + }) .when('/jobmanager', { templateUrl: 'app/jobmanager/jobmanager.html', controller: 'JobmanagerCtrl' diff --git a/zeppelin-web/src/app/notebook/notebook-actionBar.html b/zeppelin-web/src/app/notebook/notebook-actionBar.html index be57c61e634..09f46be91f3 100644 --- a/zeppelin-web/src/app/notebook/notebook-actionBar.html +++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html @@ -77,6 +77,15 @@

tooltip-placement="bottom" tooltip="Version control"> +
-