From: Roland Haeder Date: Fri, 4 Sep 2015 07:37:13 +0000 (+0200) Subject: Initial import from main project X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=b306211462e3da5be53671d1888eeeab755024e3;p=pizzaservice-lib.git Initial import from main project Signed-off-by: Roland Häder --- b306211462e3da5be53671d1888eeeab755024e3 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1cd7a86 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/nbproject/private/ +/manifest.mf +/build/ +/dist/ +/*.properties diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..e86bd63 --- /dev/null +++ b/build.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + Builds, tests, and runs the project PizzaService-lib. + + + 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 index 0000000..eaf6790 Binary files /dev/null and b/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar differ diff --git a/lib/cdi-api.jar b/lib/cdi-api.jar new file mode 100644 index 0000000..1fa239e Binary files /dev/null and b/lib/cdi-api.jar differ diff --git a/lib/javaee-api-7.0/javaee-api-7.0.jar b/lib/javaee-api-7.0/javaee-api-7.0.jar new file mode 100644 index 0000000..9e38d4c Binary files /dev/null and b/lib/javaee-api-7.0/javaee-api-7.0.jar differ diff --git a/lib/javaee-api-7.0/javaee-doc-api.jar b/lib/javaee-api-7.0/javaee-doc-api.jar new file mode 100644 index 0000000..2859e3d Binary files /dev/null and b/lib/javaee-api-7.0/javaee-doc-api.jar differ diff --git a/lib/jcore.jar b/lib/jcore.jar new file mode 100644 index 0000000..b16bdc6 Binary files /dev/null and b/lib/jcore.jar differ diff --git a/lib/jsfcore.jar b/lib/jsfcore.jar new file mode 100644 index 0000000..9141009 Binary files /dev/null and b/lib/jsfcore.jar differ diff --git a/lib/jshop.jar b/lib/jshop.jar new file mode 100644 index 0000000..d092272 Binary files /dev/null and b/lib/jshop.jar differ diff --git a/lib/log4j-api-2.3.jar b/lib/log4j-api-2.3.jar new file mode 100644 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 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 index 0000000..1f1df42 --- /dev/null +++ b/lib/nblibraries.properties @@ -0,0 +1,10 @@ +libs.CopyLibs.classpath=\ + ${base}/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar +libs.CopyLibs.displayName=CopyLibs Task +libs.CopyLibs.prop-version=2.0 +libs.javaee-api-7.0.classpath=\ + ${base}/javaee-api-7.0/javaee-api-7.0.jar +libs.javaee-api-7.0.displayName=Java EE 7 API Library +libs.javaee-api-7.0.javadoc=\ + ${base}/javaee-api-7.0/javaee-doc-api.jar +libs.javaee-api-7.0.prop-maven-dependencies=javax:javaee-api:7.0:jar diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml new file mode 100644 index 0000000..2ac9994 --- /dev/null +++ b/nbproject/build-impl.xml @@ -0,0 +1,1413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties new file mode 100644 index 0000000..a1eeaab --- /dev/null +++ b/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=99b67310 +build.xml.script.CRC32=c005ff3b +build.xml.stylesheet.CRC32=8064a381@1.75.2.48 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=99b67310 +nbproject/build-impl.xml.script.CRC32=6ad262f1 +nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.75.2.48 diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 0000000..ddf607c --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,71 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processor.options= +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# Files in build.classes.dir which should be excluded from distribution jar +dist.archive.excludes= +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/PizzaService-lib.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +includes=** +jar.compress=false +javac.classpath= +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.7 +javac.target=1.7 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=true +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. +# To set system properties for unit tests define test-sys-prop.name=value: +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..e6edbad --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,15 @@ + + + org.netbeans.modules.java.j2seproject + + + PizzaService-lib + + + + + + + + + diff --git a/src/org/mxchange/pizzaapplication/BasePizzaServiceSystem.java b/src/org/mxchange/pizzaapplication/BasePizzaServiceSystem.java new file mode 100644 index 0000000..dfc3cfa --- /dev/null +++ b/src/org/mxchange/pizzaapplication/BasePizzaServiceSystem.java @@ -0,0 +1,27 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication; + +import org.mxchange.jsfcore.BaseServletSystem; + +/** + * A general class for whole pizza application. + * + * @author Roland Haeder + */ +public class BasePizzaServiceSystem extends BaseServletSystem { +} diff --git a/src/org/mxchange/pizzaapplication/application/PizzaApplication.java b/src/org/mxchange/pizzaapplication/application/PizzaApplication.java new file mode 100644 index 0000000..f22e33d --- /dev/null +++ b/src/org/mxchange/pizzaapplication/application/PizzaApplication.java @@ -0,0 +1,252 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.application; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; +import java.util.Deque; +import java.util.Iterator; +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import org.mxchange.jcore.application.Application; +import org.mxchange.jcore.exceptions.BadTokenException; +import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException; +import org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException; +import org.mxchange.jshop.category.Category; +import org.mxchange.jshop.exceptions.CategoryTitleAlreadyUsedException; +import org.mxchange.jshop.exceptions.ProductTitleAlreadyUsedException; +import org.mxchange.jshop.item.AddableBasketItem; +import org.mxchange.jshop.product.Product; + +/** + * + * @author Roland Haeder + */ +public interface PizzaApplication extends Application { + /** + * Some "getter" for a linked list of only available products + * + * @return Only available products + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + */ + public Deque getAvailableProducts () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; + + /** + * Some "getter" for a linked list of all products + * + * @return All products + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + */ + public Deque getAllProducts () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; + + /** + * Some "getter" for a linked list of all categories + * + * @return All categories + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + */ + public Deque getAllCategories () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; + + /** + * Initializes this instance with given ServletContext + * + * @param context Servlet context + * @throws org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException If the backend is unsupported + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.io.IOException If an IO error occurs + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + */ + public void init (final ServletContext context) throws UnsupportedDatabaseBackendException, SQLException, IOException, BadTokenException; + + /** + * Some "getter" for a an array of only available products + * + * @return Only available products + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + */ + public Iterator getAvailableProductsIterator () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; + + /** + * Some "getter" for a an array of all products + * + * @return All products + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + */ + public Iterator getAllProductsIterator () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; + + /** + * Some "getter" for a an array of all categories + * + * @return All categories + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + */ + public Iterator getAllCategoriesIterator () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; + + /** + * Generates a link for category's parent category. If none is given, the method will return only a small + * note. + * + * @param category Category instance + * @return HTML link for category's parent category + * @deprecated Old lost code + */ + @Deprecated + public String generateLinkForParent (final Category category); + + /** + * Checks if given Product instance is available and returns a printable + * (human-readable) string. + * + * @param product Product instance to check + * @return Human-readable version of product availability + * @deprecated Old lost code + */ + @Deprecated + public String getPrintableProduktAvailability (final Product product); + + /** + * Returns a printable (human-readable) string of product's category + * + * @param product Product instance to check + * @return Human-readable version of product availability + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + * @deprecated Old lost code + */ + @Deprecated + public String getPrintableProductCategory (final Product product) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; + + /** + * Adds given category data from request to database + * + * @param request Request instance + * @throws org.mxchange.jshop.exceptions.CategoryTitleAlreadyUsedException The category's title is already used + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + */ + public void doAdminAddCategory (final ServletRequest request) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, CategoryTitleAlreadyUsedException; + + /** + * Adds given product data from request to database + * + * @param request Request instance + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + * @throws org.mxchange.jshop.exceptions.ProductTitleAlreadyUsedException If the product's title is already used + */ + public void doAdminAddProduct (final ServletRequest request) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, ProductTitleAlreadyUsedException; + + /** + * Handles admin product form requests + * + * @param request Request instance + * @param response Response instance + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + * @throws org.mxchange.jshop.exceptions.ProductTitleAlreadyUsedException If the product's title is already used + */ + public void doAdminHandleProductForms (final ServletRequest request, final ServletResponse response) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, ProductTitleAlreadyUsedException; + + /** + * Handles admin category form requests + * + * @param request Request instance + * @param response Response instance + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + * @throws org.mxchange.jshop.exceptions.CategoryTitleAlreadyUsedException The category's title is already used + */ + public void doAdminHandleCategoryForms (final ServletRequest request, final ServletResponse response) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, CategoryTitleAlreadyUsedException; + + /** + * Some "getter" for a Product instance from given item + * + * @param item Item instance + * @return A Product instance + * @throws java.io.IOException If an IO error occurs + * @throws java.sql.SQLException If an SQL error occurs + * @throws java.lang.NoSuchMethodException If a method was not found + * @throws java.lang.IllegalAccessException If the method cannot be accessed publicly + * @throws java.lang.reflect.InvocationTargetException If something else happens? + * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found + * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the database file is damaged + */ + public Product getProduct (final AddableBasketItem item) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; +} diff --git a/src/org/mxchange/pizzaapplication/application/PizzaServiceApplication.java b/src/org/mxchange/pizzaapplication/application/PizzaServiceApplication.java new file mode 100644 index 0000000..c9f0ee2 --- /dev/null +++ b/src/org/mxchange/pizzaapplication/application/PizzaServiceApplication.java @@ -0,0 +1,631 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.application; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; +import java.text.MessageFormat; +import java.util.Deque; +import java.util.Iterator; +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.mxchange.jcore.exceptions.BadTokenException; +import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException; +import org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException; +import org.mxchange.jshop.category.Category; +import org.mxchange.jshop.database.frontend.category.CategoryDatabaseFrontend; +import org.mxchange.jshop.database.frontend.category.CategoryFrontend; +import org.mxchange.jshop.database.frontend.product.ProductDatabaseFrontend; +import org.mxchange.jshop.database.frontend.product.ProductFrontend; +import org.mxchange.jshop.exceptions.CategoryTitleAlreadyUsedException; +import org.mxchange.jshop.exceptions.ProductTitleAlreadyUsedException; +import org.mxchange.jshop.item.AddableBasketItem; +import org.mxchange.jshop.product.Product; +import org.mxchange.pizzaapplication.BasePizzaServiceSystem; + +/** + * Main application class + * + * @author Roland Haeder + */ +public class PizzaServiceApplication extends BasePizzaServiceSystem implements PizzaApplication { + /** + * Database frontend for products + */ + private ProductFrontend productFrontend; + + /** + * Database frontend for categories + */ + private CategoryFrontend categoryFrontend; + + /** + * Default constructor + */ + public PizzaServiceApplication () { + // Trace message + this.getLogger().trace("CALLED!"); //NOI18N + } + + @Override + public Deque getAllCategories () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { + // Deligate to frontend + return this.categoryFrontend.getAllCategories(); + } + + @Override + public Deque getAllProducts () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { + // Deligate to frontend + return this.productFrontend.getAllProducts(); + } + + @Override + public Deque getAvailableProducts () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { + // Deligate to frontend + return this.productFrontend.getAllAvailableProducts(); + } + + @Override + public void init (final ServletContext context) throws UnsupportedDatabaseBackendException, SQLException { + // Trace message + this.getLogger().trace(MessageFormat.format("context={0} - CALLED!", context)); //NOI18N + + // context should not be null + if (null == context) { + // Abort here + throw new NullPointerException("context is null"); //NOI18N + } + + // Is the bundle initialized? + if (!this.isBundledInitialized()) { + // Temporary initialize default bundle + // TODO The enum Gender uses this + this.initBundle(); + } + + // Initialize properties from context + this.initProperties(context); + + // Init database frontends + this.initDatabaseFrontends(); + + // Trace message + this.getLogger().trace("EXIT!"); //NOI18N + } + + @Override + public void doBootstrap () { + throw new UnsupportedOperationException("Not supported yet."); //NOI18N + } + + @Override + public void doMainLoop () { + throw new UnsupportedOperationException("Not supported yet."); //NOI18N + } + + @Override + public void doShutdown () { + throw new UnsupportedOperationException("Not supported yet."); //NOI18N + } + + @Override + @Deprecated + public String getPrintableProduktAvailability (final Product product) { + // Trace message + this.getLogger().trace(MessageFormat.format("product={0} - CALLED!", product)); //NOI18N + + // Is it null? + if (null == product) { + // Should not be null + throw new NullPointerException("product is null"); //NOI18N + } + + // Get availability + if (product.getAvailable() == true) { + // Is available + return "Ja"; + } else { + // Not, not for public + return "Nein"; + } + } + + @Override + @SuppressWarnings ("unchecked") + public Iterator getAvailableProductsIterator () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { + // categoryFrontend must be set + if (null == this.productFrontend) { + // Abort here + throw new NullPointerException("productFrontend is null"); //NOI18N + } + + // Ask frontend for a list of products + return (Iterator) this.productFrontend.getAvailableProductsIterator(); + } + + @Override + @SuppressWarnings ("unchecked") + public Iterator getAllProductsIterator () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { + // Trace message + this.getLogger().trace("CALLED!"); //NOI18N + + // categoryFrontend must be set + if (null == this.productFrontend) { + // Abort here + throw new NullPointerException("productFrontend is null"); //NOI18N + } + + // Ask frontend for a list of products + return (Iterator) this.productFrontend.getAllProductsIterator(); + } + + @Override + @SuppressWarnings ("unchecked") + public Iterator getAllCategoriesIterator () throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { + // Trace message + this.getLogger().trace("CALLED!"); //NOI18N + + // categoryFrontend must be set + if (null == this.categoryFrontend) { + // Abort here + throw new NullPointerException("categoryFrontend is null"); //NOI18N + } + + // Ask frontend for a list of categories + return (Iterator) this.categoryFrontend.getAllCategoriesIterator(); + } + + /** + * Initializes database frontends. + */ + private void initDatabaseFrontends () throws UnsupportedDatabaseBackendException, SQLException { + // Trace message + this.getLogger().trace("CALLED!"); //NOI18N + + // Product frontend + this.productFrontend = new ProductDatabaseFrontend(); + + // Category frontend + this.categoryFrontend = new CategoryDatabaseFrontend(); + + // Trace message + this.getLogger().trace("EXIT!"); //NOI18N + } + + /** + * Checks whether given category title is already used + * + * @param title Title of category to check + * @return Whether it has been found + */ + private boolean isCategoryTitleUsed(final String title) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + // categoryFrontend must be set + if (null == this.categoryFrontend) { + // Abort here + throw new NullPointerException("categoryFrontend is null"); //NOI18N + } + + // Delegate to frontend + return this.categoryFrontend.isCategoryTitleUsed(title); + } + + /** + * Checks if given product title is already used + * @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, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + // categoryFrontend must be set + if (null == this.productFrontend) { + // Abort here + throw new NullPointerException("productFrontend is null"); //NOI18N + } + + // Delegate to frontend + return this.productFrontend.isProductTitleUsed(title); + } + + @Override + public void doAdminAddCategory (final ServletRequest request) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, CategoryTitleAlreadyUsedException { + // Trace message + this.getLogger().trace(MessageFormat.format("request={0} - CALLED!", request)); //NOI18N + + // request must not be null + if (null == request) { + // Is null + throw new NullPointerException("request is null"); //NOI18N + } + + // Get all fields + String title = request.getParameter(CategoryFrontend.COLUMN_TITLE); + String parentId = request.getParameter(CategoryFrontend.COLUMN_PARENT); + + // Debug message + this.getLogger().debug(MessageFormat.format("title={0},parentId={1}", title, parentId)); //NOI18N + + // Init variables for casting + Integer id = 0; + + // Check all fields + if (null == title) { + // "title" not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", CategoryFrontend.COLUMN_TITLE)); //NOI18N + } else if (title.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", CategoryFrontend.COLUMN_TITLE)); //NOI18N + } else if ((parentId != null) && (!parentId.isEmpty())) { + // "parent" is set, so check it + try { + id = Integer.parseInt(parentId); + } catch (final NumberFormatException e) { + // Not valid number + throw new IllegalArgumentException(e); + } + } + + // Try to check if title is used already + if (this.isCategoryTitleUsed(title)) { + // Title already used + throw new CategoryTitleAlreadyUsedException(request); + } + + // The category is not found, so add it to database + this.categoryFrontend.addCategory(title, id); + + // Trace message + this.getLogger().trace("EXIT!"); //NOI18N + } + + @Override + public void doAdminAddProduct (final ServletRequest request) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, ProductTitleAlreadyUsedException { + // Trace message + this.getLogger().trace(MessageFormat.format("request={0} - CALLED!", request)); //NOI18N + + // request must not be null + if (null == request) { + // Is null + throw new NullPointerException("request is null"); //NOI18N + } + + // Get title, price and category id + String title = request.getParameter(ProductFrontend.COLUMN_TITLE); + String price = request.getParameter(ProductFrontend.COLUMN_PRICE); + String categoryId = request.getParameter(ProductFrontend.COLUMN_CATEGORY); + String available = request.getParameter(ProductFrontend.COLUMN_AVAILABLE); + + // Debug message + this.getLogger().debug(MessageFormat.format("title={0},price={1},categoryId={2},available={3}", title, price, categoryId, available)); //NOI18N + + // Variables for converting + Long id = null; + Float p = null; + + // Check all fields + if (null == title) { + // "title" not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", ProductFrontend.COLUMN_TITLE)); //NOI18N + } else if (title.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", ProductFrontend.COLUMN_TITLE)); //NOI18N + } else if (null == price) { + // "price" not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", ProductFrontend.COLUMN_PRICE)); //NOI18N + } else if (price.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", ProductFrontend.COLUMN_PRICE)); //NOI18N + } else if (null == categoryId) { + // "title" not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", ProductFrontend.COLUMN_CATEGORY)); //NOI18N + } else if (categoryId.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", ProductFrontend.COLUMN_CATEGORY)); //NOI18N + } else if (null == available) { + // "title" not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", ProductFrontend.COLUMN_AVAILABLE)); //NOI18N + } else if (available.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", ProductFrontend.COLUMN_AVAILABLE)); //NOI18N + } else if ((!"true".equals(available)) && (!"false".equals(available))) { //NOI18N + // Invalid value + throw new IllegalArgumentException(MessageFormat.format("{0} is invalid: {1}", ProductFrontend.COLUMN_AVAILABLE, available)); //NOI18N + } + + // Parse numbers + try { + id = Long.parseLong(categoryId); + p = Float.parseFloat(price); + } catch (final NumberFormatException e) { + // Not valid number + throw new IllegalArgumentException(e); + } + + // Parse boolean + Boolean a = Boolean.parseBoolean(available); + + // Try to check if title is used already + if (this.isProductTitleUsed(title)) { + // Title already used + throw new ProductTitleAlreadyUsedException(request); + } + + // The product is not found, so add it to database + this.productFrontend.addProduct(title, p, id, a); + + // Trace message + this.getLogger().trace("EXIT!"); //NOI18N + } + + @Override + @Deprecated + public String generateLinkForParent (final Category category) { + // Trace message + this.getLogger().trace(MessageFormat.format("category={0} - CALLED!", category)); //NOI18N + + // category must not be null + if (null == category) { + // Is null + throw new NullPointerException("category is null"); //NOI18N + } + + // Get parent id + Long parentId = category.getParentId(); + + // Is the id set? + if (parentId > 0) { + // Product HTML code for link + throw new UnsupportedOperationException(MessageFormat.format("parentId={0} - Unfinished!", parentId)); //NOI18N + } + + // No parent set + return "Keine"; + } + + @Override + @Deprecated + public String getPrintableProductCategory (final Product product) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { + // Trace message + this.getLogger().trace(MessageFormat.format("product={0} - CALLED!", product)); //NOI18N + + // product must not be null + if (null == product) { + // Abort here + throw new NullPointerException("product is null"); //NOI18N + } + + // Declare category + Category category; + + // Get Category instance from product over the frontend + category = this.categoryFrontend.getCategory(product); + + // Debug message + this.getLogger().debug(MessageFormat.format("categoryId={0}", category)); //NOI18N + + // Get decoded title + String title = category.getDecodedTitle(); + + // 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 ServletRequest 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(ProductFrontend.COLUMN_TITLE); + + // request must not be null and "title" must be found and non-empty + if (null == request) { + // Abort here + throw new NullPointerException("request is null"); //NOI18N + } else if (null == title) { + // title is not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", ProductFrontend.COLUMN_TITLE)); //NOI18N + } else if (title.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", ProductFrontend.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; + } + + @Override + public void doAdminHandleProductForms (final ServletRequest request, final ServletResponse response) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, ProductTitleAlreadyUsedException { + // Trace message + this.getLogger().trace(MessageFormat.format("request={0},response={1} - CALLED!", request, response)); //NOI18N + + // request and response must both be set + if (null == request) { + // request is null + throw new NullPointerException("request is null"); //NOI18N + } else if (null == response) { + // response is null + throw new NullPointerException("response is null"); //NOI18N + } + + // Is it post? + if ("POST".equals(((HttpServletRequest) 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 + ((HttpServletResponse) response).sendRedirect(String.format("%s/admin/product.jsp?already=1", ((HttpServletRequest) request).getContextPath())); //NOI18N + } else { + // Add new product + this.doAdminAddProduct(request); + + // Redirect to proper URL + ((HttpServletResponse) response).sendRedirect(String.format("%s/admin/product.jsp?added=1", ((HttpServletRequest) request).getContextPath())); //NOI18N + } + } else if (request.getParameter("edit") != null) { //NOI18N + // TODO + } else if (request.getParameter("delete") != null) { //NOI18N + // TODO + } + + // Request not handled + throw new IllegalArgumentException("request not handled."); //NOI18N + } + + // Trace message + this.getLogger().trace("EXIT!"); //NOI18N + } + + @Override + public void doAdminHandleCategoryForms (final ServletRequest request, final ServletResponse response) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, CategoryTitleAlreadyUsedException { + // Trace message + this.getLogger().trace(MessageFormat.format("request={0},response={1} - CALLED!", request, response)); //NOI18N + + // request and response must both be set + if (null == request) { + // request is null + throw new NullPointerException("request is null"); //NOI18N + } else if (null == response) { + // response is null + throw new NullPointerException("response is null"); //NOI18N + } + + // Is it post? + if ("POST".equals(((HttpServletRequest) 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 + ((HttpServletResponse) response).sendRedirect(String.format("%s/admin/category.jsp?already=1", ((HttpServletRequest) request).getContextPath())); //NOI18N + } else { + // Add new category + this.doAdminAddCategory(request); + + // Redirect to proper URL + ((HttpServletResponse) response).sendRedirect(String.format("%s/admin/category.jsp?added=1", ((HttpServletRequest) request).getContextPath())); //NOI18N + } + } else if (request.getParameter("edit") != null) { //NOI18N + // TODO + } else if (request.getParameter("delete") != null) { //NOI18N + // TODO + } + + // Request not handled + throw new IllegalArgumentException("request not handled."); //NOI18N + } + + // 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 ServletRequest 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(CategoryFrontend.COLUMN_TITLE); + + // request must not be null and "title" must be found and non-empty + if (null == request) { + // Abort here + throw new NullPointerException("request is null"); //NOI18N + } else if (null == title) { + // title is not set + throw new IllegalArgumentException(MessageFormat.format("{0} is not set.", CategoryFrontend.COLUMN_TITLE)); //NOI18N + } else if (title.isEmpty()) { + // Is left empty + throw new IllegalArgumentException(MessageFormat.format("{0} is empty.", CategoryFrontend.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; + } + + @Override + public Product getProduct (final AddableBasketItem item) throws IOException, BadTokenException, SQLException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { + // Trace message + this.getLogger().trace(MessageFormat.format("item={0} - CALLED!", item)); //NOI18N + + // item should not be null + if (null == item) { + // Abort here + throw new NullPointerException("item is null"); //NOI18N + } else if (null == this.productFrontend) { + // Abort here + throw new NullPointerException("productFrontend is null"); //NOI18N + } + + // Init product instance + Product product = this.productFrontend.getProduct(item); + + // Trace message + this.getLogger().trace(MessageFormat.format("product={0} - EXIT!", product)); //NOI18N //NOI18N + + // Return it + return product; + } +} diff --git a/src/org/mxchange/pizzaapplication/beans/controller/PizzaBean.java b/src/org/mxchange/pizzaapplication/beans/controller/PizzaBean.java new file mode 100644 index 0000000..e307676 --- /dev/null +++ b/src/org/mxchange/pizzaapplication/beans/controller/PizzaBean.java @@ -0,0 +1,163 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.beans.controller; + +import java.util.Deque; +import java.util.Iterator; +import javax.faces.FacesException; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import org.mxchange.jshop.beans.FrameworkBean; +import org.mxchange.jshop.category.Category; +import org.mxchange.jshop.exceptions.CategoryTitleAlreadyUsedException; +import org.mxchange.jshop.exceptions.ProductTitleAlreadyUsedException; +import org.mxchange.jshop.item.AddableBasketItem; +import org.mxchange.jshop.product.Product; + +/** + * + * @author Roland Haeder + */ +public interface PizzaBean extends FrameworkBean { + /** + * Initializes this instance + * + * @throws FacesException If something was wrong + */ + public void init () throws FacesException; + + /** + * Some "getter" for an iterator of only available products + * + * @return Only available products + * @throws javax.servlet.ServletException If anything went wrong + */ + public Iterator getAvailableProductsIterator () throws ServletException; + + /** + * Some "getter" for an iterator of all products + * + * @return All products + * @throws javax.servlet.ServletException If anything went wrong + */ + public Iterator getAllProductsIterator () throws ServletException; + + /** + * Some "getter" for an iterator of all categories + * + * @return All categories + * @throws javax.servlet.ServletException If anything went wrong + */ + public Iterator getAllCategoriesIterator () throws ServletException; + + /** + * Some "getter" for a linked list of only available products + * + * @return Only available products + * @throws javax.servlet.ServletException If anything went wrong + */ + public Deque getAvailableProducts () throws ServletException; + + /** + * Some "getter" for a linked list of all products + * + * @return All products + * @throws javax.servlet.ServletException If anything went wrong + */ + public Deque getAllProducts () throws ServletException; + + /** + * Some "getter" for a linked list of all categories + * + * @return All categories + * @throws javax.servlet.ServletException If anything went wrong + */ + public Deque getAllCategories () throws ServletException; + + /** + * Generates a link for category's parent category. If none is given, the method will return only a small + * note. + * + * @param category Category instance + * @return HTML link for category's parent category + * @deprecated Old lost code + */ + @Deprecated + public String generateLinkForParent (final Category category); + + /** + * Checks if given Product instance is available and returns a printable + * (human-readable) string. + * + * @param product Product instance to check + * @return Human-readable version of product availability + * @deprecated Old lost code + */ + @Deprecated + public String getPrintableProduktAvailability (final Product product); + + /** + * Returns a printable (human-readable) string of product's category + * + * @param product Product instance to check + * @return Human-readable version of product availability + * @throws javax.servlet.ServletException If something unexpected happened + * @deprecated Old lost code + */ + @Deprecated + public String getPrintableProduktCategory (final Product product) throws ServletException; + + /** + * Adds given category data from request to database + * + * @param request Request instance + * @throws javax.servlet.ServletException If something unexpected happened + * @throws org.mxchange.jshop.exceptions.CategoryTitleAlreadyUsedException If the given title is already used + */ + public void doAdminAddCategory (final ServletRequest request) throws ServletException, CategoryTitleAlreadyUsedException; + + /** + * Adds given product data from request to database + * + * @param request Request instance + * @throws javax.servlet.ServletException If something unexpected happened + * @throws org.mxchange.jshop.exceptions.ProductTitleAlreadyUsedException If the given product title is already used + */ + public void doAdminAddProduct (final ServletRequest request) throws ServletException, ProductTitleAlreadyUsedException; + + /** + * Handles admin product form requests + * + * @throws ServletException If something unexpected happened + */ + public void doAdminHandleProductForms () throws ServletException; + + /** + * Handles admin category form requests + * + * @throws ServletException If something unexpected happened + */ + public void doAdminHandleCategoryForms () throws ServletException; + + /** + * Some "getter" for a product from given item + * @param item Item instance + * @return A Product instance + * @throws javax.servlet.ServletException If something bad happens + */ + public Product getProduct (final AddableBasketItem item) throws ServletException; +} diff --git a/src/org/mxchange/pizzaapplication/beans/controller/PizzaServiceBean.java b/src/org/mxchange/pizzaapplication/beans/controller/PizzaServiceBean.java new file mode 100644 index 0000000..21c0e8f --- /dev/null +++ b/src/org/mxchange/pizzaapplication/beans/controller/PizzaServiceBean.java @@ -0,0 +1,250 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.beans.controller; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; +import java.text.MessageFormat; +import java.util.Deque; +import java.util.Iterator; +import javax.annotation.PostConstruct; +import javax.enterprise.context.SessionScoped; +import javax.faces.FacesException; +import javax.inject.Named; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpSession; +import org.mxchange.jcore.exceptions.BadTokenException; +import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException; +import org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException; +import org.mxchange.jshop.beans.BaseFrameworkBean; +import org.mxchange.jshop.category.Category; +import org.mxchange.jshop.exceptions.CategoryTitleAlreadyUsedException; +import org.mxchange.jshop.exceptions.ProductTitleAlreadyUsedException; +import org.mxchange.jshop.item.AddableBasketItem; +import org.mxchange.jshop.product.Product; +import org.mxchange.pizzaapplication.application.PizzaApplication; +import org.mxchange.pizzaapplication.application.PizzaServiceApplication; + +/** + * Main application class + * + * @author Roland Haeder + */ +@Named("controller") +@SessionScoped +public class PizzaServiceBean extends BaseFrameworkBean implements PizzaBean { + /** + * Serial id + */ + private static final long serialVersionUID = 58137539530279L; + + /** + * Pizza application + */ + private final PizzaApplication app; + + /** + * Initializer block + */ + { + // Get new application instance + this.getLogger().debug("INITIALIZER!"); //NOI18N + this.app = new PizzaServiceApplication(); + } + + /** + * Default constructor + */ + public PizzaServiceBean () { + this.getLogger().trace("CALLED!"); //NOI18N + } + + @Override + @Deprecated + public String getCheckedHtmlFromProduct (final Product product, final ServletRequest request, final HttpSession session) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + @Deprecated + public String getDisabledHtmlFromSession (final ServletRequest request, final HttpSession session) throws ServletException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + @PostConstruct + public void init () throws FacesException { + // Trace message + this.getLogger().trace(MessageFormat.format("application={0} - CALLED!", this.getApplication())); //NOI18N + + // Must not be null + if (this.getApplication() == null) { + // Abort here + throw new NullPointerException("application is null"); //NOI18N + } + + try { + // Call init method + this.app.init(this.getApplication()); + } catch (final UnsupportedDatabaseBackendException | SQLException | IOException | BadTokenException ex) { + // Continue to throw + throw new FacesException(ex); + } + } + + @Override + @Deprecated + public String getPrintableProduktAvailability (final Product product) { + return this.app.getPrintableProduktAvailability(product); + } + + @Override + public Iterator getAvailableProductsIterator () throws ServletException { + try { + return this.app.getAvailableProductsIterator(); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public Iterator getAllProductsIterator () throws ServletException { + try { + return this.app.getAllProductsIterator(); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public Deque getAvailableProducts () throws ServletException { + try { + return this.app.getAvailableProducts(); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public Deque getAllProducts () throws ServletException { + try { + return this.app.getAllProducts(); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public Iterator getAllCategoriesIterator () throws ServletException { + try { + return this.app.getAllCategoriesIterator(); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public Deque getAllCategories () throws ServletException { + try { + return this.app.getAllCategories(); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public void doAdminAddCategory (final ServletRequest request) throws ServletException, CategoryTitleAlreadyUsedException { + try { + this.app.doAdminAddCategory(request); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public void doAdminAddProduct (final ServletRequest request) throws ServletException, ProductTitleAlreadyUsedException { + try { + this.app.doAdminAddProduct(request); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + @Deprecated + public String getPrintableProduktCategory (final Product product) throws ServletException { + try { + return this.app.getPrintableProductCategory(product); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public void doAdminHandleProductForms () throws ServletException { + try { + this.app.doAdminHandleProductForms(this.getRequest(), this.getResponse()); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | ProductTitleAlreadyUsedException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public void doAdminHandleCategoryForms () throws ServletException { + try { + this.app.doAdminHandleCategoryForms(this.getRequest(), this.getResponse()); + } catch (final IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | CategoryTitleAlreadyUsedException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public Product getProduct (final AddableBasketItem item) throws ServletException { + try { + // Deligate to application + return this.app.getProduct(item); + } catch (IOException | BadTokenException | SQLException | CorruptedDatabaseFileException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + @Deprecated + public String generateLinkForParent (final Category category) { + // Deligate to app + return this.app.generateLinkForParent(category); + } + + @Override + public void setValueInSession (HttpSession session, String key, Object value) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } +} diff --git a/src/org/mxchange/pizzaapplication/beans/customer/CustomerBean.java b/src/org/mxchange/pizzaapplication/beans/customer/CustomerBean.java new file mode 100644 index 0000000..f913b47 --- /dev/null +++ b/src/org/mxchange/pizzaapplication/beans/customer/CustomerBean.java @@ -0,0 +1,293 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.beans.customer; + +import java.lang.reflect.Field; +import java.util.Iterator; +import java.util.Map; +import javax.servlet.ServletException; +import org.mxchange.jcore.client.Client; +import org.mxchange.jcore.contact.Gender; +import org.mxchange.jshop.beans.FrameworkBean; + +/** + * An interface for customer beans + * + * @author Roland Haeder + */ +public interface CustomerBean extends FrameworkBean { + /** + * Returns an iterator of all values from this object + * + * @return An iterator + * @throws javax.servlet.ServletException If something bad happens + */ + public Iterator> iterator ()throws ServletException; + + /** + * Some "getter" for translated gender of the contact + * + * @return Translated / human-readable gender + */ + public String getTranslatedGender (); + + /** + * Gender of the contact + * + * @return the gender + */ + public Gender getGender (); + + /** + * Gender of the contact + * + * @param gender the gender to set + */ + public void setGender (final Gender gender); + + /** + * First name + * + * @return the first name + */ + public String getFirstName (); + + /** + * First name + * + * @param firstName the first name to set + */ + public void setFirstName (final String firstName); + + /** + * Family name + * + * @return the familyName + */ + public String getFamilyName (); + + /** + * Family name + * + * @param familyName the familyName to set + */ + public void setFamilyName (final String familyName); + + /** + * Companyname + * + * @return the companyName + */ + public String getCompanyName (); + + /** + * Companyname + * + * @param companyName the companyName to set + */ + public void setCompanyName (final String companyName); + + /** + * Street + * + * @return the street + */ + public String getStreet (); + + /** + * Street + * + * @param street the street to set + */ + public void setStreet (final String street); + + /** + * House number + * + * @return the houseNumber + */ + public Long getHouseNumber (); + + /** + * House number + * + * @param houseNumber the houseNumber to set + */ + public void setHouseNumber (final Long houseNumber); + + /** + * ZIP code + * + * @return the zipCode + */ + public Long getZipCode (); + + /** + * ZIP code + * + * @param zipCode the zipCode to set + */ + public void setZipCode (final Long zipCode); + + /** + * City + * + * @return the city + */ + public String getCity (); + + /** + * City + * + * @param city the city to set + */ + public void setCity (final String city); + + /** + * Country code + * + * @return the countryCode + */ + public String getCountryCode (); + + /** + * Country code + * + * @param countryCode the countryCode to set + */ + public void setCountryCode (final String countryCode); + + /** + * Email address + * + * @return the emailAddress + */ + public String getEmailAddress (); + + /** + * Email address + * + * @param emailAddress the emailAddress to set + */ + public void setEmailAddress (final String emailAddress); + + /** + * Phone number + * + * @return the phoneNumber + */ + public String getPhoneNumber (); + + /** + * Phone number + * + * @param phoneNumber the phoneNumber to set + */ + public void setPhoneNumber (final String phoneNumber); + + /** + * Fax number + * + * @return the faxNumber + */ + public String getFaxNumber (); + + /** + * Fax number + * + * @param faxNumber the faxNumber to set + */ + public void setFaxNumber (final String faxNumber); + + /** + * Cellphone number + * + * @return the cellphoneNumber + */ + public String getCellphoneNumber (); + + /** + * Cellphone number + * + * @param cellphoneNumber the cellphoneNumber to set + */ + public void setCellphoneNumber (final String cellphoneNumber); + + /** + * Birth day + * + * @return the birthday + */ + public String getBirthday (); + + /** + * Birth day + * + * @param birthday the birthday to set + */ + public void setBirthday (final String birthday); + + /** + * Comments + * + * @return the comment + */ + public String getComment (); + + /** + * Comments + * + * @param comment the comment to set + */ + public void setComment (final String comment); + + /** + * Checks whether the contact is user's own data + * + * @return Own data? + */ + public boolean isOwnContact (); + + /** + * Shows the contact to the user + * + * @param client Client instance to call back + */ + public void show (final Client client); + + /** + * Some "getter for a value from given column name. This name will be + * translated into a method name and then this method is called. + * + * @param columnName Column name + * @return Value from field + * @throws IllegalArgumentException Some implementations may throw this + * @throws javax.servlet.ServletException If something bad happens + */ + public Object getValueFromColumn (final String columnName) throws ServletException; + + /** + * Some "setter" for a value from given column name. You may wish to overwrite this method in your + * own class. + * + * @param columnName Column name + * @param value Value to set in object's field + * @throws IllegalArgumentException Some implementations may throw this + * @throws javax.servlet.ServletException If something bad happens + */ + public void setValueFromColumn (final String columnName, final Object value) throws ServletException; +} diff --git a/src/org/mxchange/pizzaapplication/beans/customer/PizzaServiceCustomerBean.java b/src/org/mxchange/pizzaapplication/beans/customer/PizzaServiceCustomerBean.java new file mode 100644 index 0000000..68b4eea --- /dev/null +++ b/src/org/mxchange/pizzaapplication/beans/customer/PizzaServiceCustomerBean.java @@ -0,0 +1,311 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.beans.customer; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.util.Iterator; +import java.util.Map; +import javax.enterprise.context.SessionScoped; +import javax.inject.Named; +import javax.servlet.ServletException; +import org.mxchange.jcore.client.Client; +import org.mxchange.jcore.contact.Contact; +import org.mxchange.jcore.contact.Gender; +import org.mxchange.jshop.beans.BaseFrameworkBean; +import org.mxchange.pizzaapplication.customer.PizzaServiceCustomer; + +/** + * A customer bean which hides the customer instance + * + * @author Roland Haeder + */ +@Named("customer") +@SessionScoped +public class PizzaServiceCustomerBean extends BaseFrameworkBean implements CustomerBean { + /** + * Serial number + */ + private static final long serialVersionUID = 542145347916L; + + /** + * Contact instance + */ + private Contact contact; + + /** + * Default constructor + */ + public PizzaServiceCustomerBean () { + // Instance customer + Contact customer = new PizzaServiceCustomer(); + + // And set it here + this.setContact(customer); + } + + @Override + public String getBirthday () { + // Deligate to "hidden" object + return this.getContact().getBirthday(); + } + + @Override + public void setBirthday (final String birthday) { + // Deligate to "hidden" object + this.getContact().setBirthday(birthday); + } + + @Override + public String getCellphoneNumber () { + // Deligate to "hidden" object + return this.getContact().getCellphoneNumber(); + } + + @Override + public void setCellphoneNumber (final String cellphoneNumber) { + // Deligate to "hidden" object + this.getContact().setCellphoneNumber(cellphoneNumber); + } + + @Override + public String getCity () { + // Deligate to "hidden" object + return this.getContact().getCity(); + } + + @Override + public void setCity (final String city) { + // Deligate to "hidden" object + this.getContact().setCity(city); + } + + @Override + public String getComment () { + // Deligate to "hidden" object + return this.getContact().getComment(); + } + + @Override + public void setComment (final String comment) { + // Deligate to "hidden" object + this.getContact().setComment(comment); + } + + @Override + public String getCompanyName () { + // Deligate to "hidden" object + return this.getContact().getCompanyName(); + } + + @Override + public void setCompanyName (final String companyName) { + // Deligate to "hidden" object + this.getContact().setCompanyName(companyName); + } + + @Override + public String getCountryCode () { + // Deligate to "hidden" object + return this.getContact().getCountryCode(); + } + + @Override + public void setCountryCode (final String countryCode) { + // Deligate to "hidden" object + this.getContact().setCountryCode(countryCode); + } + + @Override + public String getEmailAddress () { + // Deligate to "hidden" object + return this.getContact().getEmailAddress(); + } + + @Override + public void setEmailAddress (final String emailAddress) { + // Deligate to "hidden" object + this.getContact().setEmailAddress(emailAddress); + } + + @Override + public String getFamilyName () { + // Trace call + //* NOISY-DEBUG: */ this.getLogger().trace("CALLED!"); + + // Deligate to "hidden" object + return this.getContact().getFamilyName(); + } + + @Override + public void setFamilyName (final String familyName) { + // Trace call + //* NOISY-DEBUG: */ this.getLogger().trace(MessageFormat.format("familyName={0} - CALLED!", familyName)); + + // Deligate to "hidden" object + this.getContact().setFamilyName(familyName); + } + + @Override + public String getFaxNumber () { + // Deligate to "hidden" object + return this.getContact().getFaxNumber(); + } + + @Override + public void setFaxNumber (final String faxNumber) { + // Deligate to "hidden" object + this.getContact().setFaxNumber(faxNumber); + } + + @Override + public Gender getGender () { + // Deligate to "hidden" object + return this.getContact().getGender(); + } + + @Override + public void setGender (final Gender gender) { + // Deligate to "hidden" object + this.getContact().setGender(gender); + } + + @Override + public Long getHouseNumber () { + // Deligate to "hidden" object + return this.getContact().getHouseNumber(); + } + + @Override + public void setHouseNumber (final Long houseNumber) { + // Deligate to "hidden" object + this.getContact().setHouseNumber(houseNumber); + } + + @Override + public String getPhoneNumber () { + // Deligate to "hidden" object + return this.getContact().getPhoneNumber(); + } + + @Override + public void setPhoneNumber (final String phoneNumber) { + // Deligate to "hidden" object + this.getContact().setPhoneNumber(phoneNumber); + } + + @Override + public String getStreet () { + // Deligate to "hidden" object + return this.getContact().getStreet(); + } + + @Override + public void setStreet (final String street) { + // Deligate to "hidden" object + this.getContact().setStreet(street); + } + + @Override + public String getFirstName () { + // Deligate to "hidden" object + return this.getContact().getFirstName(); + } + + @Override + public void setFirstName (final String firstName) { + // Deligate to "hidden" object + this.getContact().setFirstName(firstName); + } + + @Override + public String getTranslatedGender () { + // Deligate to "hidden" object + return this.getContact().getTranslatedGender(); + } + + @Override + public Long getZipCode () { + // Deligate to "hidden" object + return this.getContact().getZipCode(); + } + + @Override + public void setZipCode (final Long zipCode) { + // Deligate to "hidden" object + this.getContact().setZipCode(zipCode); + } + + @Override + public boolean isOwnContact () { + throw new UnsupportedOperationException("Not supported yet."); //NOI18N + } + + @Override + public Iterator> iterator () throws ServletException { + try { + // Deligate to "hidden" object + return this.getContact().iterator(); + } catch (final NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public void show (final Client client) { + throw new UnsupportedOperationException("Not supported yet."); //NOI18N + } + + @Override + public Object getValueFromColumn (final String columnName) throws ServletException { + try { + // Deligate to "hidden" object + return this.getContact().getValueFromColumn(columnName); + } catch (final IllegalArgumentException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + @Override + public void setValueFromColumn (final String columnName, final Object value) throws ServletException { + try { + // Deligate to "hidden" object + this.getContact().setValueFromColumn(columnName, value); + } catch (final NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { + // Continue to throw + throw new ServletException(ex); + } + } + + /** + * Setter for Contact instance + * @param contact Contact instance to set + */ + private void setContact (final Contact contact) { + this.contact = contact; + } + + /** + * Getter for Contact instance + * @return Contact instance + */ + private Contact getContact () { + return this.contact; + } +} diff --git a/src/org/mxchange/pizzaapplication/customer/Customer.java b/src/org/mxchange/pizzaapplication/customer/Customer.java new file mode 100644 index 0000000..7d2cf5f --- /dev/null +++ b/src/org/mxchange/pizzaapplication/customer/Customer.java @@ -0,0 +1,28 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.customer; + +import org.mxchange.jcore.contact.Contact; + +/** + * A customer interface + * + * @author Roland Haeder + */ +public interface Customer extends Contact { + +} diff --git a/src/org/mxchange/pizzaapplication/customer/PizzaServiceCustomer.java b/src/org/mxchange/pizzaapplication/customer/PizzaServiceCustomer.java new file mode 100644 index 0000000..a83f065 --- /dev/null +++ b/src/org/mxchange/pizzaapplication/customer/PizzaServiceCustomer.java @@ -0,0 +1,26 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.customer; + +import org.mxchange.jcore.contact.BaseContact; + +/** + * + * @author Roland Haeder + */ +public class PizzaServiceCustomer extends BaseContact implements Customer { +} diff --git a/src/org/mxchange/pizzaapplication/tags/basket/BasketTag.java b/src/org/mxchange/pizzaapplication/tags/basket/BasketTag.java new file mode 100644 index 0000000..139e50b --- /dev/null +++ b/src/org/mxchange/pizzaapplication/tags/basket/BasketTag.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2015 quix0r + * + * 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 . + */ +package org.mxchange.pizzaapplication.tags.basket; + +import javax.servlet.jsp.tagext.BodyTag; +import org.mxchange.jshop.beans.basket.BasketBean; + +/** + * + * @author quix0r + */ +public interface BasketTag extends BodyTag { + + /** + * @return the basket + */ + public BasketBean getBasket (); + + /** + * @param basket the basket to set + */ + public void setBasket (final BasketBean basket); +} diff --git a/src/org/mxchange/pizzaapplication/tags/basket/MiniBasketTag.java b/src/org/mxchange/pizzaapplication/tags/basket/MiniBasketTag.java new file mode 100644 index 0000000..eff5214 --- /dev/null +++ b/src/org/mxchange/pizzaapplication/tags/basket/MiniBasketTag.java @@ -0,0 +1,180 @@ +/* + * 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 . + */ +package org.mxchange.pizzaapplication.tags.basket; + +import java.io.IOException; +import java.text.MessageFormat; +import javax.servlet.ServletException; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.BodyTagSupport; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.mxchange.jshop.beans.basket.BasketBean; +import org.mxchange.jshop.item.AddableBasketItem; +import org.mxchange.jshop.product.Product; +import org.mxchange.pizzaapplication.beans.controller.PizzaBean; + +/** + * A basket tag that outputs a small basket and a link to the full basket website. + * + * @author Roland Haeder + */ +public class MiniBasketTag extends BodyTagSupport implements BasketTag { + /** + * Serial number + */ + private static final long serialVersionUID = 457415727452384L; + + /** + * Basket instance + */ + private BasketBean basket; + + /** + * Logger instance + */ + private final Logger LOG; + + /** + * Initializer + */ + { + this.LOG = LogManager.getLogger(this); + } + + /** + * Outputs a div container with last added item + a link to the basket + * web page. + * + * @return No need to process the body + * @throws JspException If anything happens + */ + @Override + public int doStartTag () throws JspException { + // Trace message + this.LOG.trace("CALLED!"); //NOI18N + + // Init output + StringBuilder out = new StringBuilder("
\n"); //NOI18N + + // basket should not be null + if (this.getBasket() == null) { + // Not set + throw new NullPointerException("basket instance is null"); //NOI18N + } + + try { + // Some entries found? + if (this.getBasket().isEmpty()) { + // Empty basket + out.append("
\n"); //NOI18N + out.append(this.getBasket().getMessageStringFromKey("MiniBasketTag.basket_is_empty")).append("\n"); //NOI18N + out.append("
\n"); //NOI18N + } else { + // Get all items + AddableBasketItem item = this.getBasket().getLast(); + + // item cannot be null here + if (null == item) { + // Abort here + throw new NullPointerException("item is null"); //NOI18N + } + + // Get application bean from session + PizzaBean bean = (PizzaBean) this.getBasket().getSession().getAttribute("controller"); //NOI18N + + // Debug log + this.LOG.debug(MessageFormat.format("bean={0}", bean)); //NOI18N + + // Should not be null + if (null == bean) { + // Abort here + throw new NullPointerException("bean is null"); //NOI18N + } + + // Get product instance + Product product = bean.getProduct(item); + + // Debug message + this.LOG.debug(MessageFormat.format("product={0}", product)); //NOI18N + + // Get last num rows + int lastNumRows = this.getBasket().getLastNumRows(); + + // Debug message + this.LOG.debug(MessageFormat.format("lastNumRows={0}", lastNumRows)); //NOI18N + + // Output all + out.append("
\n"); //NOI18N + out.append("
\n"); //NOI18N + out.append(" ").append(this.getBasket().getMessageStringFromKey("MiniBasketTag.header")).append("\n"); //NOI18N + out.append("
\n"); //NOI18N + out.append("
\n"); //NOI18N + out.append(" ").append(MessageFormat.format(this.getBasket().getMessageStringFromKey("MiniBasketTag.last_item"), product.getTitle())); //NOI18N + out.append("
\n"); //NOI18N + out.append("
\n"); //NOI18N + out.append(" ").append(MessageFormat.format(this.getBasket().getMessageStringFromKey("MiniBasketTag.additional_items"), (lastNumRows - 1))); //NOI18N + out.append("
\n"); //NOI18N + out.append("
\n"); //NOI18N + out.append(" ").append(this.getBasket().getMessageStringFromKey("MiniBasketTag.to_basket")).append("\n"); //NOI18N + out.append("
\n"); //NOI18N + out.append("
\n"); //NOI18N + } + } catch (final ServletException ex) { + // Continue to throw + throw new JspException(ex); + } + + try { + // Get output instance and write it + this.pageContext.getOut().print(out.toString()); + } catch (final IOException ex) { + // Continue to throw + throw new JspException(ex); + } + + // Trace message + this.LOG.trace(MessageFormat.format("Returning {0} ... - EXIT!", SKIP_BODY)); //NOI18N + + // Don't process any body + return SKIP_BODY; + } + + /** + * @return the basket + */ + @Override + public BasketBean getBasket () { + // Trace message + //* NOISY-DEBUG: */ this.LOG.trace("basket=" + this.basket + " - EXIT!"); + + // Return it + return this.basket; + } + + /** + * @param basket the basket to set + */ + @Override + public void setBasket (final BasketBean basket) { + // Trace message + //* NOISY-DEBUG: */ this.LOG.trace("basked=" + basket + " - CALLED!"); + + // Set it here + this.basket = basket; + } +}