1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/main/java/de/uapcore/lightpit/entities/ModuleDao.java Sat May 09 14:26:31 2020 +0200 1.3 @@ -0,0 +1,141 @@ 1.4 +/* 1.5 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 1.6 + * 1.7 + * Copyright 2018 Mike Becker. All rights reserved. 1.8 + * 1.9 + * Redistribution and use in source and binary forms, with or without 1.10 + * modification, are permitted provided that the following conditions are met: 1.11 + * 1.12 + * 1. Redistributions of source code must retain the above copyright 1.13 + * notice, this list of conditions and the following disclaimer. 1.14 + * 1.15 + * 2. Redistributions in binary form must reproduce the above copyright 1.16 + * notice, this list of conditions and the following disclaimer in the 1.17 + * documentation and/or other materials provided with the distribution. 1.18 + * 1.19 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.20 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.21 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1.22 + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 1.23 + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1.24 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1.25 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1.26 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1.27 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1.28 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1.29 + * POSSIBILITY OF SUCH DAMAGE. 1.30 + * 1.31 + */ 1.32 +package de.uapcore.lightpit.entities; 1.33 + 1.34 +import de.uapcore.lightpit.LightPITModule; 1.35 +import java.sql.Connection; 1.36 +import java.sql.PreparedStatement; 1.37 +import java.sql.ResultSet; 1.38 +import java.sql.SQLException; 1.39 +import java.sql.Statement; 1.40 +import java.util.ArrayList; 1.41 +import java.util.List; 1.42 +import java.util.Map; 1.43 +import java.util.Set; 1.44 + 1.45 +public abstract class ModuleDao { 1.46 + 1.47 + /** 1.48 + * Maps database columns to POJO fields. 1.49 + * @param result the database result set 1.50 + * @param mod the POJO 1.51 + * @throws SQLException 1.52 + */ 1.53 + protected void mapColumns(ResultSet result, Module mod) throws SQLException { 1.54 + mod.setModID(result.getInt("modid")); 1.55 + mod.setClassname(result.getString("classname")); 1.56 + mod.setVisible(result.getBoolean("visible")); 1.57 + } 1.58 + 1.59 + 1.60 + /** 1.61 + * Must return a prepared statement for a single object query with the specified properties. 1.62 + * 1.63 + * <ul> 1.64 + * <li>Parameter 1: classname</li> 1.65 + * <li>Result field 1: visible</li> 1.66 + * </ul> 1.67 + * 1.68 + * @param conn the connection to use 1.69 + * @return the prepared statement 1.70 + * @throws SQLException 1.71 + */ 1.72 + protected PreparedStatement moduleCheckStatement(Connection conn) throws SQLException { 1.73 + return conn.prepareStatement("SELECT visible FROM lpitcore_module WHERE classname = ?"); 1.74 + } 1.75 + 1.76 + /** 1.77 + * Must return a prepared statement for insertion with the specified properties. 1.78 + * 1.79 + * <ul> 1.80 + * <li>Parameter 1: classname</li> 1.81 + * <li>Parameter 2: visible</li> 1.82 + * </ul> 1.83 + * 1.84 + * @param conn the connection to use 1.85 + * @return the prepared statement 1.86 + * @throws SQLException 1.87 + */ 1.88 + protected PreparedStatement moduleInsertStatement(Connection conn) throws SQLException { 1.89 + return conn.prepareStatement("INSERT INTO lpitcore_module (classname, visible) VALUES (?, ?)"); 1.90 + } 1.91 + 1.92 + /** 1.93 + * Synchronizes a set of registered module classes with the database. 1.94 + * 1.95 + * Inserts module classes which are not known to the database and sets them to be visible by default. 1.96 + * Module classes known to the database, which are not in the given set, are ignored. 1.97 + * 1.98 + * @param conn the connection to use 1.99 + * @param moduleSet the module set to synchronize 1.100 + * @throws SQLException 1.101 + */ 1.102 + public final void syncRegisteredModuleClasses(Connection conn, Set<Map.Entry<String, LightPITModule>> moduleSet) throws SQLException { 1.103 + 1.104 + PreparedStatement 1.105 + check = moduleCheckStatement(conn), 1.106 + insert = moduleInsertStatement(conn); 1.107 + insert.setBoolean(2, true); 1.108 + // update/delete not required, we do this in the module management UI 1.109 + 1.110 + for (Map.Entry<String, LightPITModule> modEntry : moduleSet) { 1.111 + if (modEntry.getValue().systemModule()) continue; 1.112 + 1.113 + check.setString(1, modEntry.getKey()); 1.114 + try (ResultSet r = check.executeQuery()) { 1.115 + if (!r.next()) { 1.116 + insert.setString(1, modEntry.getKey()); 1.117 + insert.executeUpdate(); 1.118 + } 1.119 + } 1.120 + } 1.121 + } 1.122 + 1.123 + /** 1.124 + * Returns a list of all modules known by the database. 1.125 + * 1.126 + * Keep in mind, that system modules are never known to the database. 1.127 + * 1.128 + * @param conn the connection to use 1.129 + * @return a list of all modules known by the database 1.130 + * @throws SQLException 1.131 + */ 1.132 + public List<Module> listAll(Connection conn) throws SQLException { 1.133 + List<Module> list = new ArrayList<>(); 1.134 + try (Statement stmt = conn.createStatement(); 1.135 + ResultSet result = stmt.executeQuery("SELECT * FROM lpitcore_module")) { 1.136 + while (result.next()) { 1.137 + final Module mod = new Module(); 1.138 + mapColumns(result, mod); 1.139 + list.add(mod); 1.140 + } 1.141 + } 1.142 + return list; 1.143 + } 1.144 +}