From 03717018b88d4a4d02f0ce153bb006c5474f7dd7 Mon Sep 17 00:00:00 2001 From: astroshim Date: Fri, 17 Jun 2016 00:05:42 +0900 Subject: [PATCH 1/9] add more credential apis. --- .../org/apache/zeppelin/user/Credentials.java | 29 ++++++++- .../apache/zeppelin/user/UserCredentials.java | 16 ++++- .../zeppelin/rest/CredentialRestApi.java | 62 +++++++++++++++++-- .../zeppelin/rest/CredentialsRestApiTest.java | 60 +++++++++++++++++- 4 files changed, 156 insertions(+), 11 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java index b3a3726f845..554f5cf93c0 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java @@ -61,7 +61,33 @@ public UserCredentials getUserCredentials(String username) { } public void putUserCredentials(String username, UserCredentials uc) throws IOException { - credentialsMap.put(username, uc); + synchronized (credentialsMap) { + credentialsMap.put(username, uc); + } + saveCredentials(); + } + + public UserCredentials removeUserCredentials(String username) throws IOException { + UserCredentials uc; + synchronized (credentialsMap) { + uc = credentialsMap.remove(username); + } + saveCredentials(); + return uc; + } + + public boolean removeCredentialEntity(String username, String entity) throws IOException { + UserCredentials uc = credentialsMap.get(username); + if (uc != null && uc.existUsernamePassword(entity) == false) { + return false; + } + + uc.removeUsernamePassword(entity); + saveCredentials(); + return true; + } + + public void saveCredentials() throws IOException { if (credentialsPersist) { saveToFile(); } @@ -118,5 +144,4 @@ private void saveToFile() throws IOException { LOG.error("Error saving credentials file", e); } } - } diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java index 166840a68ef..3a3be96e9bc 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java @@ -35,7 +35,21 @@ public UsernamePassword getUsernamePassword(String entity) { } public void putUsernamePassword(String entity, UsernamePassword up) { - userCredentials.put(entity, up); + synchronized (userCredentials) { + userCredentials.put(entity, up); + } + } + + public void removeUsernamePassword(String entity) { + synchronized (userCredentials) { + userCredentials.remove(entity); + } + } + + public boolean existUsernamePassword(String entity) { + synchronized (userCredentials) { + return userCredentials.containsKey(entity); + } } @Override diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java index 6904a32a28b..a3bf1998c45 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java @@ -50,7 +50,6 @@ public class CredentialRestApi { private HttpServletRequest servReq; public CredentialRestApi() { - } public CredentialRestApi(Credentials credentials) { @@ -58,10 +57,13 @@ public CredentialRestApi(Credentials credentials) { } /** - * Update credentials for current user + * Put User Credentials REST API + * @param message - JSON with entity, username, password. + * @return JSON with status.OK + * @throws IOException, IllegalArgumentException */ @PUT - public Response putCredentials(String message) throws IOException { + public Response putCredentials(String message) throws IOException, IllegalArgumentException { Map messageMap = gson.fromJson(message, new TypeToken>(){}.getType()); String entity = messageMap.get("entity"); @@ -69,7 +71,7 @@ public Response putCredentials(String message) throws IOException { String password = messageMap.get("password"); if (entity == null || username == null || password == null) { - return new JsonResponse(Status.BAD_REQUEST, "", "").build(); + return new JsonResponse(Status.BAD_REQUEST).build(); } String user = SecurityUtils.getPrincipal(); @@ -77,7 +79,57 @@ public Response putCredentials(String message) throws IOException { UserCredentials uc = credentials.getUserCredentials(user); uc.putUsernamePassword(entity, new UsernamePassword(username, password)); credentials.putUserCredentials(user, uc); - return new JsonResponse(Status.OK, "", "").build(); + return new JsonResponse(Status.OK).build(); + } + + /** + * Get User Credentials list REST API + * @param + * @return JSON with status.OK + * @throws IOException, IllegalArgumentException + */ + @GET + public Response getCredentials(String message) throws + IOException, IllegalArgumentException { + String user = SecurityUtils.getPrincipal(); + logger.info("getCredentials credentials for user {} ", user); + UserCredentials uc = credentials.getUserCredentials(user); + return new JsonResponse(Status.OK, uc).build(); + } + + /** + * Remove User Credentials REST API + * @param + * @return JSON with status.OK + * @throws IOException, IllegalArgumentException + */ + @DELETE + public Response removeCredentials(String message) throws + IOException, IllegalArgumentException { + String user = SecurityUtils.getPrincipal(); + logger.info("removeCredentials credentials for user {} ", user); + UserCredentials uc = credentials.removeUserCredentials(user); + if (uc == null) { + return new JsonResponse(Status.NOT_FOUND).build(); + } + return new JsonResponse(Status.OK).build(); } + /** + * Remove Entity of User Credential entity REST API + * @param + * @return JSON with status.OK + * @throws IOException, IllegalArgumentException + */ + @DELETE + @Path("{entity}") + public Response removeCredentialEntity(@PathParam("entity") String entity) throws + IOException, IllegalArgumentException { + String user = SecurityUtils.getPrincipal(); + logger.info("removeCredentialEntity for user {} entity {}", user, entity); + if (credentials.removeCredentialEntity(user, entity) == false) { + return new JsonResponse(Status.NOT_FOUND).build(); + } + return new JsonResponse(Status.OK).build(); + } } diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/CredentialsRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/CredentialsRestApiTest.java index 674c47e5f7c..29c2914991d 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/CredentialsRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/CredentialsRestApiTest.java @@ -19,19 +19,26 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import org.apache.commons.httpclient.methods.DeleteMethod; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PutMethod; +import org.apache.zeppelin.notebook.Note; +import org.apache.zeppelin.server.ZeppelinServer; +import org.apache.zeppelin.user.UserCredentials; +import org.apache.zeppelin.utils.SecurityUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.junit.Assert.*; public class CredentialsRestApiTest extends AbstractTestRestApi { + protected static final Logger LOG = LoggerFactory.getLogger(CredentialsRestApiTest.class); Gson gson = new Gson(); @BeforeClass @@ -72,5 +79,52 @@ public void testInvalidRequest() throws IOException { allNullPut.releaseConnection(); } -} + public Map testGetUserCredentials() throws IOException { + GetMethod getMethod = httpGet("/credential"); + getMethod.addRequestHeader("Origin", "http://localhost"); + Map resp = gson.fromJson(getMethod.getResponseBodyAsString(), + new TypeToken>(){}.getType()); + Map body = (Map) resp.get("body"); + Map credentialMap = (Map)body.get("userCredentials"); + getMethod.releaseConnection(); + return credentialMap; + } + + public void testPutUserCredentials(String requestData) throws IOException { + PutMethod putMethod = httpPut("/credential", requestData); + putMethod.addRequestHeader("Origin", "http://localhost"); + assertThat(putMethod, isAllowed()); + putMethod.releaseConnection(); + } + + public void testRemoveUserCredentials() throws IOException { + DeleteMethod deleteMethod = httpDelete("/credential/"); + assertThat("Test delete method:", deleteMethod, isAllowed()); + deleteMethod.releaseConnection(); + } + + public void testRemoveCredentialEntity(String entity) throws IOException { + DeleteMethod deleteMethod = httpDelete("/credential/" + entity); + assertThat("Test delete method:", deleteMethod, isAllowed()); + deleteMethod.releaseConnection(); + } + + @Test + public void testCredentialsAPIs() throws IOException { + String requestData1 = "{\"entity\" : \"entityname\", \"username\" : \"myuser\", \"password\" : \"mypass\"}"; + String entity = "entityname"; + Map credentialMap; + + testPutUserCredentials(requestData1); + credentialMap = testGetUserCredentials(); + assertNotNull("CredentialMap should be null", credentialMap); + testRemoveCredentialEntity(entity); + credentialMap = testGetUserCredentials(); + assertNull("CredentialMap should be null", credentialMap.get("entity1")); + + testRemoveUserCredentials(); + credentialMap = testGetUserCredentials(); + assertEquals("Compare CredentialMap", credentialMap.toString(), "{}"); + } +} From 9b2c1c98db582b88e93d66d7ccbe3427b4add607 Mon Sep 17 00:00:00 2001 From: astroshim Date: Sat, 18 Jun 2016 22:40:15 +0900 Subject: [PATCH 2/9] add checking null and blank values in the putCredentials method. --- .../main/java/org/apache/zeppelin/rest/CredentialRestApi.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) mode change 100644 => 100755 zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java old mode 100644 new mode 100755 index a3bf1998c45..74412c44862 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.rest; +import com.google.common.base.Strings; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.apache.zeppelin.user.Credentials; @@ -70,7 +71,8 @@ public Response putCredentials(String message) throws IOException, IllegalArgume String username = messageMap.get("username"); String password = messageMap.get("password"); - if (entity == null || username == null || password == null) { + if (Strings.isNullOrEmpty(entity) + || Strings.isNullOrEmpty(username) || Strings.isNullOrEmpty(password) ) { return new JsonResponse(Status.BAD_REQUEST).build(); } From 26433f2945104e17cdbc70de13bfa3f0ca5395e8 Mon Sep 17 00:00:00 2001 From: astroshim Date: Thu, 23 Jun 2016 14:34:01 +0900 Subject: [PATCH 3/9] change using syncronizedMap. --- .../org/apache/zeppelin/user/Credentials.java | 19 +++++++------------ .../apache/zeppelin/user/UserCredentials.java | 15 +++++---------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java index 554f5cf93c0..33fa5e30dc2 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java @@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory; import java.io.*; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -43,7 +44,7 @@ public Credentials(Boolean credentialsPersist, String credentialsPath) { if (credentialsPath != null) { credentialsFile = new File(credentialsPath); } - credentialsMap = new HashMap<>(); + credentialsMap = Collections.synchronizedMap(new HashMap()); if (credentialsPersist) { GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); @@ -61,17 +62,13 @@ public UserCredentials getUserCredentials(String username) { } public void putUserCredentials(String username, UserCredentials uc) throws IOException { - synchronized (credentialsMap) { - credentialsMap.put(username, uc); - } + credentialsMap.put(username, uc); saveCredentials(); } public UserCredentials removeUserCredentials(String username) throws IOException { UserCredentials uc; - synchronized (credentialsMap) { - uc = credentialsMap.remove(username); - } + uc = credentialsMap.remove(username); saveCredentials(); return uc; } @@ -124,11 +121,9 @@ private void loadFromFile() { private void saveToFile() throws IOException { String jsonString; - synchronized (credentialsMap) { - CredentialsInfoSaving info = new CredentialsInfoSaving(); - info.credentialsMap = credentialsMap; - jsonString = gson.toJson(info); - } + CredentialsInfoSaving info = new CredentialsInfoSaving(); + info.credentialsMap = credentialsMap; + jsonString = gson.toJson(info); try { if (!credentialsFile.exists()) { diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java index 3a3be96e9bc..bad8a951815 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.user; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -27,7 +28,7 @@ public class UserCredentials { private Map userCredentials; public UserCredentials() { - this.userCredentials = new HashMap<>(); + userCredentials = Collections.synchronizedMap(new HashMap()); } public UsernamePassword getUsernamePassword(String entity) { @@ -35,21 +36,15 @@ public UsernamePassword getUsernamePassword(String entity) { } public void putUsernamePassword(String entity, UsernamePassword up) { - synchronized (userCredentials) { - userCredentials.put(entity, up); - } + userCredentials.put(entity, up); } public void removeUsernamePassword(String entity) { - synchronized (userCredentials) { - userCredentials.remove(entity); - } + userCredentials.remove(entity); } public boolean existUsernamePassword(String entity) { - synchronized (userCredentials) { - return userCredentials.containsKey(entity); - } + return userCredentials.containsKey(entity); } @Override From f54653282b26cb087ce52e1942ed513999d35c8a Mon Sep 17 00:00:00 2001 From: astroshim Date: Sat, 25 Jun 2016 00:23:41 +0900 Subject: [PATCH 4/9] add rest-credential document --- docs/rest-api/rest-credential | 181 ++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 docs/rest-api/rest-credential diff --git a/docs/rest-api/rest-credential b/docs/rest-api/rest-credential new file mode 100644 index 00000000000..df9a5791321 --- /dev/null +++ b/docs/rest-api/rest-credential @@ -0,0 +1,181 @@ +--- +layout: page +title: "Credentials REST API" +description: "" +group: rest-api +--- + +{% include JB/setup %} + +## Zeppelin REST API + Zeppelin provides several REST APIs for interaction and remote activation of zeppelin functionality. + + All REST APIs are available starting with the following endpoint `http://[zeppelin-server]:[zeppelin-port]/api`. Note that zeppelin REST APIs receive or return JSON objects, it is recommended for you to install some JSON viewers such as [JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc). + + If you work with Zeppelin and find a need for an additional REST API, please [file an issue or send us mail](http://zeppelin.apache.org/community.html). + +
+## Credential REST API List + +### List Credential information + + + + + + + + + + + + + + + + + + + + + + +
DescriptionThis ```GET``` method return all key/value pair of credential informations on the server.
URL```http://[zeppelin-server]:[zeppelin-port]/api/credential```
Success code200
Fail code 500
sample JSON response + +
+{
+  "status": "OK",
+  "message": "",
+  "body": {
+    "userCredentials":{
+      "entity1":{
+        "username":"user1",
+        "password":"password1"
+      },
+      "entity2":{
+        "username":"user2",
+        "password":"password2"
+      }
+    }
+  }
+}
+ +
+### Create an Credential Information + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionThis ```PUT``` method create an credential information with new properties.
URL```http://[zeppelin-server]:[zeppelin-port]/api/credential/```
Success code200
Fail code 500
Sample JSON input +
+{
+  "entity": "e1",
+  "username": "user",
+  "password": "password"
+}
+        
+
Sample JSON response +
+{
+  "status": "OK"
+}
+        
+
+ + +
+### Delete all Credential Information + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionThis ```DELETE``` method deletes credential information.
URL```http://[zeppelin-server]:[zeppelin-port]/api/credential```
Success code200
Fail code 500
Sample JSON response + {"status":"OK"} +
+ + +
+### Delete an Credential entity + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionThis ```DELETE``` method deletes an given credential entity.
URL```http://[zeppelin-server]:[zeppelin-port]/api/credential/[entity]```
Success code200
Fail code 500
Sample JSON response + {"status":"OK"} +
+ + +
+ From 80d8a30ee2912b4952a305b88d9a12617a3bd325 Mon Sep 17 00:00:00 2001 From: AhyoungRyu Date: Fri, 24 Jun 2016 09:18:08 -0700 Subject: [PATCH 5/9] Add rest-credential.md to index.md & dropdown menu --- docs/_includes/themes/zeppelin/_navigation.html | 1 + docs/index.md | 1 + docs/rest-api/{rest-credential => rest-credential.md} | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) rename docs/rest-api/{rest-credential => rest-credential.md} (95%) diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index 40b9fb6024b..f01aa588c2b 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -93,6 +93,7 @@
  • Interpreter API
  • Notebook API
  • Configuration API
  • +
  • Credential API
  • Security
  • Authentication for NGINX
  • diff --git a/docs/index.md b/docs/index.md index 628821760df..bd1df4fe3c1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -163,6 +163,7 @@ Join to our [Mailing list](https://zeppelin.apache.org/community.html) and repor * [Interpreter API](./rest-api/rest-interpreter.html) * [Notebook API](./rest-api/rest-notebook.html) * [Configuration API](./rest-api/rest-configuration.html) + * [Credential API](./rest-api/rest-credential.html) * Security: available security support in Apache Zeppelin * [Authentication for NGINX](./security/authentication.html) * [Shiro Authentication](./security/shiroauthentication.html) diff --git a/docs/rest-api/rest-credential b/docs/rest-api/rest-credential.md similarity index 95% rename from docs/rest-api/rest-credential rename to docs/rest-api/rest-credential.md index df9a5791321..a01f3351b90 100644 --- a/docs/rest-api/rest-credential +++ b/docs/rest-api/rest-credential.md @@ -34,7 +34,7 @@ limitations under the License. Description - This ```GET``` method return all key/value pair of credential informations on the server. + This ```GET``` method returns all key/value pairs of credential information on the server. URL @@ -78,7 +78,7 @@ limitations under the License. Description - This ```PUT``` method create an credential information with new properties. + This ```PUT``` method creates an credential information with new properties. URL From d0c2bac7a42c3a0b4d61a1e0dd2901870925a1c0 Mon Sep 17 00:00:00 2001 From: astroshim Date: Sat, 25 Jun 2016 06:30:10 +0900 Subject: [PATCH 6/9] changed syncronizedmap to concurrenthashmap --- .../src/main/java/org/apache/zeppelin/user/Credentials.java | 5 ++--- .../main/java/org/apache/zeppelin/user/UserCredentials.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java index 33fa5e30dc2..a03fa1ea717 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java @@ -24,9 +24,8 @@ import org.slf4j.LoggerFactory; import java.io.*; -import java.util.Collections; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * Class defining credentials for data source authorization @@ -44,7 +43,7 @@ public Credentials(Boolean credentialsPersist, String credentialsPath) { if (credentialsPath != null) { credentialsFile = new File(credentialsPath); } - credentialsMap = Collections.synchronizedMap(new HashMap()); + credentialsMap = new ConcurrentHashMap(); if (credentialsPersist) { GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java index bad8a951815..7f339e0b00b 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java @@ -17,9 +17,8 @@ package org.apache.zeppelin.user; -import java.util.Collections; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * User Credentials POJO @@ -28,7 +27,7 @@ public class UserCredentials { private Map userCredentials; public UserCredentials() { - userCredentials = Collections.synchronizedMap(new HashMap()); + userCredentials = new ConcurrentHashMap(); } public UsernamePassword getUsernamePassword(String entity) { From 0f503fdf4c46b1b3de8f4a42d982830b3ccca3a7 Mon Sep 17 00:00:00 2001 From: astroshim Date: Mon, 27 Jun 2016 20:42:34 +0900 Subject: [PATCH 7/9] to fix ci --- .../src/main/java/org/apache/zeppelin/user/Credentials.java | 3 +-- .../main/java/org/apache/zeppelin/user/UserCredentials.java | 6 +----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java index a03fa1ea717..cc409ec75b7 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java @@ -33,7 +33,7 @@ public class Credentials { private static final Logger LOG = LoggerFactory.getLogger(Credentials.class); - private Map credentialsMap; + private Map credentialsMap = new ConcurrentHashMap<>();; private Gson gson; private Boolean credentialsPersist = true; File credentialsFile; @@ -43,7 +43,6 @@ public Credentials(Boolean credentialsPersist, String credentialsPath) { if (credentialsPath != null) { credentialsFile = new File(credentialsPath); } - credentialsMap = new ConcurrentHashMap(); if (credentialsPersist) { GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java index 7f339e0b00b..f9528668aa3 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/UserCredentials.java @@ -24,11 +24,7 @@ * User Credentials POJO */ public class UserCredentials { - private Map userCredentials; - - public UserCredentials() { - userCredentials = new ConcurrentHashMap(); - } + private Map userCredentials = new ConcurrentHashMap<>(); public UsernamePassword getUsernamePassword(String entity) { return userCredentials.get(entity); From 06099313cda64de3850652b4b5d5d4b1d1647d02 Mon Sep 17 00:00:00 2001 From: astroshim Date: Mon, 27 Jun 2016 22:08:05 +0900 Subject: [PATCH 8/9] update credentialsMap --- .../java/org/apache/zeppelin/user/Credentials.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java index cc409ec75b7..bb4a64b7254 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java @@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory; import java.io.*; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -33,7 +34,8 @@ public class Credentials { private static final Logger LOG = LoggerFactory.getLogger(Credentials.class); - private Map credentialsMap = new ConcurrentHashMap<>();; + //private Map credentialsMap = new ConcurrentHashMap<>(); + private Map credentialsMap; private Gson gson; private Boolean credentialsPersist = true; File credentialsFile; @@ -43,6 +45,8 @@ public Credentials(Boolean credentialsPersist, String credentialsPath) { if (credentialsPath != null) { credentialsFile = new File(credentialsPath); } + credentialsMap = new HashMap<>(); + if (credentialsPersist) { GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); @@ -119,9 +123,11 @@ private void loadFromFile() { private void saveToFile() throws IOException { String jsonString; - CredentialsInfoSaving info = new CredentialsInfoSaving(); - info.credentialsMap = credentialsMap; - jsonString = gson.toJson(info); + synchronized (credentialsMap) { + CredentialsInfoSaving info = new CredentialsInfoSaving(); + info.credentialsMap = credentialsMap; + jsonString = gson.toJson(info); + } try { if (!credentialsFile.exists()) { From a58047624b0c1171a3586edc8eeb00e7f12985ff Mon Sep 17 00:00:00 2001 From: astroshim Date: Mon, 27 Jun 2016 22:38:43 +0900 Subject: [PATCH 9/9] erase comment code --- .../src/main/java/org/apache/zeppelin/user/Credentials.java | 1 - 1 file changed, 1 deletion(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java index bb4a64b7254..72d44e9e117 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java @@ -34,7 +34,6 @@ public class Credentials { private static final Logger LOG = LoggerFactory.getLogger(Credentials.class); - //private Map credentialsMap = new ConcurrentHashMap<>(); private Map credentialsMap; private Gson gson; private Boolean credentialsPersist = true;