diff -r bd1a76c91d5b -r b213fef2539e src/java/de/uapcore/lightpit/entities/ModuleDao.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java/de/uapcore/lightpit/entities/ModuleDao.java Sun Apr 01 18:16:47 2018 +0200
@@ -0,0 +1,147 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2017 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.entities;
+
+import de.uapcore.lightpit.LightPITModule;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public abstract class ModuleDao {
+
+ /**
+ * Must return a prepared statement for a single object query with the specified properties.
+ *
+ *
+ * - Parameter 1: classname
+ * - Result field 1: visible
+ *
+ *
+ * @param conn the connection to use
+ * @return the prepared statement
+ * @throws SQLException
+ */
+ protected PreparedStatement moduleCheckStatement(Connection conn) throws SQLException {
+ return conn.prepareStatement("SELECT visible FROM lpitcore_module WHERE classname = ?");
+ }
+
+ /**
+ * Must return a prepared statement for insertion with the specified properties.
+ *
+ *
+ * - Parameter 1: classname
+ * - Parameter 2: visible
+ *
+ *
+ * @param conn the connection to use
+ * @return the prepared statement
+ * @throws SQLException
+ */
+ protected PreparedStatement moduleInsertStatement(Connection conn) throws SQLException {
+ return conn.prepareStatement("INSERT INTO lpitcore_module (classname, visible) VALUES (?, ?)");
+ }
+
+ /**
+ * Synchronizes a set of registered module classes with the database and gives a list of visible modules in return.
+ *
+ * Inserts module classes which are not known to the database and sets them to be visible by default.
+ * Module classes known to the database, which are not in the given set, are ignored.
+ *
+ * @param conn the connection to use
+ * @param moduleSet the module set to synchronize
+ * @return a list of elements from the given set, which should be visible in the menu
+ * @throws SQLException
+ */
+ public final List>
+ syncRegisteredModuleClasses(Connection conn, Set> moduleSet) throws SQLException {
+
+ PreparedStatement
+ check = moduleCheckStatement(conn),
+ insert = moduleInsertStatement(conn);
+ insert.setBoolean(2, true);
+ // update/delete not required, we do this in the module management UI
+
+ final List> visibleModules = new ArrayList<>();
+
+ for (Map.Entry mod : moduleSet) {
+ if (mod.getValue().systemModule()) continue;
+
+ check.setString(1, mod.getKey());
+ try (ResultSet r = check.executeQuery()) {
+ final boolean visible;
+ if (r.next()) {
+ visible = r.getBoolean(1);
+ } else {
+ insert.setString(1, mod.getKey());
+ insert.executeUpdate();
+ visible = !mod.getValue().menuKey().isEmpty();
+ }
+ if (visible) {
+ visibleModules.add(new AbstractMap.SimpleEntry<>(
+ mod.getKey(),
+ mod.getValue()
+ ));
+ }
+ }
+ }
+ return visibleModules;
+ }
+
+ /**
+ * Returns a list of all modules known by the database.
+ *
+ * Keep in mind, that system modules are never known to the database.
+ *
+ * @param conn the connection to use
+ * @return a list of all modules known by the database
+ * @throws SQLException
+ */
+ public List listAll(Connection conn) throws SQLException {
+ List list = new ArrayList<>();
+ try (
+ Statement stmt = conn.createStatement();
+ ResultSet result = stmt.executeQuery("SELECT * FROM lpitcore_module")) {
+ while (result.next()) {
+ final Module mod = new Module();
+ mod.setModID(result.getInt("modid"));
+ mod.setClassname(result.getString("classname"));
+ mod.setVisible(result.getBoolean("visible"));
+ list.add(mod);
+ }
+ }
+ return list;
+ }
+}