[DMAAP-48] Initial code import
[dmaap/datarouter.git] / datarouter-prov / src / main / java / com / att / research / 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 com.att.research.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 \r
40 import com.att.research.datarouter.provisioning.utils.DB;\r
41 import com.att.research.datarouter.provisioning.utils.URLUtilities;\r
42 \r
43 /**\r
44  * The representation of a Subscription.  Subscriptions can be retrieved from the DB, or stored/updated in the DB.\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("com.att.research.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         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                         Statement  stmt = conn.createStatement();\r
102                         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                         rs.close();\r
108                         stmt.close();\r
109                         db.release(conn);\r
110                 } catch (SQLException e) {\r
111                         e.printStackTrace();\r
112                 }\r
113                 return list;\r
114         }\r
115         public static int getMaxGroupID() {\r
116                 int max = 0;\r
117                 try {\r
118                         DB db = new DB();\r
119                         @SuppressWarnings("resource")\r
120                         Connection conn = db.getConnection();\r
121                         Statement  stmt = conn.createStatement();\r
122                         ResultSet rs = stmt.executeQuery("select MAX(groupid) from GROUPS");\r
123                         if (rs.next()) {\r
124                                 max = rs.getInt(1);\r
125                         }\r
126                         rs.close();\r
127                         stmt.close();\r
128                         db.release(conn);\r
129                 } catch (SQLException e) {\r
130                         intlogger.info("getMaxSubID: "+e.getMessage());\r
131                         e.printStackTrace();\r
132                 }\r
133                 return max;\r
134         }\r
135         public static Collection<String> getGroupsByClassfication(String classfication) {\r
136                 List<String> list = new ArrayList<String>();\r
137                 String sql = "select * from GROUPS where classification = '"+classfication+"'";\r
138                 try {\r
139                         DB db = new DB();\r
140                         @SuppressWarnings("resource")\r
141                         Connection conn = db.getConnection();\r
142                         Statement  stmt = conn.createStatement();\r
143                         ResultSet  rs = stmt.executeQuery(sql);\r
144                         while (rs.next()) {\r
145                                 int groupid = rs.getInt("groupid");\r
146                                 //list.add(URLUtilities.generateSubscriptionURL(groupid));\r
147                         }\r
148                         rs.close();\r
149                         stmt.close();\r
150                         db.release(conn);\r
151                 } catch (SQLException e) {\r
152                         e.printStackTrace();\r
153                 }\r
154                 return list;\r
155         }\r
156         /**\r
157          * Return a count of the number of active subscriptions in the DB.\r
158          * @return the count\r
159          */\r
160         public static int countActiveSubscriptions() {\r
161                 int count = 0;\r
162                 try {\r
163                         DB db = new DB();\r
164                         @SuppressWarnings("resource")\r
165                         Connection conn = db.getConnection();\r
166                         Statement  stmt = conn.createStatement();\r
167                         ResultSet rs = stmt.executeQuery("select count(*) from SUBSCRIPTIONS");\r
168                         if (rs.next()) {\r
169                                 count = rs.getInt(1);\r
170                         }\r
171                         rs.close();\r
172                         stmt.close();\r
173                         db.release(conn);\r
174                 } catch (SQLException e) {\r
175                         intlogger.warn("PROV0008 countActiveSubscriptions: "+e.getMessage());\r
176                         e.printStackTrace();\r
177                 }\r
178                 return count;\r
179         }\r
180 \r
181         public Group() {\r
182                 this("", "", "");\r
183         }\r
184         public Group(String name, String desc, String members) {\r
185                 this.groupid = -1;\r
186                 this.authid = "";\r
187                 this.name = name;\r
188                 this.description = desc;\r
189                 this.members = members;\r
190                 this.classification = "";\r
191                 this.last_mod = new Date();\r
192         }\r
193         \r
194         \r
195         public Group(ResultSet rs) throws SQLException {\r
196                 this.groupid        = rs.getInt("GROUPID");\r
197                 this.authid       = rs.getString("AUTHID");\r
198                 this.name       = rs.getString("NAME");\r
199                 this.description       = rs.getString("DESCRIPTION");\r
200                 this.classification       = rs.getString("CLASSIFICATION");\r
201                 this.members       = rs.getString("MEMBERS");\r
202                 this.last_mod     = rs.getDate("LAST_MOD");\r
203         }\r
204         \r
205 \r
206         \r
207         public Group(JSONObject jo) throws InvalidObjectException {\r
208                 this("", "", "");\r
209                 try {\r
210                         // The JSONObject is assumed to contain a vnd.att-dr.group representation\r
211                         this.groupid  = jo.optInt("groupid", -1);\r
212                         String gname      = jo.getString("name");\r
213                         String gdescription     = jo.getString("description");\r
214                         \r
215                         this.authid = jo.getString("authid");\r
216                         this.name = gname;\r
217                         this.description = gdescription;\r
218                         this.classification = jo.getString("classification");\r
219                         this.members = jo.getString("members");\r
220                 \r
221                         if (gname.length() > 50)\r
222                                 throw new InvalidObjectException("Group name is too long");\r
223                         if (gdescription.length() > 256)\r
224                                 throw new InvalidObjectException("Group Description is too long");\r
225                 } catch (InvalidObjectException e) {\r
226                         throw e;\r
227                 } catch (Exception e) {\r
228                         throw new InvalidObjectException("invalid JSON: "+e.getMessage());\r
229                 }\r
230         }\r
231         public int getGroupid() {\r
232                 return groupid;\r
233         }\r
234         \r
235         public static Logger getIntlogger() {\r
236                 return intlogger;\r
237         }\r
238         public void setGroupid(int groupid) {\r
239                 this.groupid = groupid;\r
240         }\r
241         \r
242         public static void setIntlogger(Logger intlogger) {\r
243                 Group.intlogger = intlogger;\r
244         }\r
245         public static int getNext_groupid() {\r
246                 return next_groupid;\r
247         }\r
248         public static void setNext_groupid(int next_groupid) {\r
249                 Group.next_groupid = next_groupid;\r
250         }\r
251         public String getAuthid() {\r
252                 return authid;\r
253         }\r
254         public void setAuthid(String authid) {\r
255                 this.authid = authid;\r
256         }\r
257         public String getName() {\r
258                 return name;\r
259         }\r
260         public void setName(String name) {\r
261                 this.name = name;\r
262         }\r
263         public String getDescription() {\r
264                 return description;\r
265         }\r
266         public void setDescription(String description) {\r
267                 this.description = description;\r
268         }\r
269         public String getClassification() {\r
270                 return classification;\r
271         }\r
272         public void setClassification(String classification) {\r
273                 this.classification = classification;\r
274         }\r
275         public String getMembers() {\r
276                 return members;\r
277         }\r
278         public void setMembers(String members) {\r
279                 this.members = members;\r
280         }\r
281         public Date getLast_mod() {\r
282                 return last_mod;\r
283         }\r
284         public void setLast_mod(Date last_mod) {\r
285                 this.last_mod = last_mod;\r
286         }\r
287         \r
288 \r
289         @Override\r
290         public JSONObject asJSONObject() {\r
291                 JSONObject jo = new JSONObject();\r
292                 jo.put("groupid", groupid);\r
293                 jo.put("authid", authid);\r
294                 jo.put("name", name);\r
295                 jo.put("description", description);\r
296                 jo.put("classification", classification);\r
297                 jo.put("members", members);\r
298                 jo.put("last_mod", last_mod.getTime());\r
299                 return jo;\r
300         }\r
301         @Override\r
302         public boolean doInsert(Connection c) {\r
303                 boolean rv = true;\r
304                 PreparedStatement ps = null;\r
305                 try {\r
306                         if (groupid == -1) {\r
307                                 // No feed ID assigned yet, so assign the next available one\r
308                                 setGroupid(next_groupid++);\r
309                         }\r
310                         // In case we insert a gropup from synchronization\r
311                         if (groupid > next_groupid)\r
312                                 next_groupid = groupid+1;\r
313 \r
314                         \r
315                         // Create the GROUPS row\r
316                         String sql = "insert into GROUPS (GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) values (?, ?, ?, ?, ?, ?)";\r
317                         ps = c.prepareStatement(sql, new String[] { "GROUPID" });\r
318                         ps.setInt(1, groupid);\r
319                         ps.setString(2, authid);\r
320                         ps.setString(3, name);\r
321                         ps.setString(4, description);\r
322                         ps.setString(5, classification);\r
323                         ps.setString(6, members);\r
324                         ps.execute();\r
325                         ps.close();\r
326                 } catch (SQLException e) {\r
327                         rv = false;\r
328                         intlogger.warn("PROV0005 doInsert: "+e.getMessage());\r
329                         e.printStackTrace();\r
330                 } finally {\r
331                         try {\r
332                                 ps.close();\r
333                         } catch (SQLException e) {\r
334                                 e.printStackTrace();\r
335                         }\r
336                 }\r
337                 return rv;\r
338         }\r
339         @Override\r
340         public boolean doUpdate(Connection c) {\r
341                 boolean rv = true;\r
342                 PreparedStatement ps = null;\r
343                 try {\r
344                         String sql = "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? ,  MEMBERS = ? where GROUPID = ?";\r
345                         ps = c.prepareStatement(sql);\r
346                         ps.setString(1, authid);\r
347                         ps.setString(2, name);\r
348                         ps.setString(3, description);\r
349                         ps.setString(4, classification);\r
350                         ps.setString(5, members);\r
351                         ps.setInt(6, groupid);\r
352                         ps.executeUpdate();\r
353                 } catch (SQLException e) {\r
354                         rv = false;\r
355                         intlogger.warn("PROV0006 doUpdate: "+e.getMessage());\r
356                         e.printStackTrace();\r
357                 } finally {\r
358                         try {\r
359                                 ps.close();\r
360                         } catch (SQLException e) {\r
361                                 e.printStackTrace();\r
362                         }\r
363                 }\r
364                 return rv;\r
365         }\r
366         @Override\r
367         public boolean doDelete(Connection c) {\r
368                 boolean rv = true;\r
369                 PreparedStatement ps = null;\r
370                 try {\r
371                         String sql = "delete from GROUPS where GROUPID = ?";\r
372                         ps = c.prepareStatement(sql);\r
373                         ps.setInt(1, groupid);\r
374                         ps.execute();\r
375                 } catch (SQLException e) {\r
376                         rv = false;\r
377                         intlogger.warn("PROV0007 doDelete: "+e.getMessage());\r
378                         e.printStackTrace();\r
379                 } finally {\r
380                         try {\r
381                                 ps.close();\r
382                         } catch (SQLException e) {\r
383                                 e.printStackTrace();\r
384                         }\r
385                 }\r
386                 return rv;\r
387         }\r
388         @Override\r
389         public String getKey() {\r
390                 return ""+getGroupid();\r
391         }\r
392         @Override\r
393         public boolean equals(Object obj) {\r
394                 if (!(obj instanceof Group))\r
395                         return false;\r
396                 Group os = (Group) obj;\r
397                 if (groupid != os.groupid)\r
398                         return false;\r
399                 if (authid != os.authid)\r
400                         return false;\r
401                 if (!name.equals(os.name))\r
402                         return false;\r
403                 if (description != os.description)\r
404                         return false;\r
405                 if (!classification.equals(os.classification))\r
406                         return false;\r
407                 if (!members.equals(os.members))\r
408                         return false;\r
409                 \r
410                 return true;\r
411         }\r
412 \r
413         @Override\r
414         public String toString() {\r
415                 return "GROUP: groupid=" + groupid;\r
416         }\r
417 }\r