From f62727839154532287f44567807319c180b8942c Mon Sep 17 00:00:00 2001 From: Jongyoul Lee Date: Wed, 14 Dec 2016 00:52:15 +0900 Subject: [PATCH 1/9] Supported personalized mode --- .../org/apache/zeppelin/scheduler/Job.java | 4 ++ .../zeppelin/socket/NotebookServer.java | 58 +++++++++++++------ .../paragraph/paragraph.controller.js | 2 +- .../org/apache/zeppelin/notebook/Note.java | 30 ++++++++++ .../apache/zeppelin/notebook/Paragraph.java | 41 ++++++++++++- 5 files changed, 114 insertions(+), 21 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java index 9ae74abd6f9..4be6da5b161 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java @@ -125,6 +125,10 @@ public Job(String jobId, String jobName, JobListener listener, long progressUpda setStatus(Status.READY); } + public void setId(String id) { + this.id = id; + } + public String getId() { return id; } 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 3aa51e18773..d6f2c9f1b37 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 @@ -116,7 +116,7 @@ String getKey() { * is going on. */ final Queue watcherSockets = Queues.newConcurrentLinkedQueue(); - + private Notebook notebook() { return ZeppelinServer.notebook; } @@ -193,7 +193,7 @@ public void onMessage(NotebookSocket conn, String msg) { if (StringUtils.isEmpty(conn.getUser())) { addUserConnection(messagereceived.principal, conn); } - AuthenticationInfo subject = + AuthenticationInfo subject = new AuthenticationInfo(messagereceived.principal, messagereceived.ticket); /** Lets be elegant here */ @@ -582,7 +582,15 @@ public void broadcastInterpreterBindings(String noteId, List settingList) { } public void broadcastParagraph(Note note, Paragraph p) { - broadcast(note.getId(), new Message(OP.PARAGRAPH).put("paragraph", p)); + //broadcast(note.getId(), new Message(OP.PARAGRAPH).put("paragraph", p)); + broadcastParagraphs(p.getUserParagraphMap(), p); + } + + public void broadcastParagraphs(Map userParagraphMap, + Paragraph defaultParagraph) { + for (String user : userParagraphMap.keySet()) { + multicastToUser(user, new Message(OP.PARAGRAPH).put("paragraph", userParagraphMap.get(user))); + } } private void broadcastNewParagraph(Note note, Paragraph para) { @@ -639,7 +647,7 @@ private void broadcastNoteListExcept(List> notesInfo, multicastToUser(user, new Message(OP.NOTES_INFO).put("notes", notesInfo)); } } - + void permissionError(NotebookSocket conn, String op, String userName, Set userAndRoles, @@ -677,6 +685,10 @@ private void sendNote(NotebookSocket conn, HashSet userAndRoles, Noteboo return; } addConnectionToNote(note.getId(), conn); + + if (note.isPersonalizedMode()) { + note = note.getUserNote(user); + } conn.send(serializeMessage(new Message(OP.NOTE).put("note", note))); sendAllAngularObjects(note, user, conn); } else { @@ -895,34 +907,44 @@ private void removeNote(NotebookSocket conn, HashSet userAndRoles, broadcastNoteList(subject, userAndRoles); } - private void updateParagraph(NotebookSocket conn, HashSet userAndRoles, - Notebook notebook, Message fromMessage) throws IOException { + private void updateParagraph(NotebookSocket conn, HashSet userAndRoles, Notebook notebook, + Message fromMessage) throws IOException { String paragraphId = (String) fromMessage.get("id"); if (paragraphId == null) { return; } - Map params = (Map) fromMessage - .get("params"); - Map config = (Map) fromMessage - .get("config"); + Map params = (Map) fromMessage.get("params"); + Map config = (Map) fromMessage.get("config"); String noteId = getOpenNoteId(conn); final Note note = notebook.getNote(noteId); NotebookAuthorization notebookAuthorization = notebook.getNotebookAuthorization(); AuthenticationInfo subject = new AuthenticationInfo(fromMessage.principal); if (!notebookAuthorization.isWriter(noteId, userAndRoles)) { - permissionError(conn, "write", fromMessage.principal, - userAndRoles, notebookAuthorization.getWriters(noteId)); + permissionError(conn, "write", fromMessage.principal, userAndRoles, + notebookAuthorization.getWriters(noteId)); return; } Paragraph p = note.getParagraph(paragraphId); + + if (note.isPersonalizedMode()) { + p = p.getUserParagraphMap().get(subject.getUser()); + } + p.settings.setParams(params); p.setConfig(config); p.setTitle((String) fromMessage.get("title")); p.setText((String) fromMessage.get("paragraph")); note.persist(subject); - broadcastParagraph(note, p);; + + if (note.isPersonalizedMode()) { + Map userParagraphMap = + note.getParagraph(paragraphId).getUserParagraphMap(); + broadcastParagraphs(userParagraphMap, p); + } else { + broadcastParagraph(note, p); + } } private void cloneNote(NotebookSocket conn, HashSet userAndRoles, @@ -2003,7 +2025,7 @@ private void getEditorSetting(NotebookSocket conn, Message fromMessage) return; } - private void getInterpreterSettings(NotebookSocket conn, AuthenticationInfo subject) + private void getInterpreterSettings(NotebookSocket conn, AuthenticationInfo subject) throws IOException { List availableSettings = notebook().getInterpreterFactory().get(); conn.send(serializeMessage(new Message(OP.INTERPRETER_SETTINGS) @@ -2016,7 +2038,7 @@ public void onMetaInfosReceived(String settingId, Map metaInfos) .get(settingId); interpreterSetting.setInfos(metaInfos); } - + private void switchConnectionToWatcher(NotebookSocket conn, Message messagereceived) throws IOException { if (!isSessionAllowedToSwitchToWatcher(conn)) { @@ -2030,19 +2052,19 @@ private void switchConnectionToWatcher(NotebookSocket conn, Message messagerecei return; } watcherSockets.add(conn); - + // remove this connection from regular zeppelin ws usage. removeConnectionFromAllNote(conn); connectedSockets.remove(conn); removeUserConnection(conn.getUser(), conn); } - + private boolean isSessionAllowedToSwitchToWatcher(NotebookSocket session) { String watcherSecurityKey = session.getRequest().getHeader(WatcherSecurityKey.HTTP_HEADER); return !(StringUtils.isBlank(watcherSecurityKey) || !watcherSecurityKey.equals(WatcherSecurityKey.getKey())); } - + private void broadcastToWatchers(String noteId, String subject, Message message) { synchronized (watcherSockets) { if (watcherSockets.isEmpty()) { diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 9ef943eaedc..b764d86e01d 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -969,7 +969,7 @@ $scope.dirtyText = undefined; $scope.originalText = angular.copy(data.paragraph.text); } else { // if there're local update, keep it. - $scope.paragraph.text = $scope.dirtyText; + $scope.paragraph.text = data.paragraph.text; } } else { $scope.paragraph.text = data.paragraph.text; diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index 2201b67a3c5..13c2ad19d09 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -121,6 +121,11 @@ private String getDefaultInterpreterName() { return null != setting ? setting.getName() : StringUtils.EMPTY; } + public boolean isPersonalizedMode() { + Object v = getConfig().get("personalizedMode"); + return null != v && "true".equals(v); + } + public String getId() { return id; } @@ -666,6 +671,31 @@ void unpersist(AuthenticationInfo subject) throws IOException { } + /** + * Return new note for specific user. this inserts and replaces user paragraph which doesn't + * exists in original paragraph + * + * @param user specific user + * @return new Note for the user + */ + public Note getUserNote(String user) { + Note newNote = new Note(); + newNote.id = getId(); + newNote.config = getConfig(); + newNote.angularObjects = getAngularObjects(); + + Paragraph newParagraph; + for (Paragraph p : paragraphs) { + newParagraph = p.getUserParagraph(user); + if (null == newParagraph) { + newParagraph = p.cloneParagraphForUser(user); + } + newNote.paragraphs.add(newParagraph); + } + + return newNote; + } + private void startDelayedPersistTimer(int maxDelaySec, final AuthenticationInfo subject) { synchronized (this) { if (delayedPersist != null) { diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 114babfd008..3bea9b52695 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.notebook; +import com.google.common.collect.Maps; import com.google.common.base.Strings; import org.apache.commons.lang.StringUtils; import org.apache.zeppelin.display.AngularObject; @@ -55,13 +56,14 @@ public class Paragraph extends Job implements Serializable, Cloneable { private transient InterpreterFactory factory; private transient Note note; private transient AuthenticationInfo authenticationInfo; + private transient Map userParagraphMap = Maps.newHashMap(); // personalized String title; String text; String user; Date dateUpdated; private Map config; // paragraph configs like isOpen, colWidth, etc - public final GUI settings; // form and parameter settings + public GUI settings; // form and parameter settings /** * Applicaiton states in this paragraph @@ -106,6 +108,29 @@ private static String generateId() { + new Random(System.currentTimeMillis()).nextInt(); } + public Map getUserParagraphMap() { + return userParagraphMap; + } + + public Paragraph getUserParagraph(String user) { + return userParagraphMap.get(user); + } + + public Paragraph cloneParagraphForUser(String user) { + Paragraph p = new Paragraph(); + p.settings.setParams(Maps.newHashMap(settings.getParams())); + p.setConfig(Maps.newHashMap(config)); + p.setTitle(getTitle()); + p.setText(getText()); + p.setResult(getReturn()); + p.setStatus(getStatus()); + p.setId(getId()); + + userParagraphMap.put(user, p); + + return p; + } + public String getUser() { return user; } @@ -347,7 +372,19 @@ protected Object jobRun() throws Throwable { context.out.flush(); List resultMessages = context.out.toInterpreterResultMessage(); resultMessages.addAll(ret.message()); - return new InterpreterResult(ret.code(), resultMessages); + + for (Paragraph p : userParagraphMap.values()) { + p.setText(getText()); + } + + InterpreterResult res = new InterpreterResult(ret.code(), resultMessages); + + Paragraph p = userParagraphMap.get(getUser()); + if (null != p) { + p.setResult(res); + } + + return res; } finally { InterpreterContext.remove(); } From a7c91f1ba037a1642eab2cf1f5719d0cb56f58a0 Mon Sep 17 00:00:00 2001 From: Jongyoul Lee Date: Wed, 14 Dec 2016 01:12:50 +0900 Subject: [PATCH 2/9] Fixed the bug while not using personalized mode --- .../java/org/apache/zeppelin/socket/NotebookServer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 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 d6f2c9f1b37..df0d6d9b5b6 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 @@ -582,8 +582,11 @@ public void broadcastInterpreterBindings(String noteId, List settingList) { } public void broadcastParagraph(Note note, Paragraph p) { - //broadcast(note.getId(), new Message(OP.PARAGRAPH).put("paragraph", p)); - broadcastParagraphs(p.getUserParagraphMap(), p); + if(note.isPersonalizedMode()) { + broadcastParagraphs(p.getUserParagraphMap(), p); + } else { + broadcast(note.getId(), new Message(OP.PARAGRAPH).put("paragraph", p)); + } } public void broadcastParagraphs(Map userParagraphMap, From 4fabd8872f1c40265e4a4036b0ed60c15717c870 Mon Sep 17 00:00:00 2001 From: Jongyoul Lee Date: Wed, 14 Dec 2016 23:29:29 +0900 Subject: [PATCH 3/9] Fixed style --- .../main/java/org/apache/zeppelin/socket/NotebookServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 df0d6d9b5b6..d82e7d0b2cd 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 @@ -582,7 +582,7 @@ public void broadcastInterpreterBindings(String noteId, List settingList) { } public void broadcastParagraph(Note note, Paragraph p) { - if(note.isPersonalizedMode()) { + if (note.isPersonalizedMode()) { broadcastParagraphs(p.getUserParagraphMap(), p); } else { broadcast(note.getId(), new Message(OP.PARAGRAPH).put("paragraph", p)); From 20425e7ef3205748e8d0606eeade84f3f00848fd Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Thu, 15 Dec 2016 01:07:31 +0900 Subject: [PATCH 4/9] add toggleNotePersonalizedMode and ui --- .../src/app/notebook/notebook-actionBar.html | 14 ++++++++++++++ .../src/app/notebook/notebook.controller.js | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/zeppelin-web/src/app/notebook/notebook-actionBar.html b/zeppelin-web/src/app/notebook/notebook-actionBar.html index aea18a64e9c..aedc77731f5 100644 --- a/zeppelin-web/src/app/notebook/notebook-actionBar.html +++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html @@ -66,6 +66,20 @@

tooltip-placement="bottom" tooltip="Export this note"> + + diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 8bec1aa2894..5e9fc8e48b8 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -752,6 +752,11 @@ } }; + $scope.toggleNotePersonalizedMode = function(personalizedMode) { + $scope.note.config.personalizedMode = !personalizedMode; + //clover + }; + var isSettingDirty = function() { if (angular.equals($scope.interpreterBindings, $scope.interpreterBindingsOrig)) { return false; @@ -886,6 +891,7 @@ if (note === undefined) { $location.path('/'); } + console.log('clover ', note); $scope.paragraphUrl = $routeParams.paragraphId; $scope.asIframe = $routeParams.asIframe; From 9fcb7f8ef487382b4ab847e55fde39f4c2f34c7a Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Thu, 15 Dec 2016 04:18:36 +0900 Subject: [PATCH 5/9] implement ui --- .../src/app/notebook/notebook-actionBar.html | 15 +++++--- .../src/app/notebook/notebook.controller.js | 37 +++++++++++++++++-- .../websocketEvents/websocketMsg.service.js | 4 ++ 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/zeppelin-web/src/app/notebook/notebook-actionBar.html b/zeppelin-web/src/app/notebook/notebook-actionBar.html index aedc77731f5..8399886cf0d 100644 --- a/zeppelin-web/src/app/notebook/notebook-actionBar.html +++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html @@ -66,18 +66,21 @@

tooltip-placement="bottom" tooltip="Export this note"> + diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 5e9fc8e48b8..fa517a42e85 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -614,6 +614,7 @@ minimumInputLength: 3 }; + $scope.setIamOwner(); angular.element('#selectOwners').select2(selectJson); angular.element('#selectReaders').select2(selectJson); angular.element('#selectWriters').select2(selectJson); @@ -752,9 +753,34 @@ } }; - $scope.toggleNotePersonalizedMode = function(personalizedMode) { - $scope.note.config.personalizedMode = !personalizedMode; - //clover + $scope.setIamOwner = function() { + if ($scope.permissions.owners.length > 0 && + _.indexOf($scope.permissions.owners, $rootScope.ticket.principal) < 0) { + $scope.isOwner = false; + return false; + } + $scope.isOwner = true; + return true; + }; + + $scope.toggleNotePersonalizedMode = function() { + var personalizedMode = $scope.note.config.personalizedMode; + if ($scope.isOwner) { + BootstrapDialog.confirm({ + closable: true, + title: 'Setting the result display', + message: 'Do you want to personalize your analysis??', + callback: function(result) { + if (result) { + if ($scope.note.config.personalizedMode === undefined) { + $scope.note.config.personalizedMode = 'false'; + } + $scope.note.config.personalizedMode = personalizedMode === 'true' ? 'false' : 'true'; + websocketMsgSrv.updatePersonalizedMode($scope.note.id, $scope.note.config.personalizedMode); + } + } + }); + } }; var isSettingDirty = function() { @@ -891,7 +917,6 @@ if (note === undefined) { $location.path('/'); } - console.log('clover ', note); $scope.paragraphUrl = $routeParams.paragraphId; $scope.asIframe = $routeParams.asIframe; @@ -906,6 +931,10 @@ initializeLookAndFeel(); //open interpreter binding setting when there're none selected getInterpreterBindings(); + getPermissions(); + var isPersonalized = $scope.note.config.personalizedMode; + isPersonalized = isPersonalized === undefined ? 'false' : isPersonalized; + $scope.note.config.personalizedMode = isPersonalized; }); $scope.$on('$destroy', function() { diff --git a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js index 98193c094fa..29479e879fa 100644 --- a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js +++ b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js @@ -59,6 +59,10 @@ websocketEvents.sendNewEvent({op: 'NOTE_UPDATE', data: {id: noteId, name: noteName, config: noteConfig}}); }, + updatePersonalizedMode: function(noteId, modeValue) { + websocketEvents.sendNewEvent({op: 'UPDATE_PERSONALIZED_MODE', data: {id: noteId, personalized: modeValue}}); + }, + renameNote: function(noteId, noteName) { websocketEvents.sendNewEvent({op: 'NOTE_RENAME', data: {id: noteId, name: noteName}}); }, From f59d26a34ac23b2ff9cf3d03cd8198b6176d9e94 Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Thu, 15 Dec 2016 04:19:40 +0900 Subject: [PATCH 6/9] implement update personalized mode websocket event in backend --- .../zeppelin/socket/NotebookServer.java | 29 +++++++++++++++++++ .../org/apache/zeppelin/notebook/Note.java | 10 +++++++ .../zeppelin/notebook/socket/Message.java | 3 ++ 3 files changed, 42 insertions(+) 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 d82e7d0b2cd..1883fa80809 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 @@ -258,6 +258,9 @@ public void onMessage(NotebookSocket conn, String msg) { case FOLDER_RENAME: renameFolder(conn, userAndRoles, notebook, messagereceived); break; + case UPDATE_PERSONALIZED_MODE: + updatePersonalizedMode(conn, userAndRoles, notebook, messagereceived); + break; case COMPLETION: completion(conn, userAndRoles, notebook, messagereceived); break; @@ -765,6 +768,32 @@ private void updateNote(NotebookSocket conn, HashSet userAndRoles, } } + private void updatePersonalizedMode(NotebookSocket conn, HashSet userAndRoles, + Notebook notebook, Message fromMessage) throws SchedulerException, IOException { + String noteId = (String) fromMessage.get("id"); + String personalized = (String) fromMessage.get("personalized"); + boolean isPersonalized = personalized.equals("true") ? true : false; + + if (noteId == null) { + return; + } + + NotebookAuthorization notebookAuthorization = notebook.getNotebookAuthorization(); + if (!notebookAuthorization.isOwner(noteId, userAndRoles)) { + permissionError(conn, "rename", fromMessage.principal, + userAndRoles, notebookAuthorization.getOwners(noteId)); + return; + } + + Note note = notebook.getNote(noteId); + if (note != null) { + note.setPersonalizedMode(isPersonalized); + AuthenticationInfo subject = new AuthenticationInfo(fromMessage.principal); + note.persist(subject); + sendNote(conn, userAndRoles, notebook, fromMessage); + } + } + private void renameNote(NotebookSocket conn, HashSet userAndRoles, Notebook notebook, Message fromMessage) throws SchedulerException, IOException { diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index 13c2ad19d09..dbf3e1b5b10 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -126,6 +126,16 @@ public boolean isPersonalizedMode() { return null != v && "true".equals(v); } + public void setPersonalizedMode(Boolean value) { + String valueString = StringUtils.EMPTY; + if (value) { + valueString = "true"; + } else { + valueString = "false"; + } + getConfig().put("personalizedMode", valueString); + } + public String getId() { return id; } 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 362ddcd3ee9..6f36643e900 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 @@ -55,6 +55,9 @@ public static enum OP { NOTE_RENAME, + UPDATE_PERSONALIZED_MODE, // [c-s] update personalized mode (boolean) + // @param note id and boolean personalized mode value + FOLDER_RENAME, RUN_PARAGRAPH, // [c-s] run paragraph From 2c7bd398c381ebbc84d1b1b2ff2b08912ffae36e Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Thu, 15 Dec 2016 14:45:52 +0900 Subject: [PATCH 7/9] broadcast bugfix --- .../main/java/org/apache/zeppelin/socket/NotebookServer.java | 4 ++-- zeppelin-web/src/app/notebook/notebook.controller.js | 2 ++ 2 files changed, 4 insertions(+), 2 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 1883fa80809..ae629a95720 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 @@ -780,7 +780,7 @@ private void updatePersonalizedMode(NotebookSocket conn, HashSet userAnd NotebookAuthorization notebookAuthorization = notebook.getNotebookAuthorization(); if (!notebookAuthorization.isOwner(noteId, userAndRoles)) { - permissionError(conn, "rename", fromMessage.principal, + permissionError(conn, "persoanlized ", fromMessage.principal, userAndRoles, notebookAuthorization.getOwners(noteId)); return; } @@ -790,7 +790,7 @@ private void updatePersonalizedMode(NotebookSocket conn, HashSet userAnd note.setPersonalizedMode(isPersonalized); AuthenticationInfo subject = new AuthenticationInfo(fromMessage.principal); note.persist(subject); - sendNote(conn, userAndRoles, notebook, fromMessage); + broadcastNote(note); } } diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index fa517a42e85..78377ac44d9 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -927,6 +927,8 @@ if ($scope.note === null) { $scope.note = note; + } else { + $scope.note.config.personalizedMode = note.config.personalizedMode; } initializeLookAndFeel(); //open interpreter binding setting when there're none selected From 70f68d88dc7b71e5bca194a8eb476ecf2eb0c10e Mon Sep 17 00:00:00 2001 From: Jongyoul Lee Date: Tue, 20 Dec 2016 16:10:19 +0900 Subject: [PATCH 8/9] Fixed dynamic forms Fixed NPE while broadcasting userParagraphsMap --- .../java/org/apache/zeppelin/socket/NotebookServer.java | 7 +++++-- .../main/java/org/apache/zeppelin/notebook/Paragraph.java | 2 ++ 2 files changed, 7 insertions(+), 2 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 ae629a95720..5a34ba4982c 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 @@ -594,8 +594,11 @@ public void broadcastParagraph(Note note, Paragraph p) { public void broadcastParagraphs(Map userParagraphMap, Paragraph defaultParagraph) { - for (String user : userParagraphMap.keySet()) { - multicastToUser(user, new Message(OP.PARAGRAPH).put("paragraph", userParagraphMap.get(user))); + if (null != userParagraphMap) { + for (String user : userParagraphMap.keySet()) { + multicastToUser(user, + new Message(OP.PARAGRAPH).put("paragraph", userParagraphMap.get(user))); + } } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 3bea9b52695..7e72564331d 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -119,6 +119,7 @@ public Paragraph getUserParagraph(String user) { public Paragraph cloneParagraphForUser(String user) { Paragraph p = new Paragraph(); p.settings.setParams(Maps.newHashMap(settings.getParams())); + p.settings.setForms(Maps.newHashMap(settings.getForms())); p.setConfig(Maps.newHashMap(config)); p.setTitle(getTitle()); p.setText(getText()); @@ -382,6 +383,7 @@ protected Object jobRun() throws Throwable { Paragraph p = userParagraphMap.get(getUser()); if (null != p) { p.setResult(res); + p.settings.setParams(settings.getParams()); } return res; From a9d8f7ee04c65b7c444cb71a7429b80239932104 Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Tue, 20 Dec 2016 16:26:26 +0900 Subject: [PATCH 9/9] change mode name shared to collaboration and dialog message (#5) * change mode name shared to collaboration and dialog message * change dialog message Collaboration -> collaborate, --- zeppelin-web/src/app/notebook/notebook-actionBar.html | 2 +- zeppelin-web/src/app/notebook/notebook.controller.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/zeppelin-web/src/app/notebook/notebook-actionBar.html b/zeppelin-web/src/app/notebook/notebook-actionBar.html index 8399886cf0d..88e47b92ad8 100644 --- a/zeppelin-web/src/app/notebook/notebook-actionBar.html +++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html @@ -80,7 +80,7 @@

ng-if="ticket.principal && ticket.principal !== 'anonymous'" ng-hide="viewOnly || note.config.personalizedMode === 'true'" ng-click="toggleNotePersonalizedMode()" - tooltip-placement="bottom" tooltip="Shared mode {{isOwner ? '' : '(owner can change)'}}"> + tooltip-placement="bottom" tooltip="Collaboration mode {{isOwner ? '' : '(owner can change)'}}"> diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 78377ac44d9..fa86abad6b5 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -769,7 +769,10 @@ BootstrapDialog.confirm({ closable: true, title: 'Setting the result display', - message: 'Do you want to personalize your analysis??', + message: function(dialog) { + var modeText = $scope.note.config.personalizedMode === 'true' ? 'collaborate' : 'personalize'; + return 'Do you want to ' + modeText + ' your analysis?'; + }, callback: function(result) { if (result) { if ($scope.note.config.personalizedMode === undefined) {