Refactor TenantManage 13/30413/1
authorGary Wu <gary.wu1@huawei.com>
Mon, 30 Nov 2015 23:54:53 +0000 (15:54 -0800)
committerGary Wu <gary.wu1@huawei.com>
Mon, 30 Nov 2015 23:54:53 +0000 (15:54 -0800)
Refactor TenantManage to make the following changes:

1. Block on the retrieval of users and roles since
   the MD-SAL API is async.  Without this the calls
   will always return null since the async calls
   will not have completed yet.

2. Added new APIs to return users and roles as Maps
   to avoid linear searches.

Change-Id: Ib3ce98a3ac6adbbc66627e497d85531d12258c99
Signed-off-by: Gary Wu <gary.wu1@huawei.com>
nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/AAA.java
nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/RegisterUser.java
nemo-impl/src/main/java/org/opendaylight/nemo/user/tenantmanager/TenantManage.java
nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/AAATest.java
nemo-impl/src/test/java/org/opendaylight/nemo/user/tenantmanager/RegisterUserTest.java

index e9b959b9323e48cfcb809681717587f9fcce20b6..51e693e035fbef15188a3c56a21cc467491d01a8 100644 (file)
@@ -7,6 +7,8 @@
  */\r
 package org.opendaylight.nemo.user.tenantmanager;\r
 \r
+import java.util.Map;\r
+\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserName;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserPassword;\r
@@ -14,8 +16,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.com
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.UserInstance;\r
 \r
-import java.util.List;\r
-\r
 /**\r
  * Created by z00293636 on 2015/8/29.\r
  */\r
