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

Tue, 26 Dec 2017 17:36:47 +0100

author
Mike Becker <universe@uap-core.de>
date
Tue, 26 Dec 2017 17:36:47 +0100
changeset 13
f4608ad6c947
parent 12
005d27918b57
child 14
2b270c714678
permissions
-rw-r--r--

adds dynamic fragments to LightPIT request handling framework + basic language recognition code

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.
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2017 Mike Becker. All rights reserved.
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
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.
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 *
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
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 import java.io.IOException;
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
32 import java.lang.reflect.Method;
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
33 import java.lang.reflect.Modifier;
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
34 import java.util.Arrays;
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
35 import java.util.HashMap;
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
36 import java.util.List;
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
37 import java.util.Locale;
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
38 import java.util.Map;
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
39 import java.util.Optional;
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 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
41 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
42 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
43 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
44 import javax.servlet.http.HttpSession;
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
45 import org.slf4j.Logger;
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
46 import org.slf4j.LoggerFactory;
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
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 * 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
51 */
9
20a9b2bc9063 makes LightPITServlet abstract
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
52 public abstract class AbstractLightPITServlet extends HttpServlet {
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
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);
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
55
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
56 private static final String HTML_FULL_DISPATCHER = Functions.jspPath("html_full");
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
57
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
58 /**
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
59 * Store a reference to the annotation for quicker access.
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
60 */
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
61 private Optional<LightPITModule> moduleInfo = Optional.empty();
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
62
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
63 /**
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
64 * 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
65 */
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
66 private Optional<LightPITModule.ELProxy> moduleInfoELProxy = Optional.empty();
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
67
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
68
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
69 @FunctionalInterface
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
70 private static interface HandlerMethod {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
71 ResponseType apply(HttpServletRequest t, HttpServletResponse u) throws IOException, ServletException;
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
72 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
73
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
74 /**
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
75 * Invocation mapping gathered from the {@link RequestMapping} annotations.
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
76 */
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
77 private final Map<HttpMethod, Map<String, HandlerMethod>> mappings = new HashMap<>();
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
78
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
79 /**
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
80 * Gives implementing modules access to the {@link ModuleManager}.
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
81 * @return the module manager
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
82 */
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
83 protected final ModuleManager getModuleManager() {
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
84 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
85 }
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
86
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
87 private ResponseType invokeMapping(Method method, HttpServletRequest req, HttpServletResponse resp)
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
88 throws IOException, ServletException {
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
89 try {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
90 LOG.debug("invoke {}", method.getName());
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
91 return (ResponseType) method.invoke(this, req, resp);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
92 } catch (ReflectiveOperationException | ClassCastException ex) {
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
93 LOG.error(String.format("invocation of method %s failed", method.getName()), ex);
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
94 resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
95 return ResponseType.NONE;
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
96 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
97 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
98
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
99 @Override
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
100 public void init() throws ServletException {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
101 moduleInfo = Optional.ofNullable(this.getClass().getAnnotation(LightPITModule.class));
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
102 moduleInfoELProxy = moduleInfo.map(LightPITModule.ELProxy::convert);
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
103
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
104 if (moduleInfo.isPresent()) {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
105 scanForRequestMappings();
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
106 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
107
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
108 LOG.trace("{} initialized", getServletName());
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
109 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
110
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
111 private void scanForRequestMappings() {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
112 try {
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
113 Method[] methods = getClass().getDeclaredMethods();
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
114 for (Method method : methods) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
115 Optional<RequestMapping> mapping = Optional.ofNullable(method.getAnnotation(RequestMapping.class));
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
116 if (mapping.isPresent()) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
117 if (!Modifier.isPublic(method.getModifiers())) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
118 LOG.warn("{} is annotated with {} but is not public",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
119 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
120 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
121 continue;
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 if (Modifier.isAbstract(method.getModifiers())) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
124 LOG.warn("{} is annotated with {} but is abstract",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
125 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
126 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
127 continue;
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
128 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
129 if (!ResponseType.class.isAssignableFrom(method.getReturnType())) {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
130 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
131 method.getName(), RequestMapping.class.getSimpleName()
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
132 );
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
133 continue;
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
134 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
135
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
136 Class<?>[] params = method.getParameterTypes();
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
137 if (params.length == 2
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
138 && HttpServletRequest.class.isAssignableFrom(params[0])
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
139 && HttpServletResponse.class.isAssignableFrom(params[1])) {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
140
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
141 if (mappings.computeIfAbsent(mapping.get().method(), k -> new HashMap<>()).
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
142 putIfAbsent(mapping.get().requestPath(),
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
143 (req, resp) -> invokeMapping(method, req, resp)) != null) {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
144 LOG.warn("{} {} has multiple mappings",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
145 mapping.get().method(),
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
146 mapping.get().requestPath()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
147 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
148 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
149
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
150 LOG.info("{} {} maps to {}",
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
151 mapping.get().method(),
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
152 mapping.get().requestPath(),
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
153 method.getName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
154 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
155 } else {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
156 LOG.warn("{} is annotated with {} but has the wrong parameters - (HttpServletRequest,HttpServletResponse) required",
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
157 method.getName(), RequestMapping.class.getSimpleName()
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
158 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
159 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
160 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
161 }
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
162 } catch (SecurityException ex) {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
163 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
164 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
165 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
166
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
167 @Override
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
168 public void destroy() {
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
169 mappings.clear();
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
170 LOG.trace("{} destroyed", getServletName());
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
171 }
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 /**
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
174 * Sets the name of the dynamic fragment.
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
175 *
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
176 * 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
177 * is added automatically if not specified.
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
178 *
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
179 * The fragment must be located in the dynamic fragments folder.
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
180 *
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
181 * @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
182 * @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
183 * @see Constants#DYN_FRAGMENT_PATH_PREFIX
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
184 */
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
185 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
186 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
187 }
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
188
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
189 /**
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
190 * Specifies the name of an additional stylesheet used by the module.
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
191 *
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
192 * 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
193 * output.
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
194 *
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
195 * 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
196 * is added automatically if not specified.
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
197 *
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
198 * @param req the servlet request object
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
199 * @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
200 */
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
201 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
202 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
203 }
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
204
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
205 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
206 throws IOException, ServletException {
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
207
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
208 req.setAttribute(Constants.REQ_ATTR_MENU, getModuleManager().getMainMenu());
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
209 req.getRequestDispatcher(HTML_FULL_DISPATCHER).forward(req, resp);
10
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
210 }
89e3e6e28b69 implements automatic menu generation from module information
Mike Becker <universe@uap-core.de>
parents: 9
diff changeset
211
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
212 private Optional<HandlerMethod> findMapping(HttpMethod method, HttpServletRequest req) {
11
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
213 return Optional.ofNullable(mappings.get(method)).map(
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
214 (rm) -> rm.get(Optional.ofNullable(req.getPathInfo()).orElse(""))
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
215 );
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
216 }
737ab27e37b3 implements simple request mapper
Mike Becker <universe@uap-core.de>
parents: 10
diff changeset
217
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
218 private void forwardAsSepcified(ResponseType type, HttpServletRequest req, HttpServletResponse resp)
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
219 throws ServletException, IOException {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
220 switch (type) {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
221 case NONE: return;
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
222 case HTML_FULL:
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
223 forwardToFullView(req, resp);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
224 return;
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
225 // TODO: implement remaining response types
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
226 default:
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
227 // this code should be unreachable
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
228 LOG.error("ResponseType switch is not exhaustive - this is a bug!");
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
229 throw new UnsupportedOperationException();
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
230 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
231 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
232
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
233 private void doProcess(HttpMethod method, HttpServletRequest req, HttpServletResponse resp)
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
234 throws ServletException, IOException {
13
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
235
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
236 HttpSession session = req.getSession();
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
237
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
238 // choose the requested language as session language (if available) or fall back to english, otherwise
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
239 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
240 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
241 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
242 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
243 session.setAttribute(Constants.SESSION_ATTR_LANGUAGE, sessionLocale);
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
244 LOG.debug("Settng language for new session {}: {}", session.getId(), sessionLocale.getDisplayLanguage());
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
245 }
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
246
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
247 req.setAttribute(Constants.REQ_ATTR_PATH, Functions.fullPath(req));
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
248 req.setAttribute(Constants.REQ_ATTR_MODULE_CLASSNAME, this.getClass().getName());
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
249 moduleInfoELProxy.ifPresent((proxy) -> req.setAttribute(Constants.REQ_ATTR_MODULE_INFO, proxy));
f4608ad6c947 adds dynamic fragments to LightPIT request handling framework + basic language recognition code
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
250
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
251 Optional<HandlerMethod> mapping = findMapping(method, req);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
252 if (mapping.isPresent()) {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
253 forwardAsSepcified(mapping.get().apply(req, resp), req, resp);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
254 } else {
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
255 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
256 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
257 }
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
258
7
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
259 @Override
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
260 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
261 throws ServletException, IOException {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
262 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
263 }
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
264
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
265 @Override
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
266 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
267 throws ServletException, IOException {
12
005d27918b57 implements ResponseTypes
Mike Becker <universe@uap-core.de>
parents: 11
diff changeset
268 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
269 }
598670d5b0b8 core functionality should also use the modules system, changed the code structure accordingly
Mike Becker <universe@uap-core.de>
parents:
diff changeset
270 }

mercurial