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