Sat, 16 May 2020 15:45:06 +0200
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)
also improves error pages in general
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 | 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 | 33 | import org.slf4j.Logger; |
34 | import org.slf4j.LoggerFactory; | |
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 | 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 | 43 | import java.lang.reflect.Method; |
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 | 47 | import java.util.*; |
7
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 | /** |
598670d5b0b8
core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
50 | * 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
|
51 | * 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
|
52 | */ |
9
20a9b2bc9063
makes LightPITServlet abstract
Mike Becker <universe@uap-core.de>
parents:
7
diff
changeset
|
53 | 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
|
54 | |
10
89e3e6e28b69
implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents:
9
diff
changeset
|
55 | 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
|
56 | |
43
9abf0bf44c7b
renames some crappy constants
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
57 | private static final String SITE_JSP = Functions.jspPath("site"); |
33 | 58 | |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
59 | /** |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
60 | * 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
|
61 | */ |
36
0f4f8f255c32
removes features that are not (and probably will not) used anyway
Mike Becker <universe@uap-core.de>
parents:
34
diff
changeset
|
62 | private LightPITModule.ELProxy moduleInfo = null; |
33 | 63 | |
10
89e3e6e28b69
implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents:
9
diff
changeset
|
64 | /** |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
65 | * 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
|
66 | * <p> |
18
a94b172c3a93
user friendly error pages for codes 404, 403 and 500
Mike Becker <universe@uap-core.de>
parents:
17
diff
changeset
|
67 | * 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
|
68 | * 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
|
69 | * <p> |
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
70 | * 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
|
71 | * {@link HttpServletRequest#getPathInfo()}. |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
72 | */ |
39
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
73 | 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
|
74 | |
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
|
75 | 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
|
76 | |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
77 | /** |
10
89e3e6e28b69
implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents:
9
diff
changeset
|
78 | * Gives implementing modules access to the {@link ModuleManager}. |
33 | 79 | * |
10
89e3e6e28b69
implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents:
9
diff
changeset
|
80 | * @return the module manager |
89e3e6e28b69
implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents:
9
diff
changeset
|
81 | */ |
89e3e6e28b69
implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents:
9
diff
changeset
|
82 | protected final ModuleManager getModuleManager() { |
89e3e6e28b69
implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents:
9
diff
changeset
|
83 | 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
|
84 | } |
33 | 85 | |
38
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
86 | |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
87 | /** |
38
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
88 | * Creates a set of data access objects for the specified connection. |
33 | 89 | * |
38
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
90 | * @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
|
91 | * @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
|
92 | */ |
38
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
93 | 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
|
94 | 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
|
95 | 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
|
96 | 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
|
97 | } |
39
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
98 | 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
|
99 | } |
33 | 100 | |
38
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
101 | 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
|
102 | try { |
14
2b270c714678
changed logger implementation to log4j2
Mike Becker <universe@uap-core.de>
parents:
13
diff
changeset
|
103 | 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
|
104 | final var paramTypes = method.getParameterTypes(); |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
105 | 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
|
106 | 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
|
107 | 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
|
108 | paramValues[i] = req; |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
109 | } 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
|
110 | paramValues[i] = resp; |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
111 | } |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
112 | 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
|
113 | paramValues[i] = dao; |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
114 | } |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
115 | } |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
116 | return (ResponseType) method.invoke(this, paramValues); |
12 | 117 | } 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
|
118 | 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
|
119 | LOG.debug("Details: ", ex); |
12 | 120 | resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
121 | return ResponseType.NONE; | |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
122 | } |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
123 | } |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
124 | |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
125 | @Override |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
126 | 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
|
127 | 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
|
128 | .map(LightPITModule.ELProxy::new).orElse(null); |
33 | 129 | |
130 | if (moduleInfo != null) { | |
12 | 131 | scanForRequestMappings(); |
132 | } | |
33 | 133 | |
12 | 134 | LOG.trace("{} initialized", getServletName()); |
135 | } | |
136 | ||
137 | private void scanForRequestMappings() { | |
138 | try { | |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
139 | Method[] methods = getClass().getDeclaredMethods(); |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
140 | for (Method method : methods) { |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
141 | Optional<RequestMapping> mapping = Optional.ofNullable(method.getAnnotation(RequestMapping.class)); |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
142 | if (mapping.isPresent()) { |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
143 | if (!Modifier.isPublic(method.getModifiers())) { |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
144 | LOG.warn("{} is annotated with {} but is not public", |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
145 | method.getName(), RequestMapping.class.getSimpleName() |
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 | continue; |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
148 | } |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
149 | if (Modifier.isAbstract(method.getModifiers())) { |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
150 | LOG.warn("{} is annotated with {} but is abstract", |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
151 | method.getName(), RequestMapping.class.getSimpleName() |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
152 | ); |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
153 | continue; |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
154 | } |
12 | 155 | if (!ResponseType.class.isAssignableFrom(method.getReturnType())) { |
156 | LOG.warn("{} is annotated with {} but has the wrong return type - 'ResponseType' required", | |
157 | method.getName(), RequestMapping.class.getSimpleName() | |
158 | ); | |
159 | continue; | |
160 | } | |
161 | ||
42
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
162 | boolean paramsInjectible = true; |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
163 | for (var param : method.getParameterTypes()) { |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
164 | paramsInjectible &= HttpServletRequest.class.isAssignableFrom(param) |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
165 | || HttpServletResponse.class.isAssignableFrom(param) |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
166 | || DataAccessObjects.class.isAssignableFrom(param); |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
167 | } |
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
168 | if (paramsInjectible) { |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
169 | final String requestPath = "/" + mapping.get().requestPath(); |
12 | 170 | |
39
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
171 | if (mappings |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
172 | .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
|
173 | .putIfAbsent(requestPath, method) != null) { |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
174 | LOG.warn("{} {} has multiple mappings", |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
175 | mapping.get().method(), |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
176 | mapping.get().requestPath() |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
177 | ); |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
178 | } |
12 | 179 | |
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
|
180 | 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
|
181 | 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
|
182 | 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
|
183 | 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
|
184 | 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
|
185 | 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
|
186 | } |
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
|
187 | |
22
5a91fb7067af
minor changes to logging output
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
188 | LOG.debug("{} {} maps to {}::{}", |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
189 | 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
|
190 | requestPath, |
22
5a91fb7067af
minor changes to logging output
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
191 | getClass().getSimpleName(), |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
192 | method.getName() |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
193 | ); |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
194 | } else { |
42
f962ff9dd44e
makes every parameter in a handler method optional
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
195 | 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
|
196 | method.getName(), RequestMapping.class.getSimpleName() |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
197 | ); |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
198 | } |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
199 | } |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
200 | } |
12 | 201 | } catch (SecurityException ex) { |
202 | 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
|
203 | } |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
204 | } |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
205 | |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
206 | @Override |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
207 | public void destroy() { |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
208 | mappings.clear(); |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
209 | LOG.trace("{} destroyed", getServletName()); |
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
210 | } |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
211 | |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
212 | /** |
13
f4608ad6c947
adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
213 | * 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
|
214 | * <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
|
215 | * 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
|
216 | * 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
|
217 | * <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
|
218 | * 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
|
219 | * |
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
220 | * @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
|
221 | * @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
|
222 | * @see Constants#DYN_FRAGMENT_PATH_PREFIX |
11
737ab27e37b3
implements simple request mapper
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
223 | */ |
13
f4608ad6c947
adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
224 | public void setDynamicFragment(HttpServletRequest req, String fragmentName) { |
f4608ad6c947
adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
225 | 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
|
226 | } |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
227 | |
13
f4608ad6c947
adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
228 | /** |
47
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
229 | * @param req the servlet request object |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
230 | * @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
|
231 | * @see Constants#REQ_ATTR_REDIRECT_LOCATION |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
232 | */ |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
233 | public void setRedirectLocation(HttpServletRequest req, String location) { |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
234 | if (location.startsWith("./")) { |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
235 | location = location.replaceFirst("\\./", Functions.baseHref(req)); |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
236 | } |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
237 | 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
|
238 | } |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
239 | |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
240 | /** |
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 | * 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
|
242 | * <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
|
243 | * 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
|
244 | * output. |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
245 | * <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
|
246 | * 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
|
247 | * 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
|
248 | * |
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
249 | * @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
|
250 | * @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
|
251 | */ |
f4608ad6c947
adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
252 | 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
|
253 | 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
|
254 | } |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
255 | |
47
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
256 | /** |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
257 | * 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
|
258 | * 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
|
259 | * 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
|
260 | * |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
261 | * @param req the servlet request object |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
262 | * @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
|
263 | * @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
|
264 | * @param <T> the expected type |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
265 | * @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
|
266 | */ |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
267 | public<T> Optional<T> getParameter(HttpServletRequest req, Class<T> clazz, String name) { |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
268 | final String paramValue = req.getParameter(name); |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
269 | if (paramValue == null) return Optional.empty(); |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
270 | 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
|
271 | try { |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
272 | 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
|
273 | return Optional.of(ctor.newInstance(paramValue)); |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
274 | } catch (ReflectiveOperationException e) { |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
275 | throw new RuntimeException(e); |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
276 | } |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
277 | |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
278 | } |
57cfb94ab99f
projects can now be added and updated
Mike Becker <universe@uap-core.de>
parents:
45
diff
changeset
|
279 | |
10
89e3e6e28b69
implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents:
9
diff
changeset
|
280 | 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
|
281 | throws IOException, ServletException { |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
282 | |
36
0f4f8f255c32
removes features that are not (and probably will not) used anyway
Mike Becker <universe@uap-core.de>
parents:
34
diff
changeset
|
283 | 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
|
284 | req.setAttribute(Constants.REQ_ATTR_SUB_MENU, subMenu); |
43
9abf0bf44c7b
renames some crappy constants
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
285 | 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
|
286 | } |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
287 | |
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
|
288 | 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
|
289 | 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
|
290 | } |
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
|
291 | |
39
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
292 | 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
|
293 | 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
|
294 | } |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
295 | |
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
296 | private void forwardAsSpecified(ResponseType type, HttpServletRequest req, HttpServletResponse resp) |
12 | 297 | throws ServletException, IOException { |
298 | switch (type) { | |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
299 | case NONE: |
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
300 | return; |
43
9abf0bf44c7b
renames some crappy constants
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
301 | case HTML: |
12 | 302 | forwardToFullView(req, resp); |
303 | return; | |
304 | // TODO: implement remaining response types | |
305 | default: | |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
306 | throw new AssertionError("ResponseType switch is not exhaustive - this is a bug!"); |
12 | 307 | } |
308 | } | |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
309 | |
38
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
310 | 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
|
311 | |
13
f4608ad6c947
adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
312 | // 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
|
313 | 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
|
314 | 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
|
315 | 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
|
316 | 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
|
317 | 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
|
318 | 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
|
319 | 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
|
320 | } else { |
15
bb594abac796
language selector completed
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
321 | Locale sessionLocale = (Locale) session.getAttribute(Constants.SESSION_ATTR_LANGUAGE); |
bb594abac796
language selector completed
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
322 | resp.setLocale(sessionLocale); |
bb594abac796
language selector completed
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
323 | 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
|
324 | } |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
325 | |
21
b213fef2539e
adds first part of a module manager UI
Mike Becker <universe@uap-core.de>
parents:
20
diff
changeset
|
326 | // 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
|
327 | 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
|
328 | 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
|
329 | 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
|
330 | 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
|
331 | |
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
|
332 | // 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
|
333 | 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
|
334 | 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
|
335 | 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
|
336 | 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
|
337 | } |
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
|
338 | 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
|
339 | } |
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
|
340 | |
38
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
341 | // 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
|
342 | 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
|
343 | 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
|
344 | 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
|
345 | 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
|
346 | 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
|
347 | } |
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
|
348 | 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
|
349 | 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
|
350 | try { |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
351 | connection.setAutoCommit(false); |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
352 | // 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
|
353 | 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
|
354 | if (mapping.isPresent()) { |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
355 | 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
|
356 | } else { |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
357 | 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
|
358 | } |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
359 | connection.commit(); |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
360 | } catch (SQLException ex) { |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
361 | 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
|
362 | LOG.debug("Details: ", ex); |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
363 | resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Unhandled Transaction Error - Code:" + ex.getErrorCode()); |
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
364 | connection.rollback(); |
38
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
365 | } |
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
366 | } catch (SQLException ex) { |
39
e722861558bb
fixes minor issues that were reported by default inspection
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
367 | 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
|
368 | LOG.debug("Details: ", ex); |
cf85ef18f231
adds DAO for Project entity and save/update methods
Mike Becker <universe@uap-core.de>
parents:
36
diff
changeset
|
369 | resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database Error - Code:" + ex.getErrorCode()); |
12 | 370 | } |
371 | } | |
34
824d4042c857
cleanup and simplification of database access layer
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
372 | |
7
598670d5b0b8
core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
373 | @Override |
598670d5b0b8
core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
374 | 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
|
375 | throws ServletException, IOException { |
12 | 376 | 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
|
377 | } |
598670d5b0b8
core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
378 | |
598670d5b0b8
core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
379 | @Override |
598670d5b0b8
core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
380 | 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
|
381 | throws ServletException, IOException { |
12 | 382 | 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
|
383 | } |
598670d5b0b8
core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
384 | } |