--- /dev/null
+/*
+ * 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
+ }
+}
--- /dev/null
+/*
+ * 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);
+}