From 88654b95fac2d52c9acbf8b7af6d65bd5cff5529 Mon Sep 17 00:00:00 2001 From: Colin Ma Date: Thu, 14 Jan 2016 14:35:35 +0800 Subject: [PATCH] SQOOP-2772: Sqoop2: Remove the notion of PrincipalsBean (Jarek Jarcec Cecho via Colin Ma) --- .../request/AuthorizationResourceRequest.java | 8 +-- .../client/request/SqoopResourceRequests.java | 2 +- .../org/apache/sqoop/json/PrincipalBean.java | 26 ++++---- .../org/apache/sqoop/json/PrincipalsBean.java | 63 ------------------- .../apache/sqoop/json/TestPrincipalBean.java | 60 ++++++++++++++++++ .../handler/AuthorizationRequestHandler.java | 6 +- 6 files changed, 81 insertions(+), 84 deletions(-) delete mode 100644 common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java create mode 100644 common/src/test/java/org/apache/sqoop/json/TestPrincipalBean.java diff --git a/client/src/main/java/org/apache/sqoop/client/request/AuthorizationResourceRequest.java b/client/src/main/java/org/apache/sqoop/client/request/AuthorizationResourceRequest.java index ca05d1bb..e99e9131 100644 --- a/client/src/main/java/org/apache/sqoop/client/request/AuthorizationResourceRequest.java +++ b/client/src/main/java/org/apache/sqoop/client/request/AuthorizationResourceRequest.java @@ -73,7 +73,7 @@ public void dropRole(String serverUrl, MRole role) { public void grantRevokeRole(String serverUrl, List roles, List principals, boolean isGrant) { RolesBean rolesBean = new RolesBean(roles); - PrincipalsBean principalsBean = new PrincipalsBean(principals); + PrincipalBean principalsBean = new PrincipalBean(principals); // Extract all config inputs including sensitive inputs JSONObject jsonObject = new JSONObject(); jsonObject.putAll(rolesBean.extract(false)); @@ -95,17 +95,17 @@ public RolesBean readRolesByPrincipal(String serverUrl, MPrincipal principal) { return bean; } - public PrincipalsBean readPrincipalsByRole(String serverUrl, MRole role) { + public PrincipalBean readPrincipalsByRole(String serverUrl, MRole role) { String response = super.get(serverUrl + RESOURCE + PRINCIPALS + "?role_name=" + UrlSafeUtils.urlEncode(role.getName())); JSONObject jsonObject = JSONUtils.parse(response); - PrincipalsBean bean = new PrincipalsBean(); + PrincipalBean bean = new PrincipalBean(); bean.restore(jsonObject); return bean; } public void grantRevokePrivilege(String serverUrl, List principals, List privileges, boolean isGrant) { - PrincipalsBean principalsBean = new PrincipalsBean(principals); + PrincipalBean principalsBean = new PrincipalBean(principals); // Extract all config inputs including sensitive inputs JSONObject jsonObject = new JSONObject(); jsonObject.putAll(principalsBean.extract(false)); diff --git a/client/src/main/java/org/apache/sqoop/client/request/SqoopResourceRequests.java b/client/src/main/java/org/apache/sqoop/client/request/SqoopResourceRequests.java index 3109718d..c962842f 100644 --- a/client/src/main/java/org/apache/sqoop/client/request/SqoopResourceRequests.java +++ b/client/src/main/java/org/apache/sqoop/client/request/SqoopResourceRequests.java @@ -202,7 +202,7 @@ public RolesBean readRolesByPrincipal(MPrincipal principal) { return getAuthorizationRequest().readRolesByPrincipal(serverUrl, principal); } - public PrincipalsBean readPrincipalsByRole(MRole role) { + public PrincipalBean readPrincipalsByRole(MRole role) { return getAuthorizationRequest().readPrincipalsByRole(serverUrl, role); } diff --git a/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java b/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java index f89d9ee7..c6640272 100644 --- a/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java +++ b/common/src/main/java/org/apache/sqoop/json/PrincipalBean.java @@ -33,7 +33,7 @@ @InterfaceStability.Unstable public class PrincipalBean implements JsonBean { - public static final String PRINCIPAL = "principal"; + private static final String PRINCIPALS = "principals"; private static final String NAME = "name"; private static final String TYPE = "type"; @@ -46,7 +46,7 @@ public List getPrincipals() { // For "extract" public PrincipalBean(MPrincipal principal) { this(); - this.principals = new ArrayList(); + this.principals = new ArrayList<>(); this.principals.add(principal); } @@ -62,9 +62,16 @@ public PrincipalBean() { @Override @SuppressWarnings("unchecked") public JSONObject extract(boolean skipSensitive) { - JSONObject principal = new JSONObject(); - principal.put(PRINCIPAL, extractPrincipal(principals.get(0))); - return principal; + JSONArray principalsArray = extractPrincipals(); + JSONObject principals = new JSONObject(); + principals.put(PRINCIPALS, principalsArray); + return principals; + } + + @Override + public void restore(JSONObject json) { + JSONArray principalsArray = JSONUtils.getJSONArray(json, PRINCIPALS); + restorePrincipals(principalsArray); } @SuppressWarnings("unchecked") @@ -86,15 +93,8 @@ private JSONObject extractPrincipal(MPrincipal principal) { return object; } - @Override - public void restore(JSONObject json) { - principals = new ArrayList(); - JSONObject obj = JSONUtils.getJSONObject(json, PRINCIPAL); - principals.add(restorePrincipal(obj)); - } - protected void restorePrincipals(JSONArray array) { - principals = new ArrayList(); + principals = new ArrayList<>(); for (Object obj : array) { principals.add(restorePrincipal(obj)); } diff --git a/common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java b/common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java deleted file mode 100644 index d52a4626..00000000 --- a/common/src/main/java/org/apache/sqoop/json/PrincipalsBean.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.sqoop.json; - -import org.apache.sqoop.classification.InterfaceAudience; -import org.apache.sqoop.classification.InterfaceStability; -import org.apache.sqoop.model.MPrincipal; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import java.util.List; - -@InterfaceAudience.Private -@InterfaceStability.Unstable -public class PrincipalsBean extends PrincipalBean { - - private static final String PRINCIPALS = "principals"; - - // For "extract" - public PrincipalsBean(MPrincipal principal) { - super(principal); - } - - public PrincipalsBean(List principals) { - super(principals); - - } - - // For "restore" - public PrincipalsBean() { - } - - @Override - @SuppressWarnings("unchecked") - public JSONObject extract(boolean skipSensitive) { - JSONArray principalsArray = super.extractPrincipals(); - JSONObject principals = new JSONObject(); - principals.put(PRINCIPALS, principalsArray); - return principals; - } - - @Override - public void restore(JSONObject json) { - JSONArray principalsArray = JSONUtils.getJSONArray(json, PRINCIPALS); - restorePrincipals(principalsArray); - } - -} diff --git a/common/src/test/java/org/apache/sqoop/json/TestPrincipalBean.java b/common/src/test/java/org/apache/sqoop/json/TestPrincipalBean.java new file mode 100644 index 00000000..cecb450b --- /dev/null +++ b/common/src/test/java/org/apache/sqoop/json/TestPrincipalBean.java @@ -0,0 +1,60 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sqoop.json; + +import org.apache.sqoop.model.MPrincipal; +import org.json.simple.JSONObject; +import org.testng.annotations.Test; + +import java.util.LinkedList; +import java.util.List; + +import static org.testng.AssertJUnit.assertEquals; + +public class TestPrincipalBean { + + @Test + public void testSerialization() { + MPrincipal principalUser = new MPrincipal("jarcec", MPrincipal.TYPE.USER); + MPrincipal principalGroup = new MPrincipal("sqoop", MPrincipal.TYPE.GROUP); + List principals = new LinkedList<>(); + principals.add(principalUser); + principals.add(principalGroup); + + // Serialize it to JSON object + PrincipalBean outputBean = new PrincipalBean(principals); + JSONObject json = outputBean.extract(false); + + // "Move" it across network in text form + String jsonString = json.toJSONString(); + + // Retrieved transferred object + JSONObject parsedJson = JSONUtils.parse(jsonString); + PrincipalBean inputBean = new PrincipalBean(); + inputBean.restore(parsedJson); + + assertEquals(inputBean.getPrincipals().size(), 2); + + assertEquals(inputBean.getPrincipals().get(0).getName(), "jarcec"); + assertEquals(inputBean.getPrincipals().get(0).getType(), "USER"); + + assertEquals(inputBean.getPrincipals().get(1).getName(), "sqoop"); + assertEquals(inputBean.getPrincipals().get(1).getType(), "GROUP"); + } + +} diff --git a/server/src/main/java/org/apache/sqoop/handler/AuthorizationRequestHandler.java b/server/src/main/java/org/apache/sqoop/handler/AuthorizationRequestHandler.java index 1ed63e45..45bf4d0c 100644 --- a/server/src/main/java/org/apache/sqoop/handler/AuthorizationRequestHandler.java +++ b/server/src/main/java/org/apache/sqoop/handler/AuthorizationRequestHandler.java @@ -164,7 +164,7 @@ private JsonBean getPrincipal(RequestContext ctx) { MRole role = new MRole(role_name); manager.logAuditEvent(ctx.getUserName(), ctx.getRequest().getRemoteAddr(), "get", "principals by role", role.toString()); - return new PrincipalsBean(handler.getPrincipalsByRole(role)); + return new PrincipalBean(handler.getPrincipalsByRole(role)); } else { throw new SqoopException(SecurityError.AUTH_0012, "Can't get role name"); } @@ -259,7 +259,7 @@ private JsonBean grantRevokeRole(RequestContext ctx, boolean isGrant) { AuditLoggerManager manager = AuditLoggerManager.getInstance(); RolesBean rolesBean = new RolesBean(); - PrincipalsBean principalsBean = new PrincipalsBean(); + PrincipalBean principalsBean = new PrincipalBean(); try { JSONObject json = JSONUtils.parse(ctx.getRequest().getReader()); @@ -290,7 +290,7 @@ private JsonBean grantRevokePrivilege(RequestContext ctx, boolean isGrant) { AuthorizationHandler handler = AuthorizationManager.getInstance().getAuthorizationHandler(); AuditLoggerManager manager = AuditLoggerManager.getInstance(); - PrincipalsBean principalsBean = new PrincipalsBean(); + PrincipalBean principalsBean = new PrincipalBean(); PrivilegesBean privilegesBean = new PrivilegesBean(); try {