Commit ee2a18b3 authored by lmethuku's avatar lmethuku

first commit

parents
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
\ No newline at end of file
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file

java:S6813"BRemove this field injection and use constructor injection instead.(8Ջ2J$c9acac65-74eb-4314-8488-beecb0aecf04

java:S6353%"<Use concise character class syntax '\\d' instead of '[0-9]'.(82J$f2dc562b-e3cc-4047-8086-b5075ba7ee76

java:S6353*"<Use concise character class syntax '\\d' instead of '[0-9]'.(̀82J$e9c3caf3-296e-4ffe-a359-01bd113a981d

java:S3776e"RRefactor this method to reduce its Cognitive Complexity from 17 to the 15 allowed.(8Ջ2J$ccbfc313-a852-49c4-9476-f554932f8b4e
\ No newline at end of file

java:S6353 "<Use concise character class syntax '\\d' instead of '[0-9]'.(Ƞ8̓2J$772afa77-9839-4b79-be8b-b850197ad965

java:S6353#"<Use concise character class syntax '\\d' instead of '[0-9]'.(Ն8̓2J$fc5711f6-ed59-4ff7-ab5d-ecbcd8e8e672

java:S6353'"<Use concise character class syntax '\\d' instead of '[0-9]'.(ʄ8̓2J$8977e4d8-528c-4431-bc38-5e5c71bc0105
\ No newline at end of file
z
java:S2589B"7Remove this expression which always evaluates to "true"(82J$80fb2705-f88b-4eba-8b7e-715eb8ed353f

java:S6813"BRemove this field injection and use constructor injection instead.(82J$3b300799-5c2c-459c-830e-19c122d7bf85

java:S1128 "ARemove this unused import 'javax.validation.ValidationException'.(82J$559f17f1-9bc9-4e4e-b084-d1a6771d42be
\ No newline at end of file

java:S6813"BRemove this field injection and use constructor injection instead.(8э2J$fc208077-b67a-448f-8470-589cbd0f6c2b

java:S6353?"<Use concise character class syntax '\\d' instead of '[0-9]'.(8Ս2J$c049fc5e-a288-4f52-98e7-38d5d2b7dcdc

java:S6353@"<Use concise character class syntax '\\d' instead of '[0-9]'.(8Ս2J$5c117dfc-b64b-422b-8a84-c06954dc4187

java:S6353A"<Use concise character class syntax '\\d' instead of '[0-9]'.(8Ս2J$c511b5a0-e553-4463-8a8d-8f7bd4b97341
\ No newline at end of file
f
java:S5786"Remove this 'public' modifier.(82J$b7844a41-ac55-4640-a427-1f8dd8bb594e
f
java:S5786*"Remove this 'public' modifier.(82J$cfcf79b3-b791-41c0-9096-3d4762fba111
f
java:S57864"Remove this 'public' modifier.(82J$62236191-752f-437b-ab31-00c948bc5497
a
java:S5786D"Remove this 'public' modifier.(82J$92cb9385-d75d-45af-b7dd-0f9f892bc941
f
java:S5786N"Remove this 'public' modifier.(ކ82J$d3f2e3d1-0590-48d1-9324-88b25eefda1e
a
java:S5786]"Remove this 'public' modifier.(82J$16ac76d7-33a3-4330-864c-6808cfd5ea2d
f
java:S5786g"Remove this 'public' modifier.(82J$6561874c-f9d9-4410-8353-a4e393408302
a
java:S5786r"Remove this 'public' modifier.(82J$034a25bb-a990-4de2-a2e0-5e864d39347f
a
java:S5786"Remove this 'public' modifier.(ƹ82J$0af0b4e8-0421-4289-88d5-852bb0f3fb76
\ No newline at end of file

java:S6813"BRemove this field injection and use constructor injection instead.(82J$4a1cfd56-fcbd-49b0-951c-969431371689

java:S4684"@Replace this persistent entity with a simple POJO or DTO object.(8˲2J$2e7759b2-2a9d-49b4-b648-a2fd81280a3d

java:S6353%"<Use concise character class syntax '\\d' instead of '[0-9]'.(82J$dc158522-276f-49be-91f0-5cef47a2d2fe

java:S6353&"<Use concise character class syntax '\\d' instead of '[0-9]'.(82J$b286fa73-8078-4679-995a-e8b23d9554c3

java:S6353'"<Use concise character class syntax '\\d' instead of '[0-9]'.(82J$43490b8a-5da6-41a6-8b1d-a8a8b5bda60b
\ No newline at end of file

