Code style cleanup for prov authz and beans
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / beans / Group.java
1 /*******************************************************************************\r
2  * ============LICENSE_START==================================================\r
3  * * org.onap.dmaap\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * ===========================================================================\r
7  * * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * * you may not use this file except in compliance with the License.\r
9  * * You may obtain a copy of the License at\r
10  * *\r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * *\r
13  *  * Unless required by applicable law or agreed to in writing, software\r
14  * * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * * See the License for the specific language governing permissions and\r
17  * * limitations under the License.\r
18  * * ============LICENSE_END====================================================\r
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 \r
24 package org.onap.dmaap.datarouter.provisioning.beans;\r
25 \r
26 import com.att.eelf.configuration.EELFLogger;\r
27 import com.att.eelf.configuration.EELFManager;\r
28 import java.io.InvalidObjectException;\r
29 import java.sql.Connection;\r
30 import java.sql.PreparedStatement;\r
31 import java.sql.ResultSet;\r
32 import java.sql.SQLException;\r
33 import java.sql.Statement;\r
34 import java.util.ArrayList;\r
35 import java.util.Collection;\r
36 import java.util.Date;\r
37 import java.util.List;\r
38 import java.util.Objects;\r
39 import org.json.JSONObject;\r
40 import org.onap.dmaap.datarouter.provisioning.utils.DB;\r
41 \r
42 /**\r
43  * The representation of a Subscription.  Subscriptions can be retrieved from the DB, or stored/updated in the DB.\r
44  *\r
45  * @author vikram\r
46  * @version $Id: Group.java,v 1.0 2016/07/19\r
47  */\r
48 \r
49 public class Group extends Syncable {\r
50 \r
51     private static final String GROUP_ID_CONST = "groupid";\r
52     private static EELFLogger intlogger = EELFManager.getInstance().getLogger("InternalLog");\r
53     private static int nextGroupid = getMaxGroupID() + 1;\r
54     private static final String SQLEXCEPTION = "SQLException: ";\r
55 \r
56     private int groupid;\r
57     private String authid;\r
58     private String name;\r
59     private String description;\r
60     private String classification;\r
61     private String members;\r
62     private Date lastMod;\r
63 \r
64     public Group() {\r
65         this("", "", "");\r
66     }\r
67 \r
68     /**\r
69      * Group constructor.\r
70      * @param name group name\r
71      * @param desc group description\r
72      * @param members group members\r
73      */\r
74     public Group(String name, String desc, String members) {\r
75         this.groupid = -1;\r
76         this.authid = "";\r
77         this.name = name;\r
78         this.description = desc;\r
79         this.members = members;\r
80         this.classification = "";\r
81         this.lastMod = new Date();\r
82     }\r
83 \r
84 \r
85     /**\r
86      * Group constructor from ResultSet.\r
87      * @param rs ResultSet\r
88      * @throws SQLException in case of SQL statement error\r
89      */\r
90     public Group(ResultSet rs) throws SQLException {\r
91         this.groupid = rs.getInt("GROUPID");\r
92         this.authid = rs.getString("AUTHID");\r
93         this.name = rs.getString("NAME");\r
94         this.description = rs.getString("DESCRIPTION");\r
95         this.classification = rs.getString("CLASSIFICATION");\r
96         this.members = rs.getString("MEMBERS");\r
97         this.lastMod = rs.getDate("LAST_MOD");\r
98     }\r
99 \r
100     /**\r
101      * Group constructor for JSONObject.\r
102      * @param jo JSONObject\r
103      * @throws InvalidObjectException in case of JSON error\r
104      */\r
105     public Group(JSONObject jo) throws InvalidObjectException {\r
106         this("", "", "");\r
107         try {\r
108             // The JSONObject is assumed to contain a vnd.dmaap-dr.group representation\r
109             this.groupid = jo.optInt(GROUP_ID_CONST, -1);\r
110             String gname = jo.getString("name");\r
111             String gdescription = jo.getString("description");\r
112 \r
113             this.authid = jo.getString("authid");\r
114             this.name = gname;\r
115             this.description = gdescription;\r
116             this.classification = jo.getString("classification");\r
117             this.members = jo.getString("members");\r
118 \r
119             if (gname.length() > 50) {\r
120                 throw new InvalidObjectException("Group name is too long");\r
121             }\r
122             if (gdescription.length() > 256) {\r
123                 throw new InvalidObjectException("Group Description is too long");\r
124             }\r
125         } catch (InvalidObjectException e) {\r
126             throw e;\r
127         } catch (Exception e) {\r
128             intlogger.warn("Invalid JSON: " + e.getMessage(), e);\r
129             throw new InvalidObjectException("Invalid JSON: " + e.getMessage());\r
130         }\r
131     }\r
132 \r
133     /**\r
134      * Get a group frpm DB.\r
135      * @param gup group object\r
136      * @return Group object\r
137      */\r
138     public static Group getGroupMatching(Group gup) {\r
139         String sql = String.format(\r
140                 "select * from GROUPS where NAME='%s'",\r
141                 gup.getName()\r
142         );\r
143         List<Group> list = getGroupsForSQL(sql);\r
144         return !list.isEmpty() ? list.get(0) : null;\r
145     }\r
146 \r
147     /**\r
148      * Get a group from DB using name and groupid.\r
149      * @param gup group object\r
150      * @param groupid id of group\r
151      * @return group object\r
152      */\r
153     public static Group getGroupMatching(Group gup, int groupid) {\r
154         String sql = String.format(\r
155                 "select * from GROUPS where  NAME = '%s' and GROUPID != %d ",\r
156                 gup.getName(),\r
157                 gup.getGroupid()\r
158         );\r
159         List<Group> list = getGroupsForSQL(sql);\r
160         return !list.isEmpty() ? list.get(0) : null;\r
161     }\r
162 \r
163     /**\r
164      * Get group from DB using groupid only.\r
165      * @param id id of group\r
166      * @return group object\r
167      */\r
168     public static Group getGroupById(int id) {\r
169         String sql = "select * from GROUPS where GROUPID = " + id;\r
170         List<Group> list = getGroupsForSQL(sql);\r
171         return !list.isEmpty() ? list.get(0) : null;\r
172     }\r
173 \r
174     /**\r
175      * Get group from DB using AUTHID.\r
176      * @param id AUTHID\r
177      * @return group object\r
178      */\r
179     static Group getGroupByAuthId(String id) {\r
180         String sql = "select * from GROUPS where AUTHID = '" + id + "'";\r
181         List<Group> list = getGroupsForSQL(sql);\r
182         return !list.isEmpty() ? list.get(0) : null;\r
183     }\r
184 \r
185     public static Collection<Group> getAllgroups() {\r
186         return getGroupsForSQL("select * from GROUPS");\r
187     }\r
188 \r
189     private static List<Group> getGroupsForSQL(String sql) {\r
190         List<Group> list = new ArrayList<>();\r
191         try {\r
192             DB db = new DB();\r
193             @SuppressWarnings("resource")\r
194             Connection conn = db.getConnection();\r
195             try (Statement stmt = conn.createStatement()) {\r
196                 try (ResultSet rs = stmt.executeQuery(sql)) {\r
197                     while (rs.next()) {\r
198                         Group group = new Group(rs);\r
199                         list.add(group);\r
200                     }\r
201                 }\r
202             }\r
203             db.release(conn);\r
204         } catch (SQLException e) {\r
205             intlogger.error("PROV0009 getGroupsForSQL: " + e.getMessage(), e);\r
206         }\r
207         return list;\r
208     }\r
209 \r
210     private static int getMaxGroupID() {\r
211         int max = 0;\r
212         try {\r
213             DB db = new DB();\r
214             @SuppressWarnings("resource")\r
215             Connection conn = db.getConnection();\r
216             try (Statement stmt = conn.createStatement()) {\r
217                 try (ResultSet rs = stmt.executeQuery("select MAX(groupid) from GROUPS")) {\r
218                     if (rs.next()) {\r
219                         max = rs.getInt(1);\r
220                     }\r
221                 }\r
222             }\r
223             db.release(conn);\r
224         } catch (SQLException e) {\r
225             intlogger.info("PROV0001 getMaxSubID: " + e.getMessage(), e);\r
226         }\r
227         return max;\r
228     }\r
229 \r
230     public int getGroupid() {\r
231         return groupid;\r
232     }\r
233 \r
234     public static EELFLogger getIntlogger() {\r
235         return intlogger;\r
236     }\r
237 \r
238     public void setGroupid(int groupid) {\r
239         this.groupid = groupid;\r
240     }\r
241 \r
242     public static void setIntlogger(EELFLogger intlogger) {\r
243         Group.intlogger = intlogger;\r
244     }\r
245 \r
246     public String getAuthid() {\r
247         return authid;\r
248     }\r
249 \r
250     public void setAuthid(String authid) {\r
251         this.authid = authid;\r
252     }\r
253 \r
254     public String getName() {\r
255         return name;\r
256     }\r
257 \r
258     public void setName(String name) {\r
259         this.name = name;\r
260     }\r
261 \r
262     public String getDescription() {\r
263         return description;\r
264     }\r
265 \r
266     public void setDescription(String description) {\r
267         this.description = description;\r
268     }\r
269 \r
270     public String getClassification() {\r
271         return classification;\r
272     }\r
273 \r
274     public void setClassification(String classification) {\r
275         this.classification = classification;\r
276     }\r
277 \r
278     public String getMembers() {\r
279         return members;\r
280     }\r
281 \r
282     @Override\r
283     public JSONObject asJSONObject() {\r
284         JSONObject jo = new JSONObject();\r
285         jo.put(GROUP_ID_CONST, groupid);\r
286         jo.put("authid", authid);\r
287         jo.put("name", name);\r
288         jo.put("description", description);\r
289         jo.put("classification", classification);\r
290         jo.put("members", members);\r
291         jo.put("last_mod", lastMod.getTime());\r
292         return jo;\r
293     }\r
294 \r
295     @Override\r
296     public boolean doInsert(Connection conn) {\r
297         boolean rv = true;\r
298         PreparedStatement ps = null;\r
299         try {\r
300             if (groupid == -1) {\r
301                 // No feed ID assigned yet, so assign the next available one\r
302                 setGroupid(nextGroupid++);\r
303             }\r
304             // In case we insert a gropup from synchronization\r
305             if (groupid > nextGroupid) {\r
306                 nextGroupid = groupid + 1;\r
307             }\r
308 \r
309             // Create the GROUPS row\r
310             String sql = "insert into GROUPS (GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) "\r
311                                  + "values (?, ?, ?, ?, ?, ?)";\r
312             ps = conn.prepareStatement(sql, new String[]{"GROUPID"});\r
313             ps.setInt(1, groupid);\r
314             ps.setString(2, authid);\r
315             ps.setString(3, name);\r
316             ps.setString(4, description);\r
317             ps.setString(5, classification);\r
318             ps.setString(6, members);\r
319             ps.execute();\r
320             ps.close();\r
321         } catch (SQLException e) {\r
322             rv = false;\r
323             intlogger.warn("PROV0005 doInsert: " + e.getMessage(), e);\r
324         } finally {\r
325             try {\r
326                 if (ps != null) {\r
327                     ps.close();\r
328                 }\r
329             } catch (SQLException e) {\r
330                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
331             }\r
332         }\r
333         return rv;\r
334     }\r
335 \r
336     @Override\r
337     public boolean doUpdate(Connection conn) {\r
338         boolean rv = true;\r
339         PreparedStatement ps = null;\r
340         try {\r
341             String sql = "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? ,  MEMBERS = ? "\r
342                                  + "where GROUPID = ?";\r
343             ps = conn.prepareStatement(sql);\r
344             ps.setString(1, authid);\r
345             ps.setString(2, name);\r
346             ps.setString(3, description);\r
347             ps.setString(4, classification);\r
348             ps.setString(5, members);\r
349             ps.setInt(6, groupid);\r
350             ps.executeUpdate();\r
351         } catch (SQLException e) {\r
352             rv = false;\r
353             intlogger.warn("PROV0006 doUpdate: " + e.getMessage(), e);\r
354         } finally {\r
355             try {\r
356                 if (ps != null) {\r
357                     ps.close();\r
358                 }\r
359             } catch (SQLException e) {\r
360                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
361             }\r
362         }\r
363         return rv;\r
364     }\r
365 \r
366     @Override\r
367     public boolean doDelete(Connection conn) {\r
368         boolean rv = true;\r
369         PreparedStatement ps = null;\r
370         try {\r
371             String sql = "delete from GROUPS where GROUPID = ?";\r
372             ps = conn.prepareStatement(sql);\r
373             ps.setInt(1, groupid);\r
374             ps.execute();\r
375         } catch (SQLException e) {\r
376             rv = false;\r
377             intlogger.warn("PROV0007 doDelete: " + e.getMessage(), e);\r
378         } finally {\r
379             try {\r
380                 if (ps != null) {\r
381                     ps.close();\r
382                 }\r
383             } catch (SQLException e) {\r
384                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
385             }\r
386         }\r
387         return rv;\r
388     }\r
389 \r
390     @Override\r
391     public String getKey() {\r
392         return "" + getGroupid();\r
393     }\r
394 \r
395     @Override\r
396     public boolean equals(Object obj) {\r
397         if (!(obj instanceof Group)) {\r
398             return false;\r
399         }\r
400         Group os = (Group) obj;\r
401         if (groupid != os.groupid) {\r
402             return false;\r
403         }\r
404         if (authid != os.authid) {\r
405             return false;\r
406         }\r
407         if (!name.equals(os.name)) {\r
408             return false;\r
409         }\r
410         if (description != os.description) {\r
411             return false;\r
412         }\r
413         if (!classification.equals(os.classification)) {\r
414             return false;\r
415         }\r
416         if (!members.equals(os.members)) {\r
417             return false;\r
418         }\r
419 \r
420         return true;\r
421     }\r
422 \r
423     @Override\r
424     public String toString() {\r
425         return "GROUP: groupid=" + groupid;\r
426     }\r
427 \r
428     @Override\r
429     public int hashCode() {\r
430         return Objects.hash(groupid, authid, name, description, classification, members, lastMod);\r
431     }\r
432 }\r