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

changeset 128
947d0f6a6a83
parent 86
0a658e53177c
child 138
e2aa673dd473
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/uapcore/lightpit/dao/postgres/PGComponentDao.java	Thu Oct 15 13:31:52 2020 +0200
@@ -0,0 +1,139 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2018 Mike Becker. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package de.uapcore.lightpit.dao.postgres;
+
+import de.uapcore.lightpit.dao.ComponentDao;
+import de.uapcore.lightpit.dao.Functions;
+import de.uapcore.lightpit.entities.Component;
+import de.uapcore.lightpit.entities.Project;
+import de.uapcore.lightpit.entities.User;
+import de.uapcore.lightpit.types.WebColor;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public final class PGComponentDao implements ComponentDao {
+
+    private final PreparedStatement insert, update, list, find;
+
+    public PGComponentDao(Connection connection) throws SQLException {
+        list = connection.prepareStatement(
+                "select id, name, color, ordinal, description, " +
+                        "userid, username, givenname, lastname, mail " +
+                        "from lpit_component " +
+                        "left join lpit_user on lead = userid " +
+                        "where project = ? " +
+                        "order by ordinal desc, lower(name) desc");
+
+        find = connection.prepareStatement(
+                "select id, name, color, ordinal, description, " +
+                        "userid, username, givenname, lastname, mail " +
+                        "from lpit_component " +
+                        "left join lpit_user on lead = userid " +
+                        "where id = ? ");
+
+        insert = connection.prepareStatement(
+                "insert into lpit_component (project, name, color, ordinal, description, lead) values (?, ?, ?, ?, ?, ?)"
+        );
+
+        update = connection.prepareStatement(
+                "update lpit_component set name = ?, color = ?, ordinal = ?, description = ?, lead = ? where id = ?"
+        );
+    }
+
+    private static Component mapColumns(ResultSet result) throws SQLException {
+        final var component = new Component(result.getInt("id"));
+        component.setName(result.getString("name"));
+        try {
+            component.setColor(new WebColor(result.getString("color")));
+        } catch (IllegalArgumentException ex) {
+            // if someone tempered with the database we default the color to black
+            component.setColor(new WebColor("000000"));
+        }
+        component.setOrdinal(result.getInt("ordinal"));
+        component.setDescription(result.getString("description"));
+        component.setLead(PGUserDao.mapColumns(result));
+        return component;
+    }
+
+    @Override
+    public void save(Component instance, Project project) throws SQLException {
+        Objects.requireNonNull(instance.getName());
+        insert.setInt(1, project.getId());
+        insert.setString(2, instance.getName());
+        insert.setString(3, instance.getColor().getHex());
+        insert.setInt(4, instance.getOrdinal());
+        Functions.setStringOrNull(insert, 5, instance.getDescription());
+        Functions.setForeignKeyOrNull(insert, 6, instance.getLead(), User::getId);
+        insert.executeUpdate();
+    }
+
+    @Override
+    public boolean update(Component instance) throws SQLException {
+        if (instance.getId() < 0) return false;
+        Objects.requireNonNull(instance.getName());
+        Objects.requireNonNull(instance.getColor());
+        update.setString(1, instance.getName());
+        update.setString(2, instance.getColor().getHex());
+        update.setInt(3, instance.getOrdinal());
+        Functions.setStringOrNull(update, 4, instance.getDescription());
+        Functions.setForeignKeyOrNull(update, 5, instance.getLead(), User::getId);
+        update.setInt(6, instance.getId());
+        return update.executeUpdate() > 0;
+    }
+
+    @Override
+    public List<Component> list(Project project) throws SQLException {
+        list.setInt(1, project.getId());
+        List<Component> components = new ArrayList<>();
+        try (var result = list.executeQuery()) {
+            while (result.next()) {
+                components.add(mapColumns(result));
+            }
+        }
+        return components;
+    }
+
+    @Override
+    public Component find(int id) throws SQLException {
+        find.setInt(1, id);
+        try (var result = find.executeQuery()) {
+            if (result.next()) {
+                return mapColumns(result);
+            } else {
+                return null;
+            }
+        }
+    }
+}

mercurial