Refactor and fix TenantManage for repeated queries
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / user / tenantmanager / TenantManage.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.nemo.user.tenantmanager;\r
9 \r
10 import java.util.HashMap;\r
11 import java.util.Map;\r
12 import java.util.concurrent.ExecutionException;\r
13 \r
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
15 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
17 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserRoleName;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.RegisterUserInput;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserBuilder;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserKey;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.UserRoles;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.user.roles.UserRole;\r
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
28 import org.slf4j.Logger;\r
29 import org.slf4j.LoggerFactory;\r
30 \r
31 import com.google.common.base.Function;\r
32 import com.google.common.base.Optional;\r
33 import com.google.common.collect.Maps;\r
34 import com.google.common.util.concurrent.CheckedFuture;\r
35 import com.google.common.util.concurrent.FutureCallback;\r
36 import com.google.common.util.concurrent.Futures;\r
37 import com.google.common.util.concurrent.ListenableFuture;\r
38 \r
39 /**\r
40  * Created by z00293636 on 2015/8/29.\r
41  */\r
42 \r
43 /* maintain tenant information, including how many tenants are active, their information */\r
44 public class TenantManage {\r
45     private static final Logger LOG = LoggerFactory.getLogger(TenantManage.class);\r
46     private DataBroker dataBroker;\r
47     private User user;\r
48 \r
49     public TenantManage(DataBroker dataBroker)\r
50     {\r
51         this.dataBroker = dataBroker;\r
52     }\r
53 \r
54     private void setUser(User user)\r
55     {\r
56         this.user = user;\r
57     }\r
58 \r
59     public User getUser()\r
60     {\r
61         return user;\r
62     }\r
63 \r
64     /**\r
65      *\r
66      * @return null if an error was encountered, or an empty map if there was no\r
67      *         error but no data was retrieved.\r
68      */\r
69     public Map<UserRoleName, UserRole> getUserRoles() {\r
70 \r
71         InstanceIdentifier<UserRoles> userRolesInsId = InstanceIdentifier.builder(UserRoles.class).build();\r
72         ListenableFuture<Optional<UserRoles>> userRolesFuture = this.dataBroker.newReadOnlyTransaction().read(\r
73                 LogicalDatastoreType.CONFIGURATION, userRolesInsId);\r
74 \r
75         final Optional<UserRoles> userRolesOpt;\r
76         try {\r
77             // TODO: consider time out here?\r
78             userRolesOpt = userRolesFuture.get();\r
79         } catch (InterruptedException | ExecutionException e) {\r
80             LOG.error("Cannot read role information.", e);\r
81             return null;\r
82         }\r
83 \r
84         // TODO: change to Java 8 lambda expressions\r
85         return userRolesOpt.transform(new Function<UserRoles, Map<UserRoleName, UserRole>>() {\r
86             @Override\r
87             public Map<UserRoleName, UserRole> apply(UserRoles input) {\r
88                 return Maps.uniqueIndex(input.getUserRole(), new Function<UserRole, UserRoleName>() {\r
89                     @Override\r
90                     public UserRoleName apply(UserRole role) {\r
91                         return role.getRoleName();\r
92                     }\r
93                 });\r
94             }\r
95         }).or(new HashMap<UserRoleName, UserRole>());\r
96     }\r
97 \r
98     /**\r
99     *\r
100     * @return null if an error was encountered, or an empty map if there was no\r
101     *         error but no data was retrieved.\r
102     */\r
103     public Map<UserId, User> getUsers() {\r
104         InstanceIdentifier<Users> usersInsId = InstanceIdentifier.builder(Users.class).build();\r
105         ListenableFuture<Optional<Users>> usersFuture = dataBroker.newReadOnlyTransaction().read(\r
106                 LogicalDatastoreType.CONFIGURATION, usersInsId);\r
107 \r
108         final Optional<Users> usersOpt;\r
109         try {\r
110             // TODO: consider time out here?\r
111             usersOpt = usersFuture.get();\r
112         } catch (InterruptedException | ExecutionException e) {\r
113             LOG.error("Cannot read user information.", e);\r
114             return null;\r
115         }\r
116 \r
117         // TODO: change to Java 8 lambda expressions\r
118         return usersOpt.transform(new Function<Users, Map<UserId, User>>() {\r
119             @Override\r
120             public Map<UserId, User> apply(Users input) {\r
121                 return Maps.uniqueIndex(input.getUser(), new Function<User, UserId>() {\r
122                     @Override\r
123                     public UserId apply(User user) {\r
124                         return user.getUserId();\r
125                     }\r
126                 });\r
127             }\r
128         }).or(new HashMap<UserId, User>());\r
129     }\r
130 \r
131     public void fetchVNSpace(UserId userId)\r
132     {\r
133         final Map<UserId, User> users = getUsers();\r
134         setUser((users != null) ? users.get(userId) : null);\r
135     }\r
136 \r
137     public void addUser(RegisterUserInput registerUserInput){\r
138         WriteTransaction t = dataBroker.newWriteOnlyTransaction();\r
139         if (registerUserInput.getUserId() != null)\r
140         {\r
141             User user = new UserBuilder(registerUserInput).build();\r
142 //            UserBuilder userBuilder = new UserBuilder();\r
143 //            userBuilder.setUserId(registerUserInput.getUserId());\r
144 //            userBuilder.setUserName(registerUserInput.getUserName());\r
145 //            userBuilder.setUserPassword(registerUserInput.getUserPassword());\r
146 //            userBuilder.setUserRole(registerUserInput.getUserRole());\r
147 //\r
148 //            User user = userBuilder.build();\r
149             UserKey userKey = new UserKey(registerUserInput.getUserId());\r
150 \r
151             InstanceIdentifier<User> userid = InstanceIdentifier.builder(Users.class).child(User.class, userKey).build();\r
152 \r
153             t.put(LogicalDatastoreType.CONFIGURATION, userid, user,true);\r
154             CheckedFuture<Void, TransactionCommitFailedException> f = t.submit();\r
155             Futures.addCallback(f, new FutureCallback<Void>() {\r
156                 @Override\r
157                 public void onFailure(Throwable t) {\r
158                     LOG.error("Could not write endpoint base container", t);\r
159                 }\r
160 \r
161                 @Override\r
162                 public void onSuccess(Void result) {\r
163 \r
164                 }\r
165             });\r
166         }\r
167     }\r
168 }\r