package sfBugs;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.annotation.WillClose;

import edu.umd.cs.findbugs.annotations.Confidence;
import edu.umd.cs.findbugs.annotations.DesireWarning;
import edu.umd.cs.findbugs.annotations.ExpectWarning;
import edu.umd.cs.findbugs.annotations.NoWarning;

public class Bug3415313 {

    public void original(Connection sesscon) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            StringBuffer sql = new StringBuffer();
            sql.append("SELECT groupcounter,");
            sql.append(" grouppoolcode,");
            sql.append(" groupdescription");
            sql.append(" FROM DataGroup");
            sql.append(" ORDER BY groupcounter");
            ps = sesscon.prepareStatement(sql.toString());
            int col = 1;
            rs = ps.executeQuery();
            while (rs.next()) {
                // get the data
            }
        } finally {
            WorkflowUtils.closeResultSet(rs);
            WorkflowUtils.closeStatement(ps);
        }
    }

    @NoWarning("OBL_UNSATISFIED_OBLIGATION")
    public void fp1(Connection sesscon) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = sesscon.prepareStatement("query");
            try {
            rs = ps.executeQuery();
            while (rs.next()) {
                // get the data
            }
            } finally {
                WorkflowUtils.closeResultSet(rs);
            }
        } finally {
            WorkflowUtils.closeStatement(ps);
        }
    }


    @NoWarning("OBL_UNSATISFIED_OBLIGATION")
    public void fp1(PreparedStatement ps) throws SQLException {
        ResultSet rs = null;
        try {
            rs = ps.executeQuery();
            while (rs.next()) {
                // get the data
            }
        } finally {
            WorkflowUtils.closeResultSet(rs);
        }
    }



    @ExpectWarning("OBL_UNSATISFIED_OBLIGATION")
    public void tp(Connection sesscon) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;

        StringBuffer sql = new StringBuffer();
        sql.append("SELECT groupcounter,");
        sql.append(" grouppoolcode,");
        sql.append(" groupdescription");
        sql.append(" FROM DataGroup");
        sql.append(" ORDER BY groupcounter");
        ps = sesscon.prepareStatement(sql.toString());
        int col = 1;
        rs = ps.executeQuery();
        while (rs.next()) {
            // get the data
        }

    }

    @DesireWarning(value="OBL_UNSATISFIED_OBLIGATION", confidence=Confidence.LOW)
    public void maybe(Connection sesscon) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = sesscon.prepareStatement("SELECT groupcounter FROM DataGroup");
            rs = ps.executeQuery();
            try {
                while (rs.next()) {
                    // get the data
                }
            } finally {
                WorkflowUtils.bar(rs);
            }
        } finally {
            System.out.println("yo");
            WorkflowUtils.baz(ps);
        }
    }

    @DesireWarning(value = "OBL_UNSATISFIED_OBLIGATION", confidence = Confidence.MEDIUM)
    public void tp2(Connection sesscon) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = sesscon.prepareStatement("SELECT groupcounter FROM DataGroup");
            try {
                rs = ps.executeQuery();
                while (rs.next()) {
                    // get the data
                }
            } finally {
                WorkflowUtils.bar();
            }
        } finally {
            WorkflowUtils.baz();
        }
    }




    static class WorkflowUtils {
        private static void baz(PreparedStatement ps) {
        }

        public static void bar(ResultSet rs) {
        }

        private static void baz() {
        }

        public static void bar() {
        }

        public static void closeStatement(@WillClose PreparedStatement ps) {
            try {
                if (ps != null)
                    ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        private static void closeResultSet(ResultSet rs) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}