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