src/main/java/de/uapcore/lightpit/AbstractLightPITServlet.java

Tue, 19 May 2020 16:55:58 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 19 May 2020 16:55:58 +0200
changeset 67
d15779cf3982
parent 63
51aa5e267c7f
child 70
821c4950b619
permissions
-rw-r--r--

adds request attribute users in edit() handler

7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
3 *
24
8137ec335416 updates copyright header
Mike Becker <universe@uap-core.de>
parents: 22
diff changeset
4 * Copyright 2018 Mike Becker. All rights reserved.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
5 *
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
27 *
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 */
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 package de.uapcore.lightpit;
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
31 import de.uapcore.lightpit.dao.DataAccessObjects;
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
32 import de.uapcore.lightpit.dao.postgres.PGDataAccessObjects;
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
33 import org.slf4j.Logger;
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
34 import org.slf4j.LoggerFactory;
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
35
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36 import javax.servlet.ServletException;
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 import javax.servlet.http.HttpServlet;
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 import javax.servlet.http.HttpServletRequest;
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 import javax.servlet.http.HttpServletResponse;
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
40 import javax.servlet.http.HttpSession;
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
41 import java.io.IOException;
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
42 import java.lang.reflect.Constructor;
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
43 import java.lang.reflect.Method;
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
44 import java.lang.reflect.Modifier;
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
45 import java.sql.Connection;
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
46 import java.sql.SQLException;
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
47 import java.util.*;
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
48 import java.util.function.Function;
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 /**
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 * A special implementation of a HTTPServlet which is focused on implementing
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 * the necessary functionality for {@link LightPITModule}s.
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 */
9
20a9b2bc9063 makes LightPITServlet abstract
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
54 public abstract class AbstractLightPITServlet extends HttpServlet {
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
55
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
56 private static final Logger LOG = LoggerFactory.getLogger(AbstractLightPITServlet.class);
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
57
43
9abf0bf44c7b renames some crappy constants
Mike Becker <universe@uap-core.de>
parents: 42
diff changeset
58 private static final String SITE_JSP = Functions.jspPath("site");
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
59
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
60 /**
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
61 * The EL proxy is necessary, because the EL resolver cannot handle annotation properties.
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
62 */
36
0f4f8f255c32 removes features that are not (and probably will not) used anyway
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
63 private LightPITModule.ELProxy moduleInfo = null;
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
64
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
65 @FunctionalInterface
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
66 protected interface SQLFindFunction<K, T> {
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
67 T apply(K key) throws SQLException;
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
68
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
69 default <V> SQLFindFunction<V, T> compose(Function<? super V, ? extends K> before) throws SQLException {
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
70 Objects.requireNonNull(before);
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
71 return (v) -> this.apply(before.apply(v));
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
72 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
73
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
74 default <V> SQLFindFunction<K, V> andThen(Function<? super T, ? extends V> after) throws SQLException {
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
75 Objects.requireNonNull(after);
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
76 return (t) -> after.apply(this.apply(t));
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
77 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
78
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
79 static <K> Function<K, K> identity() {
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
80 return (t) -> t;
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
81 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
82 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
83
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
84 /**
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
85 * Invocation mapping gathered from the {@link RequestMapping} annotations.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
86 * <p>
18
a94b172c3a93 user friendly error pages for codes 404, 403 and 500
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
87 * Paths in this map must always start with a leading slash, although
a94b172c3a93 user friendly error pages for codes 404, 403 and 500
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
88 * the specification in the annotation must not start with a leading slash.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
89 * <p>
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
90 * The reason for this is the different handling of empty paths in
18
a94b172c3a93 user friendly error pages for codes 404, 403 and 500
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
91 * {@link HttpServletRequest#getPathInfo()}.
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
92 */
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
93 private final Map<HttpMethod, Map<String, Method>> mappings = new HashMap<>();
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
94
45
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
95 private final List<MenuEntry> subMenu = new ArrayList<>();
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
96
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
97 /**
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
98 * Gives implementing modules access to the {@link ModuleManager}.
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
99 *
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
100 * @return the module manager
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
101 */
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
102 protected final ModuleManager getModuleManager() {
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
103 return (ModuleManager) getServletContext().getAttribute(ModuleManager.SC_ATTR_NAME);
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
104 }
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
105
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
106
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
107 /**
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
108 * Creates a set of data access objects for the specified connection.
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
109 *
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
110 * @param connection the SQL connection
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
111 * @return a set of data access objects
17
d1036b776eee adds getter for the database facade to the abstract servlet
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
112 */
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
113 private DataAccessObjects createDataAccessObjects(Connection connection) throws SQLException {
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
114 final var df = (DatabaseFacade) getServletContext().getAttribute(DatabaseFacade.SC_ATTR_NAME);
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
115 if (df.getSQLDialect() == DatabaseFacade.Dialect.Postgres) {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
116 return new PGDataAccessObjects(connection);
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
117 }
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
118 throw new AssertionError("Non-exhaustive if-else - this is a bug.");
17
d1036b776eee adds getter for the database facade to the abstract servlet
Mike Becker <universe@uap-core.de>
parents: 15
diff changeset
119 }
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
120
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
121 private ResponseType invokeMapping(Method method, HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
122 try {
14
2b270c714678 changed logger implementation to log4j2
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
123 LOG.trace("invoke {}#{}", method.getDeclaringClass().getName(), method.getName());
42
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
124 final var paramTypes = method.getParameterTypes();
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
125 final var paramValues = new Object[paramTypes.length];
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
126 for (int i = 0; i < paramTypes.length; i++) {
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
127 if (paramTypes[i].isAssignableFrom(HttpServletRequest.class)) {
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
128 paramValues[i] = req;
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
129 } else if (paramTypes[i].isAssignableFrom(HttpServletResponse.class)) {
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
130 paramValues[i] = resp;
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
131 }
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
132 if (paramTypes[i].isAssignableFrom(DataAccessObjects.class)) {
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
133 paramValues[i] = dao;
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
134 }
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
135 }
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
136 return (ResponseType) method.invoke(this, paramValues);
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
137 } catch (ReflectiveOperationException | ClassCastException ex) {
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
138 LOG.error("invocation of method {} failed: {}", method.getName(), ex.getMessage());
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
139 LOG.debug("Details: ", ex);
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
140 resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
141 return ResponseType.NONE;
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
142 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
143 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
144
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
145 @Override
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
146 public void init() throws ServletException {
36
0f4f8f255c32 removes features that are not (and probably will not) used anyway
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
147 moduleInfo = Optional.ofNullable(this.getClass().getAnnotation(LightPITModule.class))
0f4f8f255c32 removes features that are not (and probably will not) used anyway
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
148 .map(LightPITModule.ELProxy::new).orElse(null);
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
149
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
150 if (moduleInfo != null) {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
151 scanForRequestMappings();
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
152 }
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
153
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
154 LOG.trace("{} initialized", getServletName());
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
155 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
156
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
157 private void scanForRequestMappings() {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
158 try {
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
159 Method[] methods = getClass().getDeclaredMethods();
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
160 for (Method method : methods) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
161 Optional<RequestMapping> mapping = Optional.ofNullable(method.getAnnotation(RequestMapping.class));
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
162 if (mapping.isPresent()) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
163 if (!Modifier.isPublic(method.getModifiers())) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
164 LOG.warn("{} is annotated with {} but is not public",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
165 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
166 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
167 continue;
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
168 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
169 if (Modifier.isAbstract(method.getModifiers())) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
170 LOG.warn("{} is annotated with {} but is abstract",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
171 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
172 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
173 continue;
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
174 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
175 if (!ResponseType.class.isAssignableFrom(method.getReturnType())) {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
176 LOG.warn("{} is annotated with {} but has the wrong return type - 'ResponseType' required",
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
177 method.getName(), RequestMapping.class.getSimpleName()
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
178 );
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
179 continue;
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
180 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
181
42
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
182 boolean paramsInjectible = true;
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
183 for (var param : method.getParameterTypes()) {
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
184 paramsInjectible &= HttpServletRequest.class.isAssignableFrom(param)
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
185 || HttpServletResponse.class.isAssignableFrom(param)
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
186 || DataAccessObjects.class.isAssignableFrom(param);
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
187 }
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
188 if (paramsInjectible) {
58
8d3047f78190 fixes duplicated trailing slash if index path has a menu entry
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
189 String requestPath = "/" + mapping.get().requestPath();
8d3047f78190 fixes duplicated trailing slash if index path has a menu entry
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
190 if (!mapping.get().requestPath().isBlank() && !mapping.get().menuKey().isBlank()) {
8d3047f78190 fixes duplicated trailing slash if index path has a menu entry
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
191 requestPath += "/";
8d3047f78190 fixes duplicated trailing slash if index path has a menu entry
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
192 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
193
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
194 if (mappings
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
195 .computeIfAbsent(mapping.get().method(), k -> new HashMap<>())
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
196 .putIfAbsent(requestPath, method) != null) {
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
197 LOG.warn("{} {} has multiple mappings",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
198 mapping.get().method(),
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
199 mapping.get().requestPath()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
200 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
201 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
202
45
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
203 final var menuKey = mapping.get().menuKey();
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
204 if (!menuKey.isBlank()) {
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
205 subMenu.add(new MenuEntry(
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
206 new ResourceKey(moduleInfo.getBundleBaseName(), menuKey),
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
207 moduleInfo.getModulePath() + requestPath,
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
208 mapping.get().menuSequence()));
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
209 }
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
210
22
5a91fb7067af minor changes to logging output
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
211 LOG.debug("{} {} maps to {}::{}",
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
212 mapping.get().method(),
18
a94b172c3a93 user friendly error pages for codes 404, 403 and 500
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
213 requestPath,
22
5a91fb7067af minor changes to logging output
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
214 getClass().getSimpleName(),
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
215 method.getName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
216 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
217 } else {
42
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
218 LOG.warn("{} is annotated with {} but has the wrong parameters - only HttpServletRequest. HttpServletResponse, and DataAccessObjects are allowed",
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
219 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
220 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
221 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
222 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
223 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
224 } catch (SecurityException ex) {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
225 LOG.error("Scan for request mappings on declared methods failed.", ex);
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
226 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
227 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
228
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
229 @Override
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
230 public void destroy() {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
231 mappings.clear();
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
232 LOG.trace("{} destroyed", getServletName());
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
233 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
234
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
235 /**
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
236 * Sets the name of the dynamic fragment.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
237 * <p>
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
238 * It is sufficient to specify the name without any extension. The extension
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
239 * is added automatically if not specified.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
240 * <p>
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
241 * The fragment must be located in the dynamic fragments folder.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
242 *
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
243 * @param req the servlet request object
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
244 * @param fragmentName the name of the fragment
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
245 * @see Constants#DYN_FRAGMENT_PATH_PREFIX
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
246 */
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
247 protected void setDynamicFragment(HttpServletRequest req, String fragmentName) {
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
248 req.setAttribute(Constants.REQ_ATTR_FRAGMENT, Functions.dynFragmentPath(fragmentName));
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
249 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
250
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
251 /**
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
252 * @param req the servlet request object
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
253 * @param location the location where to redirect
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
254 * @see Constants#REQ_ATTR_REDIRECT_LOCATION
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
255 */
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
256 protected void setRedirectLocation(HttpServletRequest req, String location) {
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
257 if (location.startsWith("./")) {
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
258 location = location.replaceFirst("\\./", Functions.baseHref(req));
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
259 }
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
260 req.setAttribute(Constants.REQ_ATTR_REDIRECT_LOCATION, location);
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
261 }
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
262
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
263 /**
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
264 * Specifies the name of an additional stylesheet used by the module.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
265 * <p>
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
266 * Setting an additional stylesheet is optional, but quite common for HTML
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
267 * output.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
268 * <p>
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
269 * It is sufficient to specify the name without any extension. The extension
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
270 * is added automatically if not specified.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
271 *
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
272 * @param req the servlet request object
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
273 * @param stylesheet the name of the stylesheet
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
274 */
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
275 public void setStylesheet(HttpServletRequest req, String stylesheet) {
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
276 req.setAttribute(Constants.REQ_ATTR_STYLESHEET, Functions.enforceExt(stylesheet, ".css"));
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
277 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
278
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
279 /**
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
280 * Obtains a request parameter of the specified type.
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
281 * The specified type must have a single-argument constructor accepting a string to perform conversion.
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
282 * The constructor of the specified type may throw an exception on conversion failures.
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
283 *
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
284 * @param req the servlet request object
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
285 * @param clazz the class object of the expected type
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
286 * @param name the name of the parameter
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
287 * @param <T> the expected type
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
288 * @return the parameter value or an empty optional, if no parameter with the specified name was found
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
289 */
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
290 protected<T> Optional<T> getParameter(HttpServletRequest req, Class<T> clazz, String name) {
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
291 final String paramValue = req.getParameter(name);
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
292 if (paramValue == null) return Optional.empty();
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
293 if (clazz.equals(String.class)) return Optional.of((T)paramValue);
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
294 try {
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
295 final Constructor<T> ctor = clazz.getConstructor(String.class);
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
296 return Optional.of(ctor.newInstance(paramValue));
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
297 } catch (ReflectiveOperationException e) {
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
298 throw new RuntimeException(e);
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
299 }
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
300
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
301 }
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
302
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
303 /**
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
304 * Tries to look up an entity with a key obtained from a request parameter.
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
305 *
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
306 * @param req the servlet request object
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
307 * @param clazz the class representing the type of the request parameter
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
308 * @param name the name of the request parameter
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
309 * @param find the find function (typically a DAO function)
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
310 * @param <T> the type of the request parameter
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
311 * @param <R> the type of the looked up entity
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
312 * @return the retrieved entity or an empty optional if there is no such entity or the request parameter was missing
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
313 * @throws SQLException if the find function throws an exception
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
314 */
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
315 protected<T,R> Optional<R> findByParameter(HttpServletRequest req, Class<T> clazz, String name, SQLFindFunction<? super T, ? extends R> find) throws SQLException {
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
316 final var param = getParameter(req, clazz, name);
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
317 if (param.isPresent()) {
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
318 return Optional.ofNullable(find.apply(param.get()));
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
319 } else {
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
320 return Optional.empty();
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
321 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
322 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
323
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
324 private void forwardToFullView(HttpServletRequest req, HttpServletResponse resp)
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
325 throws IOException, ServletException {
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
326
36
0f4f8f255c32 removes features that are not (and probably will not) used anyway
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
327 req.setAttribute(Constants.REQ_ATTR_MENU, getModuleManager().getMainMenu());
45
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
328 req.setAttribute(Constants.REQ_ATTR_SUB_MENU, subMenu);
43
9abf0bf44c7b renames some crappy constants
Mike Becker <universe@uap-core.de>
parents: 42
diff changeset
329 req.getRequestDispatcher(SITE_JSP).forward(req, resp);
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
330 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
331
45
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
332 private String sanitizeRequestPath(HttpServletRequest req) {
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
333 return Optional.ofNullable(req.getPathInfo()).orElse("/");
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
334 }
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
335
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
336 private Optional<Method> findMapping(HttpMethod method, HttpServletRequest req) {
45
cc7f082c5ef3 simplifies menu generation, adds submenus and removes VersionsModule (versions will be part of the ProjectsModule)
Mike Becker <universe@uap-core.de>
parents: 43
diff changeset
337 return Optional.ofNullable(mappings.get(method)).map(rm -> rm.get(sanitizeRequestPath(req)));
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
338 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
339
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
340 private void forwardAsSpecified(ResponseType type, HttpServletRequest req, HttpServletResponse resp)
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
341 throws ServletException, IOException {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
342 switch (type) {
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
343 case NONE:
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
344 return;
43
9abf0bf44c7b renames some crappy constants
Mike Becker <universe@uap-core.de>
parents: 42
diff changeset
345 case HTML:
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
346 forwardToFullView(req, resp);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
347 return;
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
348 // TODO: implement remaining response types
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
349 default:
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
350 throw new AssertionError("ResponseType switch is not exhaustive - this is a bug!");
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
351 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
352 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
353
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
354 private void doProcess(HttpMethod method, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
27
1f2a96efa69f removes caching of main menu
Mike Becker <universe@uap-core.de>
parents: 24
diff changeset
355
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
356 // choose the requested language as session language (if available) or fall back to english, otherwise
20
bd1a76c91d5b module synchronization with database
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
357 HttpSession session = req.getSession();
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
358 if (session.getAttribute(Constants.SESSION_ATTR_LANGUAGE) == null) {
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
359 Optional<List<String>> availableLanguages = Functions.availableLanguages(getServletContext()).map(Arrays::asList);
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
360 Optional<Locale> reqLocale = Optional.of(req.getLocale());
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
361 Locale sessionLocale = reqLocale.filter((rl) -> availableLanguages.map((al) -> al.contains(rl.getLanguage())).orElse(false)).orElse(Locale.ENGLISH);
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
362 session.setAttribute(Constants.SESSION_ATTR_LANGUAGE, sessionLocale);
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
363 LOG.debug("Setting language for new session {}: {}", session.getId(), sessionLocale.getDisplayLanguage());
14
2b270c714678 changed logger implementation to log4j2
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
364 } else {
15
bb594abac796 language selector completed
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
365 Locale sessionLocale = (Locale) session.getAttribute(Constants.SESSION_ATTR_LANGUAGE);
bb594abac796 language selector completed
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
366 resp.setLocale(sessionLocale);
bb594abac796 language selector completed
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
367 LOG.trace("Continuing session {} with language {}", session.getId(), sessionLocale);
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
368 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
369
21
b213fef2539e adds first part of a module manager UI
Mike Becker <universe@uap-core.de>
parents: 20
diff changeset
370 // set some internal request attributes
53
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
371 final String fullPath = Functions.fullPath(req);
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
372 req.setAttribute(Constants.REQ_ATTR_BASE_HREF, Functions.baseHref(req));
53
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
373 req.setAttribute(Constants.REQ_ATTR_PATH, fullPath);
36
0f4f8f255c32 removes features that are not (and probably will not) used anyway
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
374 Optional.ofNullable(moduleInfo).ifPresent((proxy) -> req.setAttribute(Constants.REQ_ATTR_MODULE_INFO, proxy));
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
375
53
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
376 // if this is an error path, bypass the normal flow
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
377 if (fullPath.startsWith("/error/")) {
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
378 final var mapping = findMapping(method, req);
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
379 if (mapping.isPresent()) {
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
380 forwardAsSpecified(invokeMapping(mapping.get(), req, resp, null), req, resp);
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
381 }
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
382 return;
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
383 }
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
384
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
385 // obtain a connection and create the data access objects
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
386 final var db = (DatabaseFacade) req.getServletContext().getAttribute(DatabaseFacade.SC_ATTR_NAME);
53
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
387 final var ds = db.getDataSource();
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
388 if (ds == null) {
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
389 resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "JNDI DataSource lookup failed. See log for details.");
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
390 return;
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
391 }
6a8498291606 fixes bug where displaying an error page for missing data source would also require that data source (error pages don't try to get database connections now)
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
392 try (final var connection = ds.getConnection()) {
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
393 final var dao = createDataAccessObjects(connection);
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
394 try {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
395 connection.setAutoCommit(false);
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
396 // call the handler, if available, or send an HTTP 404 error
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
397 final var mapping = findMapping(method, req);
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
398 if (mapping.isPresent()) {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
399 forwardAsSpecified(invokeMapping(mapping.get(), req, resp, dao), req, resp);
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
400 } else {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
401 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
402 }
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
403 connection.commit();
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
404 } catch (SQLException ex) {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
405 LOG.warn("Database transaction failed (Code {}): {}", ex.getErrorCode(), ex.getMessage());
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
406 LOG.debug("Details: ", ex);
54
77e01cda5a40 adds missing spaces in error messages
Mike Becker <universe@uap-core.de>
parents: 53
diff changeset
407 resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Unhandled Transaction Error - Code: " + ex.getErrorCode());
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
408 connection.rollback();
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
409 }
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
410 } catch (SQLException ex) {
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
411 LOG.error("Severe Database Exception (Code {}): {}", ex.getErrorCode(), ex.getMessage());
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
412 LOG.debug("Details: ", ex);
54
77e01cda5a40 adds missing spaces in error messages
Mike Becker <universe@uap-core.de>
parents: 53
diff changeset
413 resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database Error - Code: " + ex.getErrorCode());
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
414 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
415 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
416
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
417 @Override
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
418 protected final void doGet(HttpServletRequest req, HttpServletResponse resp)
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
419 throws ServletException, IOException {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
420 doProcess(HttpMethod.GET, req, resp);
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
421 }
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
422
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
423 @Override
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
424 protected final void doPost(HttpServletRequest req, HttpServletResponse resp)
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
425 throws ServletException, IOException {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
426 doProcess(HttpMethod.POST, req, resp);
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
427 }
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
428 }

mercurial