src/main/java/de/uapcore/lightpit/dao/postgres/PGIssueDao.java

Sat, 30 May 2020 18:05:06 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 30 May 2020 18:05:06 +0200
changeset 83
24a3596b8f98
parent 75
33b6843fdf8a
child 86
0a658e53177c
permissions
-rw-r--r--

adds version selection in issue editor

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2018 Mike Becker. All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *   1. Redistributions of source code must retain the above copyright
    10  *      notice, this list of conditions and the following disclaimer.
    11  *
    12  *   2. Redistributions in binary form must reproduce the above copyright
    13  *      notice, this list of conditions and the following disclaimer in the
    14  *      documentation and/or other materials provided with the distribution.
    15  *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    26  * POSSIBILITY OF SUCH DAMAGE.
    27  *
    28  */
    29 package de.uapcore.lightpit.dao.postgres;
    31 import de.uapcore.lightpit.dao.IssueDao;
    32 import de.uapcore.lightpit.entities.*;
    34 import java.sql.Connection;
    35 import java.sql.PreparedStatement;
    36 import java.sql.ResultSet;
    37 import java.sql.SQLException;
    38 import java.util.ArrayList;
    39 import java.util.List;
    40 import java.util.Objects;
    42 import static de.uapcore.lightpit.dao.Functions.*;
    44 public final class PGIssueDao implements IssueDao {
    46     private final PreparedStatement insert, update, list, find;
    47     private final PreparedStatement affectedVersions, scheduledVersions, resolvedVersions;
    48     private final PreparedStatement clearAffected, clearScheduled, clearResolved;
    49     private final PreparedStatement insertAffected, insertScheduled, insertResolved;
    51     public PGIssueDao(Connection connection) throws SQLException {
    52         list = connection.prepareStatement(
    53                 "select issueid, project, p.name as projectname, status, category, subject, i.description, " +
    54                         "userid, username, givenname, lastname, mail, " +
    55                         "created, updated, eta " +
    56                         "from lpit_issue i " +
    57                         "left join lpit_project p on project = projectid " +
    58                         "left join lpit_user on userid = assignee " +
    59                         "where project = ? ");
    61         find = connection.prepareStatement(
    62                 "select issueid, project, p.name as projectname, status, category, subject, i.description, " +
    63                         "userid, username, givenname, lastname, mail, " +
    64                         "created, updated, eta " +
    65                         "from lpit_issue i " +
    66                         "left join lpit_project p on project = projectid " +
    67                         "left join lpit_user on userid = assignee " +
    68                         "where issueid = ? ");
    70         insert = connection.prepareStatement(
    71                 "insert into lpit_issue (project, status, category, subject, description, assignee, eta) " +
    72                         "values (?, ?::issue_status, ?::issue_category, ?, ?, ?, ?) returning issueid"
    73         );
    74         update = connection.prepareStatement(
    75                 "update lpit_issue set updated = now(), status = ?::issue_status, category = ?::issue_category, " +
    76                         "subject = ?, description = ?, assignee = ?, eta = ? where issueid = ?"
    77         );
    79         affectedVersions = connection.prepareStatement(
    80                 "select versionid, name, status, ordinal " +
    81                         "from lpit_version join lpit_issue_affected_version using (versionid) " +
    82                         "where issueid = ? " +
    83                         "order by ordinal, name"
    84         );
    85         clearAffected = connection.prepareStatement("delete from lpit_issue_affected_version where issueid = ?");
    86         insertAffected = connection.prepareStatement("insert into lpit_issue_affected_version (issueid, versionid) values (?,?)");
    88         scheduledVersions = connection.prepareStatement(
    89                 "select versionid, name, status, ordinal " +
    90                         "from lpit_version join lpit_issue_scheduled_version using (versionid) " +
    91                         "where issueid = ? " +
    92                         "order by ordinal, name"
    93         );
    94         clearScheduled = connection.prepareStatement("delete from lpit_issue_scheduled_version where issueid = ?");
    95         insertScheduled = connection.prepareStatement("insert into lpit_issue_scheduled_version (issueid, versionid) values (?,?)");
    97         resolvedVersions = connection.prepareStatement(
    98                 "select versionid, name, status, ordinal " +
    99                         "from lpit_version v join lpit_issue_resolved_version using (versionid) " +
   100                         "where issueid = ? " +
   101                         "order by ordinal, name"
   102         );
   103         clearResolved = connection.prepareStatement("delete from lpit_issue_resolved_version where issueid = ?");
   104         insertResolved = connection.prepareStatement("insert into lpit_issue_resolved_version (issueid, versionid) values (?,?)");
   105     }
   107     private User obtainAssignee(ResultSet result) throws SQLException {
   108         final int id = result.getInt("userid");
   109         if (id != 0) {
   110             final var user = new User(id);
   111             user.setUsername(result.getString("username"));
   112             user.setGivenname(result.getString("givenname"));
   113             user.setLastname(result.getString("lastname"));
   114             user.setMail(result.getString("mail"));
   115             return user;
   116         } else {
   117             return null;
   118         }
   119     }
   121     private Issue mapColumns(ResultSet result) throws SQLException {
   122         final var project = new Project(result.getInt("project"));
   123         project.setName(result.getString("projectname"));
   124         final var issue = new Issue(result.getInt("issueid"), project);
   125         issue.setStatus(IssueStatus.valueOf(result.getString("status")));
   126         issue.setCategory(IssueCategory.valueOf(result.getString("category")));
   127         issue.setSubject(result.getString("subject"));
   128         issue.setDescription(result.getString("description"));
   129         issue.setAssignee(obtainAssignee(result));
   130         issue.setCreated(result.getTimestamp("created"));
   131         issue.setUpdated(result.getTimestamp("updated"));
   132         issue.setEta(result.getDate("eta"));
   133         return issue;
   134     }
   136     private Version mapVersion(ResultSet result, Project project) throws SQLException {
   137         final var version = new Version(result.getInt("versionid"), project);
   138         version.setName(result.getString("name"));
   139         version.setOrdinal(result.getInt("ordinal"));
   140         version.setStatus(VersionStatus.valueOf(result.getString("status")));
   141         return version;
   142     }
   144     private void updateVersionLists(Issue instance) throws SQLException {
   145         clearAffected.setInt(1, instance.getId());
   146         clearScheduled.setInt(1, instance.getId());
   147         clearResolved.setInt(1, instance.getId());
   148         insertAffected.setInt(1, instance.getId());
   149         insertScheduled.setInt(1, instance.getId());
   150         insertResolved.setInt(1, instance.getId());
   151         clearAffected.executeUpdate();
   152         clearScheduled.executeUpdate();
   153         clearResolved.executeUpdate();
   154         for (Version v : instance.getAffectedVersions()) {
   155             insertAffected.setInt(2, v.getId());
   156             insertAffected.executeUpdate();
   157         }
   158         for (Version v : instance.getScheduledVersions()) {
   159             insertScheduled.setInt(2, v.getId());
   160             insertScheduled.executeUpdate();
   161         }
   162         for (Version v : instance.getResolvedVersions()) {
   163             insertResolved.setInt(2, v.getId());
   164             insertResolved.executeUpdate();
   165         }
   166     }
   168     @Override
   169     public void save(Issue instance) throws SQLException {
   170         Objects.requireNonNull(instance.getSubject());
   171         Objects.requireNonNull(instance.getProject());
   172         insert.setInt(1, instance.getProject().getId());
   173         insert.setString(2, instance.getStatus().name());
   174         insert.setString(3, instance.getCategory().name());
   175         insert.setString(4, instance.getSubject());
   176         setStringOrNull(insert, 5, instance.getDescription());
   177         setForeignKeyOrNull(insert, 6, instance.getAssignee(), User::getId);
   178         setDateOrNull(insert, 7, instance.getEta());
   179         // insert and retrieve the ID
   180         final var rs = insert.executeQuery();
   181         rs.next();
   182         instance.setId(rs.getInt(1));
   183         updateVersionLists(instance);
   184     }
   186     @Override
   187     public boolean update(Issue instance) throws SQLException {
   188         if (instance.getId() < 0) return false;
   189         Objects.requireNonNull(instance.getSubject());
   190         update.setString(1, instance.getStatus().name());
   191         update.setString(2, instance.getCategory().name());
   192         update.setString(3, instance.getSubject());
   193         setStringOrNull(update, 4, instance.getDescription());
   194         setForeignKeyOrNull(update, 5, instance.getAssignee(), User::getId);
   195         setDateOrNull(update, 6, instance.getEta());
   196         update.setInt(7, instance.getId());
   197         boolean success = update.executeUpdate() > 0;
   198         if (success) {
   199             updateVersionLists(instance);
   200             return true;
   201         } else {
   202             return false;
   203         }
   204     }
   206     @Override
   207     public List<Issue> list(Project project) throws SQLException {
   208         list.setInt(1, project.getId());
   209         List<Issue> issues = new ArrayList<>();
   210         try (var result = list.executeQuery()) {
   211             while (result.next()) {
   212                 issues.add(mapColumns(result));
   213             }
   214         }
   215         return issues;
   216     }
   218     @Override
   219     public Issue find(int id) throws SQLException {
   220         find.setInt(1, id);
   221         try (var result = find.executeQuery()) {
   222             if (result.next()) {
   223                 return mapColumns(result);
   224             } else {
   225                 return null;
   226             }
   227         }
   228     }
   230     private List<Version> listVersions(PreparedStatement stmt, Issue issue) throws SQLException {
   231         stmt.setInt(1, issue.getId());
   232         List<Version> versions = new ArrayList<>();
   233         try (var result = stmt.executeQuery()) {
   234             while (result.next()) {
   235                 versions.add(mapVersion(result, issue.getProject()));
   236             }
   237         }
   238         return versions;
   239     }
   241     @Override
   242     public void joinVersionInformation(Issue issue) throws SQLException {
   243         Objects.requireNonNull(issue.getProject());
   244         issue.setAffectedVersions(listVersions(affectedVersions, issue));
   245         issue.setScheduledVersions(listVersions(scheduledVersions, issue));
   246         issue.setResolvedVersions(listVersions(resolvedVersions, issue));
   247     }
   248 }

mercurial