Removing clumsy code smells and adding missing JettyFilter test
[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 public class Group extends Syncable {\r
49 \r
50     private static final String GROUP_ID_CONST = "groupid";\r
51     private static EELFLogger intlogger = EELFManager.getInstance().getLogger("InternalLog");\r
52     private static int nextGroupid = getMaxGroupID() + 1;\r
53     private static final String SQLEXCEPTION = "SQLException: ";\r
54 \r
55     private int groupid;\r
56     private String authid;\r
57     private String name;\r
58     private String description;\r
59     private String classification;\r
60     private String members;\r
61     private Date last_mod;\r
62 \r
63     public Group() {\r
64         this("", "", "");\r
65     }\r
66 \r
67     public Group(String name, String desc, String members) {\r
68         this.groupid = -1;\r
69         this.authid = "";\r
70         this.name = name;\r
71         this.description = desc;\r
72         this.members = members;\r
73         this.classification = "";\r
74         this.last_mod = new Date();\r
75     }\r
76 \r
77 \r
78     public Group(ResultSet rs) throws SQLException {\r
79         this.groupid = rs.getInt("GROUPID");\r
80         this.authid = rs.getString("AUTHID");\r
81         this.name = rs.getString("NAME");\r
82         this.description = rs.getString("DESCRIPTION");\r
83         this.classification = rs.getString("CLASSIFICATION");\r
84         this.members = rs.getString("MEMBERS");\r
85         this.last_mod = rs.getDate("LAST_MOD");\r
86     }\r
87 \r
88 \r
89     public Group(JSONObject jo) throws InvalidObjectException {\r
90         this("", "", "");\r
91         try {\r
92             // The JSONObject is assumed to contain a vnd.dmaap-dr.group representation\r
93             this.groupid = jo.optInt(GROUP_ID_CONST, -1);\r
94             String gname = jo.getString("name");\r
95             String gdescription = jo.getString("description");\r
96 \r
97             this.authid = jo.getString("authid");\r
98             this.name = gname;\r
99             this.description = gdescription;\r
100             this.classification = jo.getString("classification");\r
101             this.members = jo.getString("members");\r
102 \r
103             if (gname.length() > 50) {\r
104                 throw new InvalidObjectException("Group name is too long");\r
105             }\r
106             if (gdescription.length() > 256) {\r
107                 throw new InvalidObjectException("Group Description is too long");\r
108             }\r
109         } catch (InvalidObjectException e) {\r
110             throw e;\r
111         } catch (Exception e) {\r
112             intlogger.warn("Invalid JSON: " + e.getMessage(), e);\r
113             throw new InvalidObjectException("Invalid JSON: " + e.getMessage());\r
114         }\r
115     }\r
116 \r
117 \r
118     public static Group getGroupMatching(Group gup) {\r
119         String sql = String.format(\r
120                 "select * from GROUPS where NAME='%s'",\r
121                 gup.getName()\r
122         );\r
123         List<Group> list = getGroupsForSQL(sql);\r
124         return !list.isEmpty() ? list.get(0) : null;\r
125     }\r
126 \r
127     public static Group getGroupMatching(Group gup, int groupid) {\r
128         String sql = String.format(\r
129                 "select * from GROUPS where  NAME = '%s' and GROUPID != %d ",\r
130                 gup.getName(),\r
131                 gup.getGroupid()\r
132         );\r
133         List<Group> list = getGroupsForSQL(sql);\r
134         return !list.isEmpty() ? list.get(0) : null;\r
135     }\r
136 \r
137     public static Group getGroupById(int id) {\r
138         String sql = "select * from GROUPS where GROUPID = " + id;\r
139         List<Group> list = getGroupsForSQL(sql);\r
140         return !list.isEmpty() ? list.get(0) : null;\r
141     }\r
142 \r
143     static Group getGroupByAuthId(String id) {\r
144         String sql = "select * from GROUPS where AUTHID = '" + id + "'";\r
145         List<Group> list = getGroupsForSQL(sql);\r
146         return !list.isEmpty() ? list.get(0) : null;\r
147     }\r
148 \r
149     public static Collection<Group> getAllgroups() {\r
150         return getGroupsForSQL("select * from GROUPS");\r
151     }\r
152 \r
153     private static List<Group> getGroupsForSQL(String sql) {\r
154         List<Group> list = new ArrayList<>();\r
155         try {\r
156             DB db = new DB();\r
157             @SuppressWarnings("resource")\r
158             Connection conn = db.getConnection();\r
159             try (Statement stmt = conn.createStatement()) {\r
160                 try (ResultSet rs = stmt.executeQuery(sql)) {\r
161                     while (rs.next()) {\r
162                         Group group = new Group(rs);\r
163                         list.add(group);\r
164                     }\r
165                 }\r
166             }\r
167             db.release(conn);\r
168         } catch (SQLException e) {\r
169             intlogger.error("PROV0009 getGroupsForSQL: " + e.getMessage(), e);\r
170         }\r
171         return list;\r
172     }\r
173 \r
174     private static int getMaxGroupID() {\r
175         int max = 0;\r
176         try {\r
177             DB db = new DB();\r
178             @SuppressWarnings("resource")\r
179             Connection conn = db.getConnection();\r
180             try (Statement stmt = conn.createStatement()) {\r
181                 try (ResultSet rs = stmt.executeQuery("select MAX(groupid) from GROUPS")) {\r
182                     if (rs.next()) {\r
183                         max = rs.getInt(1);\r
184                     }\r
185                 }\r
186             }\r
187             db.release(conn);\r
188         } catch (SQLException e) {\r
189             intlogger.info("PROV0001 getMaxSubID: " + e.getMessage(), e);\r
190         }\r
191         return max;\r
192     }\r
193 \r
194     public int getGroupid() {\r
195         return groupid;\r
196     }\r
197 \r
198     public static EELFLogger getIntlogger() {\r
199         return intlogger;\r
200     }\r
201 \r
202     public void setGroupid(int groupid) {\r
203         this.groupid = groupid;\r
204     }\r
205 \r
206     public static void setIntlogger(EELFLogger intlogger) {\r
207         Group.intlogger = intlogger;\r
208     }\r
209 \r
210     public String getAuthid() {\r
211         return authid;\r
212     }\r
213 \r
214     public void setAuthid(String authid) {\r
215         this.authid = authid;\r
216     }\r
217 \r
218     public String getName() {\r
219         return name;\r
220     }\r
221 \r
222     public void setName(String name) {\r
223         this.name = name;\r
224     }\r
225 \r
226     public String getDescription() {\r
227         return description;\r
228     }\r
229 \r
230     public void setDescription(String description) {\r
231         this.description = description;\r
232     }\r
233 \r
234     public String getClassification() {\r
235         return classification;\r
236     }\r
237 \r
238     public void setClassification(String classification) {\r
239         this.classification = classification;\r
240     }\r
241 \r
242     public String getMembers() {\r
243         return members;\r
244     }\r
245 \r
246     @Override\r
247     public JSONObject asJSONObject() {\r
248         JSONObject jo = new JSONObject();\r
249         jo.put(GROUP_ID_CONST, groupid);\r
250         jo.put("authid", authid);\r
251         jo.put("name", name);\r
252         jo.put("description", description);\r
253         jo.put("classification", classification);\r
254         jo.put("members", members);\r
255         jo.put("last_mod", last_mod.getTime());\r
256         return jo;\r
257     }\r
258 \r
259     @Override\r
260     public boolean doInsert(Connection c) {\r
261         boolean rv = true;\r
262         PreparedStatement ps = null;\r
263         try {\r
264             if (groupid == -1) {\r
265                 // No feed ID assigned yet, so assign the next available one\r
266                 setGroupid(nextGroupid++);\r
267             }\r
268             // In case we insert a gropup from synchronization\r
269             if (groupid > nextGroupid) {\r
270                 nextGroupid = groupid + 1;\r
271             }\r
272 \r
273             // Create the GROUPS row\r
274             String sql = "insert into GROUPS (GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) values (?, ?, ?, ?, ?, ?)";\r
275             ps = c.prepareStatement(sql, new String[]{"GROUPID"});\r
276             ps.setInt(1, groupid);\r
277             ps.setString(2, authid);\r
278             ps.setString(3, name);\r
279             ps.setString(4, description);\r
280             ps.setString(5, classification);\r
281             ps.setString(6, members);\r
282             ps.execute();\r
283             ps.close();\r
284         } catch (SQLException e) {\r
285             rv = false;\r
286             intlogger.warn("PROV0005 doInsert: " + e.getMessage(), e);\r
287         } finally {\r
288             try {\r
289                 if (ps != null) {\r
290                     ps.close();\r
291                 }\r
292             } catch (SQLException e) {\r
293                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
294             }\r
295         }\r
296         return rv;\r
297     }\r
298 \r
299     @Override\r
300     public boolean doUpdate(Connection c) {\r
301         boolean rv = true;\r
302         PreparedStatement ps = null;\r
303         try {\r
304             String sql = "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? ,  MEMBERS = ? where GROUPID = ?";\r
305             ps = c.prepareStatement(sql);\r
306             ps.setString(1, authid);\r
307             ps.setString(2, name);\r
308             ps.setString(3, description);\r
309             ps.setString(4, classification);\r
310             ps.setString(5, members);\r
311             ps.setInt(6, groupid);\r
312             ps.executeUpdate();\r
313         } catch (SQLException e) {\r
314             rv = false;\r
315             intlogger.warn("PROV0006 doUpdate: " + e.getMessage(), e);\r
316         } finally {\r
317             try {\r
318                 if (ps != null) {\r
319                     ps.close();\r
320                 }\r
321             } catch (SQLException e) {\r
322                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
323             }\r
324         }\r
325         return rv;\r
326     }\r
327 \r
328     @Override\r
329     public boolean doDelete(Connection c) {\r
330         boolean rv = true;\r
331         PreparedStatement ps = null;\r
332         try {\r
333             String sql = "delete from GROUPS where GROUPID = ?";\r
334             ps = c.prepareStatement(sql);\r
335             ps.setInt(1, groupid);\r
336             ps.execute();\r
337         } catch (SQLException e) {\r
338             rv = false;\r
339             intlogger.warn("PROV0007 doDelete: " + e.getMessage(), e);\r
340         } finally {\r
341             try {\r
342                 if (ps != null) {\r
343                     ps.close();\r
344                 }\r
345             } catch (SQLException e) {\r
346                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
347             }\r
348         }\r
349         return rv;\r
350     }\r
351 \r
352     @Override\r
353     public String getKey() {\r
354         return "" + getGroupid();\r
355     }\r
356 \r
357     @Override\r
358     public boolean equals(Object obj) {\r
359         if (!(obj instanceof Group)) {\r
360             return false;\r
361         }\r
362         Group os = (Group) obj;\r
363         if (groupid != os.groupid) {\r
364             return false;\r
365         }\r
366         if (authid != os.authid) {\r
367             return false;\r
368         }\r
369         if (!name.equals(os.name)) {\r
370             return false;\r
371         }\r
372         if (description != os.description) {\r
373             return false;\r
374         }\r
375         if (!classification.equals(os.classification)) {\r
376             return false;\r
377         }\r
378         if (!members.equals(os.members)) {\r
379             return false;\r
380         }\r
381 \r
382         return true;\r
383     }\r
384 \r
385     @Override\r
386     public String toString() {\r
387         return "GROUP: groupid=" + groupid;\r
388     }\r
389 \r
390     @Override\r
391     public int hashCode() {\r
392         return Objects.hash(groupid, authid, name, description, classification, members, last_mod);\r
393     }\r
394 }\r