From 73d3fbb5d2d34604904771f32db378f9a42cdd5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Wed, 24 Aug 2016 16:31:27 +0200 Subject: [PATCH] JUser-Activity-core has derived from juser-core. This library logs user's activity of any kind (type) and may include a message (e.g. lock reason) in it as well. Ideas to expand: - IP address - user agent - referer URL - data that has been changed (old-new values) - ??? --- build.xml | 6 +- lib/commons-codec-1.10.jar | Bin 284184 -> 0 bytes lib/jcontacts-core.jar | Bin 47941 -> 0 bytes lib/jcoreee.jar | Bin 30045 -> 0 bytes lib/juser-core.jar | Bin 0 -> 76906 bytes nbproject/build-impl.xml | 2882 +++++++++-------- nbproject/project.properties | 200 +- nbproject/project.xml | 36 +- .../container/login/LoginContainer.java | 57 - .../container/login/UserLoginContainer.java | 87 - .../ConfirmedUserAccountEvent.java | 71 - .../UserConfirmedAccountEvent.java | 36 - .../events/login/UserLoggedInEvent.java | 36 - .../events/login/UserLoginEvent.java | 66 - .../logout/ObserveableUserLogoutEvent.java | 36 - .../events/logout/UserLogoutEvent.java | 66 - .../registration/RegisteredUserEvent.java | 71 - .../registration/UserRegisteredEvent.java | 36 - .../events/user/add/AdminAddedUserEvent.java | 37 - .../events/user/add/AdminUserAddedEvent.java | 66 - .../user/linked/AdminLinkedUserEvent.java | 37 - .../user/linked/AdminUserLinkedEvent.java | 67 - .../user/locked/AdminLockedUserEvent.java | 37 - .../user/locked/AdminUserLockedEvent.java | 66 - .../UpdatedUserPasswordEvent.java | 35 - .../UserUpdatedPasswordEvent.java | 69 - .../user/unlocked/AdminUnlockedUserEvent.java | 37 - .../user/unlocked/AdminUserUnlockedEvent.java | 66 - .../update/AdminUpdatedUserDataEvent.java | 36 - .../update/AdminUserDataUpdatedEvent.java | 66 - .../update/UpdatedUserPersonalDataEvent.java | 35 - .../update/UserUpdatedPersonalDataEvent.java | 66 - .../DataRepeatMismatchException.java | 40 - ...mailAddressAlreadyRegisteredException.java | 44 - .../UserEmailAddressNotFoundException.java | 42 - .../UserNameAlreadyRegisteredException.java | 54 - .../exceptions/UserNotFoundException.java | 53 - .../UserPasswordMismatchException.java | 44 - .../UserPasswordRepeatMismatchException.java | 44 - .../UserStatusConfirmedException.java | 44 - .../exceptions/UserStatusLockedException.java | 44 - .../UserStatusUnconfirmedException.java | 44 - .../email_address/ChangeableEmailAddress.java | 135 - .../email_address/EmailAddressChange.java | 272 -- .../status/EmailChangeStatus.java | 72 - .../jusercore/model/user/LoginUser.java | 356 -- .../mxchange/jusercore/model/user/User.java | 228 -- .../jusercore/model/user/UserUtils.java | 382 --- .../user/activity/LogableUserActivity.java | 106 + .../model/user/activity/UserActivityLog.java | 212 ++ .../password_history/PasswordHistory.java | 95 - .../password_history/UserPasswordHistory.java | 186 -- .../model/user/profilemodes/ProfileMode.java | 65 - .../model/user/status/UserAccountStatus.java | 83 - 54 files changed, 1882 insertions(+), 5169 deletions(-) delete mode 100644 lib/commons-codec-1.10.jar delete mode 100644 lib/jcontacts-core.jar delete mode 100644 lib/jcoreee.jar create mode 100644 lib/juser-core.jar delete mode 100644 src/org/mxchange/jusercore/container/login/LoginContainer.java delete mode 100644 src/org/mxchange/jusercore/container/login/UserLoginContainer.java delete mode 100644 src/org/mxchange/jusercore/events/confirmation/ConfirmedUserAccountEvent.java delete mode 100644 src/org/mxchange/jusercore/events/confirmation/UserConfirmedAccountEvent.java delete mode 100644 src/org/mxchange/jusercore/events/login/UserLoggedInEvent.java delete mode 100644 src/org/mxchange/jusercore/events/login/UserLoginEvent.java delete mode 100644 src/org/mxchange/jusercore/events/logout/ObserveableUserLogoutEvent.java delete mode 100644 src/org/mxchange/jusercore/events/logout/UserLogoutEvent.java delete mode 100644 src/org/mxchange/jusercore/events/registration/RegisteredUserEvent.java delete mode 100644 src/org/mxchange/jusercore/events/registration/UserRegisteredEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/add/AdminAddedUserEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/add/AdminUserAddedEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/linked/AdminLinkedUserEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/linked/AdminUserLinkedEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/locked/AdminLockedUserEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/locked/AdminUserLockedEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/password_change/UpdatedUserPasswordEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/password_change/UserUpdatedPasswordEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/unlocked/AdminUnlockedUserEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/unlocked/AdminUserUnlockedEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/update/AdminUpdatedUserDataEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/update/AdminUserDataUpdatedEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/update/UpdatedUserPersonalDataEvent.java delete mode 100644 src/org/mxchange/jusercore/events/user/update/UserUpdatedPersonalDataEvent.java delete mode 100644 src/org/mxchange/jusercore/exceptions/DataRepeatMismatchException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/EmailAddressAlreadyRegisteredException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/UserEmailAddressNotFoundException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/UserNameAlreadyRegisteredException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/UserNotFoundException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/UserPasswordMismatchException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/UserPasswordRepeatMismatchException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/UserStatusConfirmedException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/UserStatusLockedException.java delete mode 100644 src/org/mxchange/jusercore/exceptions/UserStatusUnconfirmedException.java delete mode 100644 src/org/mxchange/jusercore/model/email_address/ChangeableEmailAddress.java delete mode 100644 src/org/mxchange/jusercore/model/email_address/EmailAddressChange.java delete mode 100644 src/org/mxchange/jusercore/model/email_address/status/EmailChangeStatus.java delete mode 100644 src/org/mxchange/jusercore/model/user/LoginUser.java delete mode 100644 src/org/mxchange/jusercore/model/user/User.java delete mode 100644 src/org/mxchange/jusercore/model/user/UserUtils.java create mode 100644 src/org/mxchange/jusercore/model/user/activity/LogableUserActivity.java create mode 100644 src/org/mxchange/jusercore/model/user/activity/UserActivityLog.java delete mode 100644 src/org/mxchange/jusercore/model/user/password_history/PasswordHistory.java delete mode 100644 src/org/mxchange/jusercore/model/user/password_history/UserPasswordHistory.java delete mode 100644 src/org/mxchange/jusercore/model/user/profilemodes/ProfileMode.java delete mode 100644 src/org/mxchange/jusercore/model/user/status/UserAccountStatus.java diff --git a/build.xml b/build.xml index 8726c4d..d3b2757 100644 --- a/build.xml +++ b/build.xml @@ -7,8 +7,8 @@ - - Builds, tests, and runs the project juser-core. + + Builds, tests, and runs the project juser-activity. 5;N*- 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 JiTc_d8>l(pWkxHal{Z==e>~eIZk;#MntTD-k;5 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 diff --git a/lib/jcontacts-core.jar b/lib/jcontacts-core.jar deleted file mode 100644 index ce2093fc97d0ea122e06ac374611df23533ad191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47941 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 Dzr+#d diff --git a/lib/jcoreee.jar b/lib/jcoreee.jar deleted file mode 100644 index 8f17116fadd23a3d2ed86c88255b95836f7b24b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30045 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 literal 0 HcmV?d00001 diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml index c3d2cd9..ca053ab 100644 --- a/nbproject/build-impl.xml +++ b/nbproject/build-impl.xml @@ -1,1438 +1,1444 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/project.properties b/nbproject/project.properties index 8ebcafb..a0aad23 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -1,101 +1,99 @@ -annotation.processing.enabled=true -annotation.processing.enabled.in.editor=true -annotation.processing.processors.list= -annotation.processing.run.all.processors=true -annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output -application.title=juser-core -application.vendor=Roland Haeder -auxiliary.org-netbeans-spi-editor-hints-projects.perProjectHintSettingsFile=nbproject/cfg_hints.xml -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}/juser-core.jar -dist.javadoc.dir=${dist.dir}/javadoc -endorsed.classpath= -excludes= -file.reference.commons-codec-1.10.jar=lib/commons-codec-1.10.jar -file.reference.jcontacts-core.jar=lib/jcontacts-core.jar -file.reference.jcoreee.jar=lib/jcoreee.jar -includes=** -jar.archive.disabled=${jnlp.enabled} -jar.compress=false -jar.index=${jnlp.enabled} -javac.classpath=\ - ${file.reference.jcoreee.jar}:\ - ${file.reference.jcontacts-core.jar}:\ - ${file.reference.commons-codec-1.10.jar}:\ - ${libs.javaee-api-7.0.classpath} -# Space-separated list of extra javac options -javac.compilerargs=-Xlint:unchecked -Xlint:deprecation -javac.deprecation=true -javac.external.vm=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=true -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=true -javadoc.reference.commons-codec-1.10.jar=https://commons.apache.org/proper/commons-codec/archives/1.10/apidocs/ -javadoc.splitindex=true -javadoc.use=true -javadoc.version=true -javadoc.windowtitle=User Library -jnlp.codebase.type=no.codebase -jnlp.descriptor=application -jnlp.enabled=false -jnlp.mixed.code=default -jnlp.offline-allowed=false -jnlp.signed=false -jnlp.signing= -jnlp.signing.alias= -jnlp.signing.keystore= -# Optional override of default Codebase manifest attribute, use to prevent RIAs from being repurposed -manifest.custom.codebase= -# Optional override of default Permissions manifest attribute (supported values: sandbox, all-permissions) -manifest.custom.permissions= -meta.inf.dir=${src.dir}/META-INF -mkdist.disabled=true -platform.active=default_platform -project.license=gpl30 -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 -source.reference.jcontacts-core.jar=../jcontacts-core/src/ -source.reference.jcoreee.jar=../jcoreee/src/ -src.dir=src -test.src.dir=test +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=true +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=juser-activity-core +application.vendor=Roland Haeder +auxiliary.org-netbeans-spi-editor-hints-projects.perProjectHintSettingsFile=nbproject/cfg_hints.xml +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}/juser-activity-core.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +file.reference.juser-core.jar=lib/juser-core.jar +includes=** +jar.archive.disabled=${jnlp.enabled} +jar.compress=false +jar.index=${jnlp.enabled} +javac.classpath=\ + ${file.reference.juser-core.jar}:\ + ${libs.javaee-api-7.0.classpath} +# Space-separated list of extra javac options +javac.compilerargs=-Xlint:unchecked -Xlint:deprecation +javac.deprecation=true +javac.external.vm=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=true +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=true +javadoc.splitindex=true +javadoc.use=true +javadoc.version=true +javadoc.windowtitle=User Activity Log Library +jnlp.codebase.type=no.codebase +jnlp.descriptor=application +jnlp.enabled=false +jnlp.mixed.code=default +jnlp.offline-allowed=false +jnlp.signed=false +jnlp.signing= +jnlp.signing.alias= +jnlp.signing.keystore= +# Optional override of default Application-Library-Allowable-Codebase attribute identifying the locations where your signed RIA is expected to be found. +manifest.custom.application.library.allowable.codebase= +# Optional override of default Caller-Allowable-Codebase attribute identifying the domains from which JavaScript code can make calls to your RIA without security prompts. +manifest.custom.caller.allowable.codebase= +# Optional override of default Codebase manifest attribute, use to prevent RIAs from being repurposed +manifest.custom.codebase= +# Optional override of default Permissions manifest attribute (supported values: sandbox, all-permissions) +manifest.custom.permissions= +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=true +platform.active=default_platform +project.license=gpl30 +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 +source.reference.juser-core.jar=../juser-core/src/ +src.dir=src +test.src.dir=test diff --git a/nbproject/project.xml b/nbproject/project.xml index 1643b78..6206458 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -1,18 +1,18 @@ - - - org.netbeans.modules.java.j2seproject - - - juser-core - - - - - - - - - ./lib/nblibraries.properties - - - + + + org.netbeans.modules.java.j2seproject + + + juser-activity-core + + + + + + + + + ./lib/nblibraries.properties + + + diff --git a/src/org/mxchange/jusercore/container/login/LoginContainer.java b/src/org/mxchange/jusercore/container/login/LoginContainer.java deleted file mode 100644 index 87014e9..0000000 --- a/src/org/mxchange/jusercore/container/login/LoginContainer.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.container.login; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * A container for login data - *

