removes that dynamic_fragment bullshit

Fri, 22 May 2020 17:26:27 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 22 May 2020 17:26:27 +0200
changeset 74
91d1fc2a3a14
parent 73
672b5003cafe
child 75
33b6843fdf8a

removes that dynamic_fragment bullshit

src/main/java/de/uapcore/lightpit/AbstractLightPITServlet.java file | annotate | diff | comparison | revisions
src/main/java/de/uapcore/lightpit/Constants.java file | annotate | diff | comparison | revisions
src/main/java/de/uapcore/lightpit/Functions.java file | annotate | diff | comparison | revisions
src/main/java/de/uapcore/lightpit/modules/ErrorModule.java file | annotate | diff | comparison | revisions
src/main/java/de/uapcore/lightpit/modules/LanguageModule.java file | annotate | diff | comparison | revisions
src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java file | annotate | diff | comparison | revisions
src/main/java/de/uapcore/lightpit/modules/UsersModule.java file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/commit-successful.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/error.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/language.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/project-details.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/project-form.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/projects.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/user-form.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/users.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/version-form.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/commit-successful.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/error.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/language.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/project-details.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/project-form.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/projects.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/site.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/user-form.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/users.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/version-form.jsp file | annotate | diff | comparison | revisions
--- a/src/main/java/de/uapcore/lightpit/AbstractLightPITServlet.java	Fri May 22 17:19:09 2020 +0200
+++ b/src/main/java/de/uapcore/lightpit/AbstractLightPITServlet.java	Fri May 22 17:26:27 2020 +0200
@@ -228,20 +228,17 @@
     }
 
     /**
-     * Sets the name of the dynamic fragment.
+     * Sets the name of the content page.
      * <p>
      * It is sufficient to specify the name without any extension. The extension
      * is added automatically if not specified.
-     * <p>
-     * The fragment must be located in the dynamic fragments folder.
      *
-     * @param req          the servlet request object
-     * @param fragmentName the name of the fragment
-     * @see Constants#DYN_FRAGMENT_PATH_PREFIX
-     * @see Constants#REQ_ATTR_FRAGMENT
+     * @param req      the servlet request object
+     * @param pageName the name of the content page
+     * @see Constants#REQ_ATTR_CONTENT_PAGE
      */
