X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2Fjava%2Forg%2Fmxchange%2Fpizzaapplication%2Fapplication%2FPizzaServiceApplication.java;h=d8253814c2c7a000741ccc59f10bb1774ccbd29c;hb=ad3a217eb62ab36fab7004786b42e44edc063171;hp=e32f4556cf24de8150ddc769b7067b7d04aa3c81;hpb=8b2aec4791dfe5498f9fff0fc63b55a08ec73340;p=pizzaservice-war.git diff --git a/src/java/org/mxchange/pizzaapplication/application/PizzaServiceApplication.java b/src/java/org/mxchange/pizzaapplication/application/PizzaServiceApplication.java index e32f4556..d8253814 100644 --- a/src/java/org/mxchange/pizzaapplication/application/PizzaServiceApplication.java +++ b/src/java/org/mxchange/pizzaapplication/application/PizzaServiceApplication.java @@ -16,8 +16,8 @@ */ package org.mxchange.pizzaapplication.application; -import org.mxchange.pizzaapplication.exceptions.CategoryTitleAlreadyUsedException; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; @@ -27,9 +27,11 @@ import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.mxchange.jcore.contact.Gender; import org.mxchange.jcore.exceptions.BadTokenException; +import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException; import org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException; import org.mxchange.pizzaapplication.BasePizzaServiceSystem; import org.mxchange.pizzaapplication.category.Category; @@ -41,6 +43,7 @@ import org.mxchange.pizzaapplication.database.frontend.category.PizzaCategoryDat import org.mxchange.pizzaapplication.database.frontend.product.PizzaProductDatabaseFrontend; import org.mxchange.pizzaapplication.database.frontend.product.ProductFrontend; import org.mxchange.pizzaapplication.database.product.PizzaProductDatabaseConstants; +import org.mxchange.pizzaapplication.exceptions.CategoryTitleAlreadyUsedException; import org.mxchange.pizzaapplication.exceptions.ProductTitleAlreadyUsedException; import org.mxchange.pizzaapplication.product.Product; @@ -90,13 +93,20 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P if (object instanceof PizzaApplication) { // Instance is set, so casting should work instance = (PizzaApplication) object; + + // Debug message + instance.getLogger().debug(MessageFormat.format("Using existing instance {0} ...", object)); //NOI18N } else if (object instanceof Object) { // Not correct instance throw new ServletException("app is not set correctly"); //NOI18N } else { try { // "service" is null, so initialize it - instance = new PizzaServiceApplication(context); + instance = new PizzaServiceApplication(); + instance.init(context); + + // Debug message + instance.getLogger().debug(MessageFormat.format("Created new instance {0} ...", object)); //NOI18N } catch (final UnsupportedDatabaseBackendException | SQLException | IOException | BadTokenException ex) { throw new ServletException(ex); } @@ -122,12 +132,8 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P new PizzaServiceApplication().start(); } - /** - * Constructor with servet configuration - * - * @param context Servlet context - */ - private PizzaServiceApplication (final ServletContext context) throws UnsupportedDatabaseBackendException, SQLException, IOException, BadTokenException { + @Override + public void init (final ServletContext context) throws UnsupportedDatabaseBackendException, SQLException, IOException, BadTokenException { // Temporary initialize default bundle // @TODO The JSF may have better internatialization support this.initBundle(); @@ -363,7 +369,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P } // Get attribute - Object object = this.getValueFromSession(product, session, HTTP_PARAM_CHOOSE); + Object object = this.getValueFromSession(product, session, HTTP_PARAM_ITEM_ID); // Is the object null? if (object == null) { @@ -400,8 +406,14 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P throw new NullPointerException("session is null"); //NOI18N } + // Get "enabled" from request scope + Boolean enabled = Boolean.parseBoolean((String) request.getAttribute("enabled")); //NOI18N + + // Debug message + this.getLogger().debug(MessageFormat.format("enabled={0}", enabled)); //NOI18N + // Is something selected? - if (this.calculateTotalAmount(request, session) > 0) { + if ((enabled) || (this.calculateTotalAmount(request, session) > 0)) { // Trace message this.getLogger().trace("Returning empty string - EXIT!"); //NOI18N @@ -482,12 +494,12 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P @Override public String getPrintableProduktAvailability (final Product product) { // Trace message - this.getLogger().trace(MessageFormat.format("product={0} - CALLED!", product)); + this.getLogger().trace(MessageFormat.format("product={0} - CALLED!", product)); //NOI18N // Is it null? if (product == null) { // Should not be null - throw new NullPointerException("product is null"); + throw new NullPointerException("product is null"); //NOI18N } // Get availability @@ -544,7 +556,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P try { // Ask frontend for a list of products return this.productFrontend.getAvailableProducts(); - } catch (final IOException | BadTokenException | SQLException ex) { + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { throw new ServletException(ex); } } @@ -559,7 +571,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P try { // Ask frontend for a list of products return this.productFrontend.getAllProducts(); - } catch (final IOException | BadTokenException | SQLException ex) { + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { throw new ServletException(ex); } } @@ -574,7 +586,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P try { // Ask frontend for a list of categories return this.categoryFrontend.getCategories(); - } catch (final IOException | BadTokenException | SQLException ex) { + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { throw new ServletException(ex); } } @@ -830,7 +842,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P // Mark it as ordered by setting flag this.getLogger().debug(MessageFormat.format("Marking product={0} as choosen.", product.getId())); //NOI18N - this.setValueInSession(product, session, HTTP_PARAM_CHOOSE, "1"); //NOI18N + this.setValueInSession(product, session, HTTP_PARAM_ITEM_ID, "1"); //NOI18N // Trace message this.getLogger().trace("EXIT!"); //NOI18N @@ -907,7 +919,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P // Mark it as ordered by setting flag this.getLogger().debug(MessageFormat.format("Unmarking product={0} as choosen.", product.getId())); //NOI18N - this.clearSessionAttribute(product, session, HTTP_PARAM_CHOOSE); + this.clearSessionAttribute(product, session, HTTP_PARAM_ITEM_ID); // Trace message this.getLogger().trace("EXIT!"); //NOI18N @@ -996,7 +1008,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P this.getLogger().trace(MessageFormat.format("session={0},key={1} - CALLED!", session, key)); //NOI18N // Init value - Object value = null; + Object value; // Get it synchronized from session synchronized (session) { @@ -1018,7 +1030,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P * @param session Session instance * @return Amount as string */ - private String handleChooseFromRequestSession(final Product product, final HttpServletRequest request, final HttpSession session) { + private 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 @@ -1053,14 +1065,14 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P } // Get reqzest element - object = request.getParameter(String.format(HTTP_PARAM_MASK, HTTP_PARAM_CHOOSE, product.getId())); + object = request.getParameter(String.format(HTTP_PARAM_MASK, HTTP_PARAM_ITEM_ID, product.getId())); this.getLogger().debug(MessageFormat.format("product={0},object={1}", product.getId(), object)); //NOI18N // Is it null? if (object == null) { // Unset session this.getLogger().debug(MessageFormat.format("Unsetting session for product={0} ...", product.getId())); //NOI18N - this.clearSessionAttribute(product, session, HTTP_PARAM_CHOOSE); + this.clearSessionAttribute(product, session, HTTP_PARAM_ITEM_ID); this.clearSessionAttribute(product, session, HTTP_PARAM_AMOUNT); // Return empty string @@ -1068,7 +1080,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P } // Then set it in session - this.setValueInSession(product, session, HTTP_PARAM_CHOOSE, object); + this.setValueInSession(product, session, HTTP_PARAM_ITEM_ID, object); // Cast to string and return it this.getLogger().debug(MessageFormat.format("product={0} - Returning {1} ...", product.getId(), object)); //NOI18N @@ -1092,7 +1104,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P * @param title Title of category to check * @return Whether it has been found */ - private boolean isCategoryTitleUsed (final String title) throws IOException, SQLException, BadTokenException { + private boolean isCategoryTitleUsed(final String title) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // Delegate to frontend return this.categoryFrontend.isCategoryTitleUsed(title); } @@ -1102,7 +1114,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P * @param title Product title to check * @return Whether the product title has already been used */ - private boolean isProductTitleUsed (final String title) throws IOException, SQLException, BadTokenException { + private boolean isProductTitleUsed (final String title) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // Delegate to frontend return this.productFrontend.isProductTitleUsed(title); } @@ -1112,9 +1124,9 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P * * @param product Product instance * @param session HttpSession instance - * @return + * @return Whether the product has been ordered */ - private boolean isProductOrdered(final Product product, final HttpSession session) { + private boolean isProductOrdered (final Product product, final HttpSession session) { // Trace message this.getLogger().trace(MessageFormat.format("product={0},session={1} - CALLED!", product, session)); //NOI18N @@ -1149,14 +1161,17 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P /** * Application starter */ - private void start () { + private void start() { // Init bundle this.initBundle(); try { // Init properties this.initProperties(); - } catch (final IOException ex) { + + // And frontends + this.initDatabaseFrontends(); + } catch (final IOException | UnsupportedDatabaseBackendException | SQLException ex) { // Abort here this.abortProgramWithException(ex); } @@ -1184,13 +1199,13 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P Customer customer = new PizzaServiceCustomer(); /* - * Need a least a gender ... :( See, that is why I don't like default - * constructors, you can easily miss something important and bam! You - * get an NPE. The fix here is, to have construtors (or factories) which - * requires all required instances that needs to be set to get a - * consitent object back. - */ - + * Need a least a gender ... :( See, that is why I don't like default + * constructors, you can easily miss something important and bam! You + * get an NPE. The fix here is, to have construtors (or factories) which + * requires all required instances that needs to be set to get a + * consitent object back. + */ + // Gender is MALE now customer.setGender(Gender.MALE); @@ -1224,21 +1239,26 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P // request must not be null if (request == null) { // Is null - throw new NullPointerException("request is null"); + throw new NullPointerException("request is null"); //NOI18N } // Get all fields String title = request.getParameter(PizzaCategoryDatabaseConstants.COLUMN_TITLE); String parent = request.getParameter(PizzaCategoryDatabaseConstants.COLUMN_PARENT); - Integer id = null; + + // Debug message + this.getLogger().debug(MessageFormat.format("title={0},parent={1}", title, parent)); //NOI18N + + // Init variables for casting + Integer id = 0; // Check all fields if (title == null) { // "title" not set - throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaCategoryDatabaseConstants.COLUMN_TITLE)); + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaCategoryDatabaseConstants.COLUMN_TITLE)); //NOI18N } else if (title.isEmpty()) { // Is left empty - throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaCategoryDatabaseConstants.COLUMN_TITLE)); + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaCategoryDatabaseConstants.COLUMN_TITLE)); //NOI18N } else if ((parent != null) && (!parent.isEmpty())) { // "parent" is set, so check it try { @@ -1248,20 +1268,21 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P throw new IllegalArgumentException(e); } } + try { // Try to check if title is used already if (this.isCategoryTitleUsed(title)) { // Title already used throw new CategoryTitleAlreadyUsedException(request); } - } catch (final IOException | SQLException | BadTokenException ex) { + } catch (final IOException | SQLException | BadTokenException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { throw new ServletException(ex); } try { // The category is not found, so add it to database this.categoryFrontend.addCategory(title, id); - } catch (final SQLException ex) { + } catch (final SQLException | IOException ex) { // Continue to throw it throw new ServletException(ex); } @@ -1283,7 +1304,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P // request must not be null if (request == null) { // Is null - throw new NullPointerException("request is null"); + throw new NullPointerException("request is null"); //NOI18N } // Get title, price and category id @@ -1292,38 +1313,41 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P String category = request.getParameter(PizzaProductDatabaseConstants.COLUMN_CATEGORY); String available = request.getParameter(PizzaProductDatabaseConstants.COLUMN_AVAILABLE); + // Debug message + this.getLogger().debug(MessageFormat.format("title={0},price={1},category={2},available={3}", title, price, category, available)); //NOI18N + + // Variables for converting Long id = null; Float p = null; - Boolean a = null; // Check all fields if (title == null) { // "title" not set - throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_TITLE)); + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_TITLE)); //NOI18N } else if (title.isEmpty()) { // Is left empty - throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_TITLE)); + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_TITLE)); //NOI18N } else if (price == null) { // "price" not set - throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_PRICE)); + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_PRICE)); //NOI18N } else if (price.isEmpty()) { // Is left empty - throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_PRICE)); + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_PRICE)); //NOI18N } else if (category == null) { // "title" not set - throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_CATEGORY)); + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_CATEGORY)); //NOI18N } else if (category.isEmpty()) { // Is left empty - throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_CATEGORY)); + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_CATEGORY)); //NOI18N } else if (available == null) { // "title" not set - throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_AVAILABLE)); + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_AVAILABLE)); //NOI18N } else if (available.isEmpty()) { // Is left empty - throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_AVAILABLE)); - } else if ((!"true".equals(available)) && (!"false".equals(available))) { + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_AVAILABLE)); //NOI18N + } else if ((!"true".equals(available)) && (!"false".equals(available))) { //NOI18N // Invalid value - throw new IllegalArgumentException(MessageFormat.format("{0} is invalid: {1}", PizzaProductDatabaseConstants.COLUMN_AVAILABLE, available)); + throw new IllegalArgumentException(MessageFormat.format("{0} is invalid: {1}", PizzaProductDatabaseConstants.COLUMN_AVAILABLE, available)); //NOI18N } // Parse numbers @@ -1336,7 +1360,7 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P } // Parse boolean - a = Boolean.parseBoolean(available); + Boolean a = Boolean.parseBoolean(available); // Test on product title try { @@ -1345,14 +1369,14 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P // Title already used throw new ProductTitleAlreadyUsedException(request); } - } catch (final IOException | SQLException | BadTokenException ex) { + } catch (final IOException | SQLException | BadTokenException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { throw new ServletException(ex); } try { // The product is not found, so add it to database this.productFrontend.addProduct(title, p, id, a); - } catch (final SQLException ex) { + } catch (final SQLException | IOException ex) { // Continue to throw it throw new ServletException(ex); } @@ -1371,24 +1395,260 @@ public class PizzaServiceApplication extends BasePizzaServiceSystem implements P @Override public String generateLinkForParent (final Category category) { // Trace message - this.getLogger().trace(MessageFormat.format("category={0} - CALLED!", category)); + this.getLogger().trace(MessageFormat.format("category={0} - CALLED!", category)); //NOI18N // category must not be null if (category == null) { // Is null - throw new NullPointerException("category is null"); + throw new NullPointerException("category is null"); //NOI18N } // Get parent id - Integer parent = category.getParent(); + Long parent = category.getParent(); // Is the id set? if (parent > 0) { // Product HTML code for link - throw new UnsupportedOperationException(MessageFormat.format("parent={0} - Unfinished!", parent)); + throw new UnsupportedOperationException(MessageFormat.format("parent={0} - Unfinished!", parent)); //NOI18N } // No parent set return "Keine"; } + + @Override + public String getPrintableProduktCategory (final Product product) throws ServletException { + // Trace message + this.getLogger().trace(MessageFormat.format("product={0} - CALLED!", product)); //NOI18N + + // product must not be null + if (product == null) { + // Abort here + throw new NullPointerException("product is null"); //NOI18N + } + + // Declare category + Category category; + + try { + // Get Category instance from product over the frontend + category = this.categoryFrontend.getCategory(product); + } catch (final IOException | SQLException | BadTokenException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { + throw new ServletException(ex); + } + + // Debug message + this.getLogger().debug(MessageFormat.format("category={0}", category)); //NOI18N + + String title = null; + try { + // Now get title from it and return it + title = category.decodedTitle(); + } catch (final UnsupportedEncodingException ex) { + // Continue to throw as cause + throw new ServletException(ex); + } + + // Trace message + this.getLogger().trace(MessageFormat.format("title={0} - EXIT!", title)); //NOI18N + + // Return it + return title; + } + + /** + * Checks if product's title is already used. + * + * @param request Request instance + * @return Whether the product title is already used + * @throws java.io.IOException If any IO error occurs + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found in a file-based database backend's file ... ;-) + * @throws java.sql.SQLException If any SQL error occurs + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed + * @throws java.lang.reflect.InvocationTargetException Any other problems? + */ + private boolean isProductTitleUsed (final HttpServletRequest request) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + // Trace message + this.getLogger().trace(MessageFormat.format("request={0} - CALLED!", request)); //NOI18N + + // Init title + String title = request.getParameter(PizzaProductDatabaseConstants.COLUMN_TITLE); + + // request must not be null and "title" must be found and non-empty + if (request == null) { + // Abort here + throw new NullPointerException("request is null"); //NOI18N + } else if (title == null) { + // title is not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaProductDatabaseConstants.COLUMN_TITLE)); //NOI18N + } else if (title.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaProductDatabaseConstants.COLUMN_TITLE)); //NOI18N + } + + // Default is not used + boolean isUsed = this.isProductTitleUsed(title); + + // Trace message + this.getLogger().trace(MessageFormat.format("isUsed={0} - EXIT!", isUsed)); //NOI18N + + // Return it + return isUsed; + } + + /** + * Handles admin form requests + * @param request Request instance + * @param response Response instance + * @throws ServletException If something unexpected happened + */ + @Override + public void doAdminHandleProductForms (final HttpServletRequest request, final HttpServletResponse response) throws ServletException { + // Trace message + this.getLogger().trace(MessageFormat.format("request={0},response={1} - CALLED!", request, response)); //NOI18N + + // request and response must both be set + if (request == null) { + // request is null + throw new NullPointerException("request is null"); //NOI18N + } else if (response == null) { + // response is null + throw new NullPointerException("response is null"); //NOI18N + } + + // Try this operations + try { + // Is it post? + if ("POST".equals(request.getMethod())) { //NOI18N + // Is "add/edit/delete" set? + if (request.getParameter("add") != null) { //NOI18N + // Is it already added? + if (this.isProductTitleUsed(request)) { + // Debug message + this.getLogger().debug("Already used, redirecting ..."); //NOI18N + + // Already added, so redirect here, else a ServletException will be thrown + response.sendRedirect(String.format("%s/admin/product.jsp?already=1", request.getContextPath())); //NOI18N + } else { + // Add new product + this.doAdminAddProduct(request); + } + } else if (request.getParameter("edit") != null) { //NOI18N + // @TODO + } else if (request.getParameter("delete") != null) { //NOI18N + // @TODO + } + + // Redirect to proper URL + // @TODO Commented out for developing: + //response.sendRedirect(request.getContextPath() + "/finished.jsp"); + } + } catch (final IOException | SQLException | BadTokenException | CorruptedDatabaseFileException | ProductTitleAlreadyUsedException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | IllegalArgumentException ex) { + // Throw it as cause + throw new ServletException(ex); + } + + // Trace message + this.getLogger().trace("EXIT!"); //NOI18N + } + + /** + * Handles admin form requests + * @param request Request instance + * @param response Response instance + * @throws ServletException If something unexpected happened + */ + @Override + public void doAdminHandleCategoryForms (final HttpServletRequest request, final HttpServletResponse response) throws ServletException { + // Trace message + this.getLogger().trace(MessageFormat.format("request={0},response={1} - CALLED!", request, response)); //NOI18N + + // request and response must both be set + if (request == null) { + // request is null + throw new NullPointerException("request is null"); //NOI18N + } else if (response == null) { + // response is null + throw new NullPointerException("response is null"); //NOI18N + } + + // Try this operations + try { + // Is it post? + if ("POST".equals(request.getMethod())) { //NOI18N + // Is "add/edit/delete" set? + if (request.getParameter("add") != null) { //NOI18N + // Is the category title already used? + if (this.isCategoryTitleUsed(request)) { + // Debug message + this.getLogger().debug("Already used, redirecting ..."); //NOI18N + + // Already added, so redirect here, else a ServletException will be thrown + response.sendRedirect(String.format("%s/admin/category.jsp?already=1", request.getContextPath())); //NOI18N + } else { + // Add new category + this.doAdminAddCategory(request); + } + } else if (request.getParameter("edit") != null) { //NOI18N + // @TODO + } else if (request.getParameter("delete") != null) { //NOI18N + // @TODO + } + + // Redirect to proper URL + // @TODO Commented out for developing: + //response.sendRedirect(request.getContextPath() + "/finished.jsp"); + } + } catch (final IOException | SQLException | BadTokenException | CorruptedDatabaseFileException | CategoryTitleAlreadyUsedException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | IllegalArgumentException ex) { + // Throw it as cause + throw new ServletException(ex); + } + + // Trace message + this.getLogger().trace("EXIT!"); //NOI18N + } + + /** + * Checks if category's title is already used. + * + * @param request Request instance + * @return Whether the product title is already used + * @throws java.io.IOException If any IO error occurs + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found in a file-based database backend's file ... ;-) + * @throws java.sql.SQLException If any SQL error occurs + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed + * @throws java.lang.reflect.InvocationTargetException Any other problems? + */ + private boolean isCategoryTitleUsed (final HttpServletRequest request) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + // Trace message + this.getLogger().trace(MessageFormat.format("request={0} - CALLED!", request)); //NOI18N + + // Init title + String title = request.getParameter(PizzaCategoryDatabaseConstants.COLUMN_TITLE); + + // request must not be null and "title" must be found and non-empty + if (request == null) { + // Abort here + throw new NullPointerException("request is null"); //NOI18N + } else if (title == null) { + // title is not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", PizzaCategoryDatabaseConstants.COLUMN_TITLE)); //NOI18N + } else if (title.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", PizzaCategoryDatabaseConstants.COLUMN_TITLE)); //NOI18N + } + + // Default is not used + boolean isUsed = this.isCategoryTitleUsed(title); + + // Trace message + this.getLogger().trace(MessageFormat.format("isUsed={0} - EXIT!", isUsed)); //NOI18N + + // Return it + return isUsed; + } }