]> git.mxchange.org Git - pizzaservice-war.git/commitdiff
Initial commit
authorRoland Haeder <roland@mxchange.org>
Thu, 6 Aug 2015 07:13:39 +0000 (09:13 +0200)
committerRoland Haeder <roland@mxchange.org>
Thu, 6 Aug 2015 07:13:39 +0000 (09:13 +0200)
Signed-off-by:Roland Häder <roland@mxchange.org>

22 files changed:
.gitignore [new file with mode: 0644]
build.xml [new file with mode: 0644]
config.properties [new file with mode: 0644]
lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar [new file with mode: 0644]
lib/log4j-api-2.3.jar [new file with mode: 0644]
lib/log4j-core-2.3.jar [new file with mode: 0644]
lib/nblibraries.properties [new file with mode: 0644]
src/conf/MANIFEST.MF [new file with mode: 0644]
src/java/log4j2.xml [new file with mode: 0644]
src/java/org/mxchange/localization/bundle_de_DE.properties [new file with mode: 0644]
src/java/org/mxchange/localization/bundle_en_US.properties [new file with mode: 0644]
src/java/org/mxchange/pizzaservice/product/PizzaProduct.java [new file with mode: 0644]
src/java/org/mxchange/pizzaservice/product/Product.java [new file with mode: 0644]
src/java/org/mxchange/pizzaservice/service/PizzaService.java [new file with mode: 0644]
src/java/org/mxchange/pizzaservice/service/Service.java [new file with mode: 0644]
web/WEB-INF/glassfish-web.xml [new file with mode: 0644]
web/WEB-INF/web.xml [new file with mode: 0644]
web/bye.jsp [new file with mode: 0644]
web/errorHandler.jsp [new file with mode: 0644]
web/finished.jsp [new file with mode: 0644]
web/index.jsp [new file with mode: 0644]
web/order.jsp [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..f91a00b
--- /dev/null
@@ -0,0 +1,5 @@
+/nbproject/
+/manifest.mf
+/build/
+/dist/
+/*.properties
diff --git a/build.xml b/build.xml
new file mode 100644 (file)
index 0000000..bddac8f
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See commented blocks below for -->
+<!-- some examples of how to customize the build. -->
+<!-- (If you delete it and reopen the project it will be recreated.) -->
+<!-- By default, only the Clean and Build commands use this build script. -->
+<!-- Commands such as Run, Debug, and Test only use this build script if -->
+<!-- the Compile on Save feature is turned off for the project. -->
+<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
+<!-- in the project's Project Properties dialog box.-->
+<project name="PizzaService" default="default" basedir=".">
+    <description>Builds, tests, and runs the project PizzaService.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <!--
+
+    There exist several targets which are by default empty and which can be 
+    used for execution of your tasks. These targets are usually executed 
+    before and after some main targets. They are: 
+
+      -pre-init:                 called before initialization of project properties 
+      -post-init:                called after initialization of project properties 
+      -pre-compile:              called before javac compilation 
+      -post-compile:             called after javac compilation 
+      -pre-compile-single:       called before javac compilation of single file
+      -post-compile-single:      called after javac compilation of single file
+      -pre-compile-test:         called before javac compilation of JUnit tests
+      -post-compile-test:        called after javac compilation of JUnit tests
+      -pre-compile-test-single:  called before javac compilation of single JUnit test
+      -post-compile-test-single: called after javac compilation of single JUunit test
+      -pre-dist:                 called before archive building 
+      -post-dist:                called after archive building 
+      -post-clean:               called after cleaning build products 
+      -pre-run-deploy:           called before deploying
+      -post-run-deploy:          called after deploying
+
+    Example of pluging an obfuscator after the compilation could look like 
+
+        <target name="-post-compile">
+            <obfuscate>
+                <fileset dir="${build.classes.dir}"/>
+            </obfuscate>
+        </target>
+
+    For list of available properties check the imported 
+    nbproject/build-impl.xml file. 
+
+
+    Other way how to customize the build is by overriding existing main targets.
+    The target of interest are: 
+
+      init-macrodef-javac:    defines macro for javac compilation
+      init-macrodef-junit:   defines macro for junit execution
+      init-macrodef-debug:    defines macro for class debugging
+      do-dist:                archive building
+      run:                    execution of project 
+      javadoc-build:          javadoc generation 
+
+    Example of overriding the target for project execution could look like 
+
+        <target name="run" depends="<PROJNAME>-impl.jar">
+            <exec dir="bin" executable="launcher.exe">
+                <arg file="${dist.jar}"/>
+            </exec>
+        </target>
+
+    Notice that overridden target depends on jar target and not only on 
+    compile target as regular run target does. Again, for list of available 
+    properties which you can use check the target you are overriding in 
+    nbproject/build-impl.xml file. 
+
+    -->
+</project>
diff --git a/config.properties b/config.properties
new file mode 100644 (file)
index 0000000..216a125
--- /dev/null
@@ -0,0 +1,7 @@
+#This file is automatically generated. You may wish to alter it.
+#Wed Aug 05 13:25:17 CEST 2015
+org.mxchange.pizzaservice.database.mysql.password=
+org.mxchange.pizzaservice.database.mysql.login=
+org.mxchange.pizzaservice.database.backendType=base64csv
+org.mxchange.pizzaservice.database.mysql.dbname=test
+org.mxchange.pizzaservice.database.mysql.host=localhost
diff --git a/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar b/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar
new file mode 100644 (file)
index 0000000..eaf6790
Binary files /dev/null and b/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar differ
diff --git a/lib/log4j-api-2.3.jar b/lib/log4j-api-2.3.jar
new file mode 100644 (file)
index 0000000..2a61bbe
Binary files /dev/null and b/lib/log4j-api-2.3.jar differ
diff --git a/lib/log4j-core-2.3.jar b/lib/log4j-core-2.3.jar
new file mode 100644 (file)
index 0000000..5438b0b
Binary files /dev/null and b/lib/log4j-core-2.3.jar differ
diff --git a/lib/nblibraries.properties b/lib/nblibraries.properties
new file mode 100644 (file)
index 0000000..6d0afb5
--- /dev/null
@@ -0,0 +1,4 @@
+libs.CopyLibs.classpath=\
+    ${base}/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar
+libs.CopyLibs.displayName=CopyLibs Task
+libs.CopyLibs.prop-version=2.0
diff --git a/src/conf/MANIFEST.MF b/src/conf/MANIFEST.MF
new file mode 100644 (file)
index 0000000..59499bc
--- /dev/null
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/src/java/log4j2.xml b/src/java/log4j2.xml
new file mode 100644 (file)
index 0000000..d545287
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2015 Roland Haeder
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+-->
+<Configuration status="WARN">
+       <Appenders>
+               <Console name="STDOUT" target="SYSTEM_OUT">
+                       <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
+               </Console>
+       </Appenders>
+       <Loggers>
+               <Root level="trace">
+                       <AppenderRef ref="STDOUT" level="TRACE"/>
+               </Root>
+       </Loggers>
+</Configuration>
diff --git a/src/java/org/mxchange/localization/bundle_de_DE.properties b/src/java/org/mxchange/localization/bundle_de_DE.properties
new file mode 100644 (file)
index 0000000..4b4c3c2
--- /dev/null
@@ -0,0 +1,14 @@
+# Copyright (C) 2015 Roland Haeder
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/src/java/org/mxchange/localization/bundle_en_US.properties b/src/java/org/mxchange/localization/bundle_en_US.properties
new file mode 100644 (file)
index 0000000..4b4c3c2
--- /dev/null
@@ -0,0 +1,14 @@
+# Copyright (C) 2015 Roland Haeder
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/src/java/org/mxchange/pizzaservice/product/PizzaProduct.java b/src/java/org/mxchange/pizzaservice/product/PizzaProduct.java
new file mode 100644 (file)
index 0000000..fe14f93
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.pizzaservice.product;
+
+import java.text.MessageFormat;
+import org.mxchange.jcore.BaseFrameworkSystem;
+
+/**
+ *
+ * @author Roland Haeder
+ */
+public class PizzaProduct extends BaseFrameworkSystem implements Product {
+       /**
+        * Whether this product is choosen (default: false)
+        */
+       private boolean choosen = false;
+
+       /**
+        * Name of product
+        */
+       private final String name;
+
+       /**
+        * Price of product
+        */
+       private final float price;
+
+       /**
+        * Title of product
+        */
+       private final String title;
+
+       /**
+        * Constructor for products with a name and a price.
+        * 
+        * @param name Name of product
+        * @param title Name of product
+        * @param price Price
+        */
+       public PizzaProduct (final String name, final String title, final float price) {
+               this.name = name;
+               this.title = title;
+               this.price = price;
+       }
+
+       /**
+        * Name of product
+        * @return the name
+        */
+       @Override
+       public String getName () {
+               return this.name;
+       }
+
+       /**
+        * Price of product
+        * @return the price
+        */
+       @Override
+       public Float getPrice () {
+               return this.price;
+       }
+
+       /**
+        * Title of product
+        * @return the title
+        */
+       @Override
+       public String getTitle () {
+               return this.title;
+       }
+
+       /**
+        * Whether this product is choosen (default: false)
+        *
+        * @return the choosen
+        */
+       @Override
+       public boolean isChoosen () {
+               return this.choosen;
+       }
+
+       /**
+        * Marks product as choosen
+        */
+       @Override
+       public void markAsChoosen () {
+               // Set it
+               this.getLogger().debug(MessageFormat.format("product={0} marked as choosen.", this.getName()));
+               this.choosen = true;
+       }
+}
diff --git a/src/java/org/mxchange/pizzaservice/product/Product.java b/src/java/org/mxchange/pizzaservice/product/Product.java
new file mode 100644 (file)
index 0000000..126d6aa
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.pizzaservice.product;
+
+import org.mxchange.jcore.FrameworkInterface;
+
+/**
+ *
+ * @author Roland Haeder
+ */
+public interface Product extends FrameworkInterface {
+       /**
+        * Getter for name, suitable for form fields.
+        * 
+        * @return Name of product
+        */
+       public String getName ();
+
+       /**
+        * Getter for title.
+        * 
+        * @return Title of product
+        */
+       public String getTitle ();
+
+       /**
+        * Getter for raw price.
+        * 
+        * @return Single price of product
+        */
+       public Float getPrice ();
+
+       /**
+        * Whether this product is choosen (default: false)
+        *
+        * @return the choosen
+        */
+       public boolean isChoosen ();
+
+       /**
+        * Marks product as choosen
+        */
+       public void markAsChoosen ();
+}
diff --git a/src/java/org/mxchange/pizzaservice/service/PizzaService.java b/src/java/org/mxchange/pizzaservice/service/PizzaService.java
new file mode 100644 (file)
index 0000000..23ccb42
--- /dev/null
@@ -0,0 +1,921 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.pizzaservice.service;
+
+import java.text.MessageFormat;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import org.mxchange.jcore.BaseFrameworkSystem;
+import org.mxchange.pizzaservice.product.PizzaProduct;
+import org.mxchange.pizzaservice.product.Product;
+
+/**
+ *
+ * @author Roland Haeder
+ */
+public class PizzaService extends BaseFrameworkSystem implements Service {
+       /**
+        * Main title
+        */
+       public static final String MAIN_TITLE = "Pizza-Service";
+
+       /**
+        * Product list
+        */
+       private final SortedMap<String, Product> products;
+
+       /**
+        * Some singleton getter for this instance. If the instance is not set in
+        * given application, it will be created.
+        *
+        * @param application Servlet context
+        * @return This instance
+        * @throws javax.servlet.ServletException If object is not set correctly
+        */
+       public static final Service getInstance (final ServletContext application) throws ServletException {
+               // Trace message
+               new PizzaService().getLogger().trace(MessageFormat.format("application={0} - CALLED!", application)); //NOI18N
+
+               if (application == null) {
+                       // Not set
+                       throw new NullPointerException("application is null"); //NOI18N
+               }
+
+                       // Init instance
+               PizzaService instance = null;
+
+               // Get instance from servlet
+               Object object = application.getAttribute("service"); //NOI18N
+
+               // Is it set?
+               if (object instanceof PizzaService) {
+                       // Instance is set, so casting should work
+                       instance = (PizzaService) object;
+               } else if (object instanceof Object) {
+                       // Not correct instance
+                       throw new ServletException("service is not set correctly"); //NOI18N
+               } else {
+                       // "service" is null, so initialize it
+                       instance = new PizzaService();
+
+                       // And set it here
+                       application.setAttribute("service", instance); //NOI18N
+               }
+
+               // Trace message
+               instance.getLogger().trace(MessageFormat.format("instance={0} - EXIT!", instance)); //NOI18N
+
+               // Return it
+               return instance;
+       }
+
+       /**
+        * Private constructor
+        */
+       private PizzaService () {
+               // Init products instance
+               this.products = new TreeMap<>();
+
+               // Fill products list
+               this.fillProductsList();
+       }
+
+       /**
+        * Getter for product (list) iterator
+        *
+        * @return An interator on all listed products
+        */
+       @Override
+       public Iterator<Map.Entry<String, Product>> getProductsIterator () {
+               assert(this.products instanceof SortedMap) : "this.products is not initialized"; //NOI18N
+               return this.products.entrySet().iterator();
+       }
+
+       /**
+        * Adds given product to list or throws an exception if name is already found
+        *
+        * @param name Internal name of product
+        * @param title Product's title
+        * @param price Price
+        */
+       private void addProduct (final String name, final String title, final float price) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("name={0},title={1},price={2} - CALLED!", name, title, price)); //NOI18N
+
+               // Is the name already used?
+               if (this.isProductNameUsed(name)) {
+                       // Something went wrong
+                       throw new IllegalArgumentException(MessageFormat.format("product {0} is already used.", name)); //NOI18N
+               }
+
+               // Instance product
+               Product product = new PizzaProduct(name, title, price);
+
+               // Debug message
+               this.getLogger().debug(MessageFormat.format("Adding product={0} ...", product)); //NOI18N
+
+               // Add it
+               this.products.put(product.getName(), product);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Clears given parameter for product in session
+        * 
+        * @param product Product instance
+        * @param session Session instance
+        * @param parameter Parameter to clear
+        */
+       private void clearSessionAttribute (final Product product, final HttpSession session, final String parameter) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("produce={0},parameter={1},session={2}", product, parameter, session)); //NOI18N
+
+               // Clear in session
+               this.getLogger().debug(MessageFormat.format("Clearing product={0},parameter={1} ...", product.getName(), parameter)); //NOI18N
+               this.setValueInSession(product, session, parameter, null);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Fills products list
+        * @todo Very hard-coded stuff ...
+        */
+       private void fillProductsList () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
+               // Add products
+               this.addProduct("italia", "Pizza Italia", 5.50f); //NOI18N
+               this.addProduct("diablo", "Pizza Diablo", 7.80f); //NOI18N
+               this.addProduct("bolognese", "Spagetti Bolognese", 11.95f); //NOI18N
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Some getter for value from session
+        *
+        * @param product Product instance
+        * @param session Session instance
+        * @param attribute Attribute to get value from
+        * @return Value from session
+        */
+       private Object getValueFromSession (final Product product, final HttpSession session, final String attribute) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},session={1},attribute={2} - CALLED!", product, session, attribute)); //NOI18N
+
+               // Init variable
+               Object value = null;
+
+               // Get it synced
+               synchronized (session) {
+                       value = session.getAttribute(String.format(HTTP_PARAM_MASK, product.getName(), attribute));
+               }
+
+               this.getLogger().debug(MessageFormat.format("product={0},attribute={1},value={2}", product.getName(), attribute, value)); //NOI18N
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("value={0} - EXIT!", value)); //NOI18N
+
+               // Return it
+               return value;
+       }
+
+       /**
+        * Checks whether given product is already used
+        *
+        * @param name Name of product
+        * @return Whether the given product's name is already used
+        */
+       private boolean isProductNameUsed (final String name) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("name={0} - CALLED!", name)); //NOI18N
+
+               // Is it found?
+               return this.products.containsKey(name);
+       }
+
+       /**
+        * For debugging purpose
+        *
+        * @param args Arguments
+        */
+       public static void main (String[] args) {
+               // Get instance and start it
+               new PizzaService().start();
+       }
+
+       /**
+        * Checks if the product ordered?
+        *
+        * @param product 
+        * @param session
+        * @return 
+        */
+       private boolean isProductOrdered (final Product product, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},session={1} - CALLED!", product, session)); //NOI18N
+
+               // Get session
+               Object isOrdered = this.getValueFromSession(product, session, SESSION_ORDERED);
+               this.getLogger().debug(MessageFormat.format("product={0},isOrdered={1}", product.getName(), isOrdered)); //NOI18N
+
+               // Return result
+               return ("true".equals(isOrdered)); //NOI18N
+       }
+
+       /**
+        * Somewhat setter in session
+        *
+        * @param product Product instance
+        * @param session Session instance
+        * @param keyPart Key part to include in final key
+        * @param value Value to set
+        */
+       private void setValueInSession (final Product product, final HttpSession session, final String keyPart, final Object value) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},session={1},keyPart={2},value={3} - CALLED!", product, session, keyPart, value)); //NOI18N
+
+               synchronized(session) {
+                       // Set it synced
+                       this.getLogger().debug(MessageFormat.format("setValueInSession: Setting value={0} for product={1},keyPart={2}", value, product.getName(), keyPart)); //NOI18N
+                       session.setAttribute(String.format(HTTP_PARAM_MASK, product.getName(), keyPart), value);
+               }
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Application starter
+        */
+       private void start () {
+               // Get iterator
+               Iterator<Map.Entry<String, Product>> iterator = this.getProductsIterator();
+
+               // Run over it
+               while (iterator.hasNext()) {
+                       // Get product instance
+                       Map.Entry<String, Product> entry = iterator.next();
+
+                       // Get value
+                       Product product = entry.getValue();
+
+                       // Output data
+                       this.getLogger().debug(MessageFormat.format("Product {0}, {1}: {2}", product.getName(), product.getTitle(), product.getPrice())); //NOI18N
+               }
+       }
+
+       /**
+        * Some "getter" for amount from session
+        * @param product Product instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       @Override
+       public String getAmountFromSession (final Product product, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},session={1} - CALLED!", product, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Get attribute
+               Object object = this.getValueFromSession(product, session, HTTP_PARAM_AMOUNT);
+
+               // Is the object null?
+               if (object == null) {
+                       // Trace message
+                       this.getLogger().trace("Returning 0 - EXIT!"); //NOI18N
+
+                       // Not found
+                       return "0"; //NOI18N
+               }
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("object={0} - EXIT!", object)); //NOI18N
+
+               // Cast to string and return it
+               return (String) object;
+       }
+
+       /**
+        * Some "getter" for choose from session
+        * 
+        * @param product Product instance
+        * @param session Session instance
+        * @return Choose as string
+        */
+       @Override
+       public String getChooseFromSession (final Product product, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},session={1} - CALLED!", product, session)); //NOI18N
+
+                       // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Get attribute
+               Object object = this.getValueFromSession(product, session, HTTP_PARAM_CHOOSE);
+
+               // Is the object null?
+               if (object == null) {
+                       // Not found
+                       this.getLogger().debug(MessageFormat.format("Returning empty string for product={0} ...", product.getName())); //NOI18N
+                       return ""; //NOI18N
+               }
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("object={0} - CALLED!", object)); //NOI18N
+
+               // Cast to string and return it
+               return (String) object;
+       }
+
+       /**
+        * Handler for amount from request or session
+        * 
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       @Override
+       public String handleAmountFromRequestSession (final Product product, final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},request={1},session={2} - CALLED!", product, request, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Init variabke
+               Object object;
+
+               // Check request method
+               if (!"POST".equals(request.getMethod())) { //NOI18N
+                       // Not POST, so get from session
+                       return this.getAmountFromSession(product, session);
+               } else if (this.handleChooseFromRequestSession(product, request, session).isEmpty()) {
+                       // Not choosen
+                       this.clearSessionAttribute(product, session, HTTP_PARAM_AMOUNT);
+                       this.getLogger().debug(MessageFormat.format("Unsetting for product={0} in session, returning zero ...", product.getName())); //NOI18N
+                       return "0"; //NOI18N
+               }
+
+               // Get attribute from request
+               object = request.getParameter(String.format(HTTP_PARAM_MASK, HTTP_PARAM_AMOUNT, product.getName()));
+
+               // Is it set?
+               if (object instanceof String) {
+                       // Try to parse it to integer
+                       try {
+                               Integer value = Integer.valueOf((String) object);
+                       } catch (final NumberFormatException ex) {
+                               // Not valid input
+                               this.getLogger().warn(ex);
+                               return "0"; //NOI18N
+                       }
+
+                       // Then set it in session
+                       this.setValueInSession(product, session, HTTP_PARAM_AMOUNT, object);
+
+                       // And return it
+                       return (String) object;
+               }
+
+               // Trace message
+               this.getLogger().trace("Calling getAmountFromSession() ..."); //NOI18N
+
+               // Get attribute from session
+               return this.getAmountFromSession(product, session);
+       }
+
+       /**
+        * Handler for choosen (checkbox) from request or session
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       @Override
+       public String handleChooseFromRequestSession (final Product product, final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},request={1},session={2} - CALLED!", product, request, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Init variabke
+               Object object;
+
+               // Check request method
+               if (!"POST".equals(request.getMethod())) { //NOI18N
+                       // Not POST, so get from session
+                       return this.getChooseFromSession(product, session);
+               } else if (this.isProductOrdered(product, session)) {
+                       // Product is ordered
+                       return this.getChooseFromSession(product, session);
+               }
+
+               // Get reqzest element
+               object = request.getParameter(String.format(HTTP_PARAM_MASK, HTTP_PARAM_CHOOSE, product.getName()));
+               this.getLogger().debug(MessageFormat.format("product={0},object={1}", product.getName(), object)); //NOI18N
+
+               // Is it null?
+               if (object == null) {
+                       // Unset session
+                       this.getLogger().debug(MessageFormat.format("Unsetting session for product={0} ...", product.getName())); //NOI18N
+                       this.clearSessionAttribute(product, session, HTTP_PARAM_CHOOSE);
+                       this.clearSessionAttribute(product, session, HTTP_PARAM_AMOUNT);
+
+                       // Return empty string
+                       return ""; //NOI18N
+               }
+
+               // Then set it in session
+               this.setValueInSession(product, session, HTTP_PARAM_CHOOSE, object);
+
+               // Cast to string and return it
+               this.getLogger().debug(MessageFormat.format("product={0} - Returning {1} ...", product.getName(), object)); //NOI18N
+               return (String) object;
+       }
+
+       /**
+        * Some "getter" for choosen (checkbox) from session
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       @Override
+       public String getPrintableChoosenFromRequestSession (final Product product, final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},request={1},session={2} - CALLED!", product, request, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Get element
+               String choosen = this.handleChooseFromRequestSession(product, request, session);
+               this.getLogger().debug(MessageFormat.format("product={0},choosen={1}", product.getName(), choosen)); //NOI18N
+
+               // Must not be null
+               assert(choosen instanceof String): "choosen is null"; //NOI18N
+
+               // Is it empty?
+               if (choosen.isEmpty()) {
+                       // Not choosen
+                       return "Nein";
+               }
+
+               // Get amount
+               String amount = this.handleAmountFromRequestSession(product, request, session);
+               this.getLogger().debug(MessageFormat.format("product={0},amount={1}", product.getName(), amount)); //NOI18N
+
+               // Must not be null
+               assert(amount instanceof String): "amount is null"; //NOI18N
+
+               // Is it empty?
+               if (amount.isEmpty() || "0".equals(amount)) { //NOI18N
+                       // Choosen, but no amount
+                       return "Nein";
+               } else {
+                       // Is choosen
+                       return "Ja";
+               }
+       }
+
+       /**
+        * Some "getter" for total price of position from request or session.
+        * Single price and amount is multiplyed.
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       @Override
+       public float getTotalPositionPriceFromRequestSession (final Product product, final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},request={1},session={2} - CALLED!", product, request, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Get choosen
+               String choosen = this.handleChooseFromRequestSession(product, request, session);
+               this.getLogger().debug(MessageFormat.format("product={0},choosen={1}", product.getName(), choosen)); //NOI18N
+
+               // Must not be null
+               assert(choosen instanceof String): "choosen is null"; //NOI18N
+
+               // Is it set?
+               if (choosen.isEmpty()) {
+                       // Is empty
+                       this.getLogger().debug(MessageFormat.format("product={0},choosen={1} - returning zero ...", product.getName(), choosen)); //NOI18N
+                       return 0.00f;
+               }
+
+               // Get amount
+               String amount = this.handleAmountFromRequestSession(product, request, session);
+               this.getLogger().debug(MessageFormat.format("product={0},amount={1}", product.getName(), amount)); //NOI18N
+
+               // Must not be null
+               assert(amount instanceof String): "amount is null"; //NOI18N
+
+               // Is it empty?
+               if (amount.isEmpty() || "0".equals(amount)) { //NOI18N
+                       // Is empty
+                       this.getLogger().debug(MessageFormat.format("product={0},amount={1} - returning zero ...", product.getName(), amount)); //NOI18N
+                       return 0.00f;
+               }
+
+               // Init variable
+               Integer value = null;
+
+               // Try it
+               try {
+                       // Get amount as integer
+                       value = Integer.valueOf(amount);
+               } catch (final NumberFormatException e) {
+                       // Bat input
+                       throw new IllegalArgumentException(e);
+               }
+
+               // Calculate price
+               float price = (product.getPrice() * value);
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},price={1} - EXIT!", product.getName(), price)); //NOI18N
+
+               // Then multiply it with price
+               return price;
+       }
+
+       /**
+        * Checks whether the given product is choosen, request overules session.
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Whether the product is choosen
+        */
+       @Override
+       public boolean isProductChoosen (final Product product, final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},request={1},session={2} - CALLED!", product, request, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Get choosen
+               String choosen = this.handleChooseFromRequestSession(product, request, session);
+               this.getLogger().debug(MessageFormat.format("product={0},choosen={1}", product.getName(), choosen)); //NOI18N
+
+               // Must not be null
+               assert(choosen instanceof String): "choosen is null"; //NOI18N
+
+               // Is it not choosen?
+               if (choosen.isEmpty()) {
+                       // Not choosen
+                       return false;
+               }
+
+               // Get amount
+               String amount = this.handleAmountFromRequestSession(product, request, session);
+
+               // Must not be null
+               assert(amount instanceof String): "amount is not set"; //NOI18N
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("amount={0} - EXIT!", amount)); //NOI18N
+
+               // Must not be empty and not 0
+               return (!amount.isEmpty() && !"0".equals(amount)); //NOI18N
+       }
+
+       /**
+        * Calculates total price of all choosen products
+        *
+        * @param request Request instance
+        * @param session Session instance
+        * @return Total price of all choosen products
+        */
+       @Override
+       public float calculateTotalPrice (final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("request={0},session={1} - CALLED!", request, session)); //NOI18N
+
+               // Is product and session set?
+               if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Init total price
+               float totalPrice = 0.00f;
+
+               // Get iterator
+               Iterator<Map.Entry<String, Product>> iterator = this.getProductsIterator();
+
+               // Walk through all products
+               while (iterator.hasNext()) {
+                       // Get entry
+                       Map.Entry<String, Product> entry = iterator.next();
+
+                       // Get product instance
+                       Product product = entry.getValue();
+
+                       // Is this choosen?
+                       if (product.isChoosen()) {
+                               // Then add product's total price
+                               this.getLogger().debug(MessageFormat.format("Calling getTotalPositionPriceFromRequestSession({0},request,session) ...", product.getName())); //NOI18N
+                               totalPrice += this.getTotalPositionPriceFromRequestSession(product, request, session);
+                       }
+                       this.getLogger().debug(MessageFormat.format("product={0},totalPrice={1}", product.getName(), totalPrice)); //NOI18N
+               }
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format(" totalPrice={0} - EXIT!", totalPrice)); //NOI18N
+
+               // Return total price
+               return totalPrice;
+       }
+
+       /**
+        * Calculates total amount of all choosen products
+        *
+        * @param request Request instance
+        * @param session Session instance
+        * @return Total amount of all choosen products
+        */
+       @Override
+       public int calculateTotalAmount (final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("request={0},session={1} - CALLED!", request, session)); //NOI18N
+
+               // Is product and session set?
+               if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Init total price
+               int totalAmount = 0;
+
+               // Get iterator
+               Iterator<Map.Entry<String, Product>> iterator = this.getProductsIterator();
+
+               // Walk through all products
+               while (iterator.hasNext()) {
+                       // Get entry
+                       Map.Entry<String, Product> entry = iterator.next();
+
+                       // Get product instance
+                       Product product = entry.getValue();
+
+                       // Is this choosen?
+                       if (product.isChoosen()) {
+                               // Then add ordered amount
+                               this.getLogger().debug(MessageFormat.format("Counting {0} ...", product.getName())); //NOI18N
+
+                               // Getting amount
+                               String amount = this.getAmountFromSession(product, session);
+
+                               // Add it up
+                               this.getLogger().debug(MessageFormat.format("amount={0}", amount)); //NOI18N
+                               totalAmount += Integer.valueOf(amount);
+                       }
+                       this.getLogger().debug(MessageFormat.format("product={0},totalAmount={1}", product.getName(), totalAmount)); //NOI18N
+               }
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("totalAmount={0} - EXIT!", totalAmount)); //NOI18N
+
+               // Return total price
+               return totalAmount;
+       }
+
+       /**
+        * Some "getter" for HTML code 'checked="checked"' if the product is choosen
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Whether the product is choosen
+        */
+       @Override
+       public String getCheckedHtmlFromProduct (final Product product, final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},request={1},session={2} - CALLED!", product, request, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // First let's check if the product is choosen
+               if (this.isProductChoosen(product, request, session)) {
+                       // Trace message
+                       this.getLogger().trace("Returning checked=\"checked\" - EXIT!"); //NOI18N
+
+                       // Is choosen
+                       return "checked=\"checked\""; //NOI18N
+               } else {
+                       // Trace message
+                       this.getLogger().trace("Returning empty string - EXIT!"); //NOI18N
+
+                       // Not choosen
+                       return ""; //NOI18N
+               }
+       }
+
+       /**
+        * Some "getter" for HTML code 'disabled="disabled"' for e.g. submit buttons
+        *
+        * @param request Request instance
+        * @param session Session instance
+        * @return Whether the product is choosen
+        */
+       @Override
+       public String getDisabledHtmlFromSession (final HttpServletRequest request, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace("request=" + request + ",session=" + session + " - CALLED!"); //NOI18N
+
+               // Is product and session set?
+               if (request == null) {
+                       // Not set
+                       throw new NullPointerException("request is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Is something selected?
+               if (this.calculateTotalAmount(request, session) > 0) {
+                       // Trace message
+                       this.getLogger().trace("Returning empty string - EXIT!"); //NOI18N
+
+                       // Something has been choosen
+                       return ""; //NOI18N
+               } else {
+                       // Trace message
+                       this.getLogger().trace("Returning disabled=\"disabled\" - EXIT!"); //NOI18N
+
+                       // Nothing choosen yet
+                       return "disabled=\"disabled\""; //NOI18N
+               }
+       }
+
+       /**
+        * Marks given product as ordered in session
+        *
+        * @param product Product to mark as ordered
+        * @param session Session instance
+        */
+       @Override
+       public void markProductAsOrdered(final Product product, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},session={1} - CALLED!", product, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Mark it as ordered by setting flag
+               this.getLogger().debug(MessageFormat.format("Marking product={0} as ordered.", product.getName())); //NOI18N
+               this.setValueInSession(product, session, SESSION_ORDERED, "true"); //NOI18N
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+
+       /**
+        * Unmarks given product as ordered in session
+        *
+        * @param product Product to unmark as ordered
+        * @param session Session instance
+        */
+       @Override
+       public void unmarkProductAsOrdered(final Product product, final HttpSession session) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("product={0},session={1} - CALLED!", product, session)); //NOI18N
+
+               // Is product and session set?
+               if (product == null) {
+                       // Not set
+                       throw new NullPointerException("product is null"); //NOI18N
+               } else if (session == null) {
+                       // Not set
+                       throw new NullPointerException("session is null"); //NOI18N
+               }
+
+               // Mark it as ordered by setting flag
+               this.getLogger().debug(MessageFormat.format("Unmarking product={0} as ordered.", product.getName())); //NOI18N
+               this.clearSessionAttribute(product, session, SESSION_ORDERED);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
+       }
+}
diff --git a/src/java/org/mxchange/pizzaservice/service/Service.java b/src/java/org/mxchange/pizzaservice/service/Service.java
new file mode 100644 (file)
index 0000000..383e21d
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.pizzaservice.service;
+
+import java.util.Iterator;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import org.mxchange.jcore.FrameworkInterface;
+import org.mxchange.pizzaservice.product.Product;
+
+/**
+ *
+ * @author Roland Haeder
+ */
+public interface Service extends FrameworkInterface {
+       /**
+        * HTTP parameter "amount"
+        */
+       public static final String HTTP_PARAM_AMOUNT = "amount";
+
+       /**
+        * HTTP parameter "choose"
+        */
+       public static final String HTTP_PARAM_CHOOSE = "choose";
+
+       /**
+        * Session key "ordered"
+        */
+       public static final String SESSION_ORDERED = "ordered";
+
+       /**
+        * Mask for all parameters
+        */
+       public static final String HTTP_PARAM_MASK = "%s[%s]";
+
+       /**
+        * Getter for product iterator
+        * 
+        * @return Iterator for all products
+        */
+       public Iterator<Map.Entry<String, Product>> getProductsIterator ();
+
+       /**
+        * Some "getter" for amount from session
+        *
+        * @param product Product instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       public String getAmountFromSession (final Product product, final HttpSession session);
+
+       /**
+        * Some "getter" for choose from session
+        *
+        * @param product Product instance
+        * @param session Session instance
+        * @return Choose as string
+        */
+       public String getChooseFromSession (final Product product, final HttpSession session);
+
+       /**
+        * Handler for amount from session
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       public String handleAmountFromRequestSession (final Product product, final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Handler for choosen (checkbox) from request or session
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       public String handleChooseFromRequestSession (final Product product, final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Some "getter" for printable choosen (checkbox) from request or session
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       public String getPrintableChoosenFromRequestSession (final Product product, final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Some "getter" for total price of position from request or session.
+        * Single price and amount is multiplyed.
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Amount as string
+        */
+       public float getTotalPositionPriceFromRequestSession (final Product product, final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Checks whether the given product is choosen, request overules session.
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Whether the product is choosen
+        */
+       public boolean isProductChoosen (final Product product, final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Calculates total price of all choosen products
+        *
+        * @param request Request instance
+        * @param session Session instance
+        * @return Total price of all choosen products
+        */
+       public float calculateTotalPrice (final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Calculates total amount of all choosen products
+        *
+        * @param request Request instance
+        * @param session Session instance
+        * @return Total amount of all choosen products
+        */
+       public int calculateTotalAmount (final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Some "getter" for HTML code 'checked="checked"' if the product is choosen
+        *
+        * @param product Product instance
+        * @param request Request instance
+        * @param session Session instance
+        * @return Whether the product is choosen
+        */
+       public String getCheckedHtmlFromProduct (final Product product, final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Some "getter" for HTML code 'disabled="disabled"' for e.g. submit buttons
+        *
+        * @param request Request instance
+        * @param session Session instance
+        * @return Whether the product is choosen
+        */
+       public String getDisabledHtmlFromSession (final HttpServletRequest request, final HttpSession session);
+
+       /**
+        * Marks given product as ordered in session
+        *
+        * @param product Product to mark as ordered
+        * @param session Session instance
+        */
+       public void markProductAsOrdered(final Product product, final HttpSession session);
+
+       /**
+        * Unmarks given product as ordered in session
+        *
+        * @param product Product to unmark as ordered
+        * @param session Session instance
+        */
+       public void unmarkProductAsOrdered(final Product product, final HttpSession session);
+}
diff --git a/web/WEB-INF/glassfish-web.xml b/web/WEB-INF/glassfish-web.xml
new file mode 100644 (file)
index 0000000..13e0059
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
+<glassfish-web-app error-url="">
+  <class-loader delegate="true"/>
+  <jsp-config>
+    <property name="keepgenerated" value="true">
+      <description>Keep a copy of the generated servlet class' java code.</description>
+    </property>
+  </jsp-config>
+</glassfish-web-app>
diff --git a/web/WEB-INF/web.xml b/web/WEB-INF/web.xml
new file mode 100644 (file)
index 0000000..764689a
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+    <session-config>
+        <session-timeout>
+            30
+        </session-timeout>
+    </session-config>
+    <welcome-file-list>
+        <welcome-file>index.jsp</welcome-file>
+    </welcome-file-list>
+</web-app>
diff --git a/web/bye.jsp b/web/bye.jsp
new file mode 100644 (file)
index 0000000..b14fc10
--- /dev/null
@@ -0,0 +1,52 @@
+<%-- 
+       Document   : bye
+       Created on : 05.08.2015, 10:51:14
+       Author     : Roland Haeder
+--%>
+
+<%@page errorPage="errorHandler.jsp" %>
+<%@page import="org.mxchange.pizzaservice.service.PizzaService"%>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
+       <head>
+               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+               <title><%=PizzaService.MAIN_TITLE%> - Sitzung beenden</title>
+       </head>
+
+       <body>
+               <div id="title">
+                       <h1><%=PizzaService.MAIN_TITLE%> - Sitzung beenden</h1>
+               </div>
+
+               <div id="menu">
+                       <ul>
+                               <li><a href="index.jsp" title="Eingangsseite">Home</a></li>
+                               <li><a href="order.jsp" title="Bestellseite">Bestellung</a></li>
+                               <li><a href="finished.jsp" title="Bestellung abgeschlossen">Vielen Dank</a></li>
+                               <li><a href="bye.jsp" title="Sitzung beennden">Sitzung beenden</a></li>
+                       </ul>
+               </div>
+
+               <div id="content_outer">
+                       <div id="content_title">
+                               <h2>Situng beenden:</h2>
+                       </div>
+
+                       <div id="content">
+                               <%
+                               synchronized (session) {
+                                       if (!session.isNew()) {
+                                               // Not new session
+                                               session.invalidate();
+                                               out.println("Sitzung beendet.");
+                                       } else {
+                                               // New session
+                                               out.println("Sitzung bereits beendet.");
+                                       }
+                               }
+                               %>
+                       </div>
+               </div>
+       </body>
+</html>
diff --git a/web/errorHandler.jsp b/web/errorHandler.jsp
new file mode 100644 (file)
index 0000000..e526857
--- /dev/null
@@ -0,0 +1,55 @@
+<%-- 
+       Document   : errorHandler
+       Created on : 05.08.2015, 12:06:39
+       Author     : Roland Haeder
+--%>
+
+<%@page import="java.io.PrintWriter"%>
+<%@page import="org.mxchange.pizzaservice.service.PizzaService"%>
+<%@page import="org.mxchange.pizzaservice.service.Service"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<jsp:useBean id="date" class="java.util.Date" /><%
+       // Init service instance
+       Service service = PizzaService.getInstance(application);
+%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
+       <head>
+               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+               <title><%=PizzaService.MAIN_TITLE%> - Fehler</title>
+       </head>
+
+       <body>
+               <div id="title">
+                       <h1><%=PizzaService.MAIN_TITLE%> - Fehler</h1>
+               </div>
+
+               <div id="menu">
+                       <ul>
+                               <li><a href="index.jsp" title="Eingangsseite">Home</a></li>
+                               <li><a href="order.jsp" title="Bestellseite">Bestellung</a></li>
+                               <li><a href="finished.jsp" title="Bestellung abgeschlossen">Vielen Dank</a></li>
+                               <li><a href="bye.jsp" title="Sitzung beennden">Sitzung beenden</a></li>
+                       </ul>
+               </div>
+
+               <div id="content_outer">
+                       <div id="content_title">
+                               <h2>An error occured:</h2>
+                       </div>
+
+                       <div id="content">
+                               Unfortunately an unexpected error has occurred. Below you can find the error details.
+                               <ul>
+                                       <li>Timestamp: <fmt:formatDate value="${date}" type="both" dateStyle="long" timeStyle="long" /></li>
+                                       <li>Action: <c:out value="${requestScope['javax.servlet.forward.request_uri']}" /></li>
+                                       <li>Exception: <c:out value="${requestScope['javax.servlet.error.exception']}" /></li>
+                                       <li>Message: <c:out value="${requestScope['javax.servlet.error.message']}" /></li>
+                                       <li>Status code: <c:out value="${requestScope['javax.servlet.error.status_code']}" /></li>
+                                       <li>User agent: <c:out value="${header['user-agent']}" /></li>
+                               </ul>
+                       </div>
+               </div>
+       </body>
+</html>
diff --git a/web/finished.jsp b/web/finished.jsp
new file mode 100644 (file)
index 0000000..2325e0d
--- /dev/null
@@ -0,0 +1,141 @@
+<%-- 
+       Document   : finished
+       Created on : 04.08.2015, 10:55:47
+       Author     : Roland Haeder
+--%>
+
+<%@page errorPage="errorHandler.jsp" %>
+<%@page import="java.util.Map"%>
+<%@page import="java.util.Iterator"%>
+<%@page import="org.mxchange.pizzaservice.product.Product"%>
+<%@page import="org.mxchange.pizzaservice.service.PizzaService"%>
+<%@page import="org.mxchange.pizzaservice.service.Service"%>
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+
+<%
+       // Init service instance
+       Service service = PizzaService.getInstance(application);
+%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
+       <head>
+               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+               <title><%=PizzaService.MAIN_TITLE%> - Vielen Dank!</title>
+       </head>
+
+       <body>
+               <div id="title">
+                       <h1><%=PizzaService.MAIN_TITLE%> - Vielen Dank!</h1>
+               </div>
+
+               <div id="menu">
+                       <ul>
+                               <li><a href="index.jsp" title="Eingangsseite">Home</a></li>
+                               <li><a href="order.jsp" title="Bestellseite">Bestellung</a></li>
+                               <li><a href="finished.jsp" title="Bestellung abgeschlossen">Vielen Dank</a></li>
+                               <li><a href="bye.jsp" title="Sitzung beennden">Sitzung beenden</a></li>
+                       </ul>
+               </div>
+
+               <div id="content_outer">
+                       <div id="content_title">
+                               <h2>Folgendes haben Sie bestellt:</h2>
+                       </div>
+
+                       <div id="content">
+                               <table class="table">
+                                       <thead class="table_header">
+                                               <tr>
+                                                       <th class="table_header_column">
+                                                               Bestellen?
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Anzahl:
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Produkt:
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Einzelpreis:
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Zwischensumme:
+                                                       </th>
+                                               </tr>
+                                       </thead>
+                                       <tbody class="table_body">
+                                               <%
+                                               // Get iterator from products
+                                               Iterator<Map.Entry<String, Product>> iterator = service.getProductsIterator();
+
+                                               // Iterate over all
+                                               while (iterator.hasNext()) {
+                                                       // Get entry
+                                                       Map.Entry<String, Product> entry = iterator.next();
+
+                                                       // Get product
+                                                       Product product = entry.getValue();
+
+                                                       // Mark product as ordered
+                                                       service.markProductAsOrdered(product, session);
+                                                       %>
+                                                       <tr>
+                                                               <td>
+                                                                       <%=service.getPrintableChoosenFromRequestSession(product, request, session)%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=service.handleAmountFromRequestSession(product, request, session)%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=product.getTitle()%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=product.getPrice()%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=service.getTotalPositionPriceFromRequestSession(product, request, session)%>
+                                                               </td>
+                                                       </tr>
+                                                       <%
+                                               }
+                                               float totalPrice = service.calculateTotalPrice(request, session);
+                                               %>
+                                               <tr>
+                                                       <td id="table_total_amount_left">
+                                                               Menge:
+                                                       </td>
+                                                       <td id="table_total_amount_right">
+                                                               <%=service.calculateTotalAmount(request, session)%>
+                                                       </td>
+                                                       <td class="spacer">
+                                                               &nbsp;
+                                                       </td>
+                                                       <td id="table_total_sum_left">
+                                                               Gesamtpreis:
+                                                       </td>
+                                                       <td id="table_total_sum_right">
+                                                               <%=totalPrice%>
+                                                       </td>
+                                               </tr>
+
+                                               <tr>
+                                                       <td colspan="5" class="table_footer">
+                                                               <%
+                                                               if (("POST".equals(request.getMethod())) && (service.calculateTotalAmount(request, session) > 0)) {
+                                                                       out.print("Ihre Bestellung ist eingegangen.");
+                                                                       synchronized(session) {
+                                                                               session.invalidate();
+                                                                       }
+                                                               } else {
+                                                                       // Nothing ordered
+                                                                       out.print("Keine Bestellung aufgegeben.");
+                                                               }
+                                                               %>
+                                                       </td>
+                                               </tr>
+                                       </tbody>
+                               </table>
+                       </div>
+               </div>
+       </body>
+</html>
diff --git a/web/index.jsp b/web/index.jsp
new file mode 100644 (file)
index 0000000..3b8890b
--- /dev/null
@@ -0,0 +1,107 @@
+<%-- 
+       Document   : index
+       Created on : 04.08.2015, 10:33:10
+       Author     : Roland Haeder
+--%>
+
+<%@page errorPage="errorHandler.jsp" %>
+<%@page import="java.util.Map"%>
+<%@page import="java.util.Iterator"%>
+<%@page import="org.mxchange.pizzaservice.service.Service"%>
+<%@page import="org.mxchange.pizzaservice.product.Product"%>
+<%@page import="org.mxchange.pizzaservice.service.PizzaService"%>
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+
+<%
+       // Init service instance
+       Service service = PizzaService.getInstance(application);
+%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
+       <head>
+               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+               <title><%=PizzaService.MAIN_TITLE%> - Eingangsseite</title>
+       </head>
+
+       <body>
+               <div id="title">
+                       <h1><%=PizzaService.MAIN_TITLE%> - Eingangsseite</h1>
+               </div>
+
+               <div id="menu">
+                       <ul>
+                               <li><a href="index.jsp" title="Eingangsseite">Home</a></li>
+                               <li><a href="order.jsp" title="Bestellseite">Bestellung</a></li>
+                               <li><a href="finished.jsp" title="Bestellung abgeschlossen">Vielen Dank</a></li>
+                               <li><a href="bye.jsp" title="Sitzung beennden">Sitzung beenden</a></li>
+                       </ul>
+               </div>
+
+               <div id="content_outer">
+                       <div id="content_title">
+                               <h2>Folgendes kann bestellt werden:</h2>
+                       </div>
+
+                       <div id="content">
+                               <form action="order.jsp" accept-charset="utf-8" id="form" method="post">
+                               <table class="table">
+                                       <thead class="table_header">
+                                               <tr>
+                                                       <th class="table_header_column">
+                                                               Bestellen?
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Anzahl:
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Produkt:
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Einzelpreis:
+                                                       </th>
+                                               </tr>
+                                       </thead>
+                                       <tbody class="table_body">
+                                               <%
+                                               // Get iterator from products
+                                               Iterator<Map.Entry<String, Product>> iterator = service.getProductsIterator();
+
+                                               // Iterate over all
+                                               while (iterator.hasNext()) {
+                                                       // Get entry
+                                                       Map.Entry<String, Product> entry = iterator.next();
+
+                                                       // Get product
+                                                       Product product = entry.getValue();
+                                                       service.unmarkProductAsOrdered(product, session);
+                                                       %>
+                                                       <tr>
+                                                               <td>
+                                                                       <input type="checkbox" name="<%=String.format(Service.HTTP_PARAM_MASK, Service.HTTP_PARAM_CHOOSE, product.getName())%>" value="1" <%=service.getCheckedHtmlFromProduct(product, request, session)%> />
+                                                               </td>
+                                                               <td>
+                                                                       <input type="text" name="<%=String.format(Service.HTTP_PARAM_MASK, Service.HTTP_PARAM_AMOUNT, product.getName())%>" value="<%=service.getAmountFromSession(product, session)%>" size="3" maxlength="20" />
+                                                               </td>
+                                                               <td>
+                                                                       <%=product.getTitle()%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=product.getPrice()%>
+                                                               </td>
+                                                       </tr>
+                                                       <%
+                                               }
+                                               %>
+                                               <tr>
+                                                       <td colspan="4" class="table_footer">
+                                                               <input type="reset" value="Formular zurücksetzen" />
+                                                               <input type="submit" name="send" value="Bestellung ansehen" />
+                                                       </td>
+                                               </tr>
+                                       </tbody>
+                               </table>
+                               </form>
+                       </div>
+               </div>
+       </body>
+</html>
diff --git a/web/order.jsp b/web/order.jsp
new file mode 100644 (file)
index 0000000..c59fa35
--- /dev/null
@@ -0,0 +1,135 @@
+<%-- 
+       Document   : order
+       Created on : 04.08.2015, 10:55:10
+       Author     : Roland Haeder
+--%>
+
+<%@page errorPage="errorHandler.jsp" %>
+<%@page import="java.util.Iterator"%>
+<%@page import="java.util.Map"%>
+<%@page import="org.mxchange.pizzaservice.product.Product"%>
+<%@page import="org.mxchange.pizzaservice.service.Service"%>
+<%@page import="org.mxchange.pizzaservice.service.PizzaService"%>
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+
+<%
+       // Init service instance
+       Service service = PizzaService.getInstance(application);
+%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
+       <head>
+               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+               <title><%=PizzaService.MAIN_TITLE%> - Bestellung anzeigen</title>
+       </head>
+
+       <body>
+               <div id="title">
+                       <h1><%=PizzaService.MAIN_TITLE%> - Bestellung anzeigen</h1>
+               </div>
+
+               <div id="menu">
+                       <ul>
+                               <li><a href="index.jsp" title="Eingangsseite">Home</a></li>
+                               <li><a href="order.jsp" title="Bestellseite">Bestellung</a></li>
+                               <li><a href="finished.jsp" title="Bestellung abgeschlossen">Vielen Dank</a></li>
+                               <li><a href="bye.jsp" title="Sitzung beennden">Sitzung beenden</a></li>
+                       </ul>
+               </div>
+
+               <div id="content_outer">
+                       <div id="content_title">
+                               <h2>Folgendes möchten Sie bestellen:</h2>
+                       </div>
+
+                       <div id="content">
+                               <form action="finished.jsp" accept-charset="utf-8" id="form" method="post">
+                               <table class="table">
+                                       <thead class="table_header">
+                                               <tr>
+                                                       <th class="table_header_column">
+                                                               Bestellen?
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Anzahl:
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Produkt:
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Einzelpreis:
+                                                       </th>
+                                                       <th class="table_header_column">
+                                                               Zwischensumme:
+                                                       </th>
+                                               </tr>
+                                       </thead>
+                                       <tbody class="table_body">
+                                               <%
+                                               // Get iterator from products
+                                               Iterator<Map.Entry<String, Product>> iterator = service.getProductsIterator();
+
+                                               // Iterate over all
+                                               while (iterator.hasNext()) {
+                                                       // Get entry
+                                                       Map.Entry<String, Product> entry = iterator.next();
+
+                                                       // Get product
+                                                       Product product = entry.getValue();
+                                                       %>
+                                                       <tr>
+                                                               <td>
+                                                                       <%=service.getPrintableChoosenFromRequestSession(product, request, session)%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=service.handleAmountFromRequestSession(product, request, session)%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=product.getTitle()%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=product.getPrice()%>
+                                                               </td>
+                                                               <td>
+                                                                       <%=service.getTotalPositionPriceFromRequestSession(product, request, session)%>
+                                                               </td>
+                                                       </tr>
+                                                       <%
+                                                       // Is it choosen and amount set?
+                                                       if (service.isProductChoosen(product, request, session)) {
+                                                               // Then mark it as choosen
+                                                               product.markAsChoosen();
+                                                               service.unmarkProductAsOrdered(product, session);
+                                                       }
+                                               }
+                                               %>
+                                               <tr>
+                                                       <td id="table_total_amount_left">
+                                                               Menge:
+                                                       </td>
+                                                       <td id="table_total_amount_right">
+                                                               <%=service.calculateTotalAmount(request, session)%>
+                                                       </td>
+                                                       <td class="spacer">
+                                                               &nbsp;
+                                                       </td>
+                                                       <td id="table_total_sum_left">
+                                                               Gesamtpreis:
+                                                       </td>
+                                                       <td id="table_total_sum_right">
+                                                               <%=service.calculateTotalPrice(request, session)%>
+                                                       </td>
+                                               </tr>
+
+                                               <tr>
+                                                       <td colspan="5" class="table_footer">
+                                                               <input type="submit" name="send" value="Bestellung abschliessen" <%=service.getDisabledHtmlFromSession(request, session)%> />
+                                                       </td>
+                                               </tr>
+                                       </tbody>
+                               </table>
+                               </form>
+                       </div>
+               </div>
+       </body>
+</html>