From e7654ff9300ace3bd8bb9777c721e64a1dc91264 Mon Sep 17 00:00:00 2001 From: Chris McCormick Date: Mon, 7 Oct 2019 02:45:25 +0800 Subject: [PATCH] Removing java-spark-app as per #99. (#110) --- examples/java-spark-app/.gitignore | 135 -------- examples/java-spark-app/ENV | 5 - examples/java-spark-app/LICENSE | 202 ------------ examples/java-spark-app/Procfile | 1 - examples/java-spark-app/README.md | 30 -- examples/java-spark-app/pom.xml | 81 ----- .../src/main/java/app/Application.java | 47 --- .../src/main/java/app/book/Book.java | 18 -- .../main/java/app/book/BookController.java | 39 --- .../src/main/java/app/book/BookDao.java | 34 --- .../main/java/app/index/IndexController.java | 15 - .../main/java/app/login/LoginController.java | 48 --- .../src/main/java/app/user/User.java | 10 - .../main/java/app/user/UserController.java | 30 -- .../src/main/java/app/user/UserDao.java | 24 -- .../src/main/java/app/util/Filters.java | 30 -- .../src/main/java/app/util/JsonUtil.java | 18 -- .../src/main/java/app/util/MessageBundle.java | 23 -- .../src/main/java/app/util/Path.java | 25 -- .../src/main/java/app/util/RequestUtil.java | 57 ---- .../src/main/java/app/util/ViewUtil.java | 39 --- .../localization/messages_de.properties | 33 -- .../localization/messages_en.properties | 33 -- .../src/main/resources/public/img/english.png | Bin 56203 -> 0 bytes .../src/main/resources/public/img/favicon.png | Bin 2071 -> 0 bytes .../src/main/resources/public/img/german.png | Bin 52123 -> 0 bytes .../src/main/resources/public/img/logo.png | Bin 3446 -> 0 bytes .../src/main/resources/public/main.css | 288 ------------------ .../src/main/resources/velocity/book/all.vm | 16 - .../src/main/resources/velocity/book/one.vm | 14 - .../main/resources/velocity/index/index.vm | 22 -- .../src/main/resources/velocity/layout.vm | 47 --- .../main/resources/velocity/login/login.vm | 22 -- .../src/main/resources/velocity/notFound.vm | 4 - .../velocityconfig/velocity_implicit.vm | 11 - 35 files changed, 1401 deletions(-) delete mode 100644 examples/java-spark-app/.gitignore delete mode 100644 examples/java-spark-app/ENV delete mode 100644 examples/java-spark-app/LICENSE delete mode 100644 examples/java-spark-app/Procfile delete mode 100644 examples/java-spark-app/README.md delete mode 100644 examples/java-spark-app/pom.xml delete mode 100644 examples/java-spark-app/src/main/java/app/Application.java delete mode 100644 examples/java-spark-app/src/main/java/app/book/Book.java delete mode 100644 examples/java-spark-app/src/main/java/app/book/BookController.java delete mode 100644 examples/java-spark-app/src/main/java/app/book/BookDao.java delete mode 100644 examples/java-spark-app/src/main/java/app/index/IndexController.java delete mode 100644 examples/java-spark-app/src/main/java/app/login/LoginController.java delete mode 100644 examples/java-spark-app/src/main/java/app/user/User.java delete mode 100644 examples/java-spark-app/src/main/java/app/user/UserController.java delete mode 100644 examples/java-spark-app/src/main/java/app/user/UserDao.java delete mode 100644 examples/java-spark-app/src/main/java/app/util/Filters.java delete mode 100644 examples/java-spark-app/src/main/java/app/util/JsonUtil.java delete mode 100644 examples/java-spark-app/src/main/java/app/util/MessageBundle.java delete mode 100644 examples/java-spark-app/src/main/java/app/util/Path.java delete mode 100644 examples/java-spark-app/src/main/java/app/util/RequestUtil.java delete mode 100644 examples/java-spark-app/src/main/java/app/util/ViewUtil.java delete mode 100644 examples/java-spark-app/src/main/resources/localization/messages_de.properties delete mode 100644 examples/java-spark-app/src/main/resources/localization/messages_en.properties delete mode 100644 examples/java-spark-app/src/main/resources/public/img/english.png delete mode 100644 examples/java-spark-app/src/main/resources/public/img/favicon.png delete mode 100644 examples/java-spark-app/src/main/resources/public/img/german.png delete mode 100644 examples/java-spark-app/src/main/resources/public/img/logo.png delete mode 100644 examples/java-spark-app/src/main/resources/public/main.css delete mode 100644 examples/java-spark-app/src/main/resources/velocity/book/all.vm delete mode 100644 examples/java-spark-app/src/main/resources/velocity/book/one.vm delete mode 100644 examples/java-spark-app/src/main/resources/velocity/index/index.vm delete mode 100644 examples/java-spark-app/src/main/resources/velocity/layout.vm delete mode 100644 examples/java-spark-app/src/main/resources/velocity/login/login.vm delete mode 100644 examples/java-spark-app/src/main/resources/velocity/notFound.vm delete mode 100644 examples/java-spark-app/src/main/resources/velocityconfig/velocity_implicit.vm diff --git a/examples/java-spark-app/.gitignore b/examples/java-spark-app/.gitignore deleted file mode 100644 index 50e7380..0000000 --- a/examples/java-spark-app/.gitignore +++ /dev/null @@ -1,135 +0,0 @@ -# Created by https://www.gitignore.io - -### Windows ### -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - - -### OSX ### -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - - -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm - -*.iml - -## Directory-based project format: -.idea/ -# if you remove the above rule, at least ignore the following: - -# User-specific stuff: -# .idea/workspace.xml -# .idea/tasks.xml -# .idea/dictionaries - -# Sensitive or high-churn files: -# .idea/dataSources.ids -# .idea/dataSources.xml -# .idea/sqlDataSources.xml -# .idea/dynamic.xml -# .idea/uiDesigner.xml - -# Gradle: -# .idea/gradle.xml -# .idea/libraries - -# Mongo Explorer plugin: -# .idea/mongoSettings.xml - -## File-based project format: -*.ipr -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties - - -### Java ### -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -target - - -# Created by https://www.gitignore.io/api/gradle - -### Gradle ### -.gradle -build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -# Cache of project -.gradletasknamecache - -# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 -# gradle/wrapper/gradle-wrapper.properties -# Avoid Maven target files -target/ \ No newline at end of file diff --git a/examples/java-spark-app/ENV b/examples/java-spark-app/ENV deleted file mode 100644 index 3c69ba9..0000000 --- a/examples/java-spark-app/ENV +++ /dev/null @@ -1,5 +0,0 @@ -AUTORESTART=1 -RANGE=10 -PORT=6500 -BIND_ADDRESS=0.0.0.0 -INTERVAL=1 diff --git a/examples/java-spark-app/LICENSE b/examples/java-spark-app/LICENSE deleted file mode 100644 index 0ac0889..0000000 --- a/examples/java-spark-app/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2015 David Åse - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/examples/java-spark-app/Procfile b/examples/java-spark-app/Procfile deleted file mode 100644 index 5b544ff..0000000 --- a/examples/java-spark-app/Procfile +++ /dev/null @@ -1 +0,0 @@ -jwsgi: mvn exec:java -Dexec.mainClass=app.Application diff --git a/examples/java-spark-app/README.md b/examples/java-spark-app/README.md deleted file mode 100644 index f998e5e..0000000 --- a/examples/java-spark-app/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# spark-basic-structure - -[![asciicast](https://asciinema.org/a/257670.svg)](https://asciinema.org/a/257670) - -Java on Piku Micro PaaS on Ubuntu 18 and Linux Mint 19 -This is an example of one possible way of structuring a Spark application. - -This is a simple Java app that demonstrates deploying your apps on Piku. - -To publish this app to `piku`, make a copy of this folder and run the following commands: - -```bash -cd sparkAppp_copy -git init . -git remote add piku piku@your_server:sparkApp -git add . -git commit -a -m "initial commit" -git push piku master -``` - -The application has filters, controllers, views, authentication, localization, error handling, and more. -It contains the source code for the tutorial found at https://sparktutorials.github.io/2016/06/10/spark-basic-structure.html - -## Some Issues -Default procfile should look exactly like this one. -The live config needs the app directory under virtual environment.... Please do not specify the virtual environment in the ENV file. - - -## Screenshot -![Application Screenshot](https://sparktutorials.github.io/img/posts/sparkBasicStructure/screenshot.png) diff --git a/examples/java-spark-app/pom.xml b/examples/java-spark-app/pom.xml deleted file mode 100644 index 356b5c5..0000000 --- a/examples/java-spark-app/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - 4.0.0 - - spark-basic-structure - spark-basic-structure - 1.0-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - org.codehaus.mojo - exec-maven-plugin - 1.2.1 - - app.Application - - - - - - - - - - com.sparkjava - spark-core - 2.7.2 - - - com.sparkjava - spark-debug-tools - 0.5 - - - com.sparkjava - spark-template-velocity - 2.3 - - - org.slf4j - slf4j-simple - 1.7.13 - - - org.projectlombok - lombok - 1.16.6 - - - com.fasterxml.jackson.core - jackson-core - 2.5.1 - - - com.fasterxml.jackson.core - jackson-databind - 2.9.9 - - - com.google.guava - guava - 19.0 - - - org.mindrot - jbcrypt - 0.3m - - - - diff --git a/examples/java-spark-app/src/main/java/app/Application.java b/examples/java-spark-app/src/main/java/app/Application.java deleted file mode 100644 index 035a10c..0000000 --- a/examples/java-spark-app/src/main/java/app/Application.java +++ /dev/null @@ -1,47 +0,0 @@ -package app; - -import app.book.*; -import app.index.*; -import app.login.*; -import app.user.*; -import app.util.*; -import static spark.Spark.*; -import static spark.debug.DebugScreen.*; - -public class Application { - - // Declare dependencies - public static BookDao bookDao; - public static UserDao userDao; - - public static void main(String[] args) { - - // Instantiate your dependencies - bookDao = new BookDao(); - userDao = new UserDao(); - - // Configure Spark - port(6500); - staticFiles.location("/public"); - staticFiles.expireTime(600L); - enableDebugScreen(); - - // Set up before-filters (called before each get/post) - before("*", Filters.addTrailingSlashes); - before("*", Filters.handleLocaleChange); - - // Set up routes - get(Path.Web.INDEX, IndexController.serveIndexPage); - get(Path.Web.BOOKS, BookController.fetchAllBooks); - get(Path.Web.ONE_BOOK, BookController.fetchOneBook); - get(Path.Web.LOGIN, LoginController.serveLoginPage); - post(Path.Web.LOGIN, LoginController.handleLoginPost); - post(Path.Web.LOGOUT, LoginController.handleLogoutPost); - get("*", ViewUtil.notFound); - - //Set up after-filters (called after each get/post) - after("*", Filters.addGzipHeader); - - } - -} diff --git a/examples/java-spark-app/src/main/java/app/book/Book.java b/examples/java-spark-app/src/main/java/app/book/Book.java deleted file mode 100644 index 3c197e8..0000000 --- a/examples/java-spark-app/src/main/java/app/book/Book.java +++ /dev/null @@ -1,18 +0,0 @@ -package app.book; - -import lombok.*; - -@Value // All fields are private and final. Getters (but not setters) are generated (https://projectlombok.org/features/Value.html) -public class Book { - String title; - String author; - String isbn; - - public String getMediumCover() { - return "http://covers.openlibrary.org/b/isbn/" + this.isbn + "-M.jpg"; - } - - public String getLargeCover() { - return "http://covers.openlibrary.org/b/isbn/" + this.isbn + "-L.jpg"; - } -} diff --git a/examples/java-spark-app/src/main/java/app/book/BookController.java b/examples/java-spark-app/src/main/java/app/book/BookController.java deleted file mode 100644 index 800b541..0000000 --- a/examples/java-spark-app/src/main/java/app/book/BookController.java +++ /dev/null @@ -1,39 +0,0 @@ -package app.book; - -import app.login.*; -import app.util.*; -import spark.*; -import java.util.*; -import static app.Application.bookDao; -import static app.util.JsonUtil.*; -import static app.util.RequestUtil.*; - -public class BookController { - - public static Route fetchAllBooks = (Request request, Response response) -> { - LoginController.ensureUserIsLoggedIn(request, response); - if (clientAcceptsHtml(request)) { - HashMap model = new HashMap<>(); - model.put("books", bookDao.getAllBooks()); - return ViewUtil.render(request, model, Path.Template.BOOKS_ALL); - } - if (clientAcceptsJson(request)) { - return dataToJson(bookDao.getAllBooks()); - } - return ViewUtil.notAcceptable.handle(request, response); - }; - - public static Route fetchOneBook = (Request request, Response response) -> { - LoginController.ensureUserIsLoggedIn(request, response); - if (clientAcceptsHtml(request)) { - HashMap model = new HashMap<>(); - Book book = bookDao.getBookByIsbn(getParamIsbn(request)); - model.put("book", book); - return ViewUtil.render(request, model, Path.Template.BOOKS_ONE); - } - if (clientAcceptsJson(request)) { - return dataToJson(bookDao.getBookByIsbn(getParamIsbn(request))); - } - return ViewUtil.notAcceptable.handle(request, response); - }; -} diff --git a/examples/java-spark-app/src/main/java/app/book/BookDao.java b/examples/java-spark-app/src/main/java/app/book/BookDao.java deleted file mode 100644 index 1beb1c7..0000000 --- a/examples/java-spark-app/src/main/java/app/book/BookDao.java +++ /dev/null @@ -1,34 +0,0 @@ -package app.book; - -import com.google.common.collect.*; -import java.util.*; - -public class BookDao { - - private final List books = ImmutableList.of( - new Book("Moby Dick", "Herman Melville", "9789583001215"), - new Book("A Christmas Carol", "Charles Dickens", "9780141324524"), - new Book("Pride and Prejudice", "Jane Austen", "9781936594290"), - new Book("The Fellowship of The Ring", "J. R. R. Tolkien", "0007171978"), - new Book("Harry Potter", "J. K. Rowling", "0747532699"), - new Book("War and Peace", "Leo Tolstoy", "9780060798871"), - new Book("Don Quixote", "Miguel Cervantes", "9789626345221"), - new Book("Ulysses", "James Joyce", "9780394703800"), - new Book("The Great Gatsby", "F. Scott Fitzgerald", "9780743273565"), - new Book("One Hundred Years of Solitude", "Gabriel Garcia Marquez", "9780060531041"), - new Book("The adventures of Huckleberry Finn", "Mark Twain", "9781591940296"), - new Book("Alice In Wonderland", "Lewis Carrol", "9780439291491") - ); - - public Iterable getAllBooks() { - return books; - } - - public Book getBookByIsbn(String isbn) { - return books.stream().filter(b -> b.getIsbn().equals(isbn)).findFirst().orElse(null); - } - - public Book getRandomBook() { - return books.get(new Random().nextInt(books.size())); - } -} diff --git a/examples/java-spark-app/src/main/java/app/index/IndexController.java b/examples/java-spark-app/src/main/java/app/index/IndexController.java deleted file mode 100644 index ec5839f..0000000 --- a/examples/java-spark-app/src/main/java/app/index/IndexController.java +++ /dev/null @@ -1,15 +0,0 @@ -package app.index; - -import app.util.*; -import spark.*; -import java.util.*; -import static app.Application.*; - -public class IndexController { - public static Route serveIndexPage = (Request request, Response response) -> { - Map model = new HashMap<>(); - model.put("users", userDao.getAllUserNames()); - model.put("book", bookDao.getRandomBook()); - return ViewUtil.render(request, model, Path.Template.INDEX); - }; -} diff --git a/examples/java-spark-app/src/main/java/app/login/LoginController.java b/examples/java-spark-app/src/main/java/app/login/LoginController.java deleted file mode 100644 index 84a961c..0000000 --- a/examples/java-spark-app/src/main/java/app/login/LoginController.java +++ /dev/null @@ -1,48 +0,0 @@ -package app.login; - -import app.user.*; -import app.util.*; -import spark.*; -import java.util.*; -import static app.util.RequestUtil.*; - -public class LoginController { - - public static Route serveLoginPage = (Request request, Response response) -> { - Map model = new HashMap<>(); - model.put("loggedOut", removeSessionAttrLoggedOut(request)); - model.put("loginRedirect", removeSessionAttrLoginRedirect(request)); - return ViewUtil.render(request, model, Path.Template.LOGIN); - }; - - public static Route handleLoginPost = (Request request, Response response) -> { - Map model = new HashMap<>(); - if (!UserController.authenticate(getQueryUsername(request), getQueryPassword(request))) { - model.put("authenticationFailed", true); - return ViewUtil.render(request, model, Path.Template.LOGIN); - } - model.put("authenticationSucceeded", true); - request.session().attribute("currentUser", getQueryUsername(request)); - if (getQueryLoginRedirect(request) != null) { - response.redirect(getQueryLoginRedirect(request)); - } - return ViewUtil.render(request, model, Path.Template.LOGIN); - }; - - public static Route handleLogoutPost = (Request request, Response response) -> { - request.session().removeAttribute("currentUser"); - request.session().attribute("loggedOut", true); - response.redirect(Path.Web.LOGIN); - return null; - }; - - // The origin of the request (request.pathInfo()) is saved in the session so - // the user can be redirected back after login - public static void ensureUserIsLoggedIn(Request request, Response response) { - if (request.session().attribute("currentUser") == null) { - request.session().attribute("loginRedirect", request.pathInfo()); - response.redirect(Path.Web.LOGIN); - } - }; - -} diff --git a/examples/java-spark-app/src/main/java/app/user/User.java b/examples/java-spark-app/src/main/java/app/user/User.java deleted file mode 100644 index 92bb2b3..0000000 --- a/examples/java-spark-app/src/main/java/app/user/User.java +++ /dev/null @@ -1,10 +0,0 @@ -package app.user; - -import lombok.*; - -@Value // All fields are private and final. Getters (but not setters) are generated (https://projectlombok.org/features/Value.html) -public class User { - String username; - String salt; - String hashedPassword; -} diff --git a/examples/java-spark-app/src/main/java/app/user/UserController.java b/examples/java-spark-app/src/main/java/app/user/UserController.java deleted file mode 100644 index 6f4a4c3..0000000 --- a/examples/java-spark-app/src/main/java/app/user/UserController.java +++ /dev/null @@ -1,30 +0,0 @@ -package app.user; - -import org.mindrot.jbcrypt.*; -import static app.Application.userDao; - -public class UserController { - - // Authenticate the user by hashing the inputted password using the stored salt, - // then comparing the generated hashed password to the stored hashed password - public static boolean authenticate(String username, String password) { - if (username.isEmpty() || password.isEmpty()) { - return false; - } - User user = userDao.getUserByUsername(username); - if (user == null) { - return false; - } - String hashedPassword = BCrypt.hashpw(password, user.getSalt()); - return hashedPassword.equals(user.getHashedPassword()); - } - - // This method doesn't do anything, it's just included as an example - public static void setPassword(String username, String oldPassword, String newPassword) { - if (authenticate(username, oldPassword)) { - String newSalt = BCrypt.gensalt(); - String newHashedPassword = BCrypt.hashpw(newSalt, newPassword); - // Update the user salt and password - } - } -} diff --git a/examples/java-spark-app/src/main/java/app/user/UserDao.java b/examples/java-spark-app/src/main/java/app/user/UserDao.java deleted file mode 100644 index e7f0b8c..0000000 --- a/examples/java-spark-app/src/main/java/app/user/UserDao.java +++ /dev/null @@ -1,24 +0,0 @@ -package app.user; - -import com.google.common.collect.*; -import java.util.*; -import java.util.stream.*; - -public class UserDao { - - private final List users = ImmutableList.of( - // Username Salt for hash Hashed password (the password is "password" for all users) - new User("perwendel", "$2a$10$h.dl5J86rGH7I8bD9bZeZe", "$2a$10$h.dl5J86rGH7I8bD9bZeZeci0pDt0.VwFTGujlnEaZXPf/q7vM5wO"), - new User("davidase", "$2a$10$e0MYzXyjpJS7Pd0RVvHwHe", "$2a$10$e0MYzXyjpJS7Pd0RVvHwHe1HlCS4bZJ18JuywdEMLT83E1KDmUhCy"), - new User("federico", "$2a$10$E3DgchtVry3qlYlzJCsyxe", "$2a$10$E3DgchtVry3qlYlzJCsyxeSK0fftK4v0ynetVCuDdxGVl1obL.ln2") - ); - - public User getUserByUsername(String username) { - return users.stream().filter(b -> b.getUsername().equals(username)).findFirst().orElse(null); - } - - public Iterable getAllUserNames() { - return users.stream().map(User::getUsername).collect(Collectors.toList()); - } - -} diff --git a/examples/java-spark-app/src/main/java/app/util/Filters.java b/examples/java-spark-app/src/main/java/app/util/Filters.java deleted file mode 100644 index 927a2d5..0000000 --- a/examples/java-spark-app/src/main/java/app/util/Filters.java +++ /dev/null @@ -1,30 +0,0 @@ -package app.util; - -import spark.*; -import static app.util.RequestUtil.*; - -public class Filters { - - // If a user manually manipulates paths and forgets to add - // a trailing slash, redirect the user to the correct path - public static Filter addTrailingSlashes = (Request request, Response response) -> { - if (!request.pathInfo().endsWith("/")) { - response.redirect(request.pathInfo() + "/"); - } - }; - - // Locale change can be initiated from any page - // The locale is extracted from the request and saved to the user's session - public static Filter handleLocaleChange = (Request request, Response response) -> { - if (getQueryLocale(request) != null) { - request.session().attribute("locale", getQueryLocale(request)); - response.redirect(request.pathInfo()); - } - }; - - // Enable GZIP for all responses - public static Filter addGzipHeader = (Request request, Response response) -> { - response.header("Content-Encoding", "gzip"); - }; - -} diff --git a/examples/java-spark-app/src/main/java/app/util/JsonUtil.java b/examples/java-spark-app/src/main/java/app/util/JsonUtil.java deleted file mode 100644 index aae4ff8..0000000 --- a/examples/java-spark-app/src/main/java/app/util/JsonUtil.java +++ /dev/null @@ -1,18 +0,0 @@ -package app.util; - -import com.fasterxml.jackson.databind.*; -import java.io.*; - -public class JsonUtil { - public static String dataToJson(Object data) { - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.enable(SerializationFeature.INDENT_OUTPUT); - StringWriter sw = new StringWriter(); - mapper.writeValue(sw, data); - return sw.toString(); - } catch (IOException e) { - throw new RuntimeException("IOEXception while mapping object (" + data + ") to JSON"); - } - } -} diff --git a/examples/java-spark-app/src/main/java/app/util/MessageBundle.java b/examples/java-spark-app/src/main/java/app/util/MessageBundle.java deleted file mode 100644 index ced68fd..0000000 --- a/examples/java-spark-app/src/main/java/app/util/MessageBundle.java +++ /dev/null @@ -1,23 +0,0 @@ -package app.util; - -import java.text.*; -import java.util.*; - -public class MessageBundle { - - private ResourceBundle messages; - - public MessageBundle(String languageTag) { - Locale locale = languageTag != null ? new Locale(languageTag) : Locale.ENGLISH; - this.messages = ResourceBundle.getBundle("localization/messages", locale); - } - - public String get(String message) { - return messages.getString(message); - } - - public final String get(final String key, final Object... args) { - return MessageFormat.format(get(key), args); - } - -} diff --git a/examples/java-spark-app/src/main/java/app/util/Path.java b/examples/java-spark-app/src/main/java/app/util/Path.java deleted file mode 100644 index 32b7f66..0000000 --- a/examples/java-spark-app/src/main/java/app/util/Path.java +++ /dev/null @@ -1,25 +0,0 @@ -package app.util; - -import lombok.*; - -public class Path { - - // The @Getter methods are needed in order to access - // the variables from Velocity Templates - public static class Web { - @Getter public static final String INDEX = "/index/"; - @Getter public static final String LOGIN = "/login/"; - @Getter public static final String LOGOUT = "/logout/"; - @Getter public static final String BOOKS = "/books/"; - @Getter public static final String ONE_BOOK = "/books/:isbn/"; - } - - public static class Template { - public final static String INDEX = "/velocity/index/index.vm"; - public final static String LOGIN = "/velocity/login/login.vm"; - public final static String BOOKS_ALL = "/velocity/book/all.vm"; - public static final String BOOKS_ONE = "/velocity/book/one.vm"; - public static final String NOT_FOUND = "/velocity/notFound.vm"; - } - -} diff --git a/examples/java-spark-app/src/main/java/app/util/RequestUtil.java b/examples/java-spark-app/src/main/java/app/util/RequestUtil.java deleted file mode 100644 index 91d3ff0..0000000 --- a/examples/java-spark-app/src/main/java/app/util/RequestUtil.java +++ /dev/null @@ -1,57 +0,0 @@ -package app.util; - -import spark.*; - -public class RequestUtil { - - public static String getQueryLocale(Request request) { - return request.queryParams("locale"); - } - - public static String getParamIsbn(Request request) { - return request.params("isbn"); - } - - public static String getQueryUsername(Request request) { - return request.queryParams("username"); - } - - public static String getQueryPassword(Request request) { - return request.queryParams("password"); - } - - public static String getQueryLoginRedirect(Request request) { - return request.queryParams("loginRedirect"); - } - - public static String getSessionLocale(Request request) { - return request.session().attribute("locale"); - } - - public static String getSessionCurrentUser(Request request) { - return request.session().attribute("currentUser"); - } - - public static boolean removeSessionAttrLoggedOut(Request request) { - Object loggedOut = request.session().attribute("loggedOut"); - request.session().removeAttribute("loggedOut"); - return loggedOut != null; - } - - public static String removeSessionAttrLoginRedirect(Request request) { - String loginRedirect = request.session().attribute("loginRedirect"); - request.session().removeAttribute("loginRedirect"); - return loginRedirect; - } - - public static boolean clientAcceptsHtml(Request request) { - String accept = request.headers("Accept"); - return accept != null && accept.contains("text/html"); - } - - public static boolean clientAcceptsJson(Request request) { - String accept = request.headers("Accept"); - return accept != null && accept.contains("application/json"); - } - -} diff --git a/examples/java-spark-app/src/main/java/app/util/ViewUtil.java b/examples/java-spark-app/src/main/java/app/util/ViewUtil.java deleted file mode 100644 index 0ddc7c7..0000000 --- a/examples/java-spark-app/src/main/java/app/util/ViewUtil.java +++ /dev/null @@ -1,39 +0,0 @@ -package app.util; - -import org.apache.velocity.app.*; -import org.eclipse.jetty.http.*; -import spark.*; -import spark.template.velocity.*; -import java.util.*; -import static app.util.RequestUtil.*; - -public class ViewUtil { - - // Renders a template given a model and a request - // The request is needed to check the user session for language settings - // and to see if the user is logged in - public static String render(Request request, Map model, String templatePath) { - model.put("msg", new MessageBundle(getSessionLocale(request))); - model.put("currentUser", getSessionCurrentUser(request)); - model.put("WebPath", Path.Web.class); // Access application URLs from templates - return strictVelocityEngine().render(new ModelAndView(model, templatePath)); - } - - public static Route notAcceptable = (Request request, Response response) -> { - response.status(HttpStatus.NOT_ACCEPTABLE_406); - return new MessageBundle(getSessionLocale(request)).get("ERROR_406_NOT_ACCEPTABLE"); - }; - - public static Route notFound = (Request request, Response response) -> { - response.status(HttpStatus.NOT_FOUND_404); - return render(request, new HashMap<>(), Path.Template.NOT_FOUND); - }; - - private static VelocityTemplateEngine strictVelocityEngine() { - VelocityEngine configuredEngine = new VelocityEngine(); - configuredEngine.setProperty("runtime.references.strict", true); - configuredEngine.setProperty("resource.loader", "class"); - configuredEngine.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); - return new VelocityTemplateEngine(configuredEngine); - } -} diff --git a/examples/java-spark-app/src/main/resources/localization/messages_de.properties b/examples/java-spark-app/src/main/resources/localization/messages_de.properties deleted file mode 100644 index 92504d6..0000000 --- a/examples/java-spark-app/src/main/resources/localization/messages_de.properties +++ /dev/null @@ -1,33 +0,0 @@ -## Common -COMMON_TITLE=Ze Spark Library -COMMON_FOOTER_TEXT=Ze application uses OpenLibrary vor images. -COMMON_NAV_ALLBOOKS=View all ze books -COMMON_NAV_LOGIN=Innlogg -COMMON_NAV_LOGOUT=Auslogg -ERROR_406_NOT_ACCEPTABLE=No zuitable content found. Please zpecify eizer 'html/text' or 'application/json'. -ERROR_404_NOT_FOUND=Ve cannot find ze page you are looking for (error 404) - - -## Index -INDEX_HEADING=Velcome to ze Spark Library -INDEX_REGISTERED_USERS=Zere are currently {0} users registered: -INDEX_PASSWORD_INFO=It seems zey have all chosen ze password "password" for some reason. Hov silly. -INDEX_BOOK_OF_THE_DAY_TEXT=Ze book of ze day is: -INDEX_BOOK_OF_THE_DAY_LINK={0} von {1} - - -## Login -LOGIN_HEADING=Innlogg -LOGIN_INSTRUCTIONS=Please enter dein username und password.
(Zee ze index page if you need a hint)
-LOGIN_AUTH_SUCCEEDED=You''re logged in as ''{0}''. -LOGIN_AUTH_FAILED=Ze login informazion you zuplied vas incorrect. -LOGIN_LOGGED_OUT=You have been logged aus. -LOGIN_LABEL_USERNAME=Username -LOGIN_LABEL_PASSWORD=Password -LOGIN_BUTTON_LOGIN=Innlogg - - -## Books -BOOKS_HEADING_ALL=All ze books -BOOKS_CAPTION={0}
von {1} -BOOKS_BOOK_NOT_FOUND=Book nicht found diff --git a/examples/java-spark-app/src/main/resources/localization/messages_en.properties b/examples/java-spark-app/src/main/resources/localization/messages_en.properties deleted file mode 100644 index ed0947a..0000000 --- a/examples/java-spark-app/src/main/resources/localization/messages_en.properties +++ /dev/null @@ -1,33 +0,0 @@ -## Common -COMMON_TITLE=Spark Library -COMMON_FOOTER_TEXT=This Application uses OpenLibrary for images. -COMMON_NAV_ALLBOOKS=View all books -COMMON_NAV_LOGIN=Log in -COMMON_NAV_LOGOUT=Log out -ERROR_406_NOT_ACCEPTABLE=No suitable content found. Please specify either 'html/text' or 'application/json'. -ERROR_404_NOT_FOUND=We can't find the page you're looking for (error 404) - - -## Index -INDEX_HEADING=Welcome to the Spark Library -INDEX_REGISTERED_USERS=There are currently {0} users registered: -INDEX_PASSWORD_INFO=It seems they've all chosen the password "password" for some reason. How silly. -INDEX_BOOK_OF_THE_DAY_TEXT=The book of the day is: -INDEX_BOOK_OF_THE_DAY_LINK={0} by {1} - - -## Login -LOGIN_HEADING=Login -LOGIN_INSTRUCTIONS=Please enter your username and password.
(See the index page if you need a hint)
-LOGIN_AUTH_SUCCEEDED=You''re logged in as ''{0}''. -LOGIN_AUTH_FAILED=The login information you supplied was incorrect. -LOGIN_LOGGED_OUT=You have been logged out. -LOGIN_LABEL_USERNAME=Username -LOGIN_LABEL_PASSWORD=Password -LOGIN_BUTTON_LOGIN=Log in - - -## Books -BOOKS_HEADING_ALL=All books -BOOKS_CAPTION={0}
by {1} -BOOKS_BOOK_NOT_FOUND=Book not found diff --git a/examples/java-spark-app/src/main/resources/public/img/english.png b/examples/java-spark-app/src/main/resources/public/img/english.png deleted file mode 100644 index 3a170eec58aa39c5f00a99648c95a28365cb3c0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56203 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 PW})nB1<7)8{eb@h*Mbu# diff --git a/examples/java-spark-app/src/main/resources/public/img/favicon.png b/examples/java-spark-app/src/main/resources/public/img/favicon.png deleted file mode 100644 index a438ee7ba3dea76e892aa1c47a6b07fa51294b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 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 diff --git a/examples/java-spark-app/src/main/resources/public/img/logo.png b/examples/java-spark-app/src/main/resources/public/img/logo.png deleted file mode 100644 index e8d5d581310bcf661bdfab369f21766c1f4c635d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3446 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 ZQoxjPOZ=$w*T0VfFhH2XU&CCI{s+5r(H8&! diff --git a/examples/java-spark-app/src/main/resources/public/main.css b/examples/java-spark-app/src/main/resources/public/main.css deleted file mode 100644 index b5ccf54..0000000 --- a/examples/java-spark-app/src/main/resources/public/main.css +++ /dev/null @@ -1,288 +0,0 @@ -* { - box-sizing: border-box; -} - -html, body { - margin: 0; - padding: 0; - font-family: Tahoma, Arial, sans-serif; - position: relative; - min-height: 100%; -} - -body { - padding: 0 0 40px; - color: #333; - background: #f9f9f9; -} - -h1, h2, h3, h4 { - font-family: monospace; - font-weight: 300; - color: #444; -} - -small { - color: #555; -} - -header { - background: #274555; - border-bottom: 5px solid #ff7761; - box-shadow: 0 1px 0 0 rgba(0,0,0,.6); -} - -nav { - padding: 15px; - margin: 0 auto; - max-width: 800px; - position: relative; -} - -nav #menu { - margin-top: 20px; - float: right; -} - -a { - text-decoration: none; - color: #ff7761; -} - -#menu li { - float: left; - margin: 0 10px; -} - -#menu li a, #logout { - background: transparent; - cursor: pointer; - border: 0; - font-size: 16px; - display: inline-block; - color: #fff; - text-align: center; - height: 30px; - line-height: 30px; - padding: 0 10px; - text-decoration: none; -} - -#logo { - max-height: 50px; -} - -#chooseLanguage { - top: 15px; - right: 35px; - position: absolute; -} - -#chooseLanguage li { - float: left; -} - -#chooseLanguage button { - cursor: pointer; - margin-left: 8px; - width: 18px; - height: 18px; - border-radius: 9px; - opacity: 0.6; - border: 1px solid #222; - background-size: 100%; -} - -#chooseLanguage button:hover { - opacity: 0.8; -} - -main { - max-width: 800px; - margin: 0 auto; - padding: 15px; -} - -#content { - padding: 15px; - background: #fff; - box-shadow: 0 1px 5px rgba(0, 0, 0, 0.25); -} - -footer { - position: absolute; - left: 0; - bottom: 0; - height: 40px; - line-height: 40px; - width: 100%; - text-align: center; - background: #fff; - border-top: 1px solid #f9a11b; - font-size: 14px; -} - -nav ul, nav li { - margin: 0; - padding: 0; - list-style-type: none; -} - -/* Needlessly fancy menu hover effect */ - -#menu li { - position: relative; -} - -#menu li a::after, #logout:after { - position: absolute; - top: 28px; - left: 0; - width: 100%; - height: 4px; - background: rgba(255, 255, 255, 0.5); - border-radius: 5px; - content: ''; - opacity: 0; - -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; - transition: opacity 0.3s, transform 0.3s; - -webkit-transform: translateY(10px); - transform: translateY(10px); -} - -#logout:hover::after, -#logout:focus::after, -#menu li a:hover::after, -#menu li a:focus::after { - opacity: 1; - -webkit-transform: translateY(0px); - transform: translateY(0px); -} - -/* Very basic grid */ -.row { - width: 100%; - overflow: auto; -} - -.row > * { - float: left; -} - -.row-2 .col { - width: 49% -} - -.row-2 .col:nth-child(odd) { - margin: 0% 1% 0% 0% -} - -.row-2 .col:nth-child(even) { - margin: 0% 0% 0% 1% -} - -.row-3 .col { - width: 32% -} - -.row-3 .col:nth-child(3n+1) { - margin: 0% 1% 0% 0% -} - -.row-3 .col:nth-child(3n+2) { - margin: 0% 1% 0% 1% -} - -.row-3 .col:nth-child(3n+3) { - margin: 0% 0% 0% 1% -} - -@media screen and (max-width: 550px) { - .row .col:nth-child(n) { - width: 100%; - margin-right: 0; - margin-left: 0; - } -} - -.col img { - display: block; - width: 100%; -} - -/* Book related stuff */ - -a.book { - display: block; - text-align: center; - text-decoration: none; - color: #333; - padding: 10px; - border-radius: 5px; -} - -a.book:hover { - background: #e2e9f5; -} - -a .bookCover { - padding: 10px; - display: flex; - align-items: center; - justify-content: center; -} - -a .bookCover img { - border-radius: 5px; - min-height: 200px; - max-height: 200px; - width: auto; -} - -.bookCover img { - margin-top: 20px; - border-radius: 10px; - width: 100%; -} - -/* Login Form */ - -#loginForm { - max-width: 400px; - margin: 0 auto; -} - -#loginForm label { - display: block; - width: 100% -} - -#loginForm input { - border: 1px solid #ddd; - padding: 8px 12px; - width: 100%; - border-radius: 3px; - margin: 2px 0 20px 0; -} - -#loginForm input[type="submit"] { - color: white; - background: #274555; - border: 0; - cursor: pointer; -} - -.notification { - padding: 10px; - background: #333; - color: white; - border-radius: 3px; -} - -.good.notification { - background: #008900; -} - -.bad.notification { - background: #bb0000; -} diff --git a/examples/java-spark-app/src/main/resources/velocity/book/all.vm b/examples/java-spark-app/src/main/resources/velocity/book/all.vm deleted file mode 100644 index cdcf074..0000000 --- a/examples/java-spark-app/src/main/resources/velocity/book/all.vm +++ /dev/null @@ -1,16 +0,0 @@ -#parse("/velocity/layout.vm") -#@mainLayout() -

$msg.get("BOOKS_HEADING_ALL")

-
-#end diff --git a/examples/java-spark-app/src/main/resources/velocity/book/one.vm b/examples/java-spark-app/src/main/resources/velocity/book/one.vm deleted file mode 100644 index 2fbd2fc..0000000 --- a/examples/java-spark-app/src/main/resources/velocity/book/one.vm +++ /dev/null @@ -1,14 +0,0 @@ -#parse("/velocity/layout.vm") -#@mainLayout() - #if($book) -

$book.getTitle()

-

$book.getAuthor()

-
-
- $book.getTitle() -
-
- #else -

$msg.get("BOOKS_BOOK_NOT_FOUND")

- #end -#end diff --git a/examples/java-spark-app/src/main/resources/velocity/index/index.vm b/examples/java-spark-app/src/main/resources/velocity/index/index.vm deleted file mode 100644 index 585eb4b..0000000 --- a/examples/java-spark-app/src/main/resources/velocity/index/index.vm +++ /dev/null @@ -1,22 +0,0 @@ -#parse("/velocity/layout.vm") -#@mainLayout() -

$msg.get("INDEX_HEADING")

-

$msg.get("INDEX_REGISTERED_USERS", $users.size())

-
    - #foreach($user in $users) -
  • $user
  • - #end -
-

$msg.get("INDEX_PASSWORD_INFO")

- #if($book) -

$msg.get("INDEX_BOOK_OF_THE_DAY_TEXT")

- - #end -#end diff --git a/examples/java-spark-app/src/main/resources/velocity/layout.vm b/examples/java-spark-app/src/main/resources/velocity/layout.vm deleted file mode 100644 index b593b29..0000000 --- a/examples/java-spark-app/src/main/resources/velocity/layout.vm +++ /dev/null @@ -1,47 +0,0 @@ -#macro(mainLayout) - - - $msg.get("COMMON_TITLE") - - - - - -
- -
-
-
- $bodyContent -
-
-
- $msg.get("COMMON_FOOTER_TEXT") -
- - -#end diff --git a/examples/java-spark-app/src/main/resources/velocity/login/login.vm b/examples/java-spark-app/src/main/resources/velocity/login/login.vm deleted file mode 100644 index 98d9c61..0000000 --- a/examples/java-spark-app/src/main/resources/velocity/login/login.vm +++ /dev/null @@ -1,22 +0,0 @@ -#parse("/velocity/layout.vm") -#@mainLayout() -
- #if($authenticationFailed) -

$msg.get("LOGIN_AUTH_FAILED")

- #elseif($authenticationSucceeded) -

$msg.get("LOGIN_AUTH_SUCCEEDED", $currentUser)

- #elseif($loggedOut) -

$msg.get("LOGIN_LOGGED_OUT")

- #end -

$msg.get("LOGIN_HEADING")

-

$msg.get("LOGIN_INSTRUCTIONS", $WebPath.getINDEX())

- - - - - #if($loginRedirect) - - #end - -
-#end diff --git a/examples/java-spark-app/src/main/resources/velocity/notFound.vm b/examples/java-spark-app/src/main/resources/velocity/notFound.vm deleted file mode 100644 index 84f0dbb..0000000 --- a/examples/java-spark-app/src/main/resources/velocity/notFound.vm +++ /dev/null @@ -1,4 +0,0 @@ -#parse("/velocity/layout.vm") -#@mainLayout() -

$msg.get("ERROR_404_NOT_FOUND")

-#end diff --git a/examples/java-spark-app/src/main/resources/velocityconfig/velocity_implicit.vm b/examples/java-spark-app/src/main/resources/velocityconfig/velocity_implicit.vm deleted file mode 100644 index aa4db3c..0000000 --- a/examples/java-spark-app/src/main/resources/velocityconfig/velocity_implicit.vm +++ /dev/null @@ -1,11 +0,0 @@ -#* @implicitly included *# -#* @vtlvariable name="WebPath" type="app.util.Path.Web" *# -#* @vtlvariable name="msg" type="app.util.MessageBundle" *# -#* @vtlvariable name="books" type="java.lang.Iterable" *# -#* @vtlvariable name="book" type="app.book.Book" *# -#* @vtlvariable name="users" type="java.lang.Iterable" *# -#* @vtlvariable name="currentUser" type="java.lang.String" *# -#* @vtlvariable name="loggedOut" type="java.lang.String" *# -#* @vtlvariable name="authenticationFailed" type="java.lang.String" *# -#* @vtlvariable name="authenticationSucceeded" type="java.lang.String" *# -#* @vtlvariable name="loginRedirect" type="java.lang.String" *#