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 853c0d5c524..1859ba01961 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 @@ -45,6 +45,7 @@ import org.apache.zeppelin.interpreter.InterpreterSetting; import org.apache.zeppelin.interpreter.remote.RemoteInterpreterProcessListener; import org.apache.zeppelin.notebook.*; +import org.apache.zeppelin.notebook.repo.NotebookRepo.Revision; import org.apache.zeppelin.notebook.socket.Message; import org.apache.zeppelin.notebook.socket.Message.OP; import org.apache.zeppelin.scheduler.Job; @@ -220,6 +221,9 @@ public void onMessage(NotebookSocket conn, String msg) { case CHECKPOINT_NOTEBOOK: checkpointNotebook(conn, notebook, messagereceived); break; + case NOTE_REVISION: + getNoteRevision(conn, notebook, messagereceived); + break; case LIST_NOTEBOOK_JOBS: unicastNotebookJobInfo(conn, messagereceived); break; @@ -1129,6 +1133,18 @@ private void checkpointNotebook(NotebookSocket conn, Notebook notebook, notebook.checkpointNote(noteId, commitMessage, subject); } + private void getNoteRevision(NotebookSocket conn, Notebook notebook, Message fromMessage) + throws IOException { + String noteId = (String) fromMessage.get("noteId"); + Revision revision = (Revision) fromMessage.get("revision"); + AuthenticationInfo subject = new AuthenticationInfo(fromMessage.principal); + Note revisionNote = notebook.getNoteRevision(noteId, revision, subject); + conn.send(serializeMessage(new Message(OP.NOTE_REVISION) + .put("noteId", noteId) + .put("revisionId", revision) + .put("data", revisionNote))); + } + /** * This callback is for the paragraph that runs on ZeppelinServer * @param noteId diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 7d58e463634..472765097b0 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -175,6 +175,12 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro document.getElementById('note.checkpoint.message').value = ''; }; + // receive certain revision of note + $scope.$on('noteRevision', function(event, data) { + console.log('received note revision %o', data); + //TODO(xxx): render it + }); + $scope.runNote = function() { BootstrapDialog.confirm({ closable: true, diff --git a/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js b/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js index 2fb5003ba15..6c9eeeec855 100644 --- a/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js +++ b/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js @@ -109,6 +109,8 @@ angular.module('zeppelinWebApp').factory('websocketEvents', $rootScope.$broadcast('appLoad', data); } else if (op === 'APP_STATUS_CHANGE') { $rootScope.$broadcast('appStatusChange', data); + } else if (op === 'NOTE_REVISION') { + $rootScope.$broadcast('noteRevision', data); } }); diff --git a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js index 698b8ff8100..9a82c9b0590 100644 --- a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js +++ b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js @@ -161,6 +161,16 @@ angular.module('zeppelinWebApp').service('websocketMsgSrv', function($rootScope, }); }, + getNoteRevision: function(noteId, revisionId) { + websocketEvents.sendNewEvent({ + op: 'NOTE_REVISION', + data: { + noteId: noteId, + revisionId: revisionId + } + }); + }, + isConnected: function() { return websocketEvents.isConnected(); }, 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 c56c4eed36e..9937d616036 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 @@ -55,6 +55,7 @@ import org.apache.zeppelin.interpreter.InterpreterSetting; import org.apache.zeppelin.interpreter.remote.RemoteAngularObjectRegistry; import org.apache.zeppelin.notebook.repo.NotebookRepo; +import org.apache.zeppelin.notebook.repo.NotebookRepo.Revision; import org.apache.zeppelin.notebook.repo.NotebookRepoSync; import org.apache.zeppelin.resource.ResourcePoolUtils; import org.apache.zeppelin.scheduler.Job; @@ -357,6 +358,11 @@ public void checkpointNote(String noteId, String checkpointMessage, Authenticati notebookRepo.checkpoint(noteId, checkpointMessage, subject); } + public Note getNoteRevision(String noteId, Revision revision, AuthenticationInfo subject) + throws IOException { + return notebookRepo.get(noteId, revision, subject); + } + @SuppressWarnings("rawtypes") private Note loadNoteFromRepo(String id, AuthenticationInfo subject) { Note note = null; diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java index ab53f5f33c4..4e735e802e7 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java @@ -354,9 +354,14 @@ public Revision checkpoint(String noteId, String checkpointMsg, AuthenticationIn } @Override - public Note get(String noteId, Revision rev, AuthenticationInfo subject) throws IOException { - // Auto-generated method stub - return null; + public Note get(String noteId, Revision rev, AuthenticationInfo subject) { + Note revisionNote = null; + try { + revisionNote = getRepo(0).get(noteId, rev, subject); + } catch (IOException e) { + LOG.error("Failed to get revision {} of note {}", rev.id, noteId, e); + } + return revisionNote; } @Override diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java index 08b32359226..c0baf403b6a 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java @@ -114,6 +114,9 @@ public static enum OP { CHECKPOINT_NOTEBOOK, // [c-s] checkpoint notebook to storage repository // @param noteId // @param checkpointName + NOTE_REVISION, // [c-s] get certain revision of note + // @param noteId + // @param revisionId APP_APPEND_OUTPUT, // [s-c] append output APP_UPDATE_OUTPUT, // [s-c] update (replace) output