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