-    protected void setDynamicFragment(HttpServletRequest req, String fragmentName) {
-        req.setAttribute(Constants.REQ_ATTR_FRAGMENT, Functions.dynFragmentPath(fragmentName));
+    protected void setContentPage(HttpServletRequest req, String pageName) {
+        req.setAttribute(Constants.REQ_ATTR_CONTENT_PAGE, Functions.jspPath(pageName));
     }
 
     /**
--- a/src/main/java/de/uapcore/lightpit/Constants.java	Fri May 22 17:19:09 2020 +0200
+++ b/src/main/java/de/uapcore/lightpit/Constants.java	Fri May 22 17:26:27 2020 +0200
@@ -36,11 +36,15 @@
  * Constants with (class) local scope are defined in their respective classes.
  */
 public final class Constants {
+    /**
+     * The path where the JSP files reside.
+     */
     public static final String JSP_PATH_PREFIX = "/WEB-INF/jsp/";
 
-    public static final String DYN_FRAGMENT_PATH_PREFIX = "/WEB-INF/dynamic_fragments/";
-
-    public static final String DYN_FRAGMENT_COMMIT_SUCCESSFUL = "commit-successful";
+    /**
+     * The name of the generic JSP page that is displayed after a successful commit.
+     */
+    public static final String JSP_COMMIT_SUCCESSFUL = "commit-successful";
 
     /**
      * Name for the context parameter specifying the available languages.
@@ -83,9 +87,9 @@
     public static final String REQ_ATTR_PATH = fqn(AbstractLightPITServlet.class, "path");
 
     /**
-     * Key for the name of the fragment which should be rendered.
+     * Key for the name of the page which should be rendered.
      */
-    public static final String REQ_ATTR_FRAGMENT = fqn(AbstractLightPITServlet.class, "fragment");
+    public static final String REQ_ATTR_CONTENT_PAGE = fqn(AbstractLightPITServlet.class, "content-page");
 
     /**
      * Key for the name of the additional stylesheet used by a module.
--- a/src/main/java/de/uapcore/lightpit/Functions.java	Fri May 22 17:19:09 2020 +0200
+++ b/src/main/java/de/uapcore/lightpit/Functions.java	Fri May 22 17:26:27 2020 +0200
@@ -54,10 +54,6 @@
         return enforceExt(Constants.JSP_PATH_PREFIX + filename, ".jsp");
     }
 
-    public static String dynFragmentPath(String filename) {
-        return enforceExt(Constants.DYN_FRAGMENT_PATH_PREFIX + filename, ".jsp");
-    }
-
     public static String fqn(String base, String name) {
         return base + "." + name;
     }
--- a/src/main/java/de/uapcore/lightpit/modules/ErrorModule.java	Fri May 22 17:19:09 2020 +0200
+++ b/src/main/java/de/uapcore/lightpit/modules/ErrorModule.java	Fri May 22 17:26:27 2020 +0200
@@ -59,7 +59,7 @@
         );
 
         setStylesheet(req, "error");
-        setDynamicFragment(req, "error");
+        setContentPage(req, "error");
 
         return ResponseType.HTML;
     }
--- a/src/main/java/de/uapcore/lightpit/modules/LanguageModule.java	Fri May 22 17:19:09 2020 +0200
+++ b/src/main/java/de/uapcore/lightpit/modules/LanguageModule.java	Fri May 22 17:26:27 2020 +0200
@@ -91,7 +91,7 @@
         req.setAttribute("browserLanguage", req.getLocale());
 
         setStylesheet(req, "language");
-        setDynamicFragment(req, "language");
+        setContentPage(req, "language");
         return ResponseType.HTML;
     }
 
--- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java	Fri May 22 17:19:09 2020 +0200
+++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java	Fri May 22 17:26:27 2020 +0200
@@ -111,7 +111,7 @@
 
         final var projectList = dao.getProjectDao().list();
         req.setAttribute("projects", projectList);
-        setDynamicFragment(req, "projects");
+        setContentPage(req, "projects");
         setStylesheet(req, "projects");
 
         final var selectedProject = getSelectedProject(req, dao);
@@ -130,7 +130,7 @@
         }
 
         req.setAttribute("users", dao.getUserDao().list());
-        setDynamicFragment(req, "project-form");
+        setContentPage(req, "project-form");
     }
 
     @RequestMapping(requestPath = "edit", method = HttpMethod.GET)
@@ -161,7 +161,7 @@
             dao.getProjectDao().saveOrUpdate(project);
 
             setRedirectLocation(req, "./projects/");
-            setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
+            setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
             LOG.debug("Successfully updated project {}", project.getName());
         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
             // TODO: set request attribute with error text
@@ -187,7 +187,7 @@
         // TODO: add more levels depending on last visited location
         setBreadcrumbs(req, getBreadcrumbs(1, selectedProject));
 
-        setDynamicFragment(req, "project-details");
+        setContentPage(req, "project-details");
 
         return ResponseType.HTML;
     }
@@ -196,7 +196,7 @@
         req.setAttribute("version", version.orElse(new Version(-1, selectedProject)));
         req.setAttribute("versionStatusEnum", VersionStatus.values());
 
-        setDynamicFragment(req, "version-form");
+        setContentPage(req, "version-form");
     }
 
     @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET)
@@ -231,7 +231,7 @@
             dao.getVersionDao().saveOrUpdate(version);
 
             setRedirectLocation(req, "./projects/versions/");
-            setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
+            setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
             LOG.debug("Successfully updated version {} for project {}", version.getName(), selectedProject.getName());
         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
             // TODO: set request attribute with error text
@@ -250,7 +250,7 @@
         req.setAttribute("issueCategoryEnum", IssueCategory.values());
         req.setAttribute("versions", dao.getVersionDao().list(selectedProject));
 
-        setDynamicFragment(req, "issue-form");
+        setContentPage(req, "issue-form");
     }
 
     @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET)
@@ -285,7 +285,7 @@
             dao.getIssueDao().saveOrUpdate(issue);
 
             setRedirectLocation(req, "./projects/issues/");
-            setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
+            setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
             LOG.debug("Successfully updated issue {} for project {}", issue.getId(), selectedProject.getName());
         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
             // TODO: set request attribute with error text
--- a/src/main/java/de/uapcore/lightpit/modules/UsersModule.java	Fri May 22 17:19:09 2020 +0200
+++ b/src/main/java/de/uapcore/lightpit/modules/UsersModule.java	Fri May 22 17:26:27 2020 +0200
@@ -58,7 +58,7 @@
         final var userDao = dao.getUserDao();
 
         req.setAttribute("users", userDao.list());
-        setDynamicFragment(req, "users");
+        setContentPage(req, "users");
 
         return ResponseType.HTML;
     }
@@ -69,7 +69,7 @@
         req.setAttribute("user", findByParameter(req, Integer.class, "id",
                 dao.getUserDao()::find).orElse(new User(-1)));
 
-        setDynamicFragment(req, "user-form");
+        setContentPage(req, "user-form");
 
         return ResponseType.HTML;
     }
@@ -88,13 +88,13 @@
             dao.getUserDao().saveOrUpdate(user);
 
             setRedirectLocation(req, "./teams/");
-            setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
+            setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
 
             LOG.debug("Successfully updated user {}", user.getUsername());
         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
             // TODO: set request attribute with error text
             req.setAttribute("user", user);
-            setDynamicFragment(req, "user-form");
+            setContentPage(req, "user-form");
             LOG.warn("Form validation failure: {}", ex.getMessage());
             LOG.debug("Details:", ex);
         }
--- a/src/main/webapp/WEB-INF/dynamic_fragments/commit-successful.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-<%--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
-<c:set scope="page" var="redirectLocation" value="${requestScope[Constants.REQ_ATTR_REDIRECT_LOCATION]}"/>
-
-<fmt:message bundle="${lightpit_bundle}" key="commit.success"/>
-<fmt:message bundle="${lightpit_bundle}" key="commit.redirect-link"/>
--- a/src/main/webapp/WEB-INF/dynamic_fragments/error.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-<%-- 
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@page import="de.uapcore.lightpit.Constants" %>
-<%@page import="de.uapcore.lightpit.modules.ErrorModule" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
-
-<c:set scope="page" var="baseHref" value="${requestScope[Constants.REQ_ATTR_BASE_HREF]}"/>
-<c:set scope="page" var="errorCode" value="${requestScope['javax.servlet.error.status_code']}"/>
-<c:set scope="page" var="returnLink" value="${requestScope[ErrorModule.REQ_ATTR_RETURN_LINK]}"/>
-
-<div id="error-page">
-    <h1><fmt:message key="h1"/></h1>
-    <table>
-        <tr>
-            <th><fmt:message key="errorCode"/>:</th>
-            <td>${errorCode} - <fmt:message key="code.${errorCode}"/></td>
-        </tr>
-        <tr>
-            <th><fmt:message key="errorMessage"/>:</th>
-            <td><c:out value="${requestScope['javax.servlet.error.message']}"/></td>
-        </tr>
-        <tr>
-            <th><fmt:message key="errorTimestamp"/>:</th>
-            <td><fmt:formatDate type="both" value="<%= new java.util.Date()%>"/></td>
-        </tr>
-        <%--@elvariable id="exception" type="java.lang.Exception"--%>
-        <c:if test="${not empty exception}">
-            <tr>
-                <th><fmt:message key="errorExceptionText"/>:</th>
-                <td>${exception['class'].name} - ${exception.message}</td>
-            </tr>
-        </c:if>
-        <c:if test="${fn:startsWith(returnLink, baseHref)}">
-            <tr>
-                <th><fmt:message key="errorReturnLink"/>:</th>
-                <td><a href="${returnLink}">${returnLink}</a></td>
-            </tr>
-        </c:if>
-    </table>
-</div>
--- a/src/main/webapp/WEB-INF/dynamic_fragments/language.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-<%-- 
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@page import="de.uapcore.lightpit.Constants" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
-<jsp:useBean id="languages" type="java.util.List<java.util.Locale>" scope="request"/>
-<jsp:useBean id="browserLanguage" type="java.util.Locale" scope="request"/>
-
-<c:set scope="page" var="currentLanguage" value="${sessionScope[Constants.SESSION_ATTR_LANGUAGE]}"/>
-
-<form method="POST" id="lang-selector">
-    <c:forEach items="${languages}" var="l">
-        <label>
-            <input type="radio" name="language" value="${l.language}"
-                   <c:if test="${l.language eq currentLanguage.language}">checked</c:if>/>
-                ${l.displayLanguage}
-            (${l.getDisplayLanguage(currentLanguage)}
-            <c:if test="${not empty browserLanguage and l.language eq browserLanguage.language}"><c:set
-                    var="browserLanguagePresent" value="true"/>&nbsp;-&nbsp;<fmt:message key="browserLanguage"/></c:if>)
-        </label>
-    </c:forEach>
-    <c:if test="${not browserLanguagePresent}">
-        <span class="blNA"><fmt:message key="browserLanguageNotAvailable"/></span>
-    </c:if>
-    <input type="submit" value="<fmt:message key="submit" />"/>
-</form>
--- a/src/main/webapp/WEB-INF/dynamic_fragments/project-details.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-<%--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@page import="de.uapcore.lightpit.Constants" %>
-<%@page import="de.uapcore.lightpit.modules.ProjectsModule" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
-<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
-<c:set scope="page" var="selectedProject" value="${sessionScope[ProjectsModule.SESSION_ATTR_SELECTED_PROJECT]}"/>
-
-<jsp:useBean id="versions" type="java.util.List<de.uapcore.lightpit.entities.Version>" scope="request"/>
-<jsp:useBean id="issues" type="java.util.List<de.uapcore.lightpit.entities.Issue>" scope="request"/>
-
-<div id="tool-area">
-    <a href="./${moduleInfo.modulePath}/versions/edit" class="button"><fmt:message key="button.version.create"/></a>
-    <a href="./${moduleInfo.modulePath}/issues/edit" class="button"><fmt:message key="button.issue.create"/></a>
-</div>
-
-<c:if test="${not empty versions}">
-    <table id="version-list" class="datatable medskip">
-        <thead>
-        <tr>
-            <th></th>
-            <th><fmt:message key="thead.version.name"/></th>
-            <th><fmt:message key="thead.version.status"/></th>
-        </tr>
-        </thead>
-        <tbody>
-        <c:forEach var="version" items="${versions}">
-            <tr class="nowrap">
-                <td style="width: 2em;"><a href="./${moduleInfo.modulePath}/versions/edit?id=${version.id}">&#x270e;</a>
-                </td>
-                <td><c:out value="${version.name}"/></td>
-                <td><fmt:message key="version.status.${version.status}"/></td>
-            </tr>
-        </c:forEach>
-        </tbody>
-    </table>
-</c:if>
-
-<table id="issue-list" class="datatable medskip">
-    <thead>
-    <tr>
-        <th></th>
-        <th><fmt:message key="thead.issue.subject"/></th>
-        <th><fmt:message key="thead.issue.category"/></th>
-        <th><fmt:message key="thead.issue.status"/></th>
-        <th><fmt:message key="thead.issue.created"/></th>
-        <th><fmt:message key="thead.issue.updated"/></th>
-        <th><fmt:message key="thead.issue.eta"/></th>
-        <!-- TODO: add other information -->
-    </tr>
-    </thead>
-    <!-- TODO: add actual list -->
-</table>
--- a/src/main/webapp/WEB-INF/dynamic_fragments/project-form.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-<%--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@page import="de.uapcore.lightpit.Constants" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
-<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
-
-<jsp:useBean id="project" type="de.uapcore.lightpit.entities.Project" scope="request"/>
-<jsp:useBean id="users" type="java.util.List<de.uapcore.lightpit.entities.User>" scope="request"/>
-
-<form action="./${moduleInfo.modulePath}/commit" method="post">
-    <table class="formtable">
-        <colgroup>
-            <col>
-            <col style="width: 75ch">
-        </colgroup>
-        <tbody>
-        <tr>
-            <th><fmt:message key="thead.name"/></th>
-            <td><input name="name" type="text" maxlength="20" required value="${project.name}"/></td>
-        </tr>
-        <tr>
-            <th class="vtop"><fmt:message key="thead.description"/></th>
-            <td><input type="text" name="description" maxlength="200" value="${project.description}"/></td>
-        </tr>
-        <tr>
-            <th><fmt:message key="thead.repoUrl"/></th>
-            <td><input name="repoUrl" type="url" maxlength="50" value="${project.repoUrl}"/></td>
-        </tr>
-        <tr>
-            <th><fmt:message key="thead.owner"/></th>
-            <td>
-                <select name="owner">
-                    <option value="-1"><fmt:message key="placeholder.null-owner"/></option>
-                    <c:forEach var="user" items="${users}">
-                        <option
-                                <c:if test="${not empty project.owner and user.id eq project.owner.id}">selected</c:if>
-                                value="${user.id}"><c:out value="${user.displayname}"/></option>
-                    </c:forEach>
-                </select>
-            </td>
-        </tr>
-        </tbody>
-        <tfoot>
-        <tr>
-            <td colspan="2">
-                <input type="hidden" name="id" value="${project.id}"/>
-                <a href="./${moduleInfo.modulePath}/" class="button"><fmt:message bundle="${lightpit_bundle}"
-                                                                                  key="button.cancel"/></a>
-                <button type="submit"><fmt:message bundle="${lightpit_bundle}" key="button.okay"/></button>
-            </td>
-        </tr>
-        </tfoot>
-    </table>
-</form>
--- a/src/main/webapp/WEB-INF/dynamic_fragments/projects.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-<%--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@page import="de.uapcore.lightpit.Constants" %>
-<%@page import="de.uapcore.lightpit.modules.ProjectsModule" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
-<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
-<c:set scope="page" var="selectedProject" value="${sessionScope[ProjectsModule.SESSION_ATTR_SELECTED_PROJECT]}"/>
-
-<jsp:useBean id="projects" type="java.util.List<de.uapcore.lightpit.entities.Project>" scope="request"/>
-
-<c:if test="${empty projects}">
-    <div class="info-box">
-        <fmt:message key="no-projects"/>
-    </div>
-</c:if>
-
-<div id="tool-area">
-    <a href="./${moduleInfo.modulePath}/edit" class="button"><fmt:message key="button.create"/></a>
-</div>
-
-<c:if test="${not empty projects}">
-    <table id="project-list" class="datatable medskip fullwidth">
-        <colgroup>
-            <col>
-            <col style="width: 10%">
-            <col style="width: 35%">
-            <col style="width: 30%">
-            <col style="width: 25%">
-        </colgroup>
-        <thead>
-        <tr>
-            <th></th>
-            <th><fmt:message key="thead.name"/></th>
-            <th><fmt:message key="thead.description"/></th>
-            <th><fmt:message key="thead.repoUrl"/></th>
-            <th><fmt:message key="thead.owner"/></th>
-        </tr>
-        </thead>
-        <tbody>
-        <c:forEach var="project" items="${projects}">
-            <tr class="nowrap">
-                <td style="width: 2em;"><a href="./${moduleInfo.modulePath}/edit?id=${project.id}">&#x270e;</a></td>
-                <td><a href="./${moduleInfo.modulePath}/view?pid=${project.id}"><c:out value="${project.name}"/></a>
-                </td>
-                <td><c:out value="${project.description}"/></td>
-                <td>
-                    <c:if test="${not empty project.repoUrl}">
-                        <a target="_blank" href="<c:out value="${project.repoUrl}"/>"><c:out
-                                value="${project.repoUrl}"/></a>
-                    </c:if>
-                </td>
-                <td>
-                    <c:if test="${not empty project.owner}"><c:out value="${project.owner.displayname}"/></c:if>
-                    <c:if test="${empty project.owner}"><fmt:message key="placeholder.null-owner"/></c:if>
-                </td>
-            </tr>
-        </c:forEach>
-        </tbody>
-    </table>
-</c:if>
--- a/src/main/webapp/WEB-INF/dynamic_fragments/user-form.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-<%--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@page import="de.uapcore.lightpit.Constants" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
-<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
-
-<jsp:useBean id="user" type="de.uapcore.lightpit.entities.User" scope="request"/>
-
-<form action="./${moduleInfo.modulePath}/commit" method="post">
-    <table class="formtable">
-        <colgroup>
-            <col>
-            <col style="width: 50ch">
-        </colgroup>
-        <tbody>
-        <tr>
-            <th><fmt:message key="thead.username"/></th>
-            <td><input name="username" type="text" maxlength="50" required value="${user.username}"
-                       <c:if test="${user.id ge 0}">readonly</c:if> /></td>
-        </tr>
-        <tr>
-            <th><fmt:message key="thead.givenname"/></th>
-            <td><input name="givenname" type="text" maxlength="50" value="${user.givenname}"/></td>
-        </tr>
-        <tr>
-            <th><fmt:message key="thead.lastname"/></th>
-            <td><input name="lastname" type="text" maxlength="50" value="${user.lastname}"/></td>
-        </tr>
-        <tr>
-            <th><fmt:message key="thead.mail"/></th>
-            <td><input name="mail" type="email" maxlength="50" value="${user.mail}"/></td>
-        </tr>
-        </tbody>
-        <tfoot>
-        <tr>
-            <td colspan="2">
-                <input type="hidden" name="userid" value="${user.id}"/>
-                <a href="./${moduleInfo.modulePath}/" class="button"><fmt:message bundle="${lightpit_bundle}"
-                                                                                  key="button.cancel"/></a>
-                <button type="submit"><fmt:message bundle="${lightpit_bundle}" key="button.okay"/></button>
-            </td>
-        </tr>
-        </tfoot>
-    </table>
-</form>
--- a/src/main/webapp/WEB-INF/dynamic_fragments/users.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-<%--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@page import="de.uapcore.lightpit.Constants" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
-<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
-
-<jsp:useBean id="users" type="java.util.List<de.uapcore.lightpit.entities.User>" scope="request"/>
-
-<c:if test="${empty users}">
-    <div class="info-box">
-        <fmt:message key="no-users"/>
-    </div>
-</c:if>
-
-<div id="tool-area">
-    <a href="./${moduleInfo.modulePath}/edit" class="button"><fmt:message key="button.create"/></a>
-</div>
-
-<c:if test="${not empty users}">
-    <table class="datatable medskip">
-        <thead>
-        <tr>
-            <th></th>
-            <th><fmt:message key="thead.displayname"/></th>
-        </tr>
-        </thead>
-        <tbody>
-        <c:forEach var="user" items="${users}">
-            <tr>
-                <td><a href="./${moduleInfo.modulePath}/edit?id=${user.id}">&#x270e;</a></td>
-                <td><c:out value="${user.displayname}"/></td>
-            </tr>
-        </c:forEach>
-        </tbody>
-    </table>
-</c:if>
--- a/src/main/webapp/WEB-INF/dynamic_fragments/version-form.jsp	Fri May 22 17:19:09 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-<%--
-DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
-Copyright 2018 Mike Becker. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---%>
-<%@page pageEncoding="UTF-8" %>
-<%@page import="de.uapcore.lightpit.Constants" %>
-<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
-<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
-<c:set scope="page" var="selectedProject" value="${sessionScope[ProjectsModule.SESSION_ATTR_SELECTED_PROJECT]}"/>
-
-<jsp:useBean id="version" type="de.uapcore.lightpit.entities.Version" scope="request"/>
-<jsp:useBean id="versionStatusEnum" type="de.uapcore.lightpit.entities.VersionStatus[]" scope="request"/>
-
-<form action="./${moduleInfo.modulePath}/versions/commit" method="post">
-    <table class="formtable" style="width: 35ch">
-        <colgroup>
-            <col>
-            <col style="width: 100%">
-        </colgroup>
-        <tbody>
-        <tr>
-            <th><fmt:message key="thead.version.name"/></th>
-            <td><input name="name" type="text" maxlength="20" required value="${version.name}"/></td>
-        </tr>
-        <tr>
-            <th><fmt:message key="thead.version.status"/></th>
-            <td>
-                <select name="status" required>
-                    <c:forEach var="elem" items="${versionStatusEnum}">
-                        <option
-                                <c:if test="${elem eq version.status}">selected</c:if> value="${elem}"><fmt:message
-                                key="version.status.${elem}"/></option>
-                    </c:forEach>
-                </select>
-            </td>
-        </tr>
-        <tr title="<fmt:message key="tooltip.ordinal" />">
-            <th><fmt:message key="thead.version.ordinal"/></th>
-            <td>
-                <input name="ordinal" type="number" min="0" value="${version.ordinal}"/>
-            </td>
-        </tr>
-        </tbody>
-        <tfoot>
-        <tr>
-            <td colspan="2">
-                <input type="hidden" name="id" value="${version.id}"/>
-                <a href="./${moduleInfo.modulePath}/versions/" class="button"><fmt:message bundle="${lightpit_bundle}"
-                                                                                           key="button.cancel"/></a>
-                <button type="submit"><fmt:message bundle="${lightpit_bundle}" key="button.okay"/></button>
-            </td>
-        </tr>
-        </tfoot>
-    </table>
-</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/commit-successful.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,34 @@
+<%--
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:set scope="page" var="redirectLocation" value="${requestScope[Constants.REQ_ATTR_REDIRECT_LOCATION]}"/>
+
+<fmt:message bundle="${lightpit_bundle}" key="commit.success"/>
+<fmt:message bundle="${lightpit_bundle}" key="commit.redirect-link"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/error.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,67 @@
+<%-- 
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@page import="de.uapcore.lightpit.Constants" %>
+<%@page import="de.uapcore.lightpit.modules.ErrorModule" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+<c:set scope="page" var="baseHref" value="${requestScope[Constants.REQ_ATTR_BASE_HREF]}"/>
+<c:set scope="page" var="errorCode" value="${requestScope['javax.servlet.error.status_code']}"/>
+<c:set scope="page" var="returnLink" value="${requestScope[ErrorModule.REQ_ATTR_RETURN_LINK]}"/>
+
+<div id="error-page">
+    <h1><fmt:message key="h1"/></h1>
+    <table>
+        <tr>
+            <th><fmt:message key="errorCode"/>:</th>
+            <td>${errorCode} - <fmt:message key="code.${errorCode}"/></td>
+        </tr>
+        <tr>
+            <th><fmt:message key="errorMessage"/>:</th>
+            <td><c:out value="${requestScope['javax.servlet.error.message']}"/></td>
+        </tr>
+        <tr>
+            <th><fmt:message key="errorTimestamp"/>:</th>
+            <td><fmt:formatDate type="both" value="<%= new java.util.Date()%>"/></td>
+        </tr>
+        <%--@elvariable id="exception" type="java.lang.Exception"--%>
+        <c:if test="${not empty exception}">
+            <tr>
+                <th><fmt:message key="errorExceptionText"/>:</th>
+                <td>${exception['class'].name} - ${exception.message}</td>
+            </tr>
+        </c:if>
+        <c:if test="${fn:startsWith(returnLink, baseHref)}">
+            <tr>
+                <th><fmt:message key="errorReturnLink"/>:</th>
+                <td><a href="${returnLink}">${returnLink}</a></td>
+            </tr>
+        </c:if>
+    </table>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/language.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,52 @@
+<%-- 
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@page import="de.uapcore.lightpit.Constants" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<jsp:useBean id="languages" type="java.util.List<java.util.Locale>" scope="request"/>
+<jsp:useBean id="browserLanguage" type="java.util.Locale" scope="request"/>
+
+<c:set scope="page" var="currentLanguage" value="${sessionScope[Constants.SESSION_ATTR_LANGUAGE]}"/>
+
+<form method="POST" id="lang-selector">
+    <c:forEach items="${languages}" var="l">
+        <label>
+            <input type="radio" name="language" value="${l.language}"
+                   <c:if test="${l.language eq currentLanguage.language}">checked</c:if>/>
+                ${l.displayLanguage}
+            (${l.getDisplayLanguage(currentLanguage)}
+            <c:if test="${not empty browserLanguage and l.language eq browserLanguage.language}"><c:set
+                    var="browserLanguagePresent" value="true"/>&nbsp;-&nbsp;<fmt:message key="browserLanguage"/></c:if>)
+        </label>
+    </c:forEach>
+    <c:if test="${not browserLanguagePresent}">
+        <span class="blNA"><fmt:message key="browserLanguageNotAvailable"/></span>
+    </c:if>
+    <input type="submit" value="<fmt:message key="submit" />"/>
+</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/project-details.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,80 @@
+<%--
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@page import="de.uapcore.lightpit.Constants" %>
+<%@page import="de.uapcore.lightpit.modules.ProjectsModule" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
+<c:set scope="page" var="selectedProject" value="${sessionScope[ProjectsModule.SESSION_ATTR_SELECTED_PROJECT]}"/>
+
+<jsp:useBean id="versions" type="java.util.List<de.uapcore.lightpit.entities.Version>" scope="request"/>
+<jsp:useBean id="issues" type="java.util.List<de.uapcore.lightpit.entities.Issue>" scope="request"/>
+
+<div id="tool-area">
+    <a href="./${moduleInfo.modulePath}/versions/edit" class="button"><fmt:message key="button.version.create"/></a>
+    <a href="./${moduleInfo.modulePath}/issues/edit" class="button"><fmt:message key="button.issue.create"/></a>
+</div>
+
+<c:if test="${not empty versions}">
+    <table id="version-list" class="datatable medskip">
+        <thead>
+        <tr>
+            <th></th>
+            <th><fmt:message key="thead.version.name"/></th>
+            <th><fmt:message key="thead.version.status"/></th>
+        </tr>
+        </thead>
+        <tbody>
+        <c:forEach var="version" items="${versions}">
+            <tr class="nowrap">
+                <td style="width: 2em;"><a href="./${moduleInfo.modulePath}/versions/edit?id=${version.id}">&#x270e;</a>
+                </td>
+                <td><c:out value="${version.name}"/></td>
+                <td><fmt:message key="version.status.${version.status}"/></td>
+            </tr>
+        </c:forEach>
+        </tbody>
+    </table>
+</c:if>
+
+<table id="issue-list" class="datatable medskip">
+    <thead>
+    <tr>
+        <th></th>
+        <th><fmt:message key="thead.issue.subject"/></th>
+        <th><fmt:message key="thead.issue.category"/></th>
+        <th><fmt:message key="thead.issue.status"/></th>
+        <th><fmt:message key="thead.issue.created"/></th>
+        <th><fmt:message key="thead.issue.updated"/></th>
+        <th><fmt:message key="thead.issue.eta"/></th>
+        <!-- TODO: add other information -->
+    </tr>
+    </thead>
+    <!-- TODO: add actual list -->
+</table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/project-form.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,81 @@
+<%--
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@page import="de.uapcore.lightpit.Constants" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
+
+<jsp:useBean id="project" type="de.uapcore.lightpit.entities.Project" scope="request"/>
+<jsp:useBean id="users" type="java.util.List<de.uapcore.lightpit.entities.User>" scope="request"/>
+
+<form action="./${moduleInfo.modulePath}/commit" method="post">
+    <table class="formtable">
+        <colgroup>
+            <col>
+            <col style="width: 75ch">
+        </colgroup>
+        <tbody>
+        <tr>
+            <th><fmt:message key="thead.name"/></th>
+            <td><input name="name" type="text" maxlength="20" required value="${project.name}"/></td>
+        </tr>
+        <tr>
+            <th class="vtop"><fmt:message key="thead.description"/></th>
+            <td><input type="text" name="description" maxlength="200" value="${project.description}"/></td>
+        </tr>
+        <tr>
+            <th><fmt:message key="thead.repoUrl"/></th>
+            <td><input name="repoUrl" type="url" maxlength="50" value="${project.repoUrl}"/></td>
+        </tr>
+        <tr>
+            <th><fmt:message key="thead.owner"/></th>
+            <td>
+                <select name="owner">
+                    <option value="-1"><fmt:message key="placeholder.null-owner"/></option>
+                    <c:forEach var="user" items="${users}">
+                        <option
+                                <c:if test="${not empty project.owner and user.id eq project.owner.id}">selected</c:if>
+                                value="${user.id}"><c:out value="${user.displayname}"/></option>
+                    </c:forEach>
+                </select>
+            </td>
+        </tr>
+        </tbody>
+        <tfoot>
+        <tr>
+            <td colspan="2">
+                <input type="hidden" name="id" value="${project.id}"/>
+                <a href="./${moduleInfo.modulePath}/" class="button"><fmt:message bundle="${lightpit_bundle}"
+                                                                                  key="button.cancel"/></a>
+                <button type="submit"><fmt:message bundle="${lightpit_bundle}" key="button.okay"/></button>
+            </td>
+        </tr>
+        </tfoot>
+    </table>
+</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/projects.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,87 @@
+<%--
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@page import="de.uapcore.lightpit.Constants" %>
+<%@page import="de.uapcore.lightpit.modules.ProjectsModule" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
+<c:set scope="page" var="selectedProject" value="${sessionScope[ProjectsModule.SESSION_ATTR_SELECTED_PROJECT]}"/>
+
+<jsp:useBean id="projects" type="java.util.List<de.uapcore.lightpit.entities.Project>" scope="request"/>
+
+<c:if test="${empty projects}">
+    <div class="info-box">
+        <fmt:message key="no-projects"/>
+    </div>
+</c:if>
+
+<div id="tool-area">
+    <a href="./${moduleInfo.modulePath}/edit" class="button"><fmt:message key="button.create"/></a>
+</div>
+
+<c:if test="${not empty projects}">
+    <table id="project-list" class="datatable medskip fullwidth">
+        <colgroup>
+            <col>
+            <col style="width: 10%">
+            <col style="width: 35%">
+            <col style="width: 30%">
+            <col style="width: 25%">
+        </colgroup>
+        <thead>
+        <tr>
+            <th></th>
+            <th><fmt:message key="thead.name"/></th>
+            <th><fmt:message key="thead.description"/></th>
+            <th><fmt:message key="thead.repoUrl"/></th>
+            <th><fmt:message key="thead.owner"/></th>
+        </tr>
+        </thead>
+        <tbody>
+        <c:forEach var="project" items="${projects}">
+            <tr class="nowrap">
+                <td style="width: 2em;"><a href="./${moduleInfo.modulePath}/edit?id=${project.id}">&#x270e;</a></td>
+                <td><a href="./${moduleInfo.modulePath}/view?pid=${project.id}"><c:out value="${project.name}"/></a>
+                </td>
+                <td><c:out value="${project.description}"/></td>
+                <td>
+                    <c:if test="${not empty project.repoUrl}">
+                        <a target="_blank" href="<c:out value="${project.repoUrl}"/>"><c:out
+                                value="${project.repoUrl}"/></a>
+                    </c:if>
+                </td>
+                <td>
+                    <c:if test="${not empty project.owner}"><c:out value="${project.owner.displayname}"/></c:if>
+                    <c:if test="${empty project.owner}"><fmt:message key="placeholder.null-owner"/></c:if>
+                </td>
+            </tr>
+        </c:forEach>
+        </tbody>
+    </table>
+</c:if>
--- a/src/main/webapp/WEB-INF/jsp/site.jsp	Fri May 22 17:19:09 2020 +0200
+++ b/src/main/webapp/WEB-INF/jsp/site.jsp	Fri May 22 17:26:27 2020 +0200
@@ -43,8 +43,8 @@
 <%-- Define an alias for the main menu --%>
 <c:set scope="page" var="breadcrumbs" value="${requestScope[Constants.REQ_ATTR_BREADCRUMBS]}"/>
 
-<%-- Define an alias for the fragment name --%>
-<c:set scope="page" var="fragment" value="${requestScope[Constants.REQ_ATTR_FRAGMENT]}"/>
+<%-- Define an alias for the content page name --%>
+<c:set scope="page" var="contentPage" value="${requestScope[Constants.REQ_ATTR_CONTENT_PAGE]}"/>
 
 <%-- Define an alias for the optional redirect location --%>
 <c:set scope="page" var="redirectLocation" value="${requestScope[Constants.REQ_ATTR_REDIRECT_LOCATION]}"/>
@@ -95,10 +95,10 @@
     </div>
 </c:if>
 <div id="content-area">
-    <c:if test="${not empty fragment}">
+    <c:if test="${not empty contentPage}">
         <fmt:setBundle scope="request" basename="${moduleInfo.bundleBaseName}"/>
         <fmt:setBundle scope="request" var="lightpit_bundle" basename="localization.lightpit"/>
-        <c:import url="${fragment}"/>
+        <c:import url="${contentPage}"/>
     </c:if>
 </div>
 </body>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/user-form.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,72 @@
+<%--
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@page import="de.uapcore.lightpit.Constants" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
+
+<jsp:useBean id="user" type="de.uapcore.lightpit.entities.User" scope="request"/>
+
+<form action="./${moduleInfo.modulePath}/commit" method="post">
+    <table class="formtable">
+        <colgroup>
+            <col>
+            <col style="width: 50ch">
+        </colgroup>
+        <tbody>
+        <tr>
+            <th><fmt:message key="thead.username"/></th>
+            <td><input name="username" type="text" maxlength="50" required value="${user.username}"
+                       <c:if test="${user.id ge 0}">readonly</c:if> /></td>
+        </tr>
+        <tr>
+            <th><fmt:message key="thead.givenname"/></th>
+            <td><input name="givenname" type="text" maxlength="50" value="${user.givenname}"/></td>
+        </tr>
+        <tr>
+            <th><fmt:message key="thead.lastname"/></th>
+            <td><input name="lastname" type="text" maxlength="50" value="${user.lastname}"/></td>
+        </tr>
+        <tr>
+            <th><fmt:message key="thead.mail"/></th>
+            <td><input name="mail" type="email" maxlength="50" value="${user.mail}"/></td>
+        </tr>
+        </tbody>
+        <tfoot>
+        <tr>
+            <td colspan="2">
+                <input type="hidden" name="userid" value="${user.id}"/>
+                <a href="./${moduleInfo.modulePath}/" class="button"><fmt:message bundle="${lightpit_bundle}"
+                                                                                  key="button.cancel"/></a>
+                <button type="submit"><fmt:message bundle="${lightpit_bundle}" key="button.okay"/></button>
+            </td>
+        </tr>
+        </tfoot>
+    </table>
+</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/users.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,63 @@
+<%--
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@page import="de.uapcore.lightpit.Constants" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
+
+<jsp:useBean id="users" type="java.util.List<de.uapcore.lightpit.entities.User>" scope="request"/>
+
+<c:if test="${empty users}">
+    <div class="info-box">
+        <fmt:message key="no-users"/>
+    </div>
+</c:if>
+
+<div id="tool-area">
+    <a href="./${moduleInfo.modulePath}/edit" class="button"><fmt:message key="button.create"/></a>
+</div>
+
+<c:if test="${not empty users}">
+    <table class="datatable medskip">
+        <thead>
+        <tr>
+            <th></th>
+            <th><fmt:message key="thead.displayname"/></th>
+        </tr>
+        </thead>
+        <tbody>
+        <c:forEach var="user" items="${users}">
+            <tr>
+                <td><a href="./${moduleInfo.modulePath}/edit?id=${user.id}">&#x270e;</a></td>
+                <td><c:out value="${user.displayname}"/></td>
+            </tr>
+        </c:forEach>
+        </tbody>
+    </table>
+</c:if>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/jsp/version-form.jsp	Fri May 22 17:26:27 2020 +0200
@@ -0,0 +1,79 @@
+<%--
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright 2018 Mike Becker. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--%>
+<%@page pageEncoding="UTF-8" %>
+<%@page import="de.uapcore.lightpit.Constants" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:set scope="page" var="moduleInfo" value="${requestScope[Constants.REQ_ATTR_MODULE_INFO]}"/>
+<c:set scope="page" var="selectedProject" value="${sessionScope[ProjectsModule.SESSION_ATTR_SELECTED_PROJECT]}"/>
+
+<jsp:useBean id="version" type="de.uapcore.lightpit.entities.Version" scope="request"/>
+<jsp:useBean id="versionStatusEnum" type="de.uapcore.lightpit.entities.VersionStatus[]" scope="request"/>
+
+<form action="./${moduleInfo.modulePath}/versions/commit" method="post">
+    <table class="formtable" style="width: 35ch">
+        <colgroup>
+            <col>
+            <col style="width: 100%">
+        </colgroup>
+        <tbody>
+        <tr>
+            <th><fmt:message key="thead.version.name"/></th>
+            <td><input name="name" type="text" maxlength="20" required value="${version.name}"/></td>
+        </tr>
+        <tr>
+            <th><fmt:message key="thead.version.status"/></th>
+            <td>
+                <select name="status" required>
+                    <c:forEach var="elem" items="${versionStatusEnum}">
+                        <option
+                                <c:if test="${elem eq version.status}">selected</c:if> value="${elem}"><fmt:message
+                                key="version.status.${elem}"/></option>
+                    </c:forEach>
+                </select>
+            </td>
+        </tr>
+        <tr title="<fmt:message key="tooltip.ordinal" />">
+            <th><fmt:message key="thead.version.ordinal"/></th>
+            <td>
+                <input name="ordinal" type="number" min="0" value="${version.ordinal}"/>
+            </td>
+        </tr>
+        </tbody>
+        <tfoot>
+        <tr>
+            <td colspan="2">
+                <input type="hidden" name="id" value="${version.id}"/>
+                <a href="./${moduleInfo.modulePath}/versions/" class="button"><fmt:message bundle="${lightpit_bundle}"
+                                                                                           key="button.cancel"/></a>
+                <button type="submit"><fmt:message bundle="${lightpit_bundle}" key="button.okay"/></button>
+            </td>
+        </tr>
+        </tfoot>
+    </table>
+</form>

mercurial