java:S1612"WReplace this lambda with method reference 'MessageSourceResolvable::getDefaultMessage'.(8℞2J$dff36492-71af-40e3-abae-e9b0658d82b4
\ No newline at end of file
~
java:S1128"6Remove this unused import 'lombok.AllArgsConstructor'.(8낞2J$37a50b9e-aa07-47dc-af88-282e845678a8
x
java:S1128"5Remove this unused import 'lombok.NoArgsConstructor'.(8낞2J$43264697-59ab-416a-aabf-faa0ee85f11b

java:S1128 "BRemove this unused import 'javax.validation.constraints.NotBlank'.(㏇8ء2J$cfda1d3a-ce8e-4b6f-a8b3-d2d182b6a4a1

java:S1128
"ARemove this unused import 'javax.validation.constraints.NotNull'.(82J$699e1833-0f89-46e0-ad4c-79768674a07f

java:S1128 "ARemove this unused import 'javax.validation.constraints.Pattern'.(8ء2J$cb8fdab8-ddeb-4cba-b457-de30bee89347
\ No newline at end of file

java:S6353"<Use concise character class syntax '\\d' instead of '[0-9]'.(Ƞ82J$af41b871-3a6a-4b78-98e3-b166d8f50e5e

java:S6353"<Use concise character class syntax '\\d' instead of '[0-9]'.(Ն82J$56e1257a-a89b-4a58-a654-688cae959442

java:S6353"<Use concise character class syntax '\\d' instead of '[0-9]'.(ʄ82J$7aa4f886-8151-4e91-9c51-3697267d0672
\ No newline at end of file

java:S6353"<Use concise character class syntax '\\d' instead of '[0-9]'.(Ƞ8½2J$61cfb3f3-c78e-4a44-af88-234ccaf23901

java:S6353!"<Use concise character class syntax '\\d' instead of '[0-9]'.(Ն8½2J$2ae22dcf-c78a-4b0a-9d46-1aa629deac61

