DMAAP-1195 [DR] Remove DR code smells
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / beans / Feed.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 \r
25 package org.onap.dmaap.datarouter.provisioning.beans;\r
26 \r
27 import com.att.eelf.configuration.EELFLogger;\r
28 import com.att.eelf.configuration.EELFManager;\r
29 import java.io.InvalidObjectException;\r
30 import java.sql.Connection;\r
31 import java.sql.PreparedStatement;\r
32 import java.sql.ResultSet;\r
33 import java.sql.SQLException;\r
34 import java.sql.Statement;\r
35 import java.util.ArrayList;\r
36 import java.util.Collection;\r
37 import java.util.Date;\r
38 import java.util.HashMap;\r
39 import java.util.List;\r
40 import java.util.Map;\r
41 import java.util.Set;\r
42 import org.json.JSONArray;\r
43 import org.json.JSONException;\r
44 import org.json.JSONObject;\r
45 import org.onap.dmaap.datarouter.provisioning.utils.DB;\r
46 import org.onap.dmaap.datarouter.provisioning.utils.JSONUtilities;\r
47 import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;\r
48 \r
49 \r
50 \r
51 /**\r
52  * The representation of a Feed.  Feeds can be retrieved from the DB, or stored/updated in the DB.\r
53  *\r
54  * @author Robert Eby\r
55  * @version $Id: Feed.java,v 1.13 2013/10/28 18:06:52 eby Exp $\r
56  */\r
57 public class Feed extends Syncable {\r
58 \r
59     private static EELFLogger intlogger = EELFManager.getInstance().getLogger("InternalLog");\r
60     private static int nextFeedID = getMaxFeedID() + 1;\r
61     private static final String SQLEXCEPTION = "SQLException: ";\r
62     private static final String FEEDID = "FEEDID";\r
63     private static final String feedIDStr = "feedid";\r
64     private static final String deletedStr = "deleted";\r
65     private static final String lastModStr = "last_mod";\r
66     private static final String createdDateStr ="created_date";\r
67 \r
68     private int feedid;\r
69     private int groupid; //New field is added - Groups feature Rally:US708115 - 1610\r
70     private String name;\r
71     private String version;\r
72     private String description;\r
73     private String businessDescription; // New field is added - Groups feature Rally:US708102 - 1610\r
74     private FeedAuthorization authorization;\r
75     private String publisher;\r
76     private FeedLinks links;\r
77     private boolean deleted;\r
78     private boolean suspended;\r
79     private Date lastMod;\r
80     private Date createdDate;\r
81     private String aafInstance;\r
82 \r
83     public Feed() {\r
84         this("", "", "", "");\r
85     }\r
86 \r
87     /**\r
88      * Feed constructor.\r
89      * @param name feed name\r
90      * @param version feed version\r
91      * @param desc feed description\r
92      * @param businessDescription feed business description\r
93      */\r
94     public Feed(String name, String version, String desc, String businessDescription) {\r
95         this.feedid = -1;\r
96         this.groupid = -1; //New field is added - Groups feature Rally:US708115 - 1610\r
97         this.name = name;\r
98         this.version = version;\r
99         this.description = desc;\r
100         this.businessDescription = businessDescription; // New field is added - Groups feature Rally:US708102 - 1610\r
101         this.authorization = new FeedAuthorization();\r
102         this.publisher = "";\r
103         this.links = new FeedLinks();\r
104         this.deleted = false;\r
105         this.suspended = false;\r
106         this.lastMod = new Date();\r
107         this.createdDate = new Date();\r
108         this.aafInstance = "";\r
109     }\r
110 \r
111     /**\r
112      * Feed Constructor from ResultSet.\r
113      * @param rs ResultSet\r
114      * @throws SQLException in case of SQL statement error\r
115      */\r
116     public Feed(ResultSet rs) throws SQLException {\r
117         this.feedid = rs.getInt(FEEDID);\r
118         //New field is added - Groups feature Rally:US708115 - 1610\r
119         this.groupid = rs.getInt("GROUPID");\r
120         this.name = rs.getString("NAME");\r
121         this.version = rs.getString("VERSION");\r
122         this.description = rs.getString("DESCRIPTION");\r
123         // New field is added - Groups feature Rally:US708102 - 1610\r
124         this.businessDescription = rs.getString("BUSINESS_DESCRIPTION");\r
125         this.authorization = new FeedAuthorization();\r
126         this.authorization.setClassification(rs.getString("AUTH_CLASS"));\r
127         this.publisher = rs.getString("PUBLISHER");\r
128         this.links = new FeedLinks();\r
129         this.links.setSelf(rs.getString("SELF_LINK"));\r
130         this.links.setPublish(rs.getString("PUBLISH_LINK"));\r
131         this.links.setSubscribe(rs.getString("SUBSCRIBE_LINK"));\r
132         this.links.setLog(rs.getString("LOG_LINK"));\r
133         this.deleted = rs.getBoolean("DELETED");\r
134         this.suspended = rs.getBoolean("SUSPENDED");\r
135         this.lastMod = rs.getDate("LAST_MOD");\r
136         this.createdDate = rs.getTimestamp("CREATED_DATE");\r
137         this.aafInstance = rs.getString("AAF_INSTANCE");\r
138     }\r
139 \r
140     /**\r
141      * Feed constructor from JSONObject.\r
142      * @param jo JSONObject\r
143      * @throws InvalidObjectException in case of JSON error\r
144      */\r
145     public Feed(JSONObject jo) throws InvalidObjectException {\r
146         this("", "", "", "");\r
147         try {\r
148             // The JSONObject is assumed to contain a vnd.dmaap-dr.feed representation\r
149             this.feedid = jo.optInt(feedIDStr, -1);\r
150             this.groupid = jo.optInt("groupid");\r
151             this.name = jo.getString("name");\r
152             this.aafInstance = jo.optString("aaf_instance", "legacy");\r
153             if (!(aafInstance.equalsIgnoreCase("legacy")) && aafInstance.length() > 255) {\r
154                 throw new InvalidObjectException("aaf_instance field is too long");\r
155             }\r
156             if (name.length() > 255) {\r
157                 throw new InvalidObjectException("name field is too long");\r
158             }\r
159             try {\r
160                 this.version = jo.getString("version");\r
161             } catch (JSONException e) {\r
162                 intlogger.warn("PROV0023 Feed.Feed: " + e.getMessage(), e);\r
163                 this.version = null;\r
164             }\r
165             if (version != null && version.length() > 20) {\r
166                 throw new InvalidObjectException("version field is too long");\r
167             }\r
168             this.description = jo.optString("description");\r
169             this.businessDescription = jo.optString("business_description");\r
170             if (description.length() > 1000) {\r
171                 throw new InvalidObjectException("technical description field is too long");\r
172             }\r
173             if (businessDescription.length() > 1000) {\r
174                 throw new InvalidObjectException("business description field is too long");\r
175             }\r
176             this.authorization = new FeedAuthorization();\r
177             JSONObject jauth = jo.getJSONObject("authorization");\r
178             this.authorization.setClassification(jauth.getString("classification"));\r
179             if (this.authorization.getClassification().length() > 32) {\r
180                 throw new InvalidObjectException("classification field is too long");\r
181             }\r
182             JSONArray endPointIds = jauth.getJSONArray("endpoint_ids");\r
183             for (int i = 0; i < endPointIds.length(); i++) {\r
184                 JSONObject id = endPointIds.getJSONObject(i);\r
185                 FeedEndpointID fid = new FeedEndpointID(id.getString("id"), id.getString("password"));\r
186                 if (fid.getId().length() > 60) {\r
187                     throw new InvalidObjectException("id field is too long (" + fid.getId() + ")");\r
188                 }\r
189                 if (fid.getPassword().length() > 32) {\r
190                     //Fortify scan fixes - Privacy Violation\r
191                     throw new InvalidObjectException("password field is too long (" + fid.getPassword() + ")");\r
192                 }\r
193                 this.authorization.getEndpointIDS().add(fid);\r
194             }\r
195             if (this.authorization.getEndpointIDS().isEmpty()) {\r
196                 throw new InvalidObjectException("need to specify at least one endpoint_id");\r
197             }\r
198             endPointIds = jauth.getJSONArray("endpoint_addrs");\r
199             for (int i = 0; i < endPointIds.length(); i++) {\r
200                 String addr = endPointIds.getString(i);\r
201                 if (!JSONUtilities.validIPAddrOrSubnet(addr)) {\r
202                     throw new InvalidObjectException("bad IP addr or subnet mask: " + addr);\r
203                 }\r
204                 this.authorization.getEndpointAddrs().add(addr);\r
205             }\r
206 \r
207             this.publisher = jo.optString("publisher", "");\r
208             this.deleted = jo.optBoolean(deletedStr, false);\r
209             this.suspended = jo.optBoolean("suspend", false);\r
210             JSONObject jol = jo.optJSONObject("links");\r
211             this.links = (jol == null) ? (new FeedLinks()) : (new FeedLinks(jol));\r
212         } catch (InvalidObjectException e) {\r
213             throw e;\r
214         } catch (Exception e) {\r
215             intlogger.warn("Invalid JSON: " + e.getMessage(), e);\r
216             throw new InvalidObjectException("Invalid JSON: " + e.getMessage());\r
217         }\r
218     }\r
219 \r
220     /**\r
221      * Check if a feed ID is valid.\r
222      *\r
223      * @param id the Feed ID\r
224      * @return true if it is valid\r
225      */\r
226     @SuppressWarnings("resource")\r
227     public static boolean isFeedValid(int id) {\r
228         int count = 0;\r
229         try {\r
230             DB db = new DB();\r
231             Connection conn = db.getConnection();\r
232             try (PreparedStatement stmt = conn.prepareStatement("select COUNT(*) from FEEDS where FEEDID = ?")) {\r
233                 stmt.setInt(1, id);\r
234                 try (ResultSet rs = stmt.executeQuery()) {\r
235                     if (rs.next()) {\r
236                         count = rs.getInt(1);\r
237                     }\r
238                 }\r
239             }\r
240             db.release(conn);\r
241         } catch (SQLException e) {\r
242             intlogger.warn("PROV0024 Feed.isFeedValid: " + e.getMessage(), e);\r
243         }\r
244         return count != 0;\r
245     }\r
246 \r
247     /**\r
248      * Get a specific feed from the DB, based upon its ID.\r
249      *\r
250      * @param id the Feed ID\r
251      * @return the Feed object, or null if it does not exist\r
252      */\r
253     public static Feed getFeedById(int id) {\r
254         String sql = "select * from FEEDS where FEEDID = " + id;\r
255         return getFeedBySQL(sql);\r
256     }\r
257 \r
258     /**\r
259      * Get a specific feed from the DB, based upon its name and version.\r
260      *\r
261      * @param name    the name of the Feed\r
262      * @param version the version of the Feed\r
263      * @return the Feed object, or null if it does not exist\r
264      */\r
265     public static Feed getFeedByNameVersion(String name, String version) {\r
266         name = name.replaceAll("'", "''");\r
267         version = version.replaceAll("'", "''");\r
268         String sql = "select * from FEEDS where NAME = '" + name + "' and VERSION ='" + version + "'";\r
269         return getFeedBySQL(sql);\r
270     }\r
271 \r
272     /**\r
273      * Return a count of the number of active feeds in the DB.\r
274      *\r
275      * @return the count\r
276      */\r
277     public static int countActiveFeeds() {\r
278         int count = 0;\r
279         try {\r
280             DB db = new DB();\r
281             @SuppressWarnings("resource") Connection conn = db.getConnection();\r
282             try (Statement stmt = conn.createStatement()) {\r
283                 try (ResultSet rs = stmt.executeQuery("select count(*) from FEEDS where DELETED = 0")) {\r
284                     if (rs.next()) {\r
285                         count = rs.getInt(1);\r
286                     }\r
287                 }\r
288             }\r
289             db.release(conn);\r
290         } catch (SQLException e) {\r
291             intlogger.warn("PROV0025 Feed.countActiveFeeds: " + e.getMessage(), e);\r
292         }\r
293         return count;\r
294     }\r
295 \r
296     /**\r
297      * Method to get max feed id.\r
298      * @return int max feed id\r
299      */\r
300     public static int getMaxFeedID() {\r
301         int max = 0;\r
302         try {\r
303             DB db = new DB();\r
304             @SuppressWarnings("resource")\r
305             Connection conn = db.getConnection();\r
306             try (Statement stmt = conn.createStatement()) {\r
307                 try (ResultSet rs = stmt.executeQuery("select MAX(feedid) from FEEDS")) {\r
308                     if (rs.next()) {\r
309                         max = rs.getInt(1);\r
310                     }\r
311                 }\r
312             }\r
313             db.release(conn);\r
314         } catch (SQLException e) {\r
315             intlogger.warn("PROV0026 Feed.getMaxFeedID: " + e.getMessage(), e);\r
316         }\r
317         return max;\r
318     }\r
319 \r
320     /**\r
321      * Gets all feeds.\r
322      * @return Collection of feeds\r
323      */\r
324     public static Collection<Feed> getAllFeeds() {\r
325         Map<Integer, Feed> map = new HashMap<>();\r
326         try {\r
327             DB db = new DB();\r
328             @SuppressWarnings("resource")\r
329             Connection conn = db.getConnection();\r
330             try (Statement stmt = conn.createStatement()) {\r
331                 try (ResultSet rs = stmt.executeQuery("select * from FEEDS")) {\r
332                     while (rs.next()) {\r
333                         Feed feed = new Feed(rs);\r
334                         map.put(feed.getFeedid(), feed);\r
335                     }\r
336                 }\r
337 \r
338                 String sql = "select * from FEED_ENDPOINT_IDS";\r
339                 try (ResultSet rs = stmt.executeQuery(sql)) {\r
340                     while (rs.next()) {\r
341                         int id = rs.getInt(FEEDID);\r
342                         Feed feed = map.get(id);\r
343                         if (feed != null) {\r
344                             FeedEndpointID epi = new FeedEndpointID(rs);\r
345                             Collection<FeedEndpointID> ecoll = feed.getAuthorization().getEndpointIDS();\r
346                             ecoll.add(epi);\r
347                         }\r
348                     }\r
349                 }\r
350 \r
351                 sql = "select * from FEED_ENDPOINT_ADDRS";\r
352                 try (ResultSet rs = stmt.executeQuery(sql)) {\r
353                     while (rs.next()) {\r
354                         int id = rs.getInt(FEEDID);\r
355                         Feed feed = map.get(id);\r
356                         if (feed != null) {\r
357                             Collection<String> acoll = feed.getAuthorization().getEndpointAddrs();\r
358                             acoll.add(rs.getString("ADDR"));\r
359                         }\r
360                     }\r
361                 }\r
362             }\r
363             db.release(conn);\r
364         } catch (SQLException e) {\r
365             intlogger.warn("PROV0027 Feed.getAllFeeds: " + e.getMessage(), e);\r
366         }\r
367         return map.values();\r
368     }\r
369 \r
370     /**\r
371      * Get Feed URL list.\r
372      * @param name of Feed\r
373      * @param val of feed\r
374      * @return List of feed names\r
375      */\r
376     public static List<String> getFilteredFeedUrlList(final String name, final String val) {\r
377         List<String> list = new ArrayList<>();\r
378         String sql = "select SELF_LINK from FEEDS where DELETED = 0";\r
379         if (name.equals("name")) {\r
380             sql += " and NAME = ?";\r
381         } else if (name.equals("publ")) {\r
382             sql += " and PUBLISHER = ?";\r
383         } else if (name.equals("subs")) {\r
384             sql = "select distinct FEEDS.SELF_LINK from FEEDS, SUBSCRIPTIONS "\r
385                           + "where DELETED = 0 "\r
386                           + "and FEEDS.FEEDID = SUBSCRIPTIONS.FEEDID "\r
387                           + "and SUBSCRIPTIONS.SUBSCRIBER = ?";\r
388         }\r
389         try {\r
390             DB db = new DB();\r
391             @SuppressWarnings("resource")\r
392             Connection conn = db.getConnection();\r
393             try (PreparedStatement ps = conn.prepareStatement(sql)) {\r
394                 if (sql.indexOf('?') >= 0) {\r
395                     ps.setString(1, val);\r
396                 }\r
397                 try (ResultSet rs = ps.executeQuery()) {\r
398                     while (rs.next()) {\r
399                         String str = rs.getString(1);\r
400                         list.add(str.trim());\r
401                     }\r
402                 }\r
403             }\r
404             db.release(conn);\r
405         } catch (SQLException e) {\r
406             intlogger.warn("PROV0028 Feed.getFilteredFeedUrlList: " + e.getMessage(), e);\r
407         }\r
408         return list;\r
409     }\r
410 \r
411     @SuppressWarnings("resource")\r
412     private static Feed getFeedBySQL(String sql) {\r
413         Feed feed = null;\r
414         try {\r
415             DB db = new DB();\r
416             Connection conn = db.getConnection();\r
417             try (Statement stmt = conn.createStatement()) {\r
418                 try (ResultSet rs = stmt.executeQuery(sql)) {\r
419                     if (rs.next()) {\r
420                         feed = new Feed(rs);\r
421                     }\r
422                 }\r
423                 if (feed != null) {\r
424                     sql = "select * from FEED_ENDPOINT_IDS where FEEDID = " + feed.feedid;\r
425                     try (ResultSet rs = stmt.executeQuery(sql)) {\r
426                         Collection<FeedEndpointID> ecoll = feed.getAuthorization().getEndpointIDS();\r
427                         while (rs.next()) {\r
428                             FeedEndpointID epi = new FeedEndpointID(rs);\r
429                             ecoll.add(epi);\r
430                         }\r
431                     }\r
432                     sql = "select * from FEED_ENDPOINT_ADDRS where FEEDID = " + feed.feedid;\r
433                     try (ResultSet rs = stmt.executeQuery(sql)) {\r
434                         Collection<String> acoll = feed.getAuthorization().getEndpointAddrs();\r
435                         while (rs.next()) {\r
436                             acoll.add(rs.getString("ADDR"));\r
437                         }\r
438                     }\r
439                 }\r
440             }\r
441             db.release(conn);\r
442         } catch (SQLException e) {\r
443             intlogger.warn("PROV0029 Feed.getFeedBySQL: " + e.getMessage(), e);\r
444         }\r
445         return feed;\r
446     }\r
447 \r
448 \r
449 \r
450     public int getFeedid() {\r
451         return feedid;\r
452     }\r
453 \r
454     /**\r
455      *  Set feedid with FeedLinks.\r
456       * @param feedid Feedid to set to\r
457      */\r
458     public void setFeedid(int feedid) {\r
459         this.feedid = feedid;\r
460 \r
461         // Create link URLs\r
462         FeedLinks fl = getLinks();\r
463         fl.setSelf(URLUtilities.generateFeedURL(feedid));\r
464         fl.setPublish(URLUtilities.generatePublishURL(feedid));\r
465         fl.setSubscribe(URLUtilities.generateSubscribeURL(feedid));\r
466         fl.setLog(URLUtilities.generateFeedLogURL(feedid));\r
467     }\r
468 \r
469     public String getAafInstance() {\r
470         return aafInstance;\r
471     }\r
472 \r
473     public void setAafInstance(String aafInstance) {\r
474         this.aafInstance = aafInstance;\r
475     }\r
476 \r
477     //new getter setters for groups- Rally:US708115 - 1610\r
478     public int getGroupid() {\r
479         return groupid;\r
480     }\r
481 \r
482     public void setGroupid(int groupid) {\r
483         this.groupid = groupid;\r
484     }\r
485 \r
486     public String getName() {\r
487         return name;\r
488     }\r
489 \r
490     public void setName(String name) {\r
491         this.name = name;\r
492     }\r
493 \r
494     public String getVersion() {\r
495         return version;\r
496     }\r
497 \r
498     public void setVersion(String version) {\r
499         this.version = version;\r
500     }\r
501 \r
502     public String getDescription() {\r
503         return description;\r
504     }\r
505 \r
506     public void setDescription(String description) {\r
507         this.description = description;\r
508     }\r
509 \r
510     // New field is added - Groups feature Rally:US708102 - 1610\r
511     public String getBusinessDescription() {\r
512         return businessDescription;\r
513     }\r
514 \r
515     public void setBusinessDescription(String businessDescription) {\r
516         this.businessDescription = businessDescription;\r
517     }\r
518 \r
519     public FeedAuthorization getAuthorization() {\r
520         return authorization;\r
521     }\r
522 \r
523     public void setAuthorization(FeedAuthorization authorization) {\r
524         this.authorization = authorization;\r
525     }\r
526 \r
527     public String getPublisher() {\r
528         return publisher;\r
529     }\r
530 \r
531     /**\r
532      * Set publisher.\r
533      * @param publisher Publisher name\r
534      */\r
535     public void setPublisher(String publisher) {\r
536         if (publisher != null) {\r
537             if (publisher.length() > 8) {\r
538                 publisher = publisher.substring(0, 8);\r
539             }\r
540             this.publisher = publisher;\r
541         }\r
542     }\r
543 \r
544     public FeedLinks getLinks() {\r
545         return links;\r
546     }\r
547 \r
548     public void setLinks(FeedLinks links) {\r
549         this.links = links;\r
550     }\r
551 \r
552     public boolean isDeleted() {\r
553         return deleted;\r
554     }\r
555 \r
556     public void setDeleted(boolean deleted) {\r
557         this.deleted = deleted;\r
558     }\r
559 \r
560     public boolean isSuspended() {\r
561         return suspended;\r
562     }\r
563 \r
564     public void setSuspended(boolean suspended) {\r
565         this.suspended = suspended;\r
566     }\r
567 \r
568     @Override\r
569     public JSONObject asJSONObject() {\r
570         JSONObject jo = new JSONObject();\r
571         jo.put(feedIDStr, feedid);\r
572         //New field is added - Groups feature Rally:US708115 - 1610\r
573         jo.put("groupid", groupid);\r
574         jo.put("name", name);\r
575         jo.put("version", version);\r
576         jo.put("description", description);\r
577         // New field is added - Groups feature Rally:US708102 - 1610\r
578         jo.put("business_description", businessDescription);\r
579         jo.put("authorization", authorization.asJSONObject());\r
580         jo.put("publisher", publisher);\r
581         jo.put("links", links.asJSONObject());\r
582         jo.put(deletedStr, deleted);\r
583         jo.put("suspend", suspended);\r
584         jo.put(lastModStr, lastMod.getTime());\r
585         jo.put(createdDateStr, createdDate.getTime());\r
586         jo.put("aaf_instance", aafInstance);\r
587         return jo;\r
588     }\r
589 \r
590     /**\r
591      * Method to hide some attributes.\r
592      * @param hidepasswords true/false\r
593      * @return JSONObject\r
594      */\r
595     public JSONObject asJSONObject(boolean hidepasswords) {\r
596         JSONObject jo = asJSONObject();\r
597         if (hidepasswords) {\r
598             jo.remove(feedIDStr);    // we no longer hide passwords, however we do hide these\r
599             jo.remove(deletedStr);\r
600             jo.remove(lastModStr);\r
601             jo.remove(createdDateStr);\r
602         }\r
603         return jo;\r
604     }\r
605 \r
606     /**\r
607      * Method to limit JSONObject.\r
608      * @return JSONObject\r
609      */\r
610     public JSONObject asLimitedJSONObject() {\r
611         JSONObject jo = asJSONObject();\r
612         jo.remove(deletedStr);\r
613         jo.remove(feedIDStr);\r
614         jo.remove(lastModStr);\r
615         jo.remove(createdDateStr);\r
616         return jo;\r
617     }\r
618 \r
619 \r
620 \r
621     @Override\r
622     public boolean doDelete(Connection conn) {\r
623         boolean rv = true;\r
624         PreparedStatement ps = null;\r
625         try {\r
626             String sql = "delete from FEEDS where FEEDID = ?";\r
627             ps = conn.prepareStatement(sql);\r
628             ps.setInt(1, feedid);\r
629             ps.execute();\r
630         } catch (SQLException e) {\r
631             rv = false;\r
632             intlogger.error("PROV0007 doDelete: " + e.getMessage(), e);\r
633         } finally {\r
634             try {\r
635                 if (ps != null) {\r
636                     ps.close();\r
637                 }\r
638             } catch (SQLException e) {\r
639                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
640             }\r
641         }\r
642         return rv;\r
643     }\r
644 \r
645     @Override\r
646     public synchronized boolean doInsert(Connection conn) {\r
647         boolean rv = true;\r
648         try {\r
649             if (feedid == -1) {\r
650                 setFeedid(nextFeedID++);\r
651             }\r
652             // In case we insert a feed from synchronization\r
653             if (feedid > nextFeedID) {\r
654                 nextFeedID = feedid + 1;\r
655             }\r
656 \r
657             // Create FEED_ENDPOINT_IDS rows\r
658             FeedAuthorization auth = getAuthorization();\r
659             String sql = "insert into FEED_ENDPOINT_IDS values (?, ?, ?)";\r
660             try (PreparedStatement ps2 = conn.prepareStatement(sql)) {\r
661                 for (FeedEndpointID fid : auth.getEndpointIDS()) {\r
662                     ps2.setInt(1, feedid);\r
663                     ps2.setString(2, fid.getId());\r
664                     ps2.setString(3, fid.getPassword());\r
665                     ps2.executeUpdate();\r
666                 }\r
667             }\r
668 \r
669             // Create FEED_ENDPOINT_ADDRS rows\r
670             sql = "insert into FEED_ENDPOINT_ADDRS values (?, ?)";\r
671             try (PreparedStatement ps2 = conn.prepareStatement(sql)) {\r
672                 for (String t : auth.getEndpointAddrs()) {\r
673                     ps2.setInt(1, feedid);\r
674                     ps2.setString(2, t);\r
675                     ps2.executeUpdate();\r
676                 }\r
677             }\r
678 \r
679             // Finally, create the FEEDS row\r
680             sql = "insert into FEEDS (FEEDID, NAME, VERSION, DESCRIPTION, AUTH_CLASS, PUBLISHER, SELF_LINK, "\r
681                           + "PUBLISH_LINK, SUBSCRIBE_LINK, LOG_LINK, DELETED, SUSPENDED,"\r
682                           + "BUSINESS_DESCRIPTION, GROUPID, AAF_INSTANCE) "\r
683                           + "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";\r
684             try (PreparedStatement ps2 = conn.prepareStatement(sql)) {\r
685                 ps2.setInt(1, feedid);\r
686                 ps2.setString(2, getName());\r
687                 ps2.setString(3, getVersion());\r
688                 ps2.setString(4, getDescription());\r
689                 ps2.setString(5, getAuthorization().getClassification());\r
690                 ps2.setString(6, getPublisher());\r
691                 ps2.setString(7, getLinks().getSelf());\r
692                 ps2.setString(8, getLinks().getPublish());\r
693                 ps2.setString(9, getLinks().getSubscribe());\r
694                 ps2.setString(10, getLinks().getLog());\r
695                 ps2.setBoolean(11, isDeleted());\r
696                 ps2.setBoolean(12, isSuspended());\r
697                 ps2.setString(13, getBusinessDescription());\r
698                 ps2.setInt(14, groupid);\r
699                 ps2.setString(15, getAafInstance());\r
700                 ps2.executeUpdate();\r
701             }\r
702         } catch (SQLException e) {\r
703             rv = false;\r
704             intlogger.error("PROV0005 doInsert: " + e.getMessage(), e);\r
705         }\r
706         return rv;\r
707     }\r
708 \r
709     @Override\r
710     public boolean doUpdate(Connection conn) {\r
711         boolean rv = true;\r
712         Feed oldobj = getFeedById(feedid);\r
713         PreparedStatement ps = null;\r
714         try {\r
715             Set<FeedEndpointID> newset = getAuthorization().getEndpointIDS();\r
716             Set<FeedEndpointID> oldset = oldobj.getAuthorization().getEndpointIDS();\r
717 \r
718             // Insert new FEED_ENDPOINT_IDS rows\r
719             String sql = "insert into FEED_ENDPOINT_IDS values (?, ?, ?)";\r
720             ps = conn.prepareStatement(sql);\r
721             for (FeedEndpointID fid : newset) {\r
722                 if (!oldset.contains(fid)) {\r
723                     ps.setInt(1, feedid);\r
724                     ps.setString(2, fid.getId());\r
725                     ps.setString(3, fid.getPassword());\r
726                     ps.executeUpdate();\r
727                 }\r
728             }\r
729             ps.close();\r
730 \r
731             // Delete old FEED_ENDPOINT_IDS rows\r
732             sql = "delete from FEED_ENDPOINT_IDS where FEEDID = ? AND USERID = ? AND PASSWORD = ?";\r
733             ps = conn.prepareStatement(sql);\r
734             for (FeedEndpointID fid : oldset) {\r
735                 if (!newset.contains(fid)) {\r
736                     ps.setInt(1, feedid);\r
737                     ps.setString(2, fid.getId());\r
738                     ps.setString(3, fid.getPassword());\r
739                     ps.executeUpdate();\r
740                 }\r
741             }\r
742             ps.close();\r
743 \r
744             // Insert new FEED_ENDPOINT_ADDRS rows\r
745             Set<String> newset2 = getAuthorization().getEndpointAddrs();\r
746             Set<String> oldset2 = oldobj.getAuthorization().getEndpointAddrs();\r
747             sql = "insert into FEED_ENDPOINT_ADDRS values (?, ?)";\r
748             ps = conn.prepareStatement(sql);\r
749             for (String t : newset2) {\r
750                 if (!oldset2.contains(t)) {\r
751                     ps.setInt(1, feedid);\r
752                     ps.setString(2, t);\r
753                     ps.executeUpdate();\r
754                 }\r
755             }\r
756             ps.close();\r
757 \r
758             // Delete old FEED_ENDPOINT_ADDRS rows\r
759             sql = "delete from FEED_ENDPOINT_ADDRS where FEEDID = ? AND ADDR = ?";\r
760             ps = conn.prepareStatement(sql);\r
761             for (String t : oldset2) {\r
762                 if (!newset2.contains(t)) {\r
763                     ps.setInt(1, feedid);\r
764                     ps.setString(2, t);\r
765                     ps.executeUpdate();\r
766                 }\r
767             }\r
768             ps.close();\r
769 \r
770             // Finally, update the FEEDS row\r
771             sql = "update FEEDS set DESCRIPTION = ?, AUTH_CLASS = ?, DELETED = ?, SUSPENDED = ?, "\r
772                           + "BUSINESS_DESCRIPTION=?, GROUPID=? where FEEDID = ?";\r
773             ps = conn.prepareStatement(sql);\r
774             ps.setString(1, getDescription());\r
775             ps.setString(2, getAuthorization().getClassification());\r
776             ps.setInt(3, deleted ? 1 : 0);\r
777             ps.setInt(4, suspended ? 1 : 0);\r
778             ps.setString(5, getBusinessDescription());\r
779             ps.setInt(6, groupid);\r
780             ps.setInt(7, feedid);\r
781             ps.executeUpdate();\r
782             ps.close();\r
783         } catch (SQLException e) {\r
784             rv = false;\r
785             intlogger.warn("PROV0006 doUpdate: " + e.getMessage(), e);\r
786         } finally {\r
787             try {\r
788                 if (ps != null) {\r
789                     ps.close();\r
790                 }\r
791             } catch (SQLException e) {\r
792                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
793             }\r
794         }\r
795         return rv;\r
796     }\r
797 \r
798     /**\r
799      * Rally US708115.\r
800      * Change Ownership of FEED - 1610\r
801      */\r
802     public boolean changeOwnerShip() {\r
803         boolean rv = true;\r
804         PreparedStatement ps = null;\r
805         try {\r
806 \r
807             DB db = new DB();\r
808             @SuppressWarnings("resource")\r
809             Connection conn = db.getConnection();\r
810             String sql = "update FEEDS set PUBLISHER = ? where FEEDID = ?";\r
811             ps = conn.prepareStatement(sql);\r
812             ps.setString(1, this.publisher);\r
813             ps.setInt(2, feedid);\r
814             ps.execute();\r
815             ps.close();\r
816         } catch (SQLException e) {\r
817             rv = false;\r
818             intlogger.warn("PROV0008 changeOwnerShip: " + e.getMessage(), e);\r
819         } finally {\r
820             try {\r
821                 if (ps != null) {\r
822                     ps.close();\r
823                 }\r
824             } catch (SQLException e) {\r
825                 intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
826             }\r
827         }\r
828         return rv;\r
829     }\r
830 \r
831 \r
832     @Override\r
833     public String getKey() {\r
834         return "" + getFeedid();\r
835     }\r
836 \r
837     @Override\r
838     public boolean equals(Object obj) {\r
839         if (!(obj instanceof Feed)) {\r
840             return false;\r
841         }\r
842         Feed of = (Feed) obj;\r
843         if (feedid != of.feedid) {\r
844             return false;\r
845         }\r
846         if (groupid != of.groupid) {\r
847             //New field is added - Groups feature Rally:US708115 - 1610\r
848             return false;\r
849         }\r
850         if (!name.equals(of.name)) {\r
851             return false;\r
852         }\r
853         if (!version.equals(of.version)) {\r
854             return false;\r
855         }\r
856         if (!description.equals(of.description)) {\r
857             return false;\r
858         }\r
859         if (!businessDescription.equals(of.businessDescription)) {\r
860             // New field is added - Groups feature Rally:US708102 - 1610\r
861             return false;\r
862         }\r
863         if (!publisher.equals(of.publisher)) {\r
864             return false;\r
865         }\r
866         if (!authorization.equals(of.authorization)) {\r
867             return false;\r
868         }\r
869         if (!links.equals(of.links)) {\r
870             return false;\r
871         }\r
872         if (deleted != of.deleted) {\r
873             return false;\r
874         }\r
875         if (suspended != of.suspended) {\r
876             return false;\r
877         }\r
878         if (!aafInstance.equals(of.aafInstance)) {\r
879             return false;\r
880         }\r
881         return true;\r
882     }\r
883 \r
884     @Override\r
885     public String toString() {\r
886         return "FEED: feedid=" + feedid + ", name=" + name + ", version=" + version;\r
887     }\r
888 \r
889     @Override\r
890     public int hashCode() {\r
891         return super.hashCode();\r
892     }\r
893 }