- * @author Roland Haeder - */ -public interface LoginContainer extends Serializable { - - /** - * Getter for user instance - *

- * @return User instance - */ - User getUser (); - - /** - * Setter for user instance - *

- * @param user User instance - */ - void setUser (final User user); - - /** - * Getter for user password - *

- * @return User password - */ - String getUserPassword (); - - /** - * Setter for user password - *

- * @param userPassword User password - */ - void setUserPassword (final String userPassword); - -} diff --git a/src/org/mxchange/jusercore/container/login/UserLoginContainer.java b/src/org/mxchange/jusercore/container/login/UserLoginContainer.java deleted file mode 100644 index f54a3ba..0000000 --- a/src/org/mxchange/jusercore/container/login/UserLoginContainer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.container.login; - -import org.mxchange.jusercore.model.user.User; - -/** - * A user login container - *

- * @author Roland Haeder - */ -public class UserLoginContainer implements LoginContainer { - - /** - * Serial number - */ - private static final long serialVersionUID = 158_768_718_689_760_186L; - - /** - * User instance - */ - private User user; - - /** - * Unencrypted password - */ - private String userPassword; - - /** - * Constructor with user instance and unencrypted password - *

- * @param user User instance - * @param userPassword Unencrypted password - */ - public UserLoginContainer (final User user, final String userPassword) { - // Is both set? - if (null == user) { - // Throw NPE - throw new NullPointerException("user is null"); //NOI18N - } else if (null == userPassword) { - // Throw NPE again - throw new NullPointerException("userPassword is null"); //NOI18N - } else if (userPassword.isEmpty()) { - // Empty password - throw new IllegalArgumentException("user password is empty."); //NOI18N - } - - // Set both - this.user = user; - this.userPassword = userPassword; - } - - @Override - public User getUser () { - return this.user; - } - - @Override - public void setUser (final User user) { - this.user = user; - } - - @Override - public String getUserPassword () { - return this.userPassword; - } - - @Override - public void setUserPassword (final String userPassword) { - this.userPassword = userPassword; - } - -} diff --git a/src/org/mxchange/jusercore/events/confirmation/ConfirmedUserAccountEvent.java b/src/org/mxchange/jusercore/events/confirmation/ConfirmedUserAccountEvent.java deleted file mode 100644 index 0481159..0000000 --- a/src/org/mxchange/jusercore/events/confirmation/ConfirmedUserAccountEvent.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.confirmation; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An event, fireed if a new confirmedUser has confirmed - *

- * @author Roland Haeder - */ -public class ConfirmedUserAccountEvent implements UserConfirmedAccountEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 575_412_375_267_190L; - - /** - * Newly confirmed user - */ - private final User confirmedUser; - - /** - * Constructor with newly confirmed confirmedUser - *

- * @param confirmedUser Newly confirmed confirmedUser - */ - public ConfirmedUserAccountEvent (final User confirmedUser) { - // Is the confirmed user instance valid? - if (null == confirmedUser) { - // Throw NPE - throw new NullPointerException("confirmedUser is null"); //NOI18N - } else if (confirmedUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("confirmedUser.userId is null"); //NOI18N - } else if (confirmedUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("confirmedUser.userId={0} is invalid.", confirmedUser.getUserId())); //NOI18N - } - - // Set it here - this.confirmedUser = confirmedUser; - } - - /** - * Getter for confirmedUser instance - *

- * @return User instance - */ - @Override - public User getConfirmedUser () { - return this.confirmedUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/confirmation/UserConfirmedAccountEvent.java b/src/org/mxchange/jusercore/events/confirmation/UserConfirmedAccountEvent.java deleted file mode 100644 index 1bbea50..0000000 --- a/src/org/mxchange/jusercore/events/confirmation/UserConfirmedAccountEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.confirmation; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An event interface, fireed if a new user has registered - *

- * @author Roland Haeder - */ -public interface UserConfirmedAccountEvent extends Serializable { - - /** - * Getter for user instance - *

- * @return User instance - */ - User getConfirmedUser (); - -} diff --git a/src/org/mxchange/jusercore/events/login/UserLoggedInEvent.java b/src/org/mxchange/jusercore/events/login/UserLoggedInEvent.java deleted file mode 100644 index 1846490..0000000 --- a/src/org/mxchange/jusercore/events/login/UserLoggedInEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.login; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An interface for events after the user has logged in - *

- * @author Roland Haeder - */ -public interface UserLoggedInEvent extends Serializable { - - /** - * Getter for user instance - *

- * @return User instance - */ - User getLoggedInUser (); - -} diff --git a/src/org/mxchange/jusercore/events/login/UserLoginEvent.java b/src/org/mxchange/jusercore/events/login/UserLoginEvent.java deleted file mode 100644 index bfc25a6..0000000 --- a/src/org/mxchange/jusercore/events/login/UserLoginEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.login; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * This event is fired when the loggedInUser has logged in - *

- * @author Roland Haeder - */ -public class UserLoginEvent implements UserLoggedInEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 163_294_958_817_560L; - - /** - * User instance - */ - private final User loggedInUser; - - /** - * Constructor with updated user instance - *

- * @param loggedInUser Updated user instance - */ - public UserLoginEvent (final User loggedInUser) { - // Is the logged-in user instance valid? - if (null == loggedInUser) { - // Throw NPE - throw new NullPointerException("loggedInUser is null"); //NOI18N - } else if (loggedInUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("loggedInUser.userId is null"); //NOI18N - } else if (loggedInUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("loggedInUser.userId={0} is invalid.", loggedInUser.getUserId())); //NOI18N - } - - // Set loggedInUser - this.loggedInUser = loggedInUser; - } - - @Override - public User getLoggedInUser () { - return this.loggedInUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/logout/ObserveableUserLogoutEvent.java b/src/org/mxchange/jusercore/events/logout/ObserveableUserLogoutEvent.java deleted file mode 100644 index e9d430b..0000000 --- a/src/org/mxchange/jusercore/events/logout/ObserveableUserLogoutEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.logout; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An interface for events after the user has logged in - *

- * @author Roland Haeder - */ -public interface ObserveableUserLogoutEvent extends Serializable { - - /** - * Getter for user instance - *

- * @return User instance - */ - User getLoggedOutUser (); - -} diff --git a/src/org/mxchange/jusercore/events/logout/UserLogoutEvent.java b/src/org/mxchange/jusercore/events/logout/UserLogoutEvent.java deleted file mode 100644 index 3ee0555..0000000 --- a/src/org/mxchange/jusercore/events/logout/UserLogoutEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.logout; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * This event is fired when the loggedOutUser has logged in - *

- * @author Roland Haeder - */ -public class UserLogoutEvent implements ObserveableUserLogoutEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 58_617_641_290_620L; - - /** - * User instance - */ - private final User loggedOutUser; - - /** - * Constructor with updated loggedOutUser instance - *

- * @param loggedOutUser Updated loggedOutUser instance - */ - public UserLogoutEvent (final User loggedOutUser) { - // Is the logged-in user instance valid? - if (null == loggedOutUser) { - // Throw NPE - throw new NullPointerException("loggedOutUser is null"); //NOI18N - } else if (loggedOutUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("loggedOutUser.userId is null"); //NOI18N - } else if (loggedOutUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("loggedOutUser.userId={0} is invalid.", loggedOutUser.getUserId())); //NOI18N - } - - // Set loggedOutUser - this.loggedOutUser = loggedOutUser; - } - - @Override - public User getLoggedOutUser () { - return this.loggedOutUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/registration/RegisteredUserEvent.java b/src/org/mxchange/jusercore/events/registration/RegisteredUserEvent.java deleted file mode 100644 index 85ae473..0000000 --- a/src/org/mxchange/jusercore/events/registration/RegisteredUserEvent.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.registration; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An event, fireed if a new registeredUser has registered - *

- * @author Roland Haeder - */ -public class RegisteredUserEvent implements UserRegisteredEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 186_956_974_127_691L; - - /** - * Newly registered registeredUser; - */ - private final User registeredUser; - - /** - * Constructor with newly registered registeredUser - *

- * @param registeredUser Newly registered registeredUser - */ - public RegisteredUserEvent (final User registeredUser) { - // Is the registered user instance valid? - if (null == registeredUser) { - // Throw NPE - throw new NullPointerException("registeredUser is null"); //NOI18N - } else if (registeredUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("registeredUser.userId is null"); //NOI18N - } else if (registeredUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("registeredUser.userId={0} is invalid.", registeredUser.getUserId())); //NOI18N - } - - // Set it here - this.registeredUser = registeredUser; - } - - /** - * Getter for registeredUser instance - *

- * @return User instance - */ - @Override - public User getRegisteredUser () { - return this.registeredUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/registration/UserRegisteredEvent.java b/src/org/mxchange/jusercore/events/registration/UserRegisteredEvent.java deleted file mode 100644 index ee1ecbe..0000000 --- a/src/org/mxchange/jusercore/events/registration/UserRegisteredEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.registration; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An event interface, fireed if a new user has registered - *

- * @author Roland Haeder - */ -public interface UserRegisteredEvent extends Serializable { - - /** - * Getter for user instance - *

- * @return User instance - */ - User getRegisteredUser (); - -} diff --git a/src/org/mxchange/jusercore/events/user/add/AdminAddedUserEvent.java b/src/org/mxchange/jusercore/events/user/add/AdminAddedUserEvent.java deleted file mode 100644 index f1b8173..0000000 --- a/src/org/mxchange/jusercore/events/user/add/AdminAddedUserEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.add; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An interface for events being fired when an administrator added a new user - * account. - *

- * @author Roland Haeder - */ -public interface AdminAddedUserEvent extends Serializable { - - /** - * Getter for added user instance - *

- * @return Added user instance - */ - User getAddedUser (); - -} diff --git a/src/org/mxchange/jusercore/events/user/add/AdminUserAddedEvent.java b/src/org/mxchange/jusercore/events/user/add/AdminUserAddedEvent.java deleted file mode 100644 index 8889084..0000000 --- a/src/org/mxchange/jusercore/events/user/add/AdminUserAddedEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.add; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An event being fired when the administrator has added a new user account - *

- * @author Roland Haeder - */ -public class AdminUserAddedEvent implements AdminAddedUserEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 14_785_787_174_676_290L; - - /** - * Added user instance - */ - private final User addedUser; - - /** - * Constructor with added user instance - *

- * @param addedUser Added user instance - */ - public AdminUserAddedEvent (final User addedUser) { - // Is the user instance valid? - if (null == addedUser) { - // Throw NPE - throw new NullPointerException("addedUser is null"); //NOI18N - } else if (addedUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("addedUser.userId is null"); //NOI18N - } else if (addedUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("addedUser.userId={0} is invalid.", addedUser.getUserId())); //NOI18N - } - - // Set it here - this.addedUser = addedUser; - } - - @Override - public User getAddedUser () { - return this.addedUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/user/linked/AdminLinkedUserEvent.java b/src/org/mxchange/jusercore/events/user/linked/AdminLinkedUserEvent.java deleted file mode 100644 index c34ce80..0000000 --- a/src/org/mxchange/jusercore/events/user/linked/AdminLinkedUserEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.linked; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An interface for events being fired when an administrator linked a new user - * account with existing contact data. - *

- * @author Roland Haeder - */ -public interface AdminLinkedUserEvent extends Serializable { - - /** - * Getter for linked user instance - *

- * @return linked user instance - */ - User getLinkedUser (); - -} diff --git a/src/org/mxchange/jusercore/events/user/linked/AdminUserLinkedEvent.java b/src/org/mxchange/jusercore/events/user/linked/AdminUserLinkedEvent.java deleted file mode 100644 index f35cc70..0000000 --- a/src/org/mxchange/jusercore/events/user/linked/AdminUserLinkedEvent.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.linked; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An event being fired when the administrator has linked a new user account - * with existing contact data. - *

- * @author Roland Haeder - */ -public class AdminUserLinkedEvent implements AdminLinkedUserEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 14_785_787_174_676_290L; - - /** - * Linked user instance - */ - private final User linkedUser; - - /** - * Constructor with linked user instance - *

- * @param linkedUser Linked user instance - */ - public AdminUserLinkedEvent (final User linkedUser) { - // Is the user instance valid? - if (null == linkedUser) { - // Throw NPE - throw new NullPointerException("linkedUser is null"); //NOI18N - } else if (linkedUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("linkedUser.userId is null"); //NOI18N - } else if (linkedUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("linkedUser.userId={0} is invalid.", linkedUser.getUserId())); //NOI18N - } - - // Set it here - this.linkedUser = linkedUser; - } - - @Override - public User getLinkedUser () { - return this.linkedUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/user/locked/AdminLockedUserEvent.java b/src/org/mxchange/jusercore/events/user/locked/AdminLockedUserEvent.java deleted file mode 100644 index cd3196d..0000000 --- a/src/org/mxchange/jusercore/events/user/locked/AdminLockedUserEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.locked; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An interface for events being fired when an administrator locked a user - * account. - *

- * @author Roland Haeder - */ -public interface AdminLockedUserEvent extends Serializable { - - /** - * Getter for locked user instance - *

- * @return locked user instance - */ - User getLockedUser (); - -} diff --git a/src/org/mxchange/jusercore/events/user/locked/AdminUserLockedEvent.java b/src/org/mxchange/jusercore/events/user/locked/AdminUserLockedEvent.java deleted file mode 100644 index a2df3f9..0000000 --- a/src/org/mxchange/jusercore/events/user/locked/AdminUserLockedEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.locked; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An event being fired when the administrator has locked a user account. - *

- * @author Roland Haeder - */ -public class AdminUserLockedEvent implements AdminLockedUserEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 14_785_787_174_676_290L; - - /** - * Locked user instance - */ - private final User lockedUser; - - /** - * Constructor with linked user instance - *

- * @param lockedUser Locked user instance - */ - public AdminUserLockedEvent (final User lockedUser) { - // Is the user instance valid? - if (null == lockedUser) { - // Throw NPE - throw new NullPointerException("lockedUser is null"); //NOI18N - } else if (lockedUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("lockedUser.userId is null"); //NOI18N - } else if (lockedUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("lockedUser.userId={0} is invalid.", lockedUser.getUserId())); //NOI18N - } - - // Set it here - this.lockedUser = lockedUser; - } - - @Override - public User getLockedUser () { - return this.lockedUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/user/password_change/UpdatedUserPasswordEvent.java b/src/org/mxchange/jusercore/events/user/password_change/UpdatedUserPasswordEvent.java deleted file mode 100644 index 600e749..0000000 --- a/src/org/mxchange/jusercore/events/user/password_change/UpdatedUserPasswordEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.password_change; - -import org.mxchange.jusercore.model.user.password_history.PasswordHistory; - -/** - * An interface for events being fired when a user updates personal data. - *

- * @author Roland Haeder - */ -public interface UpdatedUserPasswordEvent { - - /** - * Getter for password history entry - *

- * @return Password history entry - */ - PasswordHistory getPasswordHistory (); - -} diff --git a/src/org/mxchange/jusercore/events/user/password_change/UserUpdatedPasswordEvent.java b/src/org/mxchange/jusercore/events/user/password_change/UserUpdatedPasswordEvent.java deleted file mode 100644 index 629f195..0000000 --- a/src/org/mxchange/jusercore/events/user/password_change/UserUpdatedPasswordEvent.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.password_change; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.password_history.PasswordHistory; - -/** - * An event being fired when the user has updated personal data - *

- * @author Roland Haeder - */ -public class UserUpdatedPasswordEvent implements UpdatedUserPasswordEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 14_785_787_174_676_290L; - - /** - * Updated user instance - */ - private final PasswordHistory passwordHistory; - - /** - * Constructor with updated user instance - *

- * @param passwordHistory Updated user instance - */ - public UserUpdatedPasswordEvent (final PasswordHistory passwordHistory) { - // Is the user instance valid? - if (null == passwordHistory) { - // Throw NPE - throw new NullPointerException("passwordHistory is null"); //NOI18N - } else if (passwordHistory.getUserPasswordHistoryUser() == null) { - // Throw NPE again - throw new NullPointerException("passwordHistory.userPasswordHistoryUser is null"); //NOI18N - } else if (passwordHistory.getUserPasswordHistoryUser().getUserId() == null) { - // Throw NPE again - throw new NullPointerException("passwordHistory.userPasswordHistoryUser.userId is null"); //NOI18N - } else if (passwordHistory.getUserPasswordHistoryUser().getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("passwordHistory.userPasswordHistoryUser.userId={0} is invalid.", passwordHistory.getUserPasswordHistoryUser().getUserId())); //NOI18N - } - - // Set it here - this.passwordHistory = passwordHistory; - } - - @Override - public PasswordHistory getPasswordHistory () { - return this.passwordHistory; - } - -} diff --git a/src/org/mxchange/jusercore/events/user/unlocked/AdminUnlockedUserEvent.java b/src/org/mxchange/jusercore/events/user/unlocked/AdminUnlockedUserEvent.java deleted file mode 100644 index bc0c422..0000000 --- a/src/org/mxchange/jusercore/events/user/unlocked/AdminUnlockedUserEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.unlocked; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An interface for events being fired when an administrator unlocked a user - * account. - *

- * @author Roland Haeder - */ -public interface AdminUnlockedUserEvent extends Serializable { - - /** - * Getter for unlocked user instance - *

- * @return Unlocked user instance - */ - User getUnlockedUser (); - -} diff --git a/src/org/mxchange/jusercore/events/user/unlocked/AdminUserUnlockedEvent.java b/src/org/mxchange/jusercore/events/user/unlocked/AdminUserUnlockedEvent.java deleted file mode 100644 index 145314b..0000000 --- a/src/org/mxchange/jusercore/events/user/unlocked/AdminUserUnlockedEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.unlocked; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An event being fired when the administrator has unlocked a user account. - *

- * @author Roland Haeder - */ -public class AdminUserUnlockedEvent implements AdminUnlockedUserEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 14_785_787_174_676_290L; - - /** - * Unlocked user instance - */ - private final User unlockedUser; - - /** - * Constructor with linked user instance - *

- * @param unlockedUser Unlocked user instance - */ - public AdminUserUnlockedEvent (final User unlockedUser) { - // Is the user instance valid? - if (null == unlockedUser) { - // Throw NPE - throw new NullPointerException("unlockedUser is null"); //NOI18N - } else if (unlockedUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("unlockedUser.userId is null"); //NOI18N - } else if (unlockedUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("unlockedUser.userId={0} is invalid.", unlockedUser.getUserId())); //NOI18N - } - - // Set it here - this.unlockedUser = unlockedUser; - } - - @Override - public User getUnlockedUser () { - return this.unlockedUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/user/update/AdminUpdatedUserDataEvent.java b/src/org/mxchange/jusercore/events/user/update/AdminUpdatedUserDataEvent.java deleted file mode 100644 index 5b32266..0000000 --- a/src/org/mxchange/jusercore/events/user/update/AdminUpdatedUserDataEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.update; - -import java.io.Serializable; -import org.mxchange.jusercore.model.user.User; - -/** - * An interface for events being fired when an administrator updated user data. - *

- * @author Roland Haeder - */ -public interface AdminUpdatedUserDataEvent extends Serializable { - - /** - * Getter for updated user instance - *

- * @return Added user instance - */ - User getUpdatedUser (); - -} diff --git a/src/org/mxchange/jusercore/events/user/update/AdminUserDataUpdatedEvent.java b/src/org/mxchange/jusercore/events/user/update/AdminUserDataUpdatedEvent.java deleted file mode 100644 index 4a9fda3..0000000 --- a/src/org/mxchange/jusercore/events/user/update/AdminUserDataUpdatedEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.update; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An event being fired when the administrator has updated user data - *

- * @author Roland Haeder - */ -public class AdminUserDataUpdatedEvent implements AdminUpdatedUserDataEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 14_785_787_174_676_290L; - - /** - * Updated user instance - */ - private final User updatedUser; - - /** - * Constructor with updated user instance - *

- * @param updatedUser Updated user instance - */ - public AdminUserDataUpdatedEvent (final User updatedUser) { - // Is the user instance valid? - if (null == updatedUser) { - // Throw NPE - throw new NullPointerException("updatedUser is null"); //NOI18N - } else if (updatedUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("updatedUser.userId is null"); //NOI18N - } else if (updatedUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("updatedUser.userId={0} is invalid.", updatedUser.getUserId())); //NOI18N - } - - // Set it here - this.updatedUser = updatedUser; - } - - @Override - public User getUpdatedUser () { - return this.updatedUser; - } - -} diff --git a/src/org/mxchange/jusercore/events/user/update/UpdatedUserPersonalDataEvent.java b/src/org/mxchange/jusercore/events/user/update/UpdatedUserPersonalDataEvent.java deleted file mode 100644 index 6499521..0000000 --- a/src/org/mxchange/jusercore/events/user/update/UpdatedUserPersonalDataEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.update; - -import org.mxchange.jusercore.model.user.User; - -/** - * An interface for events being fired when a user updates personal data. - *

- * @author Roland Haeder - */ -public interface UpdatedUserPersonalDataEvent { - - /** - * Getter for updated user instance - *

- * @return Added user instance - */ - User getUpdatedUser (); - -} diff --git a/src/org/mxchange/jusercore/events/user/update/UserUpdatedPersonalDataEvent.java b/src/org/mxchange/jusercore/events/user/update/UserUpdatedPersonalDataEvent.java deleted file mode 100644 index 9e65dae..0000000 --- a/src/org/mxchange/jusercore/events/user/update/UserUpdatedPersonalDataEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.events.user.update; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An event being fired when the user has updated personal data - *

- * @author Roland Haeder - */ -public class UserUpdatedPersonalDataEvent implements UpdatedUserPersonalDataEvent { - - /** - * Serial number - */ - private static final long serialVersionUID = 14_785_787_174_676_290L; - - /** - * Updated user instance - */ - private final User updatedUser; - - /** - * Constructor with updated user instance - *

- * @param updatedUser Updated user instance - */ - public UserUpdatedPersonalDataEvent (final User updatedUser) { - // Is the user instance valid? - if (null == updatedUser) { - // Throw NPE - throw new NullPointerException("updatedUser is null"); //NOI18N - } else if (updatedUser.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("updatedUser.userId is null"); //NOI18N - } else if (updatedUser.getUserId() < 1) { - // Invalid id number - throw new IllegalArgumentException(MessageFormat.format("updatedUser.userId={0} is invalid.", updatedUser.getUserId())); //NOI18N - } - - // Set it here - this.updatedUser = updatedUser; - } - - @Override - public User getUpdatedUser () { - return this.updatedUser; - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/DataRepeatMismatchException.java b/src/org/mxchange/jusercore/exceptions/DataRepeatMismatchException.java deleted file mode 100644 index 7606d6e..0000000 --- a/src/org/mxchange/jusercore/exceptions/DataRepeatMismatchException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -/** - * An exception thrown when the user has not entered same email addresses - *

- * @author Roland Haeder - */ -public class DataRepeatMismatchException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 12_857_813_986_248_156L; - - /** - * Constructor with message - *

- * @param message Message to show - */ - public DataRepeatMismatchException (final String message) { - super(message); - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/EmailAddressAlreadyRegisteredException.java b/src/org/mxchange/jusercore/exceptions/EmailAddressAlreadyRegisteredException.java deleted file mode 100644 index c0e1ddf..0000000 --- a/src/org/mxchange/jusercore/exceptions/EmailAddressAlreadyRegisteredException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An exception thrown when the user's email address is already registered. - *

- * @author Roland Haeder - */ -public class EmailAddressAlreadyRegisteredException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 16_435_892_878_271L; - - /** - * Constructor with already registered user instance - *

- * @param user User instance - */ - public EmailAddressAlreadyRegisteredException (final User user) { - // Call super contructor - super(MessageFormat.format("Email address {0} already registered.", user.getUserContact().getContactEmailAddress())); //NOI18N - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/UserEmailAddressNotFoundException.java b/src/org/mxchange/jusercore/exceptions/UserEmailAddressNotFoundException.java deleted file mode 100644 index 8a1591f..0000000 --- a/src/org/mxchange/jusercore/exceptions/UserEmailAddressNotFoundException.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; - -/** - * An exception thrown when an user email address was not found. - *

- * @author Roland Haeder - */ -public class UserEmailAddressNotFoundException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 50_375_271_856_714_906L; - - /** - * Constructor with email address - *

- * @param emailAddress Email address - */ - public UserEmailAddressNotFoundException (final String emailAddress) { - super(MessageFormat.format("User email address {0} not found.", emailAddress)); //NOI18N - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/UserNameAlreadyRegisteredException.java b/src/org/mxchange/jusercore/exceptions/UserNameAlreadyRegisteredException.java deleted file mode 100644 index f32fbb1..0000000 --- a/src/org/mxchange/jusercore/exceptions/UserNameAlreadyRegisteredException.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An exception thrown when the user name is already registered - *

- * @author Roland Haeder - */ -public class UserNameAlreadyRegisteredException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 16_435_892_878_271L; - - /** - * Constructor with already registered user instance - *

- * @param user User instance - */ - public UserNameAlreadyRegisteredException (final User user) { - // Call super contructor - super(MessageFormat.format("User name {0} already registered at record id {1}. Maybe forgot to call isRegistered(user) ?", user.getUserName(), user.getUserId())); - } - - /** - * Constructor with already registered user name - *

- * @param userName User name - */ - public UserNameAlreadyRegisteredException (final String userName) { - // Call super contructor - super(MessageFormat.format("User name {0} already used. Maybe forgot to call isRegistered(user) ?", userName)); - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/UserNotFoundException.java b/src/org/mxchange/jusercore/exceptions/UserNotFoundException.java deleted file mode 100644 index c8710f7..0000000 --- a/src/org/mxchange/jusercore/exceptions/UserNotFoundException.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An exception thrown when the user's account was not found - *

- * @author Roland Haeder - */ -public class UserNotFoundException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 42_895_928_956_718_956L; - - /** - * Constructor with already registered user instance - *

- * @param user User instance - */ - public UserNotFoundException (final User user) { - // Call super contructor - super(MessageFormat.format("User name {0} not found.", user.getUserName())); //NOI18N - } - - /** - * Constructor with user id - *

- * @param userId User id - */ - public UserNotFoundException (final Long userId) { - super(MessageFormat.format("User id {0} not found.", userId)); //NOI18N - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/UserPasswordMismatchException.java b/src/org/mxchange/jusercore/exceptions/UserPasswordMismatchException.java deleted file mode 100644 index 55db22b..0000000 --- a/src/org/mxchange/jusercore/exceptions/UserPasswordMismatchException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An exception thrown when the entered password did not match the stored - * password. - *

- * @author Roland Haeder - */ -public class UserPasswordMismatchException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 97_283_567_871_569_401L; - - /** - * Creates an exception with given user instance - *

- * @param user User instance - */ - public UserPasswordMismatchException (final User user) { - super(MessageFormat.format("Password for user {0} does not match stored password.", user)); - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/UserPasswordRepeatMismatchException.java b/src/org/mxchange/jusercore/exceptions/UserPasswordRepeatMismatchException.java deleted file mode 100644 index 8a28369..0000000 --- a/src/org/mxchange/jusercore/exceptions/UserPasswordRepeatMismatchException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An exception thrown when the entered password did not match the stored - * password. - *

- * @author Roland Haeder - */ -public class UserPasswordRepeatMismatchException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 51_782_450_671_256_594L; - - /** - * Creates an exception with given user instance - *

- * @param user User instance - */ - public UserPasswordRepeatMismatchException (final User user) { - super(MessageFormat.format("Passwords don't match, userId={0}", user.getUserId())); - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/UserStatusConfirmedException.java b/src/org/mxchange/jusercore/exceptions/UserStatusConfirmedException.java deleted file mode 100644 index 28cfdb7..0000000 --- a/src/org/mxchange/jusercore/exceptions/UserStatusConfirmedException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An exception thrown when the user account is unconfirmed - *

- * @author Roland Haeder - */ -public class UserStatusConfirmedException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 541_378_578_296_710L; - - /** - * Constructor with already registered user instance - *

- * @param user User instance - */ - public UserStatusConfirmedException (final User user) { - // Call super contructor - super(MessageFormat.format("User account with user name {0} is confirmed.", user.getUserName())); - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/UserStatusLockedException.java b/src/org/mxchange/jusercore/exceptions/UserStatusLockedException.java deleted file mode 100644 index bb96e7f..0000000 --- a/src/org/mxchange/jusercore/exceptions/UserStatusLockedException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An exception thrown when the user account is locked - *

- * @author Roland Haeder - */ -public class UserStatusLockedException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 438_395_891_288_681L; - - /** - * Constructor with already registered user instance - *

- * @param user User instance - */ - public UserStatusLockedException (final User user) { - // Call super contructor - super(MessageFormat.format("User account with user name {0} is locked.", user.getUserName())); - } - -} diff --git a/src/org/mxchange/jusercore/exceptions/UserStatusUnconfirmedException.java b/src/org/mxchange/jusercore/exceptions/UserStatusUnconfirmedException.java deleted file mode 100644 index 543cb80..0000000 --- a/src/org/mxchange/jusercore/exceptions/UserStatusUnconfirmedException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.exceptions; - -import java.text.MessageFormat; -import org.mxchange.jusercore.model.user.User; - -/** - * An exception thrown when the user account is unconfirmed - *

- * @author Roland Haeder - */ -public class UserStatusUnconfirmedException extends Exception { - - /** - * Serial number - */ - private static final long serialVersionUID = 438_395_891_288_681L; - - /** - * Constructor with already registered user instance - *

- * @param user User instance - */ - public UserStatusUnconfirmedException (final User user) { - // Call super contructor - super(MessageFormat.format("User account with user name {0} is unconfirmed.", user.getUserName())); - } - -} diff --git a/src/org/mxchange/jusercore/model/email_address/ChangeableEmailAddress.java b/src/org/mxchange/jusercore/model/email_address/ChangeableEmailAddress.java deleted file mode 100644 index 5d2d726..0000000 --- a/src/org/mxchange/jusercore/model/email_address/ChangeableEmailAddress.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.email_address; - -import java.io.Serializable; -import java.util.Calendar; -import org.mxchange.jusercore.model.email_address.status.EmailChangeStatus; -import org.mxchange.jusercore.model.user.User; - -/** - * A POJI for email address changes. This is required to have the user confirm - * the change (avoids abuse a bit). - *

- * @author Roland Haeder - */ -public interface ChangeableEmailAddress extends Serializable { - - /** - * Getter for email change id - *

- * @return Email change id - */ - Long getEmailChangeId (); - - /** - * Setter for email change id - *

- * @param emailChangeId Email change id - */ - void setEmailChangeId (final Long emailChangeId); - - /** - * Getter for email address to change to - *

- * @return Email address to change to - */ - String getEmailAddress (); - - /** - * Setter for email address to change to - *

- * @param emailAddress Email address to change to - */ - void setEmailAddress (final String emailAddress); - - /** - * Getter for created "email change" timestamp - *

- * @return Created "email change" timestamp - */ - Calendar getEmailChangeCreated (); - - /** - * Setter for created "email change" timestamp - *

- * @param emailChangeCreated Created "email change" timestamp - */ - void setEmailChangeCreated (final Calendar emailChangeCreated); - - /** - * Getter for user initiating the email change - *

- * @return User initiating the email change - */ - User getEmailChangeUser (); - - /** - * Setter for user initiating the email change - *

- * @param emailChangeUser User initiating the email change - */ - void setEmailChangeUser (final User emailChangeUser); - - /** - * Getter for email change done/undone - *

- * @return Email change done/undone - */ - Calendar getEmailChangeDone (); - - /** - * Setter for email change done/undone - *

- * @param emailChangeDone Email change done/undone - */ - void setEmailChangeDone (final Calendar emailChangeDone); - - /** - * Getter for email change status - *

- * @return Email change status - */ - EmailChangeStatus getEmailChangeStatus (); - - /** - * Setter for email change status - *

- * @param emailChangeStatus Email change status - */ - void setEmailChangeStatus (final EmailChangeStatus emailChangeStatus); - - /** - * Getter for email change hash - *

- * @return Email change hash - */ - String getEmailChangeHash (); - - /** - * Getter for email change hash - *

- * @param emailChangeHash Email change hash - */ - void setEmailChangeHash (final String emailChangeHash); - - @Override - boolean equals (final Object object); - - @Override - int hashCode (); -} diff --git a/src/org/mxchange/jusercore/model/email_address/EmailAddressChange.java b/src/org/mxchange/jusercore/model/email_address/EmailAddressChange.java deleted file mode 100644 index 718c4c5..0000000 --- a/src/org/mxchange/jusercore/model/email_address/EmailAddressChange.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.email_address; - -import java.util.Calendar; -import java.util.Objects; -import javax.persistence.Basic; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; -import org.mxchange.jusercore.model.email_address.status.EmailChangeStatus; -import org.mxchange.jusercore.model.user.LoginUser; -import org.mxchange.jusercore.model.user.User; - -/** - * A POJO for changing email addresses. - *

- * @author Roland Haeder - */ -@Entity (name = "email_changes") -@Table (name = "email_changes") -@NamedQueries ( - value = { - @NamedQuery (name = "SearchEmailChangeByEmail", query = "SELECT e FROM email_changes AS e WHERE LOWER(e.emailAddress) LIKE LOWER(:email)"), - @NamedQuery (name = "AllEmailAddressChanges", query = "SELECT e.emailAddress FROM email_changes AS e ORDER BY e.emailChangeId ASC"), - @NamedQuery (name = "SearchEmailChangeByHash", query = "SELECT e FROM email_changes AS e WHERE e.emailChangeHash = :hash") - } -) -@SuppressWarnings ("PersistenceUnitPresent") -public class EmailAddressChange implements ChangeableEmailAddress { - - /** - * Serial number - */ - @Transient - private static final long serialVersionUID = 398_459_287_176_139L; - - /** - * Email address to change to - */ - @Basic (optional = false) - @Column (name = "email_address", length = 100, nullable = false, updatable = false) - private String emailAddress; - - /** - * Timestamp when this change has been added - */ - @Basic (optional = false) - @Temporal (TemporalType.TIMESTAMP) - @Column (name = "email_change_created", nullable = false, updatable = false) - private Calendar emailChangeCreated; - - /** - * Timestamp when this change has been done or undone - */ - @Basic (optional = false) - @Temporal (TemporalType.TIMESTAMP) - @Column (name = "email_change_done", nullable = false, updatable = false) - private Calendar emailChangeDone; - - /** - * Email change hash the user has to click - */ - @Basic (optional = false) - @Column (name = "email_change_hash", unique = true) - private String emailChangeHash; - - /** - * Email change id - */ - @Id - @GeneratedValue (strategy = GenerationType.IDENTITY) - @Column (name = "email_change_id", nullable = false, updatable = false) - private Long emailChangeId; - - /** - * Email change status - */ - @Basic (optional = false) - @Column (name = "email_change_status", nullable = false, updatable = false) - @Enumerated (EnumType.STRING) - private EmailChangeStatus emailChangeStatus; - - /** - * User initiating the email change - */ - @JoinColumn (name = "email_change_user_id", nullable = false, updatable = false) - @OneToOne (targetEntity = LoginUser.class, cascade = CascadeType.REFRESH, optional = false) - private User emailChangeUser; - - /** - * Default constructor - */ - public EmailAddressChange () { - // Set default email change status - this.emailChangeStatus = EmailChangeStatus.NEW; - } - - /** - * Constructor with all fields to set - *

- * @param emailChangeId Email change id - * @param user User instance - * @param emailAddress Email address - * @param emailChangeCreated Timestamp for creation - * @param emailChangeStatus Email change status - * @param emailChangeDone When this entry has been done - * @param emailChangeHash Email change hash - */ - public EmailAddressChange (final Long emailChangeId, final User user, final String emailAddress, final Calendar emailChangeCreated, final EmailChangeStatus emailChangeStatus, final Calendar emailChangeDone, final String emailChangeHash) { - // Call other constructor - this(user, emailAddress); - - // Set remaining - this.emailChangeId = emailChangeId; - this.emailChangeCreated = emailChangeCreated; - this.emailChangeStatus = emailChangeStatus; - this.emailChangeDone = emailChangeDone; - this.emailChangeHash = emailChangeHash; - } - - /** - * Constructor with user and email address - *

- * @param user User instance - * @param emailAddress Email address - */ - public EmailAddressChange (final User user, final String emailAddress) { - // Call other constructor - this(); - - // Set all - this.emailChangeUser = user; - this.emailAddress = emailAddress; - } - - @Override - public boolean equals (final Object object) { - if (this == object) { - return true; - } else if (null == object) { - return false; - } else if (this.getClass() != object.getClass()) { - return false; - } - - final ChangeableEmailAddress otherEmail = (ChangeableEmailAddress) object; - - if (!Objects.equals(this.getEmailChangeId(), otherEmail.getEmailChangeId())) { - return false; - } else if (!Objects.equals(this.getEmailAddress(), otherEmail.getEmailAddress())) { - return false; - } else if (!Objects.equals(this.getEmailChangeUser(), otherEmail.getEmailChangeUser())) { - return false; - } - - return true; - } - - @Override - public String getEmailAddress () { - return this.emailAddress; - } - - @Override - public void setEmailAddress (final String emailAddress) { - this.emailAddress = emailAddress; - } - - @Override - @SuppressWarnings ("ReturnOfDateField") - public Calendar getEmailChangeCreated () { - return this.emailChangeCreated; - } - - @Override - @SuppressWarnings ("AssignmentToDateFieldFromParameter") - public void setEmailChangeCreated (final Calendar emailChangeCreated) { - this.emailChangeCreated = emailChangeCreated; - } - - @Override - @SuppressWarnings ("ReturnOfDateField") - public Calendar getEmailChangeDone () { - return this.emailChangeDone; - } - - @Override - @SuppressWarnings ("AssignmentToDateFieldFromParameter") - public void setEmailChangeDone (final Calendar emailChangeDone) { - this.emailChangeDone = emailChangeDone; - } - - @Override - public String getEmailChangeHash () { - return this.emailChangeHash; - } - - @Override - public void setEmailChangeHash (final String emailChangeHash) { - this.emailChangeHash = emailChangeHash; - } - - @Override - public Long getEmailChangeId () { - return this.emailChangeId; - } - - @Override - public void setEmailChangeId (final Long emailChangeId) { - this.emailChangeId = emailChangeId; - } - - @Override - public EmailChangeStatus getEmailChangeStatus () { - return this.emailChangeStatus; - } - - @Override - public void setEmailChangeStatus (final EmailChangeStatus emailChangeStatus) { - this.emailChangeStatus = emailChangeStatus; - } - - @Override - public User getEmailChangeUser () { - return this.emailChangeUser; - } - - @Override - public void setEmailChangeUser (final User emailChangeUser) { - this.emailChangeUser = emailChangeUser; - } - - @Override - public int hashCode () { - int hash = 5; - - hash = 71 * hash + Objects.hashCode(this.getEmailChangeId()); - hash = 71 * hash + Objects.hashCode(this.getEmailAddress()); - hash = 71 * hash + Objects.hashCode(this.getEmailChangeUser()); - - return hash; - } - -} diff --git a/src/org/mxchange/jusercore/model/email_address/status/EmailChangeStatus.java b/src/org/mxchange/jusercore/model/email_address/status/EmailChangeStatus.java deleted file mode 100644 index c472e80..0000000 --- a/src/org/mxchange/jusercore/model/email_address/status/EmailChangeStatus.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.email_address.status; - -import java.io.Serializable; - -/** - * An enumeration for email changing - *

- * @author Roland Haeder - */ -public enum EmailChangeStatus implements Serializable { - - /** - * Newly added email address (default) - */ - NEW("EMAIL_CHANGE_STATUS_NEW"), //NOI18N - - /** - * User changed to this address - */ - CHANGED("EMAIL_CHANGE_STATUS_CHANGED"), //NOI18N - - /** - * Has withdrawn the action - */ - WITHDRAWN("EMAIL_CHANGE_STATUS_WITHDRAWN"), //NOI18N - - /** - * User has "deleted" the entry. This is not done to keep a history of email changes. - */ - DELETED("EMAIL_CHANGE_STATUS_DELETED"); //NOI18N - - /** - * Message key - */ - private final String messageKey; - - /** - * Constructor with i18n translation key - *

- * @param messageKey Message key (i18n) - */ - private EmailChangeStatus (final String messageKey) { - // Set it here - this.messageKey = messageKey; - } - - /** - * Output value (for messages) - *

- * @return the messageKey - */ - public String getMessageKey () { - return this.messageKey; - } - -} diff --git a/src/org/mxchange/jusercore/model/user/LoginUser.java b/src/org/mxchange/jusercore/model/user/LoginUser.java deleted file mode 100644 index 7de804a..0000000 --- a/src/org/mxchange/jusercore/model/user/LoginUser.java +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.user; - -import java.util.Calendar; -import java.util.Locale; -import java.util.Objects; -import javax.persistence.Basic; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.Lob; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; -import org.mxchange.jcontacts.contact.Contact; -import org.mxchange.jcontacts.contact.UserContact; -import org.mxchange.jusercore.model.user.profilemodes.ProfileMode; -import org.mxchange.jusercore.model.user.status.UserAccountStatus; - -/** - * A generic user entity class - *

- * @author Roland Haeder - */ -@Entity (name = "users") -@Table ( - name = "users" -) -@NamedQueries ( - { - @NamedQuery (name = "AllUserNames", query = "SELECT DISTINCT u.userName FROM users AS u ORDER BY u.userId ASC"), - @NamedQuery (name = "AllEmailAddresses", query = "SELECT DISTINCT c.contactEmailAddress FROM contacts AS c INNER JOIN users AS u ON u.userContact = c ORDER BY c.contactId ASC"), - @NamedQuery (name = "SearchUserByName", query = "SELECT u FROM users AS u WHERE LOWER(u.userName) LIKE LOWER(:userName)"), - @NamedQuery (name = "SearchUserById", query = "SELECT u FROM users AS u WHERE u.userId = :id"), - @NamedQuery (name = "SearchUserByEmailAddress", query = "SELECT u FROM users AS u INNER JOIN contacts AS c ON u.userContact = c WHERE LOWER(c.contactEmailAddress) LIKE LOWER(:emailAddress)"), - @NamedQuery (name = "SearchUserByConfirmKey", query = "SELECT u FROM users AS u WHERE u.userConfirmKey = :confirmKey"), - @NamedQuery (name = "SearchAllUsersExcept", query = "SELECT u FROM users AS u WHERE u != :user ORDER BY u.userId ASC"), - @NamedQuery (name = "AllUsers", query = "SELECT u FROM users AS u ORDER BY u.userId ASC"), - @NamedQuery (name = "AllPublicUsers", query = "SELECT u FROM users AS u WHERE u.userAccountStatus = :status AND u.userProfileMode = :mode ORDER BY u.userId ASC"), - @NamedQuery (name = "AllMemberPublicUsers", query = "SELECT u FROM users AS u WHERE u.userAccountStatus = :status AND u.userProfileMode IN (:public, :members) ORDER BY u.userId ASC") - } -) -@SuppressWarnings ("PersistenceUnitPresent") -public class LoginUser implements User { - - /** - * Serial number - */ - @Transient - private static final long serialVersionUID = 4_328_454_581_751L; - - /** - * Account status - */ - @Basic (optional = false) - @Column (name = "user_account_status", nullable = false) - @Enumerated (value = EnumType.STRING) - private UserAccountStatus userAccountStatus; - - /** - * Confirmation key - */ - @Column (name = "user_confirm_key", unique = true) - private String userConfirmKey; - - /** - * Id number from "contacts" table - */ - @JoinColumn (name = "user_contact_id", referencedColumnName = "contact_id", nullable = false, updatable = false, unique = true) - @OneToOne (targetEntity = UserContact.class, cascade = CascadeType.ALL, optional = false) - private Contact userContact; - - /** - * "created" timestamp - */ - @Basic (optional = false) - @Temporal (TemporalType.TIMESTAMP) - @Column (name = "user_created", nullable = false) - private Calendar userCreated; - - /** - * Encrypted password - */ - @Basic (optional = false) - @Column (name = "user_encrypted_password", nullable = false) - private String userEncryptedPassword; - - /** - * User id - */ - @Id - @Column (name = "user_id", nullable = false, length = 20, updatable = false) - @GeneratedValue (strategy = GenerationType.IDENTITY) - private Long userId; - - /** - * Last "locked" timestamp - */ - @Temporal (TemporalType.TIMESTAMP) - @Column (name = "user_last_locked_timestamp") - private Calendar userLastLocked; - - /** - * Last locked reason - */ - @Lob - @Column (name = "user_last_locked_reason") - private String userLastLockedReason; - - /** - * User locale - */ - @Column (name = "user_locale") - private Locale userLocale; - - /** - * Whether the user must change password after login - */ - @Column (name = "user_must_change_password") - private Boolean userMustChangePassword; - - /** - * User name - */ - @Basic (optional = false) - @Column (name = "user_name", nullable = false, length = 30, unique = true) - private String userName; - - /** - * Profile mode of this user - */ - @Basic (optional = false) - @Enumerated (EnumType.STRING) - @Column (name = "user_profile_mode", nullable = false) - private ProfileMode userProfileMode; - - /** - * When this user has been updated - */ - @Temporal (TemporalType.TIMESTAMP) - @Column (name = "user_updated") - private Calendar userUpdated; - - /** - * Default constructor - */ - public LoginUser () { - // Default is invisible - this.userProfileMode = ProfileMode.INVISIBLE; - } - - @Override - public void copyAll (final User user) { - // Is contact set? - if (user.getUserContact() instanceof Contact) { - // Copy also contact data - this.getUserContact().copyAll(user.getUserContact()); - } - - // Copy other data - this.setUserConfirmKey(user.getUserConfirmKey()); - this.setUserName(user.getUserName()); - this.setUserEncryptedPassword(user.getUserEncryptedPassword()); - this.setUserAccountStatus(user.getUserAccountStatus()); - this.setUserCreated(user.getUserCreated()); - this.setUserLastLocked(user.getUserLastLocked()); - this.setUserLastLockedReason(user.getUserLastLockedReason()); - this.setUserUpdated(user.getUserUpdated()); - this.setUserProfileMode(user.getUserProfileMode()); - this.setUserLocale(user.getUserLocale()); - } - - @Override - public boolean equals (final Object object) { - if (null == object) { - return false; - } else if (this.getClass() != object.getClass()) { - return false; - } - - final User other = (User) object; - - return ((Objects.equals(this.getUserName(), other.getUserName())) && - (Objects.equals(this.getUserId(), other.getUserId()))); - } - - @Override - public UserAccountStatus getUserAccountStatus () { - return this.userAccountStatus; - } - - @Override - public void setUserAccountStatus (final UserAccountStatus userAccountStatus) { - this.userAccountStatus = userAccountStatus; - } - - @Override - public String getUserConfirmKey () { - return this.userConfirmKey; - } - - @Override - public void setUserConfirmKey (final String userConfirmKey) { - this.userConfirmKey = userConfirmKey; - } - - @Override - public Contact getUserContact () { - return this.userContact; - } - - @Override - public void setUserContact (final Contact userContact) { - this.userContact = userContact; - } - - @Override - @SuppressWarnings ("ReturnOfDateField") - public Calendar getUserCreated () { - return this.userCreated; - } - - @Override - @SuppressWarnings ("AssignmentToDateFieldFromParameter") - public void setUserCreated (final Calendar userCreated) { - this.userCreated = userCreated; - } - - @Override - public String getUserEncryptedPassword () { - return this.userEncryptedPassword; - } - - @Override - public void setUserEncryptedPassword (final String userEncryptedPassword) { - this.userEncryptedPassword = userEncryptedPassword; - } - - @Override - public Long getUserId () { - return this.userId; - } - - @Override - public void setUserId (final Long userId) { - this.userId = userId; - } - - @Override - @SuppressWarnings ("ReturnOfDateField") - public Calendar getUserLastLocked () { - return this.userLastLocked; - } - - @Override - @SuppressWarnings ("AssignmentToDateFieldFromParameter") - public void setUserLastLocked (final Calendar userLastLocked) { - this.userLastLocked = userLastLocked; - } - - @Override - public String getUserLastLockedReason () { - return this.userLastLockedReason; - } - - @Override - public void setUserLastLockedReason (final String userLastLockedReason) { - this.userLastLockedReason = userLastLockedReason; - } - - @Override - public Locale getUserLocale () { - return this.userLocale; - } - - @Override - public void setUserLocale (final Locale userLocale) { - this.userLocale = userLocale; - } - - @Override - public Boolean getUserMustChangePassword () { - return this.userMustChangePassword; - } - - @Override - public void setUserMustChangePassword (final Boolean userMustChangePassword) { - this.userMustChangePassword = userMustChangePassword; - } - - @Override - public String getUserName () { - return this.userName; - } - - @Override - public void setUserName (final String userName) { - this.userName = userName; - } - - @Override - public ProfileMode getUserProfileMode () { - return this.userProfileMode; - } - - @Override - public void setUserProfileMode (final ProfileMode userProfileMode) { - this.userProfileMode = userProfileMode; - } - - @Override - @SuppressWarnings ("ReturnOfDateField") - public Calendar getUserUpdated () { - return this.userUpdated; - } - - @Override - @SuppressWarnings ("AssignmentToDateFieldFromParameter") - public void setUserUpdated (final Calendar userUpdated) { - this.userUpdated = userUpdated; - } - - @Override - public int hashCode () { - int hash = 5; - hash = 83 * hash + Objects.hashCode(this.getUserName()); - hash = 83 * hash + Objects.hashCode(this.getUserId()); - return hash; - } - -} diff --git a/src/org/mxchange/jusercore/model/user/User.java b/src/org/mxchange/jusercore/model/user/User.java deleted file mode 100644 index 4bb0f05..0000000 --- a/src/org/mxchange/jusercore/model/user/User.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.user; - -import java.io.Serializable; -import java.util.Calendar; -import java.util.Locale; -import org.mxchange.jcontacts.contact.Contact; -import org.mxchange.jusercore.model.user.profilemodes.ProfileMode; -import org.mxchange.jusercore.model.user.status.UserAccountStatus; - -/** - * A user POPJI - *

- * @author Roland Haeder - */ -public interface User extends Serializable { - - /** - * Copies all attributes from other user object to this - *

- * @param userSource Source instance - */ - void copyAll (final User userSource); - - /** - * Getter for account status - *

- * @return Account status - */ - UserAccountStatus getUserAccountStatus (); - - /** - * Setter for account status - *

- * @param userStatus Account status - */ - void setUserAccountStatus (final UserAccountStatus userStatus); - - /** - * Getter for confirmation key - *

- * @return Confirmation key - */ - String getUserConfirmKey (); - - /** - * Setter for confirmation key - *

- * @param userConfirmKey Confirmation key - */ - void setUserConfirmKey (final String userConfirmKey); - - /** - * Getter for contact instance - *

- * @return Contact id number - */ - Contact getUserContact (); - - /** - * Setter for contact instance - *

- * @param contact Contact instance - */ - void setUserContact (final Contact contact); - - /** - * Getter for "created" timestamp - *

- * @return "created" timestamp - */ - Calendar getUserCreated (); - - /** - * Setter for "created" timestamp - *

- * @param userCreated "created" timestamp - */ - void setUserCreated (final Calendar userCreated); - - /** - * Getter for encrypted password - *

- * @return Encrypted password - */ - String getUserEncryptedPassword (); - - /** - * Setter for password hash - *

- * @param userEncryptedPassword Encrypted password - */ - void setUserEncryptedPassword (final String userEncryptedPassword); - - /** - * Getter for customer id number - *

- * @return User id number - */ - Long getUserId (); - - /** - * Settte for customer id number - *

- * @param customerId User id number - */ - void setUserId (final Long customerId); - - /** - * Getter for "locked" timestamp - *

- * @return "locked" timestamp - */ - Calendar getUserLastLocked (); - - /** - * Getter for "locked" timestamp - *

- * @param userLocked "locked" timestamp - */ - void setUserLastLocked (final Calendar userLocked); - - /** - * Getter for reason of last locked - *

- * @return Reason of last locked - */ - String getUserLastLockedReason (); - - /** - * Setter for reason of last locked - *

- * @param lastLockedReason Reason of last locked - */ - void setUserLastLockedReason (final String lastLockedReason); - - /** - * Getter for user name - *

- * @return User name - */ - String getUserName (); - - /** - * Setter for user name - *

- * @param userName User name - */ - void setUserName (final String userName); - - /** - * Getter for public user profile flag - *

- * @return Whether the user has a public profile - */ - ProfileMode getUserProfileMode (); - - /** - * Setter for public user profile flag - *

- * @param userPublicProfile Whether the user has a public profile - */ - void setUserProfileMode (final ProfileMode userPublicProfile); - - /** - * Getter for updated timestamp - *

- * @return Updated timestamp - */ - Calendar getUserUpdated (); - - /** - * Setter for updated timestamp - *

- * @param userUpdated Updated timestamp - */ - void setUserUpdated (final Calendar userUpdated); - - /** - * Getter for user's locale - *

- * @return User's locale - */ - Locale getUserLocale (); - - /** - * Setteror user's locale - *

- * @param userLocale User's locale - */ - void setUserLocale (final Locale userLocale); - - /** - * Getter for flag if user needs to change password - *

- * @return Flag if user needs to change password - */ - Boolean getUserMustChangePassword (); - - /** - * Setter for flag if user needs to change password - *

- * @param userMustChangePassword Flag if user needs to change password - */ - void setUserMustChangePassword (final Boolean userMustChangePassword); - - @Override - boolean equals (final Object object); - - @Override - int hashCode (); - -} diff --git a/src/org/mxchange/jusercore/model/user/UserUtils.java b/src/org/mxchange/jusercore/model/user/UserUtils.java deleted file mode 100644 index ebd64ef..0000000 --- a/src/org/mxchange/jusercore/model/user/UserUtils.java +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.user; - -import java.io.Serializable; -import java.security.SecureRandom; -import java.text.MessageFormat; -import java.util.Properties; -import java.util.Random; -import org.apache.commons.codec.digest.Crypt; -import org.apache.commons.codec.digest.DigestUtils; -import org.mxchange.jcontacts.contact.Contact; -import org.mxchange.jusercore.container.login.LoginContainer; - -/** - * An utilities class for users - *

- * @author Roland Haeder - */ -public class UserUtils implements Serializable { - - /** - * Password alphabet - */ - private static final String PASSWORD_ALPHABET = "abcdefghijklmnopqrstuvwxzyABCDEFGHIJKLMNOPQRSTUVWXZY0123456789-/?!_+#@"; //NOI18N - - /** - * Minimum password length - */ - private static final Integer PASSWORD_MINIMUM_LENGTH = 5; - - /** - * Random number generator - */ - private static final Random RANDOM_NUMBER_GENERATOR; - - /** - * Serial number - */ - private static final long serialVersionUID = 18_356_847_120_972L; - - /** - * Static initializer - */ - static { - // Init RNG - RANDOM_NUMBER_GENERATOR = new SecureRandom(); - } - - /** - * Creates a pseudo-random password with given length - *

- * @param length Length of the password - *

- * @return Pseudo-random password - */ - public static String createRandomPassword (final Integer length) { - // Parameter should be valid - if (null == length) { - // Throw NPE - throw new NullPointerException("length is null"); //NOI18N - } else if (length < PASSWORD_MINIMUM_LENGTH) { - // To weak passwords - throw new IllegalArgumentException(MessageFormat.format("Password length {0} is to short, minimum: {1}", length, PASSWORD_MINIMUM_LENGTH)); //NOI18N - } - - // Init variable - StringBuilder password = new StringBuilder(length); - - // Start creating it - for (int i = 0; i < length; i++) { - // Generate random number - int pos = RANDOM_NUMBER_GENERATOR.nextInt(PASSWORD_ALPHABET.length()); - - // Get char at this position and add it to the final password - password.append(String.valueOf(PASSWORD_ALPHABET.charAt(pos))); - } - - // Should have the wanted length - assert (password.length() == length) : MessageFormat.format("Password length {0} doesn't match requested: {1}", password.length(), length); //NOI18N - - // Return it - return password.toString(); - } - - /** - * Hashes given user password and adds a salt to it - *

- * @param userPassword User password to be hashed - *

- * @return Hashed user password - */ - public static String encryptPassword (final String userPassword) { - // Is it null or empty? - if (null == userPassword) { - // Throw NPE - throw new NullPointerException("userPassword is null"); //NOI18N - } else if (userPassword.isEmpty()) { - // Empty passwords are hardcoded not allowed due to security risks - throw new IllegalArgumentException("userPassword is empty"); //NOI18N - } - - // Generate large number - String number = Long.toString(RANDOM_NUMBER_GENERATOR.nextLong() * 10_000_000_000L); - - // Generate salt - String salt = Crypt.crypt(number); - - // First encrypt password - String encryptedPassword = Crypt.crypt(userPassword, salt); - - // Return it - return encryptedPassword; - } - - /** - * Generates a pseudo-random user name - *

- * @return User name - */ - public static String generateRandomUserName () { - // User name's format is normally "user" + random number (10 digits) - String userName = String.format("user%d", RANDOM_NUMBER_GENERATOR.nextInt(10000000)); //NOI18N - - // Return it - return userName; - } - - /** - * Generate a key suitable for confirmation. This is basicly a large and - * strong hash with a lop entropy. - *

- * @param user User instance to use as additional entropy source - *

- * @return Generated key - */ - public static String generatedConfirmationKey (final User user) { - // Generates random string by creating a random, encrypted password - StringBuilder key = new StringBuilder(encryptPassword(generateRandomUserName())); - - // Is user set? - if (user instanceof User) { - // Add it's name, too - key.append(":").append(user); //NOI18N - - // Is user name set? - if (user.getUserName() instanceof String) { - // Add it - key.append(":").append(user.getUserName()); //NOI18N - } - - // Is password set? - if (user.getUserEncryptedPassword() instanceof String) { - // Add it, too - key.append(":").append(user.getUserEncryptedPassword()); //NOI18N - } - - // Get contact instance - Contact contact = user.getUserContact(); - - // Is contact set? - if (contact instanceof Contact) { - // Add it, too - key.append(":").append(contact); //NOI18N - - // Is email address set? - if (contact.getContactEmailAddress() instanceof String) { - // Add it, too - key.append(":").append(contact.getContactEmailAddress()); //NOI18N - } - } - } - - // Hash key - String hash = DigestUtils.sha256Hex(key.toString()); - - // Return it - return hash; - } - - /** - * Returns a Properties object from given user instance. - *

- * @param user User instance to get all fields from - *

- * @return All properties from given user - */ - public static Properties getAllUserFields (final User user) { - // Parameter should be valid - if (null == user) { - // Throw NPE - throw new NullPointerException("user is null"); //NOI18N - } else if (user.getUserId() == null) { - // Throw NPE again - throw new NullPointerException("user.userId is null"); //NOI18N - } else if (user.getUserId() < 1) { - // Not valid number - throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is not valid.", user.getUserId())); //NOI18N - } else if (user.getUserName() == null) { - // Throw NPE again - throw new NullPointerException("user.userName is null"); //NOI18N - } else if (user.getUserName().isEmpty()) { - // Empty string - throw new IllegalArgumentException("user.userName is empty"); //NOI18N - } else if (user.getUserAccountStatus() == null) { - // Throw NPE - throw new NullPointerException("user.userAccountStatus is null"); //NOI18N - } - - // Init properties list - Properties properties = new Properties(); - - // Init some vbalues with empty strings - properties.setProperty("userConfirmKey", ""); //NOI18N - properties.setProperty("userUpdated", ""); //NOI18N - properties.setProperty("userLastLockedReason", ""); //NOI18N - properties.setProperty("contactTitle", ""); //NOI18N - properties.setProperty("contactStreet", ""); //NOI18N - properties.setProperty("contactHouseNumber", ""); //NOI18N - properties.setProperty("contacCity", ""); //NOI18N - properties.setProperty("contacCity", ""); //NOI18N - properties.setProperty("contactZipCode", ""); //NOI18N - properties.setProperty("contactBirthday", ""); //NOI18N - properties.setProperty("contactEmailAddress", ""); //NOI18N - properties.setProperty("contactUpdated", ""); //NOI18N - - // Set all: - // - User data - properties.setProperty("userId", Long.toString(user.getUserId())); //NOI18N - properties.setProperty("userName", user.getUserName()); //NOI18N - properties.setProperty("userCreated", user.getUserCreated().toString()); //NOI18N - if (user.getUserUpdated() != null) { - properties.setProperty("contactUpdated", user.getUserUpdated().toString()); //NOI18N - } - if (user.getUserConfirmKey() != null) { - properties.setProperty("userConfirmKey", user.getUserConfirmKey()); //NOI18N - } - if (user.getUserLastLockedReason() != null) { - properties.setProperty("userLastLockedReason", user.getUserLastLockedReason()); //NOI18N - } - properties.setProperty("userAccountStatus", user.getUserAccountStatus().toString()); //NOI18N - - // - Contact data - properties.setProperty("contactGender", user.getUserContact().getContactGender().toString()); //NOI18N - if (user.getUserContact().getContactTitle() != null) { - properties.setProperty("contactTitle", user.getUserContact().getContactTitle()); //NOI18N - } - properties.setProperty("contactFirstName", user.getUserContact().getContactFirstName()); //NOI18N - properties.setProperty("contactFamilyName", user.getUserContact().getContactFamilyName()); //NOI18N - if (user.getUserContact().getContactStreet() != null) { - properties.setProperty("contactStreet", user.getUserContact().getContactStreet()); //NOI18N - } - if (user.getUserContact().getContactHouseNumber() != null) { - properties.setProperty("contactHouseNumber", Short.toString(user.getUserContact().getContactHouseNumber())); //NOI18N - } - if (user.getUserContact().getContactCity() != null) { - properties.setProperty("contacCity", user.getUserContact().getContactCity()); //NOI18N - } - if (user.getUserContact().getContactZipCode() != null) { - properties.setProperty("contactZipCode", Integer.toString(user.getUserContact().getContactZipCode())); //NOI18N - } - if (user.getUserContact().getContactBirthday() != null) { - properties.setProperty("contactBirthday", user.getUserContact().getContactBirthday().toString()); //NOI18N - } - if (user.getUserContact().getContactEmailAddress() != null) { - properties.setProperty("contactEmailAddress", user.getUserContact().getContactEmailAddress()); //NOI18N - } - properties.setProperty("contactCreated", user.getUserContact().getContactCreated().toString()); //NOI18N - if (user.getUserContact().getContactUpdated() != null) { - properties.setProperty("contactUpdated", user.getUserContact().getContactUpdated().toString()); //NOI18N - } - - // Return it - return properties; - } - - /** - * Checks if password from container matches the updatedUser's password - *

- * @param container Container holding user instance and unencrypted password - * @param updatedUser Updated user instance from database - *

- * @return Whether the password matches - */ - public static boolean ifPasswordMatches (final LoginContainer container, final User updatedUser) { - // Validate parameters - if (null == container) { - // Throw NPE - throw new NullPointerException("container is null"); //NOI18N - } else if (null == updatedUser) { - // And again NPE ... - throw new NullPointerException("updatedUser is null"); //NOI18N - } else if (container.getUser() == null) { - // NPE for user in container - throw new NullPointerException("container.user is null"); //NOI18N - } else if (container.getUserPassword() == null) { - // NPE for user password in container - throw new NullPointerException("container.userPassword is null"); //NOI18N - } else if (container.getUserPassword().isEmpty()) { - // Empty password in container - throw new IllegalArgumentException("container.userPassword is empty"); //NOI18N - } - - // Call below method - return ifPasswordMatches(container.getUserPassword(), updatedUser); - } - - /** - * Checks if direct password the updatedUser's password - *

- * @param unencryptedPassword Unencrypted (direct) password - * @param updatedUser Updated user instance from database - *

- * @return Whether the password matches - */ - public static boolean ifPasswordMatches (final String unencryptedPassword, final User updatedUser) { - // Validate parameters - if (null == unencryptedPassword) { - // Throw NPE - throw new NullPointerException("unencryptedPassword is null"); //NOI18N - } else if (unencryptedPassword.isEmpty()) { - // NPE for user in container - throw new NullPointerException("unencryptedPassword is empty."); //NOI18N - } else if (null == updatedUser) { - // And again NPE ... - throw new NullPointerException("updatedUser is null"); //NOI18N - } - - // First encrypt password - String encryptedPassword = Crypt.crypt(unencryptedPassword, updatedUser.getUserEncryptedPassword()); - - // Is it matching? - return encryptedPassword.equals(updatedUser.getUserEncryptedPassword()); - } - - /** - * Checks if password from container matches with from user instance. - *

- * @param container Container holding user instance and unencrypted password - *

- * @return Whether it maches - */ - public static boolean ifPasswordMatches (final LoginContainer container) { - // Validate parameters - if (null == container) { - // Throw NPE - throw new NullPointerException("container is null"); //NOI18N - } else if (container.getUser() == null) { - // NPE for user in container - throw new NullPointerException("container.user is null"); //NOI18N - } else if (container.getUserPassword() == null) { - // NPE for user password in container - throw new NullPointerException("container.userPassword is null"); //NOI18N - } else if (container.getUserPassword().isEmpty()) { - // Empty password in container - throw new IllegalArgumentException("container.userPassword is empty"); //NOI18N - } - - // Call other method - return ifPasswordMatches(container.getUserPassword(), container.getUser()); - } - - /** - * No instance from this class - */ - private UserUtils () { - } -} diff --git a/src/org/mxchange/jusercore/model/user/activity/LogableUserActivity.java b/src/org/mxchange/jusercore/model/user/activity/LogableUserActivity.java new file mode 100644 index 0000000..d62ab2f --- /dev/null +++ b/src/org/mxchange/jusercore/model/user/activity/LogableUserActivity.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2016 Cho-Time GmbH + * + * 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.jusercore.model.user.activity; + +import java.io.Serializable; +import java.util.Calendar; +import org.mxchange.jusercore.model.user.User; + +/** + * POJI for logable user activity + *

+ * @author Roland Haeder + */ +public interface LogableUserActivity extends Serializable { + + /** + * Getter for activity id + *

+ * @return Activity id + */ + Long getActivityId (); + + /** + * Getter for activity id + *

+ * @param activityId Activity id + */ + void setActivityId (final Long activityId); + + /** + * Getter for activity message (optional) + *

+ * @return Activity message + */ + String getActivityMessage (); + + /** + * Setter for activity message (optional) + *

+ * @param activityMessage Activity message + */ + void setActivityMessage (final String activityMessage); + + /** + * Getter for activity timestamp + *

+ * @return Activity timestamp + */ + Calendar getActivityTimestamp (); + + /** + * Setter for activity timestamp + *

+ * @param activityTimestamp Activity timestamp + */ + void setActivityTimestamp (final Calendar activityTimestamp); + + /** + * Getter for activity type + *

+ * @return Activity type + */ + String getActivityType (); + + /** + * Setter for activity type + *

+ * @param activityType Activity type + */ + void setActivityType (final String activityType); + + /** + * Getter for activity user (who did it) + *

+ * @return User who did activity + */ + User getActivityUser (); + + /** + * Setter for activity user (who did it) + *

+ * @param activityUser User who did activity + */ + void setActivityUser (final User activityUser); + + @Override + boolean equals (final Object object); + + @Override + int hashCode (); + +} diff --git a/src/org/mxchange/jusercore/model/user/activity/UserActivityLog.java b/src/org/mxchange/jusercore/model/user/activity/UserActivityLog.java new file mode 100644 index 0000000..790c5aa --- /dev/null +++ b/src/org/mxchange/jusercore/model/user/activity/UserActivityLog.java @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2016 Cho-Time GmbH + * + * 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.jusercore.model.user.activity; + +import java.util.Calendar; +import java.util.Objects; +import javax.persistence.Basic; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.Lob; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import org.mxchange.jusercore.model.user.LoginUser; +import org.mxchange.jusercore.model.user.User; + +/** + * A POJO for user acitivity log + *

+ * @author Roland Haeder + */ +@Entity (name = "user_activity_log") +@Table ( + name = "user_activity_log" +) +@NamedQueries ( + { + @NamedQuery (name = "FindAllUsersActivity", query = "SELECT a FROM user_activity_log AS a WHERE a.activityUser = :activityUser ORDER BY a.activityId DESC"), + @NamedQuery (name = "FindUsersActivityByType", query = "SELECT a FROM user_activity_log AS a WHERE a.activityUser = :activityUser AND a.activityType LIKE :activityType ORDER BY a.activityId DESC") + } +) +@SuppressWarnings ("PersistenceUnitPresent") +public class UserActivityLog implements LogableUserActivity { + + /** + * Serial number + */ + @Transient + private static final long serialVersionUID = 12_945_967_867_290_601L; + + /** + * Primary key + */ + @Id + @GeneratedValue (strategy = GenerationType.IDENTITY) + @Column (name = "activity_id", nullable = false, updatable = false) + private Long activityId; + + /** + * Message + */ + @Column (name = "activity_message", updatable = false) + @Lob + private String activityMessage; + + /** + * Timestamp + */ + @Basic (optional = false) + @Temporal (TemporalType.TIMESTAMP) + @Column (name = "activity_timestamp", nullable = false, updatable = false) + private Calendar activityTimestamp; + + /** + * Type + */ + @Basic (optional = false) + @Column (name = "activity_type", nullable = false, updatable = false) + private String activityType; + + /** + * User instance + */ + @JoinColumn (name = "activity_user_id", referencedColumnName = "user_id", nullable = false, updatable = false) + @OneToOne (targetEntity = LoginUser.class, cascade = CascadeType.ALL, optional = false) + private User activityUser; + + /** + * Default constructor + */ + public UserActivityLog () { + } + + /** + * Constructor with message, type and user + *

+ * @param activityMessage Message + * @param activityType Type + * @param activityUser User instance + */ + public UserActivityLog (final String activityMessage, final String activityType, final User activityUser) { + this.activityMessage = activityMessage; + this.activityType = activityType; + this.activityUser = activityUser; + } + + @Override + public boolean equals (final Object object) { + if (this == object) { + return true; + } else if (null == object) { + return false; + } else if (this.getClass() != object.getClass()) { + return false; + } + + final LogableUserActivity other = (LogableUserActivity) object; + + if (!Objects.equals(this.getActivityMessage(), other.getActivityMessage())) { + return false; + } else if (!Objects.equals(this.getActivityType(), other.getActivityType())) { + return false; + } else if (!Objects.equals(this.getActivityId(), other.getActivityId())) { + return false; + } else if (!Objects.equals(this.getActivityTimestamp(), other.getActivityTimestamp())) { + return false; + } else if (!Objects.equals(this.getActivityUser(), other.getActivityUser())) { + return false; + } + + return true; + } + + @Override + public Long getActivityId () { + return this.activityId; + } + + @Override + public void setActivityId (final Long activityId) { + this.activityId = activityId; + } + + @Override + public String getActivityMessage () { + return this.activityMessage; + } + + @Override + public void setActivityMessage (final String activityMessage) { + this.activityMessage = activityMessage; + } + + @Override + @SuppressWarnings ("ReturnOfDateField") + public Calendar getActivityTimestamp () { + return this.activityTimestamp; + } + + @Override + @SuppressWarnings ("AssignmentToDateFieldFromParameter") + public void setActivityTimestamp (final Calendar activityTimestamp) { + this.activityTimestamp = activityTimestamp; + } + + @Override + public String getActivityType () { + return this.activityType; + } + + @Override + public void setActivityType (final String activityType) { + this.activityType = activityType; + } + + @Override + public User getActivityUser () { + return this.activityUser; + } + + @Override + public void setActivityUser (final User activityUser) { + this.activityUser = activityUser; + } + + @Override + public int hashCode () { + int hash = 7; + + hash = 83 * hash + Objects.hashCode(this.getActivityId()); + hash = 83 * hash + Objects.hashCode(this.getActivityMessage()); + hash = 83 * hash + Objects.hashCode(this.getActivityTimestamp()); + hash = 83 * hash + Objects.hashCode(this.getActivityType()); + hash = 83 * hash + Objects.hashCode(this.getActivityUser()); + + return hash; + } + +} diff --git a/src/org/mxchange/jusercore/model/user/password_history/PasswordHistory.java b/src/org/mxchange/jusercore/model/user/password_history/PasswordHistory.java deleted file mode 100644 index 8a1c35e..0000000 --- a/src/org/mxchange/jusercore/model/user/password_history/PasswordHistory.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.user.password_history; - -import java.io.Serializable; -import java.util.Calendar; -import org.mxchange.jusercore.model.user.User; - -/** - * A POJI for user password history - *

- * @author Roland Haeder - */ -public interface PasswordHistory extends Serializable { - - /** - * Getter for timestamp this history entry has been created (usually in - * EJB). - *

- * @return Timestamp when this history entry has been created - */ - Calendar getUserPasswordHistoryCreated (); - - /** - * Setter for timestamp this history entry has been created (usually in - * EJB). - *

- * @param userPasswordHistoryCreated Timestamp when this history entry has - * been created - */ - void setUserPasswordHistoryCreated (final Calendar userPasswordHistoryCreated); - - /** - * Getter for history entry id (primary key) - *

- * @return History entry id (primary key) - */ - Long getUserPasswordHistoryId (); - - /** - * Setter for history entry id (primary key) - *

- * @param userPasswordHistoryId History entry id (primary key) - */ - void setUserPasswordHistoryId (final Long userPasswordHistoryId); - - /** - * Getter for user's password hash - *

- * @return User's password hash - */ - String getUserPasswordHistoryPasswordHash (); - - /** - * Setter for user's password hash - *

- * @param userPasswordHistoryPasswordHash User's password hash - */ - void setUserPasswordHistoryPasswordHash (final String userPasswordHistoryPasswordHash); - - /** - * Getter for user instance - *

- * @return User instance - */ - User getUserPasswordHistoryUser (); - - /** - * Setter for user instance - *

- * @param userPasswordHistoryUser User instance - */ - void setUserPasswordHistoryUser (final User userPasswordHistoryUser); - - @Override - boolean equals (final Object object); - - @Override - int hashCode (); - -} diff --git a/src/org/mxchange/jusercore/model/user/password_history/UserPasswordHistory.java b/src/org/mxchange/jusercore/model/user/password_history/UserPasswordHistory.java deleted file mode 100644 index 1cbdef1..0000000 --- a/src/org/mxchange/jusercore/model/user/password_history/UserPasswordHistory.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.user.password_history; - -import java.util.Calendar; -import java.util.Objects; -import javax.persistence.Basic; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; -import org.mxchange.jusercore.model.user.LoginUser; -import org.mxchange.jusercore.model.user.User; - -/** - * A POJO for user password history - *

- * @author Roland Haeder - */ -@Entity (name = "user_password_history") -@Table ( - name = "user_password_history" -) -@NamedQueries ( - { - @NamedQuery (name = "AllUsersHistoryEntries", query = "SELECT h FROM user_password_history AS h WHERE h.userPasswordHistoryUser = :user ORDER BY h.userPasswordHistoryId DESC") - } -) -@SuppressWarnings ("PersistenceUnitPresent") -public class UserPasswordHistory implements PasswordHistory { - - /** - * Serial number - */ - @Transient - private static final long serialVersionUID = 1L; - - /** - * Timestamp when this entry has been created - */ - @Basic (optional = false) - @Column (name = "history_created", nullable = false, updatable = false) - @Temporal (TemporalType.TIMESTAMP) - private Calendar userPasswordHistoryCreated; - - /** - * Id number (primary key) - */ - @Id - @Column (name = "history_id", updatable = false) - @GeneratedValue (strategy = GenerationType.IDENTITY) - private Long userPasswordHistoryId; - - /** - * Password hash being used - */ - @Basic (optional = false) - @Column (name = "history_password_hash", nullable = false, updatable = false) - private String userPasswordHistoryPasswordHash; - - /** - * User instance for this history entry - */ - @JoinColumn (name = "history_user_id", nullable = true, updatable = false) - @OneToOne (targetEntity = LoginUser.class, cascade = CascadeType.REFRESH) - private User userPasswordHistoryUser; - - /** - * Default constructor - */ - public UserPasswordHistory () { - } - - /** - * Constructor with password hash and user instance - *

- * @param userPasswordHistoryPasswordHash Password hash - * @param userPasswordHistoryUser User instance - */ - public UserPasswordHistory (final String userPasswordHistoryPasswordHash, final User userPasswordHistoryUser) { - // Set all - this.userPasswordHistoryPasswordHash = userPasswordHistoryPasswordHash; - this.userPasswordHistoryUser = userPasswordHistoryUser; - } - - @Override - public boolean equals (final Object object) { - if (this == object) { - return true; - } else if (object == null) { - return false; - } else if (this.getClass() != object.getClass()) { - return false; - } - - final PasswordHistory other = (PasswordHistory) object; - - if (!Objects.equals(this.getUserPasswordHistoryId(), other.getUserPasswordHistoryId())) { - return false; - } else if (!Objects.equals(this.getUserPasswordHistoryPasswordHash(), other.getUserPasswordHistoryPasswordHash())) { - return false; - } else if (!Objects.equals(this.getUserPasswordHistoryUser(), other.getUserPasswordHistoryUser())) { - return false; - } - - return true; - } - - @Override - @SuppressWarnings ("ReturnOfDateField") - public Calendar getUserPasswordHistoryCreated () { - return this.userPasswordHistoryCreated; - } - - @Override - @SuppressWarnings ("AssignmentToDateFieldFromParameter") - public void setUserPasswordHistoryCreated (final Calendar userPasswordHistoryCreated) { - this.userPasswordHistoryCreated = userPasswordHistoryCreated; - } - - @Override - public Long getUserPasswordHistoryId () { - return this.userPasswordHistoryId; - } - - @Override - public void setUserPasswordHistoryId (final Long userPasswordHistoryId) { - this.userPasswordHistoryId = userPasswordHistoryId; - } - - @Override - public String getUserPasswordHistoryPasswordHash () { - return this.userPasswordHistoryPasswordHash; - } - - @Override - public void setUserPasswordHistoryPasswordHash (final String userPasswordHistoryPasswordHash) { - this.userPasswordHistoryPasswordHash = userPasswordHistoryPasswordHash; - } - - @Override - public User getUserPasswordHistoryUser () { - return this.userPasswordHistoryUser; - } - - @Override - public void setUserPasswordHistoryUser (final User userPasswordHistoryUser) { - this.userPasswordHistoryUser = userPasswordHistoryUser; - } - - @Override - public int hashCode () { - int hash = 7; - - hash = 79 * hash + Objects.hashCode(this.getUserPasswordHistoryId()); - hash = 79 * hash + Objects.hashCode(this.getUserPasswordHistoryPasswordHash()); - hash = 79 * hash + Objects.hashCode(this.getUserPasswordHistoryUser()); - - return hash; - } - -} diff --git a/src/org/mxchange/jusercore/model/user/profilemodes/ProfileMode.java b/src/org/mxchange/jusercore/model/user/profilemodes/ProfileMode.java deleted file mode 100644 index c71bae7..0000000 --- a/src/org/mxchange/jusercore/model/user/profilemodes/ProfileMode.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.user.profilemodes; - -import java.io.Serializable; - -/** - * User profile modes - *

- * @author Roland Haeder - */ -public enum ProfileMode implements Serializable { - - /** - * Invisible to guests and members (not administrators) - */ - INVISIBLE("PROFILE_MODE_INVISIBLE"), //NOI18N - - /** - * Only visible to members (and administrators) - */ - MEMBERS("PROFILE_MODE_MEMBERS"), //NOI18N - - /** - * Visible to all (public in Internet) - */ - PUBLIC("PROFILE_MODE_PUBLIC"); //NOI18N - - /** - * Message key (i18n) - */ - private final String messageKey; - - /** - * Constructor with message key - *

- * @param messageKey Message key - */ - private ProfileMode (final String messageKey) { - this.messageKey = messageKey; - } - - /** - * Getter for message key (i18n) - *

- * @return Message key - */ - public String getMessageKey () { - return this.messageKey; - } -} diff --git a/src/org/mxchange/jusercore/model/user/status/UserAccountStatus.java b/src/org/mxchange/jusercore/model/user/status/UserAccountStatus.java deleted file mode 100644 index f1eb67c..0000000 --- a/src/org/mxchange/jusercore/model/user/status/UserAccountStatus.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2016 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.jusercore.model.user.status; - -import java.io.Serializable; - -/** - * An enumeration for user's account status like confirmed, locked, etc. - *

- * @author Roland Haeder - */ -public enum UserAccountStatus implements Serializable { - - /** - * Unconfirmed (default) - */ - UNCONFIRMED("USER_ACCOUNT_STATUS_UNCONFIRMED", "user_status_unconfirmed"), //NOI18N - - /** - * Confirmed (email address validated) - */ - CONFIRMED("USER_ACCOUNT_STATUS_CONFIRMED", "user_status_confirmed"), //NOI18N - - /** - * Locked (maybe violated T&C) - */ - LOCKED("USER_ACCOUNT_STATUS_LOCKED", "user_status_locked"); //NOI18N - - /** - * Message key - */ - private final String messageKey; - - /** - * CSS style class - */ - private final String styleClass; - - /** - * Constructor with i18n translation key - *

- * @param messageKey Message key (i18n) - * @param styleClass CSS style class - */ - private UserAccountStatus (final String messageKey, final String styleClass) { - // Set it here - this.messageKey = messageKey; - this.styleClass = styleClass; - } - - /** - * Getter for message key - *

- * @return Message key (i18n) - */ - public String getMessageKey () { - return this.messageKey; - } - - /** - * Getter for CSS style class - *

- * @return CSS style class - */ - public String getStyleClass () { - return this.styleClass; - } - -} -- 2.39.5