java:S6353%"<Use concise character class syntax '\\d' instead of '[0-9]'.(ʄ8½2J$481d26d4-1a66-4e6d-9cdf-9fd9de7ff058
\ No newline at end of file
\
,src/main/java/com/visa/application/Main.java,e\4\e4a8b1d377a4b327b700c82cdc170510bab01518
7
pom.xml,4\4\442292b8a7efeabbe4cc176709b833b1792140ec
n
>src/main/java/com/visa/application/service/ProfileService.java,4\1\41bdef3c357ffa2919c8036ccd646a5bb9348466
t
Dsrc/main/java/com/visa/application/repository/ProfileRepository.java,b\f\bf2246c8a2e0e3f6e2888be51be848cd14b25af8
e
5src/main/java/com/visa/application/model/Profile.java,3\9\39274ec568fdf53b2388a2beba6c240009129728
t
Dsrc/main/java/com/visa/application/controller/ProfileController.java,9\1\91badd6b59270f6c8260c473e50cd1c00e805d48
U
%src/main/java/dto/ProfileRequest.java,8\7\8715154f4b2d72eabd8494cd607226404222b4cc
j
:src/main/java/com/visa/application/dto/ProfileRequest.java,5\e\5ec6d872fb208ee3645ebbf009150f659e0c633b
u
Esrc/main/java/com/nisum/application/repository/ProfileRepository.java,4\d\4d9346f28a897013a240ab165c8817479f53f79e
f
6src/main/java/com/nisum/application/model/Profile.java,b\c\bc9444ff84bf0fa860b21d32f6086eeac6dc6040
o
?src/main/java/com/nisum/application/service/ProfileService.java,1\1\11394e5b278a0fc461d2f3653ef4a8374d43047f
u
Esrc/main/java/com/nisum/application/controller/ProfileController.java,6\c\6caba67e19d7d589c01faf57eec7a370818836d2
m
=src/main/java/com/nisum/application/dto/ProfileUpdateDTO.java,c\7\c7bf124cfd1fe6f004d498f189abdc5f205f2114
z
Jsrc/test/java/com/nisum/application/controller/ProfileControllerTests.java,8\6\869e6870cfdc50bf026049343a551fa43db97d81
]
-src/main/java/com/nisum/application/Main.java,e\1\e1c37a2b874f6ea7e17c9c18414e6d4339d81114
y
Isrc/main/java/com/nisum/application/exception/GlobalExceptionHandler.java,9\6\961c057c03dd1aa0ff098cce4acbe18c3fc9d908
g
7src/main/java/com/nisum/application/dto/ProfileDTO.java,d\a\daef86cba3ba34ec44937592df23ca740eb9c122
{
Ksrc/main/java/com/nisum/application/exception/ProfileConflictException.java,3\7\373f0d9f7019337750f87b356b87fe861ed26dee
{
Ksrc/main/java/com/nisum/application/exception/ProfileNotFoundException.java,a\d\adadcc0ae2c286a8984091e3e1991c100a44636e

Q.idea/sonarlint/securityhotspotstore/5/e/5ec6d872fb208ee3645ebbf009150f659e0c633b,5\3\53a9ac2e005fb1b83c10a02b4608bb8211441e63

Q.idea/sonarlint/securityhotspotstore/8/7/8715154f4b2d72eabd8494cd607226404222b4cc,b\5\b5b8c87075b6d45953ea7a23cf6453ac6a7c9b12
w
G.idea/sonarlint/issuestore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec,8\6\863e0292fd7e9b3e74dafd6cc01f73ba76346482

Q.idea/sonarlint/securityhotspotstore/e/4/e4a8b1d377a4b327b700c82cdc170510bab01518,5\4\547ef5de3621b8fe7f4578cd68f2b74ee1a17a15

Q.idea/sonarlint/securityhotspotstore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec,2\c\2cabb939da04d3de3a200bf2b575690e1a16316d
w
G.idea/sonarlint/issuestore/e/1/e1c37a2b874f6ea7e17c9c18414e6d4339d81114,4\f\4f3c45e238cc113997e784ae22047986b0f44363
w
G.idea/sonarlint/issuestore/b/f/bf2246c8a2e0e3f6e2888be51be848cd14b25af8,4\2\4249f84971c060f70ffa8e35322bb58ffcf39852

Q.idea/sonarlint/securityhotspotstore/b/f/bf2246c8a2e0e3f6e2888be51be848cd14b25af8,c\d\cd6e0770e2e9a3fc3611a6cba3eb3783f398101d

Q.idea/sonarlint/securityhotspotstore/e/1/e1c37a2b874f6ea7e17c9c18414e6d4339d81114,a\d\adc0832f962cf1a7235a7c86b08916af502697f2

Q.idea/sonarlint/securityhotspotstore/a/d/adadcc0ae2c286a8984091e3e1991c100a44636e,8\0\80266ea37609659b182af912980dd43fa28cdc00

Q.idea/sonarlint/securityhotspotstore/3/7/373f0d9f7019337750f87b356b87fe861ed26dee,c\7\c7bcc4a9375537fd426bd046125483563721eb8d

Q.idea/sonarlint/securityhotspotstore/4/1/41bdef3c357ffa2919c8036ccd646a5bb9348466,b\3\b380f0a52443eb8fb81f8889cee8eaa06455114f
:
.gitignore,a\5\a5cc2925ca8258af241be7e5b0381edf30266302

Q.idea/sonarlint/securityhotspotstore/4/d/4d9346f28a897013a240ab165c8817479f53f79e,5\f\5f1046b972d5994b495bcf9cbeaa0912ca0eb201

Q.idea/sonarlint/securityhotspotstore/d/a/daef86cba3ba34ec44937592df23ca740eb9c122,2\d\2d8c3d1aeb47d00da4f010cf60f06d954cd5c430

Q.idea/sonarlint/securityhotspotstore/6/c/6caba67e19d7d589c01faf57eec7a370818836d2,6\9\69fb5a35a5ff83489edce155f73c77017c78024c

Q.idea/sonarlint/securityhotspotstore/9/1/91badd6b59270f6c8260c473e50cd1c00e805d48,d\7\d7d547291c13ccf4928b3d57888aaec8f1bfb135

Q.idea/sonarlint/securityhotspotstore/b/c/bc9444ff84bf0fa860b21d32f6086eeac6dc6040,7\1\7156b0b21c76b648e8af324623be0acf61bddc01

Q.idea/sonarlint/securityhotspotstore/9/6/961c057c03dd1aa0ff098cce4acbe18c3fc9d908,3\b\3bb2dc03bf68d81cd57480b5f86210799d079ab6
w
G.idea/sonarlint/issuestore/4/d/4d9346f28a897013a240ab165c8817479f53f79e,6\8\6819fcd84b9bc553678c3ccf93a886adb3936c49

Q.idea/sonarlint/securityhotspotstore/c/7/c7bf124cfd1fe6f004d498f189abdc5f205f2114,c\6\c67289295854d30abbeca289629abd4da2a4b254

Q.idea/sonarlint/securityhotspotstore/3/9/39274ec568fdf53b2388a2beba6c240009129728,4\4\44ee811b78b1df7130df9219f49c8e6d2af92c41

Q.idea/sonarlint/securityhotspotstore/1/1/11394e5b278a0fc461d2f3653ef4a8374d43047f,3\6\3662fd6c81698fbfffcb6ec1820c82721d36c992

Q.idea/sonarlint/securityhotspotstore/8/6/869e6870cfdc50bf026049343a551fa43db97d81,3\1\31242250ccffa68052f25d45bf0e8d23fb75bfbd
\ No newline at end of file
\
,src/main/java/com/visa/application/Main.java,e\4\e4a8b1d377a4b327b700c82cdc170510bab01518
7
pom.xml,4\4\442292b8a7efeabbe4cc176709b833b1792140ec
n
>src/main/java/com/visa/application/service/ProfileService.java,4\1\41bdef3c357ffa2919c8036ccd646a5bb9348466
t
Dsrc/main/java/com/visa/application/repository/ProfileRepository.java,b\f\bf2246c8a2e0e3f6e2888be51be848cd14b25af8
e
5src/main/java/com/visa/application/model/Profile.java,3\9\39274ec568fdf53b2388a2beba6c240009129728
t
Dsrc/main/java/com/visa/application/controller/ProfileController.java,9\1\91badd6b59270f6c8260c473e50cd1c00e805d48
U
%src/main/java/dto/ProfileRequest.java,8\7\8715154f4b2d72eabd8494cd607226404222b4cc
j
:src/main/java/com/visa/application/dto/ProfileRequest.java,5\e\5ec6d872fb208ee3645ebbf009150f659e0c633b
u
Esrc/main/java/com/nisum/application/repository/ProfileRepository.java,4\d\4d9346f28a897013a240ab165c8817479f53f79e
f
6src/main/java/com/nisum/application/model/Profile.java,b\c\bc9444ff84bf0fa860b21d32f6086eeac6dc6040
o
?src/main/java/com/nisum/application/service/ProfileService.java,1\1\11394e5b278a0fc461d2f3653ef4a8374d43047f
u
Esrc/main/java/com/nisum/application/controller/ProfileController.java,6\c\6caba67e19d7d589c01faf57eec7a370818836d2
m
=src/main/java/com/nisum/application/dto/ProfileUpdateDTO.java,c\7\c7bf124cfd1fe6f004d498f189abdc5f205f2114
z
Jsrc/test/java/com/nisum/application/controller/ProfileControllerTests.java,8\6\869e6870cfdc50bf026049343a551fa43db97d81
]
-src/main/java/com/nisum/application/Main.java,e\1\e1c37a2b874f6ea7e17c9c18414e6d4339d81114
y
Isrc/main/java/com/nisum/application/exception/GlobalExceptionHandler.java,9\6\961c057c03dd1aa0ff098cce4acbe18c3fc9d908
g
7src/main/java/com/nisum/application/dto/ProfileDTO.java,d\a\daef86cba3ba34ec44937592df23ca740eb9c122
{
Ksrc/main/java/com/nisum/application/exception/ProfileConflictException.java,3\7\373f0d9f7019337750f87b356b87fe861ed26dee
{
Ksrc/main/java/com/nisum/application/exception/ProfileNotFoundException.java,a\d\adadcc0ae2c286a8984091e3e1991c100a44636e

Q.idea/sonarlint/securityhotspotstore/5/e/5ec6d872fb208ee3645ebbf009150f659e0c633b,5\3\53a9ac2e005fb1b83c10a02b4608bb8211441e63

Q.idea/sonarlint/securityhotspotstore/8/7/8715154f4b2d72eabd8494cd607226404222b4cc,b\5\b5b8c87075b6d45953ea7a23cf6453ac6a7c9b12
w
G.idea/sonarlint/issuestore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec,8\6\863e0292fd7e9b3e74dafd6cc01f73ba76346482

Q.idea/sonarlint/securityhotspotstore/e/4/e4a8b1d377a4b327b700c82cdc170510bab01518,5\4\547ef5de3621b8fe7f4578cd68f2b74ee1a17a15

Q.idea/sonarlint/securityhotspotstore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec,2\c\2cabb939da04d3de3a200bf2b575690e1a16316d
w
G.idea/sonarlint/issuestore/e/1/e1c37a2b874f6ea7e17c9c18414e6d4339d81114,4\f\4f3c45e238cc113997e784ae22047986b0f44363
w
G.idea/sonarlint/issuestore/b/f/bf2246c8a2e0e3f6e2888be51be848cd14b25af8,4\2\4249f84971c060f70ffa8e35322bb58ffcf39852

Q.idea/sonarlint/securityhotspotstore/b/f/bf2246c8a2e0e3f6e2888be51be848cd14b25af8,c\d\cd6e0770e2e9a3fc3611a6cba3eb3783f398101d

Q.idea/sonarlint/securityhotspotstore/e/1/e1c37a2b874f6ea7e17c9c18414e6d4339d81114,a\d\adc0832f962cf1a7235a7c86b08916af502697f2

Q.idea/sonarlint/securityhotspotstore/a/d/adadcc0ae2c286a8984091e3e1991c100a44636e,8\0\80266ea37609659b182af912980dd43fa28cdc00

Q.idea/sonarlint/securityhotspotstore/3/7/373f0d9f7019337750f87b356b87fe861ed26dee,c\7\c7bcc4a9375537fd426bd046125483563721eb8d

Q.idea/sonarlint/securityhotspotstore/4/1/41bdef3c357ffa2919c8036ccd646a5bb9348466,b\3\b380f0a52443eb8fb81f8889cee8eaa06455114f
:
.gitignore,a\5\a5cc2925ca8258af241be7e5b0381edf30266302

Q.idea/sonarlint/securityhotspotstore/4/d/4d9346f28a897013a240ab165c8817479f53f79e,5\f\5f1046b972d5994b495bcf9cbeaa0912ca0eb201

Q.idea/sonarlint/securityhotspotstore/d/a/daef86cba3ba34ec44937592df23ca740eb9c122,2\d\2d8c3d1aeb47d00da4f010cf60f06d954cd5c430

Q.idea/sonarlint/securityhotspotstore/6/c/6caba67e19d7d589c01faf57eec7a370818836d2,6\9\69fb5a35a5ff83489edce155f73c77017c78024c

Q.idea/sonarlint/securityhotspotstore/9/1/91badd6b59270f6c8260c473e50cd1c00e805d48,d\7\d7d547291c13ccf4928b3d57888aaec8f1bfb135

Q.idea/sonarlint/securityhotspotstore/b/c/bc9444ff84bf0fa860b21d32f6086eeac6dc6040,7\1\7156b0b21c76b648e8af324623be0acf61bddc01

Q.idea/sonarlint/securityhotspotstore/9/6/961c057c03dd1aa0ff098cce4acbe18c3fc9d908,3\b\3bb2dc03bf68d81cd57480b5f86210799d079ab6
w
G.idea/sonarlint/issuestore/4/d/4d9346f28a897013a240ab165c8817479f53f79e,6\8\6819fcd84b9bc553678c3ccf93a886adb3936c49

Q.idea/sonarlint/securityhotspotstore/c/7/c7bf124cfd1fe6f004d498f189abdc5f205f2114,c\6\c67289295854d30abbeca289629abd4da2a4b254

Q.idea/sonarlint/securityhotspotstore/3/9/39274ec568fdf53b2388a2beba6c240009129728,4\4\44ee811b78b1df7130df9219f49c8e6d2af92c41

Q.idea/sonarlint/securityhotspotstore/1/1/11394e5b278a0fc461d2f3653ef4a8374d43047f,3\6\3662fd6c81698fbfffcb6ec1820c82721d36c992

Q.idea/sonarlint/securityhotspotstore/8/6/869e6870cfdc50bf026049343a551fa43db97d81,3\1\31242250ccffa68052f25d45bf0e8d23fb75bfbd
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/dompoc" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.visa.application</groupId>
<artifactId>DOMPOC</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.7</version> <!-- Specify the Spring Boot version here -->
</parent>
<dependencies>
<!-- Spring Boot WebFlux for reactive web applications -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- Spring Data MongoDB Reactive -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Jackson Databind for JSON serialization/deserialization -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.nisum.application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
\ No newline at end of file
package com.nisum.application.controller;
import com.nisum.application.dto.ProfileDTO;
import com.nisum.application.model.Profile;
import com.nisum.application.service.ProfileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import javax.validation.Valid;
import javax.validation.constraints.Pattern;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
@RestController
@RequestMapping("/profile")
@Slf4j
public class ProfileController {
@Autowired
private ProfileService profileService;
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Mono<Profile> createProfile(@Valid @RequestBody ProfileDTO profileDTO) {
Profile profile = convertToEntity(profileDTO);
return profileService.createProfile(profile)
.doOnSuccess(savedProfile -> log.info("Profile created successfully: {}", savedProfile))
.doOnError(error -> {
log.error("Error creating profile", error);
if (error instanceof ResponseStatusException) {
ResponseStatusException exception = (ResponseStatusException) error;
log.error("HTTP Status: {}, Message: {}", exception.getStatus(), exception.getReason());
}
});
}
private Profile convertToEntity(ProfileDTO profileDTO) {
Profile profile = new Profile();
profile.setFirstName(profileDTO.getFirstName());
profile.setLastName(profileDTO.getLastName());
profile.setDateOfBirth(LocalDate.parse(profileDTO.getDob(), DateTimeFormatter.ofPattern("MM-dd-yyyy")));
profile.setPermanentAccountNumber(profileDTO.getPan());
profile.setAdharNumber(profileDTO.getAdhar());
profile.setMobileNumber(profileDTO.getMobile());
return profile;
}
@GetMapping
public Flux<Profile> searchProfiles(
@RequestParam(required = false) String firstName,
@RequestParam(required = false) String lastName,
@RequestParam(required = false) @Pattern(regexp = "^[A-Z]{5}[0-9]{4}[A-Z]$", message = "Invalid PAN format") String pan,
@RequestParam(required = false) @Pattern(regexp = "^[1-9][0-9]{11}$", message = "Invalid Aadhar format") String adhar,
@RequestParam(required = false) @Pattern(regexp = "^[6-9][0-9]{9}$", message = "Invalid mobile format") String mobile,
@RequestParam(required = false) String dob) {
LocalDate dateOfBirth = null;
if (dob != null) {
try {
dateOfBirth = LocalDate.parse(dob, DateTimeFormatter.ofPattern("MM-dd-yyyy")); // Ensure correct date format
} catch (DateTimeParseException e) {
return Flux.error(new IllegalArgumentException("Invalid date format. Expected format: MM-DD-YYYY"));
}
}
log.info("Received request to search profiles with criteria - FirstName: {}, LastName: {}, PAN: {}, Aadhar: {}, Mobile: {}, DOB: {}",
firstName, lastName, pan, adhar, mobile, dob);
return profileService.searchProfiles(firstName, lastName, pan, adhar, mobile, dateOfBirth)
.doOnError(error -> log.error("Error searching profiles", error));
}
@PutMapping
@ResponseStatus(HttpStatus.OK)
public Mono<Profile> updateProfile(@Valid @RequestBody ProfileDTO profileUpdateDTO) {
return profileService.updateProfile(profileUpdateDTO)
.doOnSuccess(updatedProfile -> log.info("Profile updated successfully: {}", updatedProfile))
.doOnError(error -> log.error("Error updating profile", error));
}
@DeleteMapping("/{profileId}")
public Mono<ResponseEntity<Object>> deleteProfile(@PathVariable String profileId) {
return profileService.deleteProfileById(profileId)
.map(deleted -> ResponseEntity.noContent().build())
.doOnError(error -> log.error("Error deleting profile", error));
}
}
package com.nisum.application.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProfileDTO {
private String profileId;
@NotBlank(message = "First name is mandatory")
@Pattern(regexp = "^[a-zA-Z ]*$", message = "First name should only contain letters and spaces")
private String firstName;
@NotBlank(message = "Last name is mandatory")
@Pattern(regexp = "^[a-zA-Z ]*$", message = "Last name should only contain letters and spaces")
private String lastName;
@NotNull(message = "Date of birth is required.")
@Pattern(regexp = "^\\d{2}-\\d{2}-\\d{4}$", message = "Date of birth must be in MM-DD-YYYY format")
private String dob;
@Pattern(regexp = "^[A-Z]{5}[0-9]{4}[A-Z]$", message = "PAN should follow the format AAAAA1111A")
private String pan;
@Pattern(regexp = "^[1-9][0-9]{11}$", message = "Aadhar must be a 12 digit number starting with 1-9")
private String adhar;
@NotBlank(message = "Mobile number is mandatory")
@Pattern(regexp = "^[6-9][0-9]{9}$", message = "Mobile number should be 10 digits and start with 6/7/8/9")
private String mobile;
}
package com.nisum.application.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.support.WebExchangeBindException;
import java.util.List;
import java.util.stream.Collectors;
@ControllerAdvice
public class GlobalExceptionHandler {
// Handle validation errors
@ExceptionHandler(WebExchangeBindException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<List<String>> handleValidationExceptions(WebExchangeBindException ex) {
List<String> errorMessages = ex.getBindingResult()
.getFieldErrors()
.stream()
.map(fieldError -> fieldError.getDefaultMessage())
.collect(Collectors.toList());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessages);
}
// Handle Profile conflicts
@ExceptionHandler(ProfileConflictException.class)
@ResponseStatus(HttpStatus.CONFLICT)
public ResponseEntity<String> handleConflict(ProfileConflictException ex) {
return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage());
}
// Catch-all for other exceptions
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<String> handleBadRequest(Exception ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid request");
}
@ExceptionHandler(ProfileNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ResponseEntity<String> handleProfileNotFound(ProfileNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
package com.nisum.application.exception;
public class ProfileConflictException extends RuntimeException {
public ProfileConflictException(String message) {
super(message);
}
}
package com.nisum.application.exception;
public class ProfileNotFoundException extends RuntimeException {
public ProfileNotFoundException(String message) {
super(message);
}
}
package com.nisum.application.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.time.LocalDate;
@Document(collection = "profiles")
@Data
public class Profile {
@Id
private String id;
private String firstName;
private String lastName;
private LocalDate dateOfBirth;
private String permanentAccountNumber;
private String adharNumber;
private String mobileNumber;
}
package com.nisum.application.repository;
import com.nisum.application.model.Profile;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDate;
public interface ProfileRepository extends ReactiveMongoRepository<Profile, String> {
Mono<Profile> findByPermanentAccountNumber(String pan);
Mono<Profile> findByAdharNumber(String adhar);
Flux<Profile> findByFirstNameRegexAndLastNameRegex(String firstName, String lastName);
Flux<Profile> findAllByPermanentAccountNumber(String pan);
Flux<Profile> findAllByAdharNumber(String aadharNumber);
Flux<Profile> findByMobileNumber(String mobile);
Flux<Profile> findByDateOfBirth(LocalDate dob);
}
package com.nisum.application.service;
import com.nisum.application.dto.ProfileDTO;
import com.nisum.application.exception.ProfileConflictException;
import com.nisum.application.exception.ProfileNotFoundException;
import com.nisum.application.model.Profile;
import com.nisum.application.repository.ProfileRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.regex.Pattern;
@Service
@Slf4j
public class ProfileService {
@Autowired
private ProfileRepository profileRepository;
public Mono<Profile> createProfile(Profile profile) {
// Ensure either PAN or Aadhar is provided
if (profile.getPermanentAccountNumber() == null && profile.getAdharNumber() == null) {
return Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Either PAN or Aadhar must be provided."));
}
// Validate Aadhar number
if (profile.getAdharNumber() != null && !profile.getAdharNumber().matches("^[1-9][0-9]{11}$")) {
return Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Aadhar must be a 12 digit number starting with 1-9."));
}
// Validate PAN number
if (profile.getPermanentAccountNumber() != null && !profile.getPermanentAccountNumber().matches("^[A-Z]{5}[0-9]{4}[A-Z]$")) {
return Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid PAN format."));
}
// Check for PAN and Aadhar conflicts individually
Mono<Profile> panConflictCheck = profile.getPermanentAccountNumber() != null
? profileRepository.findByPermanentAccountNumber(profile.getPermanentAccountNumber())
.flatMap(existingProfile -> Mono.error(new ProfileConflictException("Profile with the same PAN already exists.")))
: Mono.empty();
Mono<Profile> aadharConflictCheck = profile.getAdharNumber() != null
? profileRepository.findByAdharNumber(profile.getAdharNumber())
.flatMap(existingProfile -> Mono.error(new ProfileConflictException("Profile with the same Aadhar already exists.")))
: Mono.empty();
// Combine the two checks using `Mono.firstWithSignal` to propagate the first error or complete both if no conflicts
return Mono.firstWithSignal(panConflictCheck, aadharConflictCheck)
.switchIfEmpty(profileRepository.save(profile))
.doOnSuccess(savedProfile -> log.info("Profile created successfully: {}", savedProfile))
.doOnError(error -> log.error("Error creating profile", error));
}
public Flux<Profile> searchProfiles(String firstName, String lastName, String pan, String adhar, String mobile, LocalDate dob) {
// Check if at least one search criteria is provided
if (firstName == null && lastName == null && pan == null && adhar == null && mobile == null && dob == null) {
log.error("Search criteria are missing. At least one criteria must be provided.");
return Flux.error(new IllegalArgumentException("At least one search criteria must be provided."));
}
// Build the query based on provided criteria
Flux<Profile> result;
if (firstName != null || lastName != null) {
String firstNameRegex = firstName != null ? ".*" + Pattern.quote(firstName) + ".*" : ".*";
String lastNameRegex = lastName != null ? ".*" + Pattern.quote(lastName) + ".*" : ".*";
result = profileRepository.findByFirstNameRegexAndLastNameRegex(firstNameRegex, lastNameRegex);
} else if (pan != null) {
result = profileRepository.findAllByPermanentAccountNumber(pan);
} else if (adhar != null) {
result = profileRepository.findAllByAdharNumber(adhar);
} else if (mobile != null) {
result = profileRepository.findByMobileNumber(mobile);
} else if (dob != null) {
result = profileRepository.findByDateOfBirth(dob);
} else {
result = Flux.empty();
}
// Log the search criteria and results
return result
.doOnSubscribe(subscription -> log.info("Search initiated with criteria - FirstName: {}, LastName: {}, PAN: {}, Aadhar: {}, Mobile: {}, DOB: {}",
firstName, lastName, pan, adhar, mobile, dob))
.doOnNext(profile -> log.debug("Found profile: {}", profile))
.doOnError(error -> log.error("Error searching profiles", error))
.doOnComplete(() -> log.info("Search completed with criteria - FirstName: {}, LastName: {}, PAN: {}, Aadhar: {}, Mobile: {}, DOB: {}",
firstName, lastName, pan, adhar, mobile, dob))
.switchIfEmpty(Flux.error(new IllegalStateException("No profiles found matching the given criteria.")));
}
public Mono<Profile> updateProfile(ProfileDTO updateDTO) {
log.info("Received request to update profile with ID: {}", updateDTO.getProfileId());
return profileRepository.findById(updateDTO.getProfileId())
.flatMap(existingProfile -> {
boolean updated = false;
if (updateDTO.getFirstName() != null) {
existingProfile.setFirstName(updateDTO.getFirstName());
updated = true;
}
if (updateDTO.getLastName() != null) {
existingProfile.setLastName(updateDTO.getLastName());
updated = true;
}
if (updateDTO.getDob() != null) {
try {
existingProfile.setDateOfBirth(LocalDate.parse(updateDTO.getDob(), DateTimeFormatter.ofPattern("MM-dd-yyyy")));
updated = true;
} catch (DateTimeParseException e) {
log.error("Invalid date format: {}", updateDTO.getDob());
return Mono.error(new IllegalArgumentException("Invalid date format. Expected MM-DD-YYYY"));
}
}
if (updateDTO.getPan() != null) {
existingProfile.setPermanentAccountNumber(updateDTO.getPan());
updated = true;
}
if (updateDTO.getAdhar() != null) {
existingProfile.setAdharNumber(updateDTO.getAdhar());
updated = true;
}
if (updateDTO.getMobile() != null) {
existingProfile.setMobileNumber(updateDTO.getMobile());
updated = true;
}
if (!updated) {
log.warn("No fields to update for profile with ID: {}", updateDTO.getProfileId());
return Mono.error(new IllegalArgumentException("At least one field must be provided to update the profile."));
}
return profileRepository.save(existingProfile)
.doOnSuccess(updatedProfile -> log.info("Profile updated successfully: {}", updatedProfile))
.doOnError(error -> log.error("Error updating profile", error));
})
.switchIfEmpty(Mono.error(new IllegalArgumentException("Profile not found with the given ID")));
}
public Mono<Void> deleteProfileById(String profileId) {
return profileRepository.findById(profileId)
.switchIfEmpty(Mono.error(new ProfileNotFoundException("Profile not found with the given ID: " + profileId)))
.flatMap(existingProfile -> profileRepository.delete(existingProfile));
}
}
spring.data.mongodb.uri=mongodb://localhost:27017/profiles_db
logging.level.root=INFO
logging.level.com.nisum.application=DEBUG
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment