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