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