Merge "Fixed 13 blockers in Subscription.java"
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / beans / Subscription.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 org.apache.log4j.Logger;\r
35 import org.json.JSONObject;\r
36 import org.onap.dmaap.datarouter.provisioning.utils.DB;\r
37 import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;\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 Robert Eby\r
43  * @version $Id: Subscription.java,v 1.9 2013/10/28 18:06:53 eby Exp $\r
44  */\r
45 public class Subscription extends Syncable {\r
46     private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");\r
47     private static int next_subid = getMaxSubID() + 1;\r
48 \r
49     private int subid;\r
50     private int feedid;\r
51     private int groupid; //New field is added - Groups feature Rally:US708115 - 1610\r
52     private SubDelivery delivery;\r
53     private boolean metadataOnly;\r
54     private String subscriber;\r
55     private SubLinks links;\r
56     private boolean suspended;\r
57     private Date last_mod;\r
58     private Date created_date;\r
59 \r
60     public static Subscription getSubscriptionMatching(Subscription sub) {\r
61         SubDelivery deli = sub.getDelivery();\r
62         String sql = String.format(\r
63                 "select * from SUBSCRIPTIONS where FEEDID = %d and DELIVERY_URL = \"%s\" and DELIVERY_USER = \"%s\" and DELIVERY_PASSWORD = \"%s\" and DELIVERY_USE100 = %d and METADATA_ONLY = %d",\r
64                 sub.getFeedid(),\r
65                 deli.getUrl(),\r
66                 deli.getUser(),\r
67                 deli.getPassword(),\r
68                 deli.isUse100() ? 1 : 0,\r
69                 sub.isMetadataOnly() ? 1 : 0\r
70         );\r
71         List<Subscription> list = getSubscriptionsForSQL(sql);\r
72         return list.size() > 0 ? list.get(0) : null;\r
73     }\r
74 \r
75     public static Subscription getSubscriptionById(int id) {\r
76         String sql = "select * from SUBSCRIPTIONS where SUBID = " + id;\r
77         List<Subscription> list = getSubscriptionsForSQL(sql);\r
78         return list.size() > 0 ? list.get(0) : null;\r
79     }\r
80 \r
81     public static Collection<Subscription> getAllSubscriptions() {\r
82         return getSubscriptionsForSQL("select * from SUBSCRIPTIONS");\r
83     }\r
84 \r
85     private static List<Subscription> getSubscriptionsForSQL(String sql) {\r
86         List<Subscription> list = new ArrayList<Subscription>();\r
87         try {\r
88             DB db = new DB();\r
89             @SuppressWarnings("resource")\r
90             Connection conn = db.getConnection();\r
91             try(Statement stmt = conn.createStatement()) {\r
92                 try(ResultSet rs = stmt.executeQuery(sql)) {\r
93                     while (rs.next()) {\r
94                         Subscription sub = new Subscription(rs);\r
95                         list.add(sub);\r
96                     }\r
97                 }\r
98             }\r
99             db.release(conn);\r
100         } catch (SQLException e) {\r
101             e.printStackTrace();\r
102         }\r
103         return list;\r
104     }\r
105 \r
106     public static int getMaxSubID() {\r
107         int max = 0;\r
108         try {\r
109             DB db = new DB();\r
110             @SuppressWarnings("resource")\r
111             Connection conn = db.getConnection();\r
112             try(Statement stmt = conn.createStatement()) {\r
113                 try(ResultSet rs = stmt.executeQuery("select MAX(subid) from SUBSCRIPTIONS")) {\r
114                     if (rs.next()) {\r
115                         max = rs.getInt(1);\r
116                     }\r
117                 }\r
118             }\r
119             db.release(conn);\r
120         } catch (SQLException e) {\r
121             intlogger.info("getMaxSubID: " + e.getMessage());\r
122             e.printStackTrace();\r
123         }\r
124         return max;\r
125     }\r
126 \r
127     public static Collection<String> getSubscriptionUrlList(int feedid) {\r
128         List<String> list = new ArrayList<String>();\r
129         String sql = "select SUBID from SUBSCRIPTIONS where FEEDID = " + feedid;\r
130         try {\r
131             DB db = new DB();\r
132             @SuppressWarnings("resource")\r
133             Connection conn = db.getConnection();\r
134             try(Statement stmt = conn.createStatement()) {\r
135                 try(ResultSet rs = stmt.executeQuery(sql)) {\r
136                     while (rs.next()) {\r
137                         int subid = rs.getInt("SUBID");\r
138                         list.add(URLUtilities.generateSubscriptionURL(subid));\r
139                     }\r
140                 }\r
141             }\r
142             db.release(conn);\r
143         } catch (SQLException e) {\r
144             e.printStackTrace();\r
145         }\r
146         return list;\r
147     }\r
148 \r
149     /**\r
150      * Return a count of the number of active subscriptions in the DB.\r
151      *\r
152      * @return the count\r
153      */\r
154     public static int countActiveSubscriptions() {\r
155         int count = 0;\r
156         try {\r
157             DB db = new DB();\r
158             @SuppressWarnings("resource")\r
159             Connection conn = db.getConnection();\r
160             try(Statement stmt = conn.createStatement()) {\r
161                 try(ResultSet rs = stmt.executeQuery("select count(*) from SUBSCRIPTIONS")) {\r
162                     if (rs.next()) {\r
163                         count = rs.getInt(1);\r
164                     }\r
165                 }\r
166             }\r
167             db.release(conn);\r
168         } catch (SQLException e) {\r
169             intlogger.warn("PROV0008 countActiveSubscriptions: " + e.getMessage());\r
170             e.printStackTrace();\r
171         }\r
172         return count;\r
173     }\r
174 \r
175     public Subscription() {\r
176         this("", "", "");\r
177     }\r
178 \r
179     public Subscription(String url, String user, String password) {\r
180         this.subid = -1;\r
181         this.feedid = -1;\r
182         this.groupid = -1; //New field is added - Groups feature Rally:US708115 - 1610\r
183         this.delivery = new SubDelivery(url, user, password, false);\r
184         this.metadataOnly = false;\r
185         this.subscriber = "";\r
186         this.links = new SubLinks();\r
187         this.suspended = false;\r
188         this.last_mod = new Date();\r
189         this.created_date = new Date();\r
190     }\r
191 \r
192     public Subscription(ResultSet rs) throws SQLException {\r
193         this.subid = rs.getInt("SUBID");\r
194         this.feedid = rs.getInt("FEEDID");\r
195         this.groupid = rs.getInt("GROUPID"); //New field is added - Groups feature Rally:US708115 - 1610\r
196         this.delivery = new SubDelivery(rs);\r
197         this.metadataOnly = rs.getBoolean("METADATA_ONLY");\r
198         this.subscriber = rs.getString("SUBSCRIBER");\r
199         this.links = new SubLinks(rs.getString("SELF_LINK"), URLUtilities.generateFeedURL(feedid), rs.getString("LOG_LINK"));\r
200         this.suspended = rs.getBoolean("SUSPENDED");\r
201         this.last_mod = rs.getDate("LAST_MOD");\r
202         this.created_date = rs.getDate("CREATED_DATE");\r
203     }\r
204 \r
205     public Subscription(JSONObject jo) throws InvalidObjectException {\r
206         this("", "", "");\r
207         try {\r
208             // The JSONObject is assumed to contain a vnd.att-dr.subscription representation\r
209             this.subid = jo.optInt("subid", -1);\r
210             this.feedid = jo.optInt("feedid", -1);\r
211             this.groupid = jo.optInt("groupid", -1); //New field is added - Groups feature Rally:US708115 - 1610\r
212 \r
213             JSONObject jdeli = jo.getJSONObject("delivery");\r
214             String url = jdeli.getString("url");\r
215             String user = jdeli.getString("user");\r
216             String password = jdeli.getString("password");\r
217             boolean use100 = jdeli.getBoolean("use100");\r
218 \r
219 \r
220             //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.\r
221             Properties p = (new DB()).getProperties();\r
222             if (p.get("org.onap.dmaap.datarouter.provserver.https.relaxation").toString().equals("false") && !jo.has("sync")) {\r
223                 if (!url.startsWith("https://"))\r
224                     throw new InvalidObjectException("delivery URL is not HTTPS");\r
225             }\r
226 \r
227             if (url.length() > 256)\r
228                 throw new InvalidObjectException("delivery url field is too long");\r
229             if (user.length() > 20)\r
230                 throw new InvalidObjectException("delivery user field is too long");\r
231             if (password.length() > 32)\r
232                 throw new InvalidObjectException("delivery password field is too long");\r
233             this.delivery = new SubDelivery(url, user, password, use100);\r
234 \r
235             this.metadataOnly = jo.getBoolean("metadataOnly");\r
236             this.suspended = jo.optBoolean("suspend", false);\r
237 \r
238             this.subscriber = jo.optString("subscriber", "");\r
239             JSONObject jol = jo.optJSONObject("links");\r
240             this.links = (jol == null) ? (new SubLinks()) : (new SubLinks(jol));\r
241         } catch (InvalidObjectException e) {\r
242             throw e;\r
243         } catch (Exception e) {\r
244             throw new InvalidObjectException("invalid JSON: " + e.getMessage());\r
245         }\r
246     }\r
247 \r
248     public int getSubid() {\r
249         return subid;\r
250     }\r
251 \r
252     public void setSubid(int subid) {\r
253         this.subid = subid;\r
254 \r
255         // Create link URLs\r
256         SubLinks sl = getLinks();\r
257         sl.setSelf(URLUtilities.generateSubscriptionURL(subid));\r
258         sl.setLog(URLUtilities.generateSubLogURL(subid));\r
259     }\r
260 \r
261     public int getFeedid() {\r
262         return feedid;\r
263     }\r
264 \r
265     public void setFeedid(int feedid) {\r
266         this.feedid = feedid;\r
267 \r
268         // Create link URLs\r
269         SubLinks sl = getLinks();\r
270         sl.setFeed(URLUtilities.generateFeedURL(feedid));\r
271     }\r
272 \r
273     //New getter setters for Groups feature Rally:US708115 - 1610\r
274     public int getGroupid() {\r
275         return groupid;\r
276     }\r
277 \r
278     public void setGroupid(int groupid) {\r
279         this.groupid = groupid;\r
280     }\r
281 \r
282     public SubDelivery getDelivery() {\r
283         return delivery;\r
284     }\r
285 \r
286     public void setDelivery(SubDelivery delivery) {\r
287         this.delivery = delivery;\r
288     }\r
289 \r
290     public boolean isMetadataOnly() {\r
291         return metadataOnly;\r
292     }\r
293 \r
294     public void setMetadataOnly(boolean metadataOnly) {\r
295         this.metadataOnly = metadataOnly;\r
296     }\r
297 \r
298     public boolean isSuspended() {\r
299         return suspended;\r
300     }\r
301 \r
302     public void setSuspended(boolean suspended) {\r
303         this.suspended = suspended;\r
304     }\r
305 \r
306     public String getSubscriber() {\r
307         return subscriber;\r
308     }\r
309 \r
310     public void setSubscriber(String subscriber) {\r
311         if (subscriber != null) {\r
312             if (subscriber.length() > 8)\r
313                 subscriber = subscriber.substring(0, 8);\r
314             this.subscriber = subscriber;\r
315         }\r
316     }\r
317 \r
318     public SubLinks getLinks() {\r
319         return links;\r
320     }\r
321 \r
322     public void setLinks(SubLinks links) {\r
323         this.links = links;\r
324     }\r
325 \r
326     @Override\r
327     public JSONObject asJSONObject() {\r
328         JSONObject jo = new JSONObject();\r
329         jo.put("subid", subid);\r
330         jo.put("feedid", feedid);\r
331         jo.put("groupid", groupid); //New field is added - Groups feature Rally:US708115 - 1610\r
332         jo.put("delivery", delivery.asJSONObject());\r
333         jo.put("metadataOnly", metadataOnly);\r
334         jo.put("subscriber", subscriber);\r
335         jo.put("links", links.asJSONObject());\r
336         jo.put("suspend", suspended);\r
337         jo.put("last_mod", last_mod.getTime());\r
338         jo.put("created_date", created_date.getTime());\r
339         return jo;\r
340     }\r
341 \r
342     public JSONObject asLimitedJSONObject() {\r
343         JSONObject jo = asJSONObject();\r
344         jo.remove("subid");\r
345         jo.remove("feedid");\r
346         jo.remove("last_mod");\r
347         return jo;\r
348     }\r
349 \r
350     public JSONObject asJSONObject(boolean hidepasswords) {\r
351         JSONObject jo = asJSONObject();\r
352         if (hidepasswords) {\r
353             jo.remove("subid");    // we no longer hide passwords, however we do hide these\r
354             jo.remove("feedid");\r
355             jo.remove("last_mod");\r
356             jo.remove("created_date");\r
357         }\r
358         return jo;\r
359     }\r
360 \r
361     @Override\r
362     public boolean doInsert(Connection c) {\r
363         boolean rv = true;\r
364         PreparedStatement ps = null;\r
365         try {\r
366             if (subid == -1) {\r
367                 // No feed ID assigned yet, so assign the next available one\r
368                 setSubid(next_subid++);\r
369             }\r
370             // In case we insert a feed from synchronization\r
371             if (subid > next_subid)\r
372                 next_subid = subid + 1;\r
373 \r
374             // Create the SUBSCRIPTIONS row\r
375             String sql = "insert into SUBSCRIPTIONS (SUBID, FEEDID, DELIVERY_URL, DELIVERY_USER, DELIVERY_PASSWORD, DELIVERY_USE100, METADATA_ONLY, SUBSCRIBER, SUSPENDED, GROUPID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";\r
376             ps = c.prepareStatement(sql, new String[]{"SUBID"});\r
377             ps.setInt(1, subid);\r
378             ps.setInt(2, feedid);\r
379             ps.setString(3, getDelivery().getUrl());\r
380             ps.setString(4, getDelivery().getUser());\r
381             ps.setString(5, getDelivery().getPassword());\r
382             ps.setInt(6, getDelivery().isUse100() ? 1 : 0);\r
383             ps.setInt(7, isMetadataOnly() ? 1 : 0);\r
384             ps.setString(8, getSubscriber());\r
385             ps.setBoolean(9, isSuspended());\r
386             ps.setInt(10, groupid); //New field is added - Groups feature Rally:US708115 - 1610\r
387             ps.execute();\r
388             ps.close();\r
389             // Update the row to set the URLs\r
390             sql = "update SUBSCRIPTIONS set SELF_LINK = ?, LOG_LINK = ? where SUBID = ?";\r
391             ps = c.prepareStatement(sql);\r
392             ps.setString(1, getLinks().getSelf());\r
393             ps.setString(2, getLinks().getLog());\r
394             ps.setInt(3, subid);\r
395             ps.execute();\r
396             ps.close();\r
397         } catch (SQLException e) {\r
398             rv = false;\r
399             intlogger.warn("PROV0005 doInsert: " + e.getMessage());\r
400             e.printStackTrace();\r
401         } finally {\r
402             try {\r
403                 if(ps!=null) {\r
404                     ps.close();\r
405                 }\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 boolean doUpdate(Connection c) {\r
415         boolean rv = true;\r
416         PreparedStatement ps = null;\r
417         try {\r
418             String sql = "update SUBSCRIPTIONS set DELIVERY_URL = ?, DELIVERY_USER = ?, DELIVERY_PASSWORD = ?, DELIVERY_USE100 = ?, METADATA_ONLY = ?, SUSPENDED = ?, GROUPID = ? where SUBID = ?";\r
419             ps = c.prepareStatement(sql);\r
420             ps.setString(1, delivery.getUrl());\r
421             ps.setString(2, delivery.getUser());\r
422             ps.setString(3, delivery.getPassword());\r
423             ps.setInt(4, delivery.isUse100() ? 1 : 0);\r
424             ps.setInt(5, isMetadataOnly() ? 1 : 0);\r
425             ps.setInt(6, suspended ? 1 : 0);\r
426             ps.setInt(7, groupid); //New field is added - Groups feature Rally:US708115 - 1610\r
427             ps.setInt(8, subid);\r
428             ps.executeUpdate();\r
429         } catch (SQLException e) {\r
430             rv = false;\r
431             intlogger.warn("PROV0006 doUpdate: " + e.getMessage());\r
432             e.printStackTrace();\r
433         } finally {\r
434             try {\r
435                 if(ps!=null) {\r
436                     ps.close();\r
437                 }\r
438             } catch (SQLException e) {\r
439                 e.printStackTrace();\r
440             }\r
441         }\r
442         return rv;\r
443     }\r
444 \r
445 \r
446     /**\r
447      * Rally US708115\r
448      * Change Ownership of Subscription - 1610\r
449      */\r
450     public boolean changeOwnerShip() {\r
451         boolean rv = true;\r
452         PreparedStatement ps = null;\r
453         try {\r
454 \r
455             DB db = new DB();\r
456             @SuppressWarnings("resource")\r
457             Connection c = db.getConnection();\r
458             String sql = "update SUBSCRIPTIONS set SUBSCRIBER = ? where SUBID = ?";\r
459             ps = c.prepareStatement(sql);\r
460             ps.setString(1, this.subscriber);\r
461             ps.setInt(2, subid);\r
462             ps.execute();\r
463             ps.close();\r
464         } catch (SQLException e) {\r
465             rv = false;\r
466             intlogger.warn("PROV0006 doUpdate: " + e.getMessage());\r
467             e.printStackTrace();\r
468         } finally {\r
469             try {\r
470                 if(ps!=null) {\r
471                     ps.close();\r
472                 }\r
473             } catch (SQLException e) {\r
474                 e.printStackTrace();\r
475             }\r
476         }\r
477         return rv;\r
478     }\r
479 \r
480 \r
481     @Override\r
482     public boolean doDelete(Connection c) {\r
483         boolean rv = true;\r
484         PreparedStatement ps = null;\r
485         try {\r
486             String sql = "delete from SUBSCRIPTIONS where SUBID = ?";\r
487             ps = c.prepareStatement(sql);\r
488             ps.setInt(1, subid);\r
489             ps.execute();\r
490         } catch (SQLException e) {\r
491             rv = false;\r
492             intlogger.warn("PROV0007 doDelete: " + e.getMessage());\r
493             e.printStackTrace();\r
494         } finally {\r
495             try {\r
496                 if(ps!=null) {\r
497                     ps.close();\r
498                 }\r
499             } catch (SQLException e) {\r
500                 e.printStackTrace();\r
501             }\r
502         }\r
503         return rv;\r
504     }\r
505 \r
506     @Override\r
507     public String getKey() {\r
508         return "" + getSubid();\r
509     }\r
510 \r
511     @Override\r
512     public boolean equals(Object obj) {\r
513         if (!(obj instanceof Subscription))\r
514             return false;\r
515         Subscription os = (Subscription) obj;\r
516         if (subid != os.subid)\r
517             return false;\r
518         if (feedid != os.feedid)\r
519             return false;\r
520         if (groupid != os.groupid) //New field is added - Groups feature Rally:US708115 - 1610\r
521             return false;\r
522         if (!delivery.equals(os.delivery))\r
523             return false;\r
524         if (metadataOnly != os.metadataOnly)\r
525             return false;\r
526         if (!subscriber.equals(os.subscriber))\r
527             return false;\r
528         if (!links.equals(os.links))\r
529             return false;\r
530         if (suspended != os.suspended)\r
531             return false;\r
532         return true;\r
533     }\r
534 \r
535     @Override\r
536     public int hashCode() {\r
537         return Objects.hash(subid, feedid, groupid, delivery, metadataOnly, subscriber, links, suspended, last_mod, created_date);\r
538     }\r
539 \r
540     @Override\r
541     public String toString() {\r
542         return "SUB: subid=" + subid + ", feedid=" + feedid;\r
543     }\r
544 }\r