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