Removing code smells
[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 ", gup.getName(), gup.getGroupid());\r
156         List<Group> list = getGroupsForSQL(sql);\r
157         return !list.isEmpty() ? list.get(0) : null;\r
158     }\r
159 \r
160     /**\r
161      * Get group from DB using groupid only.\r
162      * @param id id of group\r
163      * @return group object\r
164      */\r
165     public static Group getGroupById(int id) {\r
166         String sql = "select * from GROUPS where GROUPID = " + id;\r
167         List<Group> list = getGroupsForSQL(sql);\r
168         return !list.isEmpty() ? list.get(0) : null;\r
169     }\r
170 \r
171     /**\r
172      * Get group from DB using AUTHID.\r
173      * @param id AUTHID\r
174      * @return group object\r
175      */\r
176     static Group getGroupByAuthId(String id) {\r
177         String sql = "select * from GROUPS where AUTHID = '" + id + "'";\r
178         List<Group> list = getGroupsForSQL(sql);\r
179         return !list.isEmpty() ? list.get(0) : null;\r
180     }\r
181 \r
182     public static Collection<Group> getAllgroups() {\r
183         return getGroupsForSQL("select * from GROUPS");\r
184     }\r
185 \r
186     private static List<Group> getGroupsForSQL(String sql) {\r
187         List<Group> list = new ArrayList<>();\r
188         try {\r
189             DB db = new DB();\r
190             @SuppressWarnings("resource")\r
191             Connection conn = db.getConnection();\r
192             try (Statement stmt = conn.createStatement()) {\r
193                 try (ResultSet rs = stmt.executeQuery(sql)) {\r
194                     while (rs.next()) {\r
195                         Group group = new Group(rs);\r
196                         list.add(group);\r
197                     }\r
198                 }\r
199             }\r
200             db.release(conn);\r
201         } catch (SQLException e) {\r
202             intlogger.error("PROV0009 getGroupsForSQL: " + e.getMessage(), e);\r
203         }\r
204         return list;\r
205     }\r
206 \r
207     private static int getMaxGroupID() {\r
208         int max = 0;\r
209         try {\r
210             DB db = new DB();\r
211             @SuppressWarnings("resource")\r
212             Connection conn = db.getConnection();\r
213             try (Statement stmt = conn.createStatement()) {\r
214                 try (ResultSet rs = stmt.executeQuery("select MAX(groupid) from GROUPS")) {\r
215                     if (rs.next()) {\r
216                         max = rs.getInt(1);\r
217                     }\r
218                 }\r
219             }\r
220             db.release(conn);\r
221         } catch (SQLException e) {\r
222             intlogger.info("PROV0001 getMaxSubID: " + e.getMessage(), e);\r
223         }\r
224         return max;\r
225     }\r
226 \r
227     public int getGroupid() {\r
228         return groupid;\r
229     }\r
230 \r
231     public static EELFLogger getIntlogger() {\r
232         return intlogger;\r
233     }\r
234 \r
235     public void setGroupid(int groupid) {\r
236         this.groupid = groupid;\r
237     }\r
238 \r
239     public static void setIntlogger(EELFLogger intlogger) {\r
240         Group.intlogger = intlogger;\r
241     }\r
242 \r
243     public String getAuthid() {\r
244         return authid;\r
245     }\r
246 \r
247     public void setAuthid(String authid) {\r
248         this.authid = authid;\r
249     }\r
250 \r
251     public String getName() {\r
252         return name;\r
253     }\r
254 \r
255     public void setName(String name) {\r
256         this.name = name;\r
257     }\r
258 \r
259     public String getDescription() {\r
260         return description;\r
261     }\r
262 \r
263     public void setDescription(String description) {\r
264         this.description = description;\r
265     }\r
266 \r
267     public String getClassification() {\r
268         return classification;\r
269     }\r
270 \r
271     public void setClassification(String classification) {\r
272         this.classification = classification;\r
273     }\r
274 \r
275     public String getMembers() {\r
276         return members;\r
277     }\r
278 \r
279     @Override\r
280     public JSONObject asJSONObject() {\r
281         JSONObject jo = new JSONObject();\r
282         jo.put(GROUP_ID_CONST, groupid);\r
283         jo.put("authid", authid);\r
284         jo.put("name", name);\r
285         jo.put("description", description);\r
286         jo.put("classification", classification);\r
287         jo.put("members", members);\r
288         jo.put("last_mod", lastMod.getTime());\r
289         return jo;\r
290     }\r
291 \r
292     @Override\r
293     public boolean doInsert(Connection conn) {\r
294         boolean rv = true;\r
295         PreparedStatement ps = null;\r
296         try {\r
297             if (groupid == -1) {\r
298                 // No feed ID assigned yet, so assign the next available one\r
299                 setGroupid(nextGroupid++);\r
300             }\r
301             // In case we insert a gropup from synchronization\r
302             if (groupid > nextGroupid) {\r
303                 nextGroupid = groupid + 1;\r
304             }\r
305 \r
306             // Create the GROUPS row\r
307             String sql = "insert into GROUPS (GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) "\r
308                                  + "values (?, ?, ?, ?, ?, ?)";\r
309             ps = conn.prepareStatement(sql, new String[]{"GROUPID"});\r
310             ps.setInt(1, groupid);\r
311             ps.setString(2, authid);\r
312             ps.setString(3, name);\r
313             ps.setString(4, description);\r
314             ps.setString(5, classification);\r
315             ps.setString(6, members);\r
316             ps.execute();\r
317             ps.close();\r
318         } catch (SQLException e) {\r
319             rv = false;\r
320             intlogger.warn("PROV0005 doInsert: " + e.getMessage(), e);\r
321         } finally {\r
322             try {\r
323                 if (ps != null) {\r
324                     ps.close();\r
325                 }\r
326             } catch (SQLException e) {\r
327                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
328             }\r
329         }\r
330         return rv;\r
331     }\r
332 \r
333     @Override\r
334     public boolean doUpdate(Connection conn) {\r
335         boolean rv = true;\r
336         PreparedStatement ps = null;\r
337         try {\r
338             String sql = "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? ,  MEMBERS = ? "\r
339                                  + "where GROUPID = ?";\r
340             ps = conn.prepareStatement(sql);\r
341             ps.setString(1, authid);\r
342             ps.setString(2, name);\r
343             ps.setString(3, description);\r
344             ps.setString(4, classification);\r
345             ps.setString(5, members);\r
346             ps.setInt(6, groupid);\r
347             ps.executeUpdate();\r
348         } catch (SQLException e) {\r
349             rv = false;\r
350             intlogger.warn("PROV0006 doUpdate: " + e.getMessage(), e);\r
351         } finally {\r
352             try {\r
353                 if (ps != null) {\r
354                     ps.close();\r
355                 }\r
356             } catch (SQLException e) {\r
357                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
358             }\r
359         }\r
360         return rv;\r
361     }\r
362 \r
363     @Override\r
364     public boolean doDelete(Connection conn) {\r
365         boolean rv = true;\r
366         PreparedStatement ps = null;\r
367         try {\r
368             String sql = "delete from GROUPS where GROUPID = ?";\r
369             ps = conn.prepareStatement(sql);\r
370             ps.setInt(1, groupid);\r
371             ps.execute();\r
372         } catch (SQLException e) {\r
373             rv = false;\r
374             intlogger.warn("PROV0007 doDelete: " + e.getMessage(), e);\r
375         } finally {\r
376             try {\r
377                 if (ps != null) {\r
378                     ps.close();\r
379                 }\r
380             } catch (SQLException e) {\r
381                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
382             }\r
383         }\r
384         return rv;\r
385     }\r
386 \r
387     @Override\r
388     public String getKey() {\r
389         return "" + getGroupid();\r
390     }\r
391 \r
392     @Override\r
393     public boolean equals(Object obj) {\r
394         if (!(obj instanceof Group)) {\r
395             return false;\r
396         }\r
397         Group os = (Group) obj;\r
398         if (groupid != os.groupid) {\r
399             return false;\r
400         }\r
401         if (authid != os.authid) {\r
402             return false;\r
403         }\r
404         if (!name.equals(os.name)) {\r
405             return false;\r
406         }\r
407         if (description != os.description) {\r
408             return false;\r
409         }\r
410         if (!classification.equals(os.classification)) {\r
411             return false;\r
412         }\r
413         if (!members.equals(os.members)) {\r
414             return false;\r
415         }\r
416 \r
417         return true;\r
418     }\r
419 \r
420     @Override\r
421     public String toString() {\r
422         return "GROUP: groupid=" + groupid;\r
423     }\r
424 \r
425     @Override\r
426     public int hashCode() {\r
427         return Objects.hash(groupid, authid, name, description, classification, members, lastMod);\r
428     }\r
429 }\r