@@ -37,39 +37,19 @@ public class AAA {
     private String checkUser(UserId userId, UserName userName, UserPassword userPassword, UserRoleName userRoleName)\r
     {\r
         tenantManage.fetchUsers();\r
-        List<User> userList = tenantManage.getUsersList();\r
+        final Map<UserId, User> users = tenantManage.getUsers();\r
         String errorInfo = null;\r
-        Boolean userexist = false;\r
-\r
-       if (userList != null)\r
-        {\r
-            for (User user : userList)\r
-            {\r
-                if (user.getUserId().equals(userId))\r
-                {\r
-                    userexist = true;\r
-                    if (!user.getUserName().equals(userName))\r
-                    {\r
-                        errorInfo = "The user name is not right.";\r
-                        break;\r
-                    }\r
-                    else if (!user.getUserPassword().equals(userPassword))\r
-                    {\r
-                        errorInfo = "The password is not right.";\r
-                        break;\r
-                    }\r
-                    else if (!user.getUserRole().equals(userRoleName))\r
-                    {\r
-                        errorInfo = "The role is not right.";\r
-                        break;\r
-                    }\r
-                }\r
-             }\r
-\r
-        }\r
-\r
-        if (!userexist)\r
-        {\r
+        final User user = users.get(userId);\r
+\r
+        if (users.containsKey(userId) && user != null) {\r
+            if (!user.getUserName().equals(userName)) {\r
+                errorInfo = "The user name is not right.";\r
+            } else if (!user.getUserPassword().equals(userPassword)) {\r
+                errorInfo = "The password is not right.";\r
+            } else if (!user.getUserRole().equals(userRoleName)) {\r
+                errorInfo = "The role is not right.";\r
+            }\r
+        } else {\r
             errorInfo = "The user is not exist.";\r
         }\r
         return errorInfo;\r
index d598b020f6b9baa27adedca3ac312cc5502bbe3f..5dbf6a04aa6339b94ee925ee331fbca2a3da845b 100644 (file)
@@ -7,21 +7,19 @@
  */\r
 package org.opendaylight.nemo.user.tenantmanager;\r
 \r
+import java.util.Map;\r
+\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserRoleName;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.RegisterUserInput;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.user.roles.UserRole;\r
 \r
-import java.util.List;\r
-\r
 /**\r
  * Created by z00293636 on 2015/9/20.\r
  */\r
 public class RegisterUser {\r
-    private TenantManage tenantManage;\r
-    private List<UserRole> userRoleList;\r
-    private List<User> usersList;\r
+    private final TenantManage tenantManage;\r
 \r
     public RegisterUser(TenantManage tenantManage)\r
     {\r
@@ -33,19 +31,19 @@ public class RegisterUser {
         String errorInfo = null;\r
 \r
         tenantManage.fetchUserRoles();\r
-        userRoleList = tenantManage.getUserRoleList();\r
+        Map<UserRoleName, UserRole> userRoles = tenantManage.getUserRoles();\r
         tenantManage.fetchUsers();\r
-        usersList = tenantManage.getUsersList();\r
+        Map<UserId, User> users = tenantManage.getUsers();\r
 \r
-        if (userRoleList == null)\r
+        if (userRoles.isEmpty())\r
         {\r
             errorInfo = "There are no roles be defined.";\r
         }\r
         else\r
         {\r
-            if (IfRoleExist(input.getUserRole()))\r
+            if (userRoles.containsKey(input.getUserRole()))\r
             {\r
-                if (usersList != null && IfUserHasRegistered(input.getUserId()))\r
+                if (users.containsKey(input.getUserId()))\r
                 {\r
                     errorInfo = "The user has been registered.";\r
                 }\r
@@ -61,32 +59,5 @@ public class RegisterUser {
         }\r
         return errorInfo;\r
     }\r
-    private boolean IfRoleExist(UserRoleName userRoleName){\r
-        Boolean roleExist = false;\r
-\r
-        for (UserRole userRole : userRoleList)\r
-        {\r
-            if (userRole.getRoleName().equals(userRoleName))\r
-            {\r
-                roleExist = true;\r
-            }\r
-        }\r
-\r
-        return roleExist;\r
-    }\r
-\r
-    private boolean IfUserHasRegistered(UserId userId){\r
-        Boolean userHasRegistered = false;\r
-\r
-        for (User user : usersList)\r
-        {\r
-            if (user.getUserId().equals(userId))\r
-            {\r
-                userHasRegistered = true;\r
-            }\r
-        }\r
-\r
-        return userHasRegistered;\r
-    }\r
 \r
 }\r
index c20756b84b5fdf68122bf5d1440317a065d98ae3..cbf22e1fe1fc180fece9eea91e5e13407a7e15ef 100644 (file)
@@ -7,16 +7,19 @@
  */\r
 package org.opendaylight.nemo.user.tenantmanager;\r
 \r
-import com.google.common.base.Optional;\r
-import com.google.common.util.concurrent.FutureCallback;\r
-import com.google.common.util.concurrent.Futures;\r
-import com.google.common.util.concurrent.CheckedFuture;\r
-import com.google.common.util.concurrent.ListenableFuture;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.concurrent.ExecutionException;\r
+import java.util.concurrent.TimeUnit;\r
+import java.util.concurrent.TimeoutException;\r
+\r
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserRoleName;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.RegisterUserInput;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
@@ -28,8 +31,12 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
-import java.util.List;\r
-\r
+import com.google.common.base.Optional;\r
+import com.google.common.util.concurrent.CheckedFuture;\r
+import com.google.common.util.concurrent.FutureCallback;\r
+import com.google.common.util.concurrent.Futures;\r
+import com.google.common.util.concurrent.ListenableFuture;\r
+import com.google.common.util.concurrent.SettableFuture;\r
 \r
 /**\r
  * Created by z00293636 on 2015/8/29.\r
@@ -39,8 +46,8 @@ import java.util.List;
 public class TenantManage {\r
     private static final Logger LOG = LoggerFactory.getLogger(TenantManage.class);\r
     private DataBroker dataBroker;\r
-    private List<UserRole> userRoleList;\r
-    private List<User> usersList ;\r
+    private final SettableFuture<List<UserRole>> userRoleListFuture = SettableFuture.create();\r
+    private final SettableFuture<List<User>> usersListFuture = SettableFuture.create();\r
     private User user;\r
 \r
     public TenantManage(DataBroker dataBroker)\r
@@ -50,12 +57,12 @@ public class TenantManage {
 \r
     private void setUserRoleList(List<UserRole> userRoleList)\r
     {\r
-        this.userRoleList = userRoleList;\r
+        this.userRoleListFuture.set(userRoleList);\r
     }\r
 \r
     private void setUserList(List<User> userList)\r
     {\r
-        this.usersList = userList;\r
+        this.usersListFuture.set(userList);\r
     }\r
 \r
     private void setUser(User user)\r
@@ -63,14 +70,53 @@ public class TenantManage {
         this.user = user;\r
     }\r
 \r
-    public List<UserRole> getUserRoleList()\r
-    {\r
-        return userRoleList;\r
+    public List<UserRole> getUserRoleList() {\r
+        try {\r
+            return userRoleListFuture.get(1, TimeUnit.SECONDS);\r
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {\r
+            LOG.error("Cannot read role information.", e);\r
+            return null;\r
+        }\r
     }\r
 \r
-    public List<User> getUsersList()\r
+    /**\r
+     *\r
+     * @return Map from UserRoleName to UserRole.  If no roles exist, an empty (not-null) map is returned.\r
+     */\r
+    public Map<UserRoleName, UserRole> getUserRoles() {\r
+        final Map<UserRoleName, UserRole> map = new HashMap<>();\r
+        final List<UserRole> userRoleList = getUserRoleList();\r
+        if (userRoleList != null) {\r
+            for (UserRole role : userRoleList) {\r
+                map.put(role.getRoleName(), role);\r
+            }\r
+        }\r
+        return map;\r
+    }\r
+\r
+    public List<User> getUsersList() {\r
+        try {\r
+            return usersListFuture.get(1, TimeUnit.SECONDS);\r
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {\r
+            LOG.error("Cannot read user information.", e);\r
+            return null;\r
+        }\r
+    }\r
+\r
+    /**\r
+     *\r
+     * @return Map from UserId to User.  If no users exist, an empty (not-null) map is returned.\r
+     */\r
+    public Map<UserId, User> getUsers()\r
     {\r
-        return usersList;\r
+        final Map<UserId, User> map = new HashMap<>();\r
+        final List<User> userList = getUsersList();\r
+        if (userList != null) {\r
+            for (User user : userList) {\r
+                map.put(user.getUserId(), user);\r
+            }\r
+        }\r
+        return map;\r
     }\r
 \r
     public User getUser()\r
@@ -87,18 +133,14 @@ public class TenantManage {
             public void onSuccess(Optional<UserRoles> result)\r
             {\r
                 setUserRoleList(result.get().getUserRole());\r
-                return;\r
             }\r
 \r
             @Override\r
             public void onFailure(Throwable t)\r
             {\r
                 LOG.error("Can not read role information.", t);\r
-\r
-                return;\r
             }\r
         });\r
-         return;\r
     }\r
 \r
     public void fetchUsers(){\r
@@ -109,35 +151,25 @@ public class TenantManage {
             public void onSuccess(Optional<Users> result)\r
             {\r
                 setUserList(result.get().getUser());\r
-                return;\r
             }\r
 \r
             @Override\r
             public void onFailure(Throwable t)\r
             {\r
                 LOG.error("Can not read users information.", t);\r
-\r
-                return;\r
             }\r
         });\r
-        return;\r
     }\r
 \r
     public void fetchVNSpace(UserId userId)\r
     {\r
         fetchUsers();\r
-        if (getUsersList() != null)\r
-        {\r
-            for (User user : getUsersList())\r
-            {\r
-                if (user.getUserId().equals(userId))\r
-                {\r
-                    setUser(user);\r
-                    break;\r
-                }\r
-            }\r
+        final Map<UserId, User> users = getUsers();\r
+\r
+        User user = users.get(userId);\r
+        if (users.containsKey(userId) && user != null) {\r
+            setUser(user);\r
         }\r
-        return;\r
     }\r
 \r
     public void addUser(RegisterUserInput registerUserInput){\r
index 98f669a0dc4f0cc056123f10c124699c68a22f04..24f50ac385ad35da9ab550ed53440ead1ae1653b 100644 (file)
@@ -32,6 +32,7 @@ public class AAATest extends TestCase {
     private TenantManage tenantManage;
     private UserInstance userInstance;
 
+    @Override
     @Before
     public void setUp() throws Exception {
         tenantManage = mock(TenantManage.class);
@@ -47,7 +48,7 @@ public class AAATest extends TestCase {
         String acutal = aaa.checkUser(userInstance);
         String expected = "The user is not exist.";
         verify(tenantManage).fetchUsers();
-        verify(tenantManage).getUsersList();
+        verify(tenantManage).getUsers();
         Assert.assertNotNull(aaa);
         Assert.assertEquals(expected,acutal);
     }
index e0a66896bb6478ede5f528930f075e22a56340f9..26ce1765d016f3c17339451f2badbdb07c799b01 100644 (file)
@@ -38,6 +38,7 @@ public class RegisterUserTest extends TestCase {
     private RegisterUser registerUser;
     private TenantManage tenantManage;
     private RegisterUserInput input;
+    @Override
     @Before
     public void setUp() throws Exception {
         tenantManage = mock(TenantManage.class);
@@ -62,8 +63,8 @@ public class RegisterUserTest extends TestCase {
         when(input.getUserRole()).thenReturn(mock(UserRoleName.class));
         registerUser.registerUser(input);
 
-        verify(tenantManage,times(2)).getUserRoleList();
-        verify(tenantManage,times(2)).getUsersList();
+        verify(tenantManage,times(2)).getUserRoles();
+        verify(tenantManage,times(2)).getUsers();
         Assert.assertNotNull(tenantManage);
         Assert.assertNotNull(registerUser);
     }