Refactor Prov DB handling
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / beans / Group.java
index da682d7..0b7e065 100644 (file)
 \r
 package org.onap.dmaap.datarouter.provisioning.beans;\r
 \r
+import com.att.eelf.configuration.EELFLogger;\r
+import com.att.eelf.configuration.EELFManager;\r
 import java.io.InvalidObjectException;\r
 import java.sql.Connection;\r
 import java.sql.PreparedStatement;\r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
-import java.sql.Statement;\r
-import java.util.*;\r
-\r
-import com.att.eelf.configuration.EELFLogger;\r
-import com.att.eelf.configuration.EELFManager;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Date;\r
+import java.util.List;\r
+import java.util.Objects;\r
 import org.json.JSONObject;\r
-import org.onap.dmaap.datarouter.provisioning.utils.DB;\r
+import org.onap.dmaap.datarouter.provisioning.utils.ProvDbUtils;\r
 \r
 /**\r
  * The representation of a Subscription.  Subscriptions can be retrieved from the DB, or stored/updated in the DB.\r
@@ -42,11 +44,12 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
  * @author vikram\r
  * @version $Id: Group.java,v 1.0 2016/07/19\r
  */\r
+\r
 public class Group extends Syncable {\r
 \r
+    private static final String GROUP_ID_CONST = "groupid";\r
     private static EELFLogger intlogger = EELFManager.getInstance().getLogger("InternalLog");\r
-    private static int next_groupid = getMaxGroupID() + 1;\r
-    private static final String SQLEXCEPTION = "SQLException: ";\r
+    private static int nextGroupid = getMaxGroupID() + 1;\r
 \r
     private int groupid;\r
     private String authid;\r
@@ -54,89 +57,18 @@ public class Group extends Syncable {
     private String description;\r
     private String classification;\r
     private String members;\r
-    private Date last_mod;\r
-\r
-\r
-    public static Group getGroupMatching(Group gup) {\r
-        String sql = String.format(\r
-                "select * from GROUPS where NAME='%s'",\r
-                gup.getName()\r
-        );\r
-        List<Group> list = getGroupsForSQL(sql);\r
-        return list.size() > 0 ? list.get(0) : null;\r
-    }\r
-\r
-    public static Group getGroupMatching(Group gup, int groupid) {\r
-        String sql = String.format(\r
-                "select * from GROUPS where  NAME = '%s' and GROUPID != %d ",\r
-                gup.getName(),\r
-                gup.getGroupid()\r
-        );\r
-        List<Group> list = getGroupsForSQL(sql);\r
-        return list.size() > 0 ? list.get(0) : null;\r
-    }\r
-\r
-    public static Group getGroupById(int id) {\r
-        String sql = "select * from GROUPS where GROUPID = " + id;\r
-        List<Group> list = getGroupsForSQL(sql);\r
-        return list.size() > 0 ? list.get(0) : null;\r
-    }\r
-\r
-    public static Group getGroupByAuthId(String id) {\r
-        String sql = "select * from GROUPS where AUTHID = '" + id + "'";\r
-        List<Group> list = getGroupsForSQL(sql);\r
-        return list.size() > 0 ? list.get(0) : null;\r
-    }\r
-\r
-    public static Collection<Group> getAllgroups() {\r
-        return getGroupsForSQL("select * from GROUPS");\r
-    }\r
-\r
-    private static List<Group> getGroupsForSQL(String sql) {\r
-        List<Group> list = new ArrayList<Group>();\r
-        try {\r
-            DB db = new DB();\r
-            @SuppressWarnings("resource")\r
-            Connection conn = db.getConnection();\r
-            try (Statement stmt = conn.createStatement()) {\r
-                try (ResultSet rs = stmt.executeQuery(sql)) {\r
-                    while (rs.next()) {\r
-                        Group group = new Group(rs);\r
-                        list.add(group);\r
-                    }\r
-                }\r
-            }\r
-            db.release(conn);\r
-        } catch (SQLException e) {\r
-            intlogger.error("PROV0009 getGroupsForSQL: " + e.getMessage(), e);\r
-        }\r
-        return list;\r
-    }\r
-\r
-    public static int getMaxGroupID() {\r
-        int max = 0;\r
-        try {\r
-            DB db = new DB();\r
-            @SuppressWarnings("resource")\r
-            Connection conn = db.getConnection();\r
-            try (Statement stmt = conn.createStatement()) {\r
-                try (ResultSet rs = stmt.executeQuery("select MAX(groupid) from GROUPS")) {\r
-                    if (rs.next()) {\r
-                        max = rs.getInt(1);\r
-                    }\r
-                }\r
-            }\r
-            db.release(conn);\r
-        } catch (SQLException e) {\r
-            intlogger.info("PROV0001 getMaxSubID: " + e.getMessage(), e);\r
-        }\r
-        return max;\r
-    }\r
+    private Date lastMod;\r
 \r
     public Group() {\r
         this("", "", "");\r
     }\r
 \r
+    /**\r
+     * Group constructor.\r
+     * @param name group name\r
+     * @param desc group description\r
+     * @param members group members\r
+     */\r
     public Group(String name, String desc, String members) {\r
         this.groupid = -1;\r
         this.authid = "";\r
@@ -144,10 +76,15 @@ public class Group extends Syncable {
         this.description = desc;\r
         this.members = members;\r
         this.classification = "";\r
-        this.last_mod = new Date();\r
+        this.lastMod = new Date();\r
     }\r
 \r
 \r
+    /**\r
+     * Group constructor from ResultSet.\r
+     * @param rs ResultSet\r
+     * @throws SQLException in case of SQL statement error\r
+     */\r
     public Group(ResultSet rs) throws SQLException {\r
         this.groupid = rs.getInt("GROUPID");\r
         this.authid = rs.getString("AUTHID");\r
@@ -155,15 +92,19 @@ public class Group extends Syncable {
         this.description = rs.getString("DESCRIPTION");\r
         this.classification = rs.getString("CLASSIFICATION");\r
         this.members = rs.getString("MEMBERS");\r
-        this.last_mod = rs.getDate("LAST_MOD");\r
+        this.lastMod = rs.getDate("LAST_MOD");\r
     }\r
 \r
-\r
+    /**\r
+     * Group constructor for JSONObject.\r
+     * @param jo JSONObject\r
+     * @throws InvalidObjectException in case of JSON error\r
+     */\r
     public Group(JSONObject jo) throws InvalidObjectException {\r
         this("", "", "");\r
         try {\r
             // The JSONObject is assumed to contain a vnd.dmaap-dr.group representation\r
-            this.groupid = jo.optInt("groupid", -1);\r
+            this.groupid = jo.optInt(GROUP_ID_CONST, -1);\r
             String gname = jo.getString("name");\r
             String gdescription = jo.getString("description");\r
 \r
@@ -182,11 +123,93 @@ public class Group extends Syncable {
         } catch (InvalidObjectException e) {\r
             throw e;\r
         } catch (Exception e) {\r
-            intlogger.warn("Invalid JSON: " + e.getMessage(), e);\r
+            intlogger.error("Invalid JSON: " + e.getMessage(), e);\r
             throw new InvalidObjectException("Invalid JSON: " + e.getMessage());\r
         }\r
     }\r
 \r
+    /**\r
+     * Get a group frpm DB.\r
+     * @param gup group object\r
+     * @return Group object\r
+     */\r
+    public static Group getGroupMatching(Group gup) {\r
+        String sql = String.format(\r
+            "select * from GROUPS where NAME='%s'",\r
+            gup.getName()\r
+        );\r
+        List<Group> list = getGroupsForSQL(sql);\r
+        return !list.isEmpty() ? list.get(0) : null;\r
+    }\r
+\r
+    /**\r
+     * Get a group from DB using name and groupid.\r
+     * @param gup group object\r
+     * @param groupid id of group\r
+     * @return group object\r
+     */\r
+    public static Group getGroupMatching(Group gup, int groupid) {\r
+        String sql = String.format(\r
+            "select * from GROUPS where  NAME = '%s' and GROUPID != %d ", gup.getName(), groupid);\r
+        List<Group> list = getGroupsForSQL(sql);\r
+        return !list.isEmpty() ? list.get(0) : null;\r
+    }\r
+\r
+    /**\r
+     * Get group from DB using groupid only.\r
+     * @param id id of group\r
+     * @return group object\r
+     */\r
+    public static Group getGroupById(int id) {\r
+        String sql = "select * from GROUPS where GROUPID = " + id;\r
+        List<Group> list = getGroupsForSQL(sql);\r
+        return !list.isEmpty() ? list.get(0) : null;\r
+    }\r
+\r
+    /**\r
+     * Get group from DB using AUTHID.\r
+     * @param id AUTHID\r
+     * @return group object\r
+     */\r
+    static Group getGroupByAuthId(String id) {\r
+        String sql = "select * from GROUPS where AUTHID = '" + id + "'";\r
+        List<Group> list = getGroupsForSQL(sql);\r
+        return !list.isEmpty() ? list.get(0) : null;\r
+    }\r
+\r
+    public static Collection<Group> getAllgroups() {\r
+        return getGroupsForSQL("select * from GROUPS");\r
+    }\r
+\r
+    private static List<Group> getGroupsForSQL(String sql) {\r
+        List<Group> list = new ArrayList<>();\r
+        try (Connection conn = ProvDbUtils.getInstance().getConnection();\r
+            PreparedStatement ps = conn.prepareStatement(sql);\r
+            ResultSet rs = ps.executeQuery()) {\r
+            while (rs.next()) {\r
+                Group group = new Group(rs);\r
+                list.add(group);\r
+            }\r
+        } catch (SQLException e) {\r
+            intlogger.error("PROV0009 getGroupsForSQL: " + e.getMessage(), e);\r
+        }\r
+        return list;\r
+    }\r
+\r
+    private static int getMaxGroupID() {\r
+        int max = 0;\r
+        try (Connection conn = ProvDbUtils.getInstance().getConnection();\r
+            PreparedStatement ps = conn.prepareStatement("select MAX(groupid) from GROUPS");\r
+            ResultSet rs = ps.executeQuery()) {\r
+            if (rs.next()) {\r
+                max = rs.getInt(1);\r
+            }\r
+        } catch (SQLException e) {\r
+            intlogger.error("PROV0001 getMaxSubID: " + e.getMessage(), e);\r
+        }\r
+        return max;\r
+    }\r
+\r
     public int getGroupid() {\r
         return groupid;\r
     }\r
@@ -242,33 +265,31 @@ public class Group extends Syncable {
     @Override\r
     public JSONObject asJSONObject() {\r
         JSONObject jo = new JSONObject();\r
-        jo.put("groupid", groupid);\r
+        jo.put(GROUP_ID_CONST, groupid);\r
         jo.put("authid", authid);\r
         jo.put("name", name);\r
         jo.put("description", description);\r
         jo.put("classification", classification);\r
         jo.put("members", members);\r
-        jo.put("last_mod", last_mod.getTime());\r
+        jo.put("last_mod", lastMod.getTime());\r
         return jo;\r
     }\r
 \r
     @Override\r
-    public boolean doInsert(Connection c) {\r
+    public boolean doInsert(Connection conn) {\r
         boolean rv = true;\r
-        PreparedStatement ps = null;\r
-        try {\r
+        try (PreparedStatement ps = conn.prepareStatement(\r
+            "insert into GROUPS(GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) "\r
+                + "values (?, ?, ?, ?, ?, ?)", new String[]{"GROUPID"})) {\r
             if (groupid == -1) {\r
                 // No feed ID assigned yet, so assign the next available one\r
-                setGroupid(next_groupid++);\r
+                setGroupid(nextGroupid++);\r
             }\r
-            // In case we insert a gropup from synchronization\r
-            if (groupid > next_groupid) {\r
-                next_groupid = groupid + 1;\r
+            // In case we insert a group from synchronization\r
+            if (groupid > nextGroupid) {\r
+                nextGroupid = groupid + 1;\r
             }\r
-\r
             // Create the GROUPS row\r
-            String sql = "insert into GROUPS (GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) values (?, ?, ?, ?, ?, ?)";\r
-            ps = c.prepareStatement(sql, new String[]{"GROUPID"});\r
             ps.setInt(1, groupid);\r
             ps.setString(2, authid);\r
             ps.setString(3, name);\r
@@ -276,29 +297,18 @@ public class Group extends Syncable {
             ps.setString(5, classification);\r
             ps.setString(6, members);\r
             ps.execute();\r
-            ps.close();\r
         } catch (SQLException e) {\r
             rv = false;\r
-            intlogger.warn("PROV0005 doInsert: " + e.getMessage(), e);\r
-        } finally {\r
-            try {\r
-                if (ps != null) {\r
-                    ps.close();\r
-                }\r
-            } catch (SQLException e) {\r
-                intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
-            }\r
+            intlogger.error("PROV0005 doInsert: " + e.getMessage(), e);\r
         }\r
         return rv;\r
     }\r
 \r
     @Override\r
-    public boolean doUpdate(Connection c) {\r
+    public boolean doUpdate(Connection conn) {\r
         boolean rv = true;\r
-        PreparedStatement ps = null;\r
-        try {\r
-            String sql = "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? ,  MEMBERS = ? where GROUPID = ?";\r
-            ps = c.prepareStatement(sql);\r
+        try (PreparedStatement ps = conn.prepareStatement(\r
+            "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? ,  MEMBERS = ? where GROUPID = ?")) {\r
             ps.setString(1, authid);\r
             ps.setString(2, name);\r
             ps.setString(3, description);\r
@@ -308,39 +318,20 @@ public class Group extends Syncable {
             ps.executeUpdate();\r
         } catch (SQLException e) {\r
             rv = false;\r
-            intlogger.warn("PROV0006 doUpdate: " + e.getMessage(), e);\r
-        } finally {\r
-            try {\r
-                if (ps != null) {\r
-                    ps.close();\r
-                }\r
-            } catch (SQLException e) {\r
-                intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
-            }\r
+            intlogger.error("PROV0006 doUpdate: " + e.getMessage(), e);\r
         }\r
         return rv;\r
     }\r
 \r
     @Override\r
-    public boolean doDelete(Connection c) {\r
+    public boolean doDelete(Connection conn) {\r
         boolean rv = true;\r
-        PreparedStatement ps = null;\r
-        try {\r
-            String sql = "delete from GROUPS where GROUPID = ?";\r
-            ps = c.prepareStatement(sql);\r
+        try (PreparedStatement ps = conn.prepareStatement("delete from GROUPS where GROUPID = ?")) {\r
             ps.setInt(1, groupid);\r
             ps.execute();\r
         } catch (SQLException e) {\r
             rv = false;\r
-            intlogger.warn("PROV0007 doDelete: " + e.getMessage(), e);\r
-        } finally {\r
-            try {\r
-                if (ps != null) {\r
-                    ps.close();\r
-                }\r
-            } catch (SQLException e) {\r
-                intlogger.error(SQLEXCEPTION + e.getMessage(), e);\r
-            }\r
+            intlogger.error("PROV0007 doDelete: " + e.getMessage(), e);\r
         }\r
         return rv;\r
     }\r
@@ -359,23 +350,19 @@ public class Group extends Syncable {
         if (groupid != os.groupid) {\r
             return false;\r
         }\r
-        if (authid != os.authid) {\r
+        if (!authid.equals(os.authid)) {\r
             return false;\r
         }\r
         if (!name.equals(os.name)) {\r
             return false;\r
         }\r
-        if (description != os.description) {\r
+        if (!description.equals(os.description)) {\r
             return false;\r
         }\r
         if (!classification.equals(os.classification)) {\r
             return false;\r
         }\r
-        if (!members.equals(os.members)) {\r
-            return false;\r
-        }\r
-\r
-        return true;\r
+        return members.equals(os.members);\r
     }\r
 \r
     @Override\r
@@ -385,6 +372,6 @@ public class Group extends Syncable {
 \r
     @Override\r
     public int hashCode() {\r
-        return Objects.hash(groupid, authid, name, description, classification, members, last_mod);\r
+        return Objects.hash(groupid, authid, name, description, classification, members, lastMod);\r
     }\r
 }\r