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

Thu, 22 Oct 2020 13:03:26 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 22 Oct 2020 13:03:26 +0200
changeset 138
e2aa673dd473
parent 131
67df332e3146
child 145
6d2d69fd1c12
permissions
-rw-r--r--

adds custom node names - fixes #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
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;
83
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
42 import java.lang.reflect.*;
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
43 import java.sql.Connection;
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
44 import java.sql.SQLException;
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
45 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
46 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
47
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 /**
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 * A special implementation of a HTTPServlet which is focused on implementing
79
f64255a88d66 bloat removal 3/3 - LightPITModule annotation and ModuleManager
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
50 * the necessary functionality for LightPIT pages.
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 */
9
20a9b2bc9063 makes LightPITServlet abstract
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
52 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
53
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
54 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
55
43
9abf0bf44c7b renames some crappy constants
Mike Becker <universe@uap-core.de>
parents: 42
diff changeset
56 private static final String SITE_JSP = Functions.jspPath("site");
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
57
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
58
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
59 @FunctionalInterface
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
60 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
61 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
62
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
63 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
64 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
65 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
66 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
67
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
68 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
69 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
70 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
71 }
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 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
74 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
75 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
76 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
77
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
78 /**
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
79 * 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
80 * <p>
18
a94b172c3a93 user friendly error pages for codes 404, 403 and 500
Mike Becker <universe@uap-core.de>
parents: 17
diff changeset
81 * 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
82 * 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
83 * <p>
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
84 * 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
85 * {@link HttpServletRequest#getPathInfo()}.
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
86 */
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
87 private final Map<HttpMethod, Map<PathPattern, Method>> mappings = new HashMap<>();
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
88
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
89 /**
78
bb4c52bf3439 bloat removal 2/3 - moduleInfo
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
90 * Returns the name of the resource bundle associated with this servlet.
86
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
91 *
78
bb4c52bf3439 bloat removal 2/3 - moduleInfo
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
92 * @return the resource bundle base name
bb4c52bf3439 bloat removal 2/3 - moduleInfo
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
93 */
bb4c52bf3439 bloat removal 2/3 - moduleInfo
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
94 protected abstract String getResourceBundleName();
bb4c52bf3439 bloat removal 2/3 - moduleInfo
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
95
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
96
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
97 /**
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
98 * 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
99 *
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
100 * @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
101 * @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
102 */
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
103 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
104 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
105 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
106 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
107 }
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
108 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
109 }
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
110
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
111 private ResponseType invokeMapping(Map.Entry<PathPattern, Method> mapping, HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
112 final var pathPattern = mapping.getKey();
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
113 final var method = mapping.getValue();
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
114 try {
14
2b270c714678 changed logger implementation to log4j2
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
115 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
116 final var paramTypes = method.getParameterTypes();
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
117 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
118 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
119 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
120 paramValues[i] = req;
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
121 } 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
122 paramValues[i] = resp;
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
123 }
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
124 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
125 paramValues[i] = dao;
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
126 }
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
127 if (paramTypes[i].isAssignableFrom(PathParameters.class)) {
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
128 paramValues[i] = pathPattern.obtainPathParameters(sanitizeRequestPath(req));
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
129 }
42
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
130 }
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
131 return (ResponseType) method.invoke(this, paramValues);
73
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
132 } catch (InvocationTargetException ex) {
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
133 LOG.error("invocation of method {}::{} failed: {}",
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
134 method.getDeclaringClass().getName(), method.getName(), ex.getTargetException().getMessage());
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
135 LOG.debug("Details: ", ex.getTargetException());
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
136 resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex.getTargetException().getMessage());
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
137 return ResponseType.NONE;
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
138 } catch (ReflectiveOperationException | ClassCastException ex) {
73
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
139 LOG.error("invocation of method {}::{} failed: {}",
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
140 method.getDeclaringClass().getName(), method.getName(), ex.getMessage());
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
141 LOG.debug("Details: ", ex);
73
672b5003cafe improves error message for InvocationTargetExceptions
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
142 resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex.getMessage());
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
143 return ResponseType.NONE;
11
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 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
146
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
147 @Override
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
148 public void init() throws ServletException {
78
bb4c52bf3439 bloat removal 2/3 - moduleInfo
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
149 scanForRequestMappings();
33
fd8c40ff78c3 fixes several warnings
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
150
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
151 LOG.trace("{} initialized", getServletName());
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
152 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
153
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
154 private void scanForRequestMappings() {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
155 try {
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
156 Method[] methods = getClass().getDeclaredMethods();
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
157 for (Method method : methods) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
158 Optional<RequestMapping> mapping = Optional.ofNullable(method.getAnnotation(RequestMapping.class));
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
159 if (mapping.isPresent()) {
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
160 if (mapping.get().requestPath().isBlank()) {
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
161 LOG.warn("{} is annotated with {} but request path is empty",
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
162 method.getName(), RequestMapping.class.getSimpleName()
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
163 );
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
164 continue;
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
165 }
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
166
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
167 if (!Modifier.isPublic(method.getModifiers())) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
168 LOG.warn("{} is annotated with {} but is not public",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
169 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
170 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
171 continue;
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 if (Modifier.isAbstract(method.getModifiers())) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
174 LOG.warn("{} is annotated with {} but is abstract",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
175 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
176 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
177 continue;
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
178 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
179 if (!ResponseType.class.isAssignableFrom(method.getReturnType())) {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
180 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
181 method.getName(), RequestMapping.class.getSimpleName()
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
182 );
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
183 continue;
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
184 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
185
42
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
186 boolean paramsInjectible = true;
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
187 for (var param : method.getParameterTypes()) {
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
188 paramsInjectible &= HttpServletRequest.class.isAssignableFrom(param)
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
189 || HttpServletResponse.class.isAssignableFrom(param)
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
190 || PathParameters.class.isAssignableFrom(param)
42
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
191 || DataAccessObjects.class.isAssignableFrom(param);
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
192 }
f962ff9dd44e makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents: 40
diff changeset
193 if (paramsInjectible) {
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
194 try {
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
195 PathPattern pathPattern = new PathPattern(mapping.get().requestPath());
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
196
131
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
197 final var methodMappings = mappings.computeIfAbsent(mapping.get().method(), k -> new HashMap<>());
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
198 final var currentMapping = methodMappings.putIfAbsent(pathPattern, method);
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
199 if (currentMapping != null) {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
200 LOG.warn("Cannot map {} {} to {} in class {} - this would override the mapping to {}",
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
201 mapping.get().method(),
131
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
202 mapping.get().requestPath(),
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
203 method.getName(),
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
204 getClass().getSimpleName(),
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
205 currentMapping.getName()
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
206 );
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
207 }
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
208
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
209 LOG.debug("{} {} maps to {}::{}",
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
210 mapping.get().method(),
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
211 mapping.get().requestPath(),
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
212 getClass().getSimpleName(),
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
213 method.getName()
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
214 );
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
215 } catch (IllegalArgumentException ex) {
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
216 LOG.warn("Request mapping for {} failed: path pattern '{}' is syntactically invalid",
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
217 method.getName(), mapping.get().requestPath()
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
218 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
219 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
220 } else {
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
221 LOG.warn("{} is annotated with {} but has the wrong parameters - only HttpServletRequest, HttpServletResponse, PathParameters, and DataAccessObjects are allowed",
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
222 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
223 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
224 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
225 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
226 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
227 } catch (SecurityException ex) {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
228 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
229 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
230 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
231
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
232 @Override
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
233 public void destroy() {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
234 mappings.clear();
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
235 LOG.trace("{} destroyed", getServletName());
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
236 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
237
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
238 /**
74
91d1fc2a3a14 removes that dynamic_fragment bullshit
Mike Becker <universe@uap-core.de>
parents: 73
diff changeset
239 * Sets the name of the content page.
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 * 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
242 * 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
243 *
74
91d1fc2a3a14 removes that dynamic_fragment bullshit
Mike Becker <universe@uap-core.de>
parents: 73
diff changeset
244 * @param req the servlet request object
91d1fc2a3a14 removes that dynamic_fragment bullshit
Mike Becker <universe@uap-core.de>
parents: 73
diff changeset
245 * @param pageName the name of the content page
91d1fc2a3a14 removes that dynamic_fragment bullshit
Mike Becker <universe@uap-core.de>
parents: 73
diff changeset
246 * @see Constants#REQ_ATTR_CONTENT_PAGE
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
247 */
74
91d1fc2a3a14 removes that dynamic_fragment bullshit
Mike Becker <universe@uap-core.de>
parents: 73
diff changeset
248 protected void setContentPage(HttpServletRequest req, String pageName) {
91d1fc2a3a14 removes that dynamic_fragment bullshit
Mike Becker <universe@uap-core.de>
parents: 73
diff changeset
249 req.setAttribute(Constants.REQ_ATTR_CONTENT_PAGE, Functions.jspPath(pageName));
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
250 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
251
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
252 /**
96
b7b685f31e39 breadcrumb menu is now a sidebar navigation menu
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
253 * Sets the navigation menu.
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
254 *
109
2e0669e814ff adds versions overview
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
255 * @param req the servlet request object
2e0669e814ff adds versions overview
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
256 * @param jspName the name of the menu's jsp file
96
b7b685f31e39 breadcrumb menu is now a sidebar navigation menu
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
257 * @see Constants#REQ_ATTR_NAVIGATION
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
258 */
109
2e0669e814ff adds versions overview
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
259 protected void setNavigationMenu(HttpServletRequest req, String jspName) {
2e0669e814ff adds versions overview
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
260 req.setAttribute(Constants.REQ_ATTR_NAVIGATION, Functions.jspPath(jspName));
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
261 }
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
262
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
263 /**
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
264 * @param req the servlet request object
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
265 * @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
266 * @see Constants#REQ_ATTR_REDIRECT_LOCATION
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
267 */
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
268 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
269 if (location.startsWith("./")) {
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
270 location = location.replaceFirst("\\./", Functions.baseHref(req));
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
271 }
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
272 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
273 }
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
274
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
275 /**
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
276 * 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
277 * <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
278 * 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
279 * output.
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
280 * <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
281 * 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
282 * 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
283 *
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
284 * @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
285 * @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
286 */
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
287 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
288 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
289 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
290
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
291 /**
86
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
292 * Sets the view model object.
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
293 * The type must match the expected type in the JSP file.
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
294 *
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
295 * @param req the servlet request object
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
296 * @param viewModel the view model object
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
297 */
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
298 public void setViewModel(HttpServletRequest req, Object viewModel) {
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
299 req.setAttribute(Constants.REQ_ATTR_VIEWMODEL, viewModel);
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
300 }
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
301
131
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
302 private <T> Optional<T> parseParameter(String paramValue, Class<T> clazz) {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
303 if (paramValue == null) return Optional.empty();
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
304 if (clazz.equals(Boolean.class)) {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
305 if (paramValue.toLowerCase().equals("false") || paramValue.equals("0")) {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
306 return Optional.of((T) Boolean.FALSE);
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
307 } else {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
308 return Optional.of((T) Boolean.TRUE);
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
309 }
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
310 }
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
311 if (clazz.equals(String.class)) return Optional.of((T) paramValue);
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
312 if (java.sql.Date.class.isAssignableFrom(clazz)) {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
313 try {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
314 return Optional.of((T) java.sql.Date.valueOf(paramValue));
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
315 } catch (IllegalArgumentException ex) {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
316 return Optional.empty();
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
317 }
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
318 }
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
319 try {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
320 final Constructor<T> ctor = clazz.getConstructor(String.class);
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
321 return Optional.of(ctor.newInstance(paramValue));
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
322 } catch (ReflectiveOperationException e) {
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
323 // does not type check and is not convertible - treat as if the parameter was never set
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
324 return Optional.empty();
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
325 }
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
326 }
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
327
86
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
328 /**
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
329 * 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
330 * 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
331 * 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
332 *
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
333 * @param req the servlet request object
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
334 * @param clazz the class object of the expected type
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
335 * @param name the name of the parameter
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
336 * @param <T> the expected type
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
337 * @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
338 */
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
339 protected <T> Optional<T> getParameter(HttpServletRequest req, Class<T> clazz, String name) {
83
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
340 if (clazz.isArray()) {
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
341 final String[] paramValues = req.getParameterValues(name);
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
342 int len = paramValues == null ? 0 : paramValues.length;
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
343 final var array = (T) Array.newInstance(clazz.getComponentType(), len);
86
0a658e53177c improves issue overview and adds progress information
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
344 for (int i = 0; i < len; i++) {
83
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
345 try {
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
346 final Constructor<?> ctor = clazz.getComponentType().getConstructor(String.class);
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
347 Array.set(array, i, ctor.newInstance(paramValues[i]));
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
348 } catch (ReflectiveOperationException e) {
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
349 throw new RuntimeException(e);
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
350 }
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
351 }
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
352 return Optional.of(array);
24a3596b8f98 adds version selection in issue editor
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
353 } else {
131
67df332e3146 changes request mapping to contain project and version ID as path parameters (this removes the session storage)
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
354 return parseParameter(req.getParameter(name), clazz);
80
27a25f32048e adds project overview page
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
355 }
47
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
356 }
57cfb94ab99f projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
357
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
358 /**
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
359 * 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
360 *
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
361 * @param req the servlet request object
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
362 * @param clazz the class representing the type of the request parameter
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
363 * @param name the name of the request parameter
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
364 * @param find the find function (typically a DAO function)
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
365 * @param <T> the type of the request parameter
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
366 * @param <R> the type of the looked up entity
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
367 * @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
368 * @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
369 */
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
370 protected <T, R> Optional<R> findByParameter(HttpServletRequest req, Class<T> clazz, String name, SQLFindFunction<? super T, ? extends R> find) throws SQLException {
63
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
371 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
372 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
373 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
374 } else {
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
375 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
376 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
377 }
51aa5e267c7f adds utility function to find an entity by ID (reduces code duplication)
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
378
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
379 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
380 throws IOException, ServletException {
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
381
79
f64255a88d66 bloat removal 3/3 - LightPITModule annotation and ModuleManager
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
382 final String lightpitBundle = "localization.lightpit";
f64255a88d66 bloat removal 3/3 - LightPITModule annotation and ModuleManager
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
383 final var mainMenu = List.of(
f64255a88d66 bloat removal 3/3 - LightPITModule annotation and ModuleManager
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
384 new MenuEntry(new ResourceKey(lightpitBundle, "menu.projects"), "projects/"),
f64255a88d66 bloat removal 3/3 - LightPITModule annotation and ModuleManager
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
385 new MenuEntry(new ResourceKey(lightpitBundle, "menu.users"), "teams/"),
f64255a88d66 bloat removal 3/3 - LightPITModule annotation and ModuleManager
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
386 new MenuEntry(new ResourceKey(lightpitBundle, "menu.languages"), "language/")
f64255a88d66 bloat removal 3/3 - LightPITModule annotation and ModuleManager
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
387 );
71
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
388 for (var entry : mainMenu) {
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
389 if (Functions.fullPath(req).startsWith("/" + entry.getPathName())) {
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
390 entry.setActive(true);
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
391 }
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
392 }
dca186d3911f adds breadcrumb menu
Mike Becker <universe@uap-core.de>
parents: 70
diff changeset
393 req.setAttribute(Constants.REQ_ATTR_MENU, mainMenu);
43
9abf0bf44c7b renames some crappy constants
Mike Becker <universe@uap-core.de>
parents: 42
diff changeset
394 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
395 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
396
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
397 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
398 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
399 }
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
400
130
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
401 private Optional<Map.Entry<PathPattern, Method>> findMapping(HttpMethod method, HttpServletRequest req) {
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
402 return Optional.ofNullable(mappings.get(method)).flatMap(rm ->
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
403 rm.entrySet().stream().filter(
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
404 kv -> kv.getKey().matches(sanitizeRequestPath(req))
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
405 ).findAny()
7ef369744fd1 adds the possibility to specify path parameters to RequestMapping
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
406 );
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
407 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
408
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
409 private void forwardAsSpecified(ResponseType type, HttpServletRequest req, HttpServletResponse resp)
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
410 throws ServletException, IOException {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
411 switch (type) {
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
412 case NONE:
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
413 return;
43
9abf0bf44c7b renames some crappy constants
Mike Becker <universe@uap-core.de>
parents: 42
diff changeset
414 case HTML:
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
415 forwardToFullView(req, resp);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
416 return;
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
417 // TODO: implement remaining response types
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
418 default:
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
419 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
420 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
421 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
422
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
423 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
424
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
425 // 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
426 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
427 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
428 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
429 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
430 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
431 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
432 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
433 } else {
15
bb594abac796 language selector completed
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
434 Locale sessionLocale = (Locale) session.getAttribute(Constants.SESSION_ATTR_LANGUAGE);
bb594abac796 language selector completed
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
435 resp.setLocale(sessionLocale);
bb594abac796 language selector completed
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
436 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
437 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
438
21
b213fef2539e adds first part of a module manager UI
Mike Becker <universe@uap-core.de>
parents: 20
diff changeset
439 // 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
440 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
441 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
442 req.setAttribute(Constants.REQ_ATTR_PATH, fullPath);
78
bb4c52bf3439 bloat removal 2/3 - moduleInfo
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
443 req.setAttribute(Constants.REQ_ATTR_RESOURCE_BUNDLE, getResourceBundleName());
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
444
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
445 // 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
446 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
447 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
448 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
449 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
450 }
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
451 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
452 }
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
453
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
454 // 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
455 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
456 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
457 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
458 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
459 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
460 }
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
461 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
462 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
463 try {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
464 connection.setAutoCommit(false);
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
465 // 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
466 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
467 if (mapping.isPresent()) {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
468 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
469 } else {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
470 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
471 }
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
472 connection.commit();
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
473 } catch (SQLException ex) {
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
474 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
475 LOG.debug("Details: ", ex);
54
77e01cda5a40 adds missing spaces in error messages
Mike Becker <universe@uap-core.de>
parents: 53
diff changeset
476 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
477 connection.rollback();
38
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
478 }
cf85ef18f231 adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents: 36
diff changeset
479 } catch (SQLException ex) {
39
e722861558bb fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents: 38
diff changeset
480 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
481 LOG.debug("Details: ", ex);
54
77e01cda5a40 adds missing spaces in error messages
Mike Becker <universe@uap-core.de>
parents: 53
diff changeset
482 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
483 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
484 }
34
824d4042c857 cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
485
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
486 @Override
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
487 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
488 throws ServletException, IOException {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
489 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
490 }
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
491
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
492 @Override
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
493 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
494 throws ServletException, IOException {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
495 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
496 }
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
497 }

mercurial