184 Commits

Author SHA1 Message Date
Alex Tusa
dd92307cf8 Merge pull request #28 from atusa17/PAN-46
Pan 46
2019-04-11 21:51:52 -06:00
1e7e46fc66 PAN-46 fixed breaking integration tests 2019-04-11 21:36:21 -06:00
53ba34db1e Merge remote-tracking branch 'origin/PAN-46' into PAN-46 2019-04-11 20:57:46 -06:00
7305f444f8 PAN-46 Merged with Master 2019-04-11 20:57:20 -06:00
dantanxiaotian
34c74da321 Merge branch 'master' into PAN-46 2019-04-11 20:31:14 -06:00
Alex Tusa
dd6e98130d Merge pull request #27 from atusa17/PAN-11
Pan 11
2019-04-11 15:18:17 -06:00
93774e7e11 PAN-46 Wrote unit tests for the ExceptionHandlingController 2019-04-07 21:56:23 -06:00
c5727c8d1a PAN-46 Added validation to TheoremController 2019-04-07 21:40:09 -06:00
61c4b3de42 PAN-46 Added validation to ProofController 2019-04-07 21:32:43 -06:00
9dd7fb66f5 PAN-46 Added validation to the DefinitionController 2019-04-07 20:35:57 -06:00
8127cb1647 PAN-46 Added validation to the AccountController 2019-04-07 20:25:33 -06:00
12f7d7f359 PAN-11 fixed all integration tests 2019-04-07 18:00:12 -06:00
c8600b8bb4 PAN-11 Fixed integration tests 2019-04-07 17:30:34 -06:00
091215f1eb PAN-11 Fixed integration tests 2019-04-07 17:22:08 -06:00
67f77d6c9e PAN-11 Fixed integration tests 2019-04-07 17:06:43 -06:00
c75b243df8 PAN-11 Fixed integration tests 2019-04-07 16:51:36 -06:00
609f018f9f PAN-11 Fixed integration tests 2019-04-07 16:21:18 -06:00
7802e25310 Merge branches 'PAN-11' and 'master' of https://github.com/atusa17/ptp into PAN-11
# Conflicts:
#	services/src/integrationTest/resources/test.properties
#	services/src/main/java/edu/msudenver/tsp/services/dto/Account.java
2019-04-07 16:03:36 -06:00
Alex Tusa
1bddb2d646 Merge pull request #24 from atusa17/PAN-15
Pan 15
2019-04-07 15:33:49 -06:00
36036b710d PAN-15 Finished Unit Tests 2019-04-07 15:18:19 -06:00
dantanxiaotian
adbcd786f0 PAN-15 fix the request changes 2019-04-02 16:38:54 -06:00
dantanxiaotian
b1d4ed9719 PAN-15 fix the request changes 2019-03-27 12:18:12 -06:00
765d8283d9 PAN-11 wrote unit tests for deleteDefinition 2019-03-24 22:36:10 -06:00
8724d6c2f8 PAN-11 created the deleteDefinition method 2019-03-24 22:27:27 -06:00
5a44b5b793 PAN-11 wrote unit tests for the updateDefinition method 2019-03-24 22:12:34 -06:00
6d1db048c8 PAN-11 created the updateDefinition method 2019-03-24 21:51:36 -06:00
69726a46a4 PAN-11 created the updateDefinition method 2019-03-24 21:51:10 -06:00
ae88fd356d PAN-11 Wrote unit tests for the findById method 2019-03-24 21:41:16 -06:00
bc0d631e6c PAN-11 Wrote the findById method 2019-03-24 21:29:49 -06:00
92bea81ae5 PAN-11 Wrote unit tests for getAllDefinitions() 2019-03-24 21:23:03 -06:00
978b58fe2c PAN-11 wrote the GetAllDefinitions() method 2019-03-24 20:48:25 -06:00
8a582614f9 Merge branches 'PAN-11' and 'master' of https://github.com/atusa17/ptp into PAN-11 2019-03-24 19:20:38 -06:00
eedc7a3eee Merge remote-tracking branch 'origin/PAN-15' into PAN-15 2019-03-24 17:49:16 -06:00
0bc56f57e6 PAN-15 Merged with master 2019-03-24 17:49:07 -06:00
dantanxiaotian
cc7e6e0ed2 Merge branches 'PAN-15' and 'master' of https://github.com/atusa17/ptp into PAN-15 2019-03-24 17:45:00 -06:00
e2e2b24f3d Merge branches 'PAN-15' and 'master' of https://github.com/atusa17/ptp into PAN-15 2019-03-24 17:44:27 -06:00
Alex Tusa
c715e98e81 Merge pull request #26 from atusa17/PAN-18
Pan 18
2019-03-24 17:34:50 -06:00
dantanxiaotian
6791f6c61f Merge branch 'master' of https://github.com/atusa17/ptp into PAN-15
# Conflicts:
#	src/main/java/edu/msudenver/tsp/website/Application.java
2019-03-24 17:31:40 -06:00
zeliu
8f2968bc2b PAN-18 WORKING HOMEPAGE 2019-03-24 17:17:04 -06:00
zeliu
98f6b9e2b7 PAN-18 WORKING HOMEPAGE 2019-03-24 17:02:50 -06:00
zeliu
3b4753215c PAN-18 Refactored the HomeController 2019-03-24 15:26:08 -06:00
zeliu
94440faa4d PAN-18 Here is the JSP file for hoempage 2019-03-24 15:21:25 -06:00
zeliu
cf5135e5b0 Merge branch 'master' of https://github.com/atusa17/ptp 2019-03-24 15:18:22 -06:00
dantanxiaotian
7060f2e7e3 Merge branch 'master' of https://github.com/atusa17/ptp into PAN-15
# Conflicts:
#	src/main/java/edu/msudenver/tsp/website/Application.java
2019-03-24 15:00:20 -06:00
dantanxiaotian
89f1c55f51 PAN-15 Fixed unit tests 2019-03-24 14:54:06 -06:00
Alex Tusa
de5a69d619 Merge pull request #25 from atusa17/PAN-52-fix
PAN-52 Fixed issue with the Theorems API
2019-03-21 12:15:55 -06:00
296cf62be6 PAN-52 Fixed issue with the Theorems API 2019-03-21 11:40:19 -06:00
f5dbdac990 PAN-52 Fixed issue with the Theorems API 2019-03-21 11:29:30 -06:00
c9a2a978fc PAN-52 Fixed issue with the Theorems API 2019-03-21 11:20:52 -06:00
d0cde837e9 PAN-52 Fixed issue with the Theorems API 2019-03-21 11:09:01 -06:00
07cdef3d44 PAN-52 Fixed issue with the Theorems API 2019-03-21 11:05:32 -06:00
ab360abcf8 PAN-52 Fixed issue with the Theorems API 2019-03-21 11:02:46 -06:00
4622c49cee PAN-52 Fixed issue with the Theorems API 2019-03-21 10:59:14 -06:00
f8a1d8bf89 PAN-52 Fixed issue with the Theorems API 2019-03-21 10:55:15 -06:00
ba4c7502db PAN-52 Fixed issue with the Theorems API 2019-03-21 10:39:24 -06:00
1e15082fcc PAN-52 Fixed issue with the Theorems API 2019-03-21 10:32:57 -06:00
6b7cf5cd91 PAN-52 Fixed issue with the Theorems API 2019-03-21 10:28:51 -06:00
413a78f729 PAN-52 Fixed issue with the Theorems API 2019-03-21 10:28:09 -06:00
80f55c4879 PAN-52 Fixed issue with the Theorems API 2019-03-21 10:25:52 -06:00
Alex Tusa
ae15ec8073 Merge pull request #22 from atusa17/PAN-16
Pan 16
2019-03-20 22:47:56 -06:00
8c79d9975e Merge branches 'PAN-16' and 'master' of https://github.com/atusa17/ptp into PAN-16
# Conflicts:
#	services/build.gradle
2019-03-20 22:32:25 -06:00
9695f5082a Merge branches 'PAN-15' and 'master' of https://github.com/atusa17/ptp into PAN-15
# Conflicts:
#	services/build.gradle
2019-03-20 22:30:11 -06:00
f5f959b453 Merge branches 'PAN-15' and 'master' of https://github.com/atusa17/ptp into PAN-15
# Conflicts:
#	services/build.gradle
2019-03-20 22:28:51 -06:00
f35777b5a6 Merge remote-tracking branch 'origin/PAN-15' into PAN-15
# Conflicts:
#	services/src/main/java/edu/msudenver/tsp/services/dto/Account.java
#	services/src/main/java/edu/msudenver/tsp/services/factory/RequestFactory.java
2019-03-20 22:17:24 -06:00
748781f10f Merge branches 'PAN-15' and 'master' of https://github.com/atusa17/ptp into PAN-15
# Conflicts:
#	build.gradle
#	persistence/src/main/java/edu/msudenver/tsp/persistence/repository/AccountsRepository.java
#	persistence/src/test/java/edu/msudenver/tsp/persistence/controller/AccountControllerTest.java
#	services/src/main/java/edu/msudenver/tsp/services/RestService.java
#	services/src/main/java/edu/msudenver/tsp/services/dto/Account.java
#	services/src/main/java/edu/msudenver/tsp/services/factory/RequestFactory.java
#	services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java
#	services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java
2019-03-20 22:15:32 -06:00
Alex Tusa
083c149a73 Merge branch 'master' into PAN-15 2019-03-20 22:15:08 -06:00
749a20c0fd Merge branches 'PAN-16' and 'master' of https://github.com/atusa17/ptp into PAN-16
# Conflicts:
#	services/build.gradle
2019-03-20 22:00:11 -06:00
dantanxiaotian
b15ef858b0 Merge pull request #23 from atusa17/PAN-52
Pan 52
2019-03-20 16:20:03 -06:00
dantanxiaotian
860e5379e6 PAN-15 UserService.java and completed UserSservice integration test 2019-03-20 16:06:24 -06:00
-
5479130178 fixed again, thanks Alex for your detailed reviews I have learned alot :) 2019-03-19 17:44:53 -06:00
-
f0cb7633c6 updated with passed tests 2019-03-19 00:11:38 -06:00
-
9f5d9e24f5 made few changes also adding test method 2019-03-18 13:52:01 -06:00
7b2d5c45a6 PAN-52 Forgot to add the @Repository annotation to the ProofRepository 2019-03-17 22:59:18 -06:00
b48094ba26 PAN-11 Stuck trying to get the integration tests to be configured correctly 2019-03-17 22:02:00 -06:00
3853911b3c PAN-11 corrected build.gradle inter-project dependencies 2019-03-17 21:09:07 -06:00
a84e6c6ab7 PAN-52 Removed useless classes 2019-03-17 16:22:23 -06:00
9700eb55ab PAN-52 Removed useless classes 2019-03-17 16:21:32 -06:00
7548ca64d0 PAN-52 Updated the build.gradle files and the .travis.yml 2019-03-17 16:01:12 -06:00
6197beb309 PAN-52 Updated the build.gradle files 2019-03-17 15:37:04 -06:00
6009720d80 PAN-52 Created RequestFactory unit tests 2019-03-17 15:07:23 -06:00
c90f5b6e09 PAN-57 Added patch method to RestService per request 2019-03-17 14:52:41 -06:00
a13ab97154 PAN-57 Refacted superfluous code 2019-03-17 14:48:43 -06:00
a85bf67d08 PAN-57 Refactored the Definition DTO 2019-03-17 14:36:44 -06:00
1de1f7a5fc PAN-52 Finished integration tests for the proofs repository 2019-03-17 14:26:54 -06:00
2c03c75938 PAN-52 Fixed a typo in the parameter arguments 2019-03-17 13:58:51 -06:00
52a21e72f3 PAN-52 Updated logging formats 2019-03-17 12:51:48 -06:00
atusa
4b866017a1 PAN-52 Finished creating the ProofController and writing all unit tests 2019-03-15 15:58:23 -06:00
atusa
bd7455c679 PAN-52 updated the travis.yml file to also perform a sonar analysis after each build 2019-03-15 15:04:45 -06:00
-
150933b22b Merge remote-tracking branch 'origin/PAN-16' into PAN-16 2019-03-15 01:45:31 -06:00
-
0afe995950 Reverted build file changes 2019-03-15 01:44:51 -06:00
Alex Tusa
401383f5da Delete gradlew~Stashed changes 2019-03-14 20:45:56 -06:00
-
b5f1590142 Merge branch 'master' of https://github.com/atusa17/ptp into PAN-16 2019-03-14 17:15:42 -06:00
-
c45c0a6108 add to PAN-16 2019-03-14 17:04:10 -06:00
-
139dc943c3 PAN-16 finished 2019-03-14 16:58:17 -06:00
4d0658a268 PAN-52 Added findByName to the TheoremRepository, and to the TheoremController as well as the corresponding tests, and a foreign key mapping from the proofs table to the corresponding theorem in the theorems table 2019-03-14 12:28:59 -06:00
d560f5831f PAN-52 Added findByName and findByBranch methods to the repository, and created first couple of methods and corresponding tests in the ProofController 2019-03-14 11:51:29 -06:00
7af41d4235 PAN-52 Added findByName and findByBranch methods to the repository, and created first couple of methods and corresponding tests in the ProofController 2019-03-14 11:43:01 -06:00
4bd1936a7a PAN-52 created the proofs DTO 2019-03-14 11:17:51 -06:00
bc92dc60d4 PAN-52 created the proofs table 2019-03-14 10:51:38 -06:00
Brittany
fe0912fc24 Merge pull request #21 from atusa17/PAN-50
Pan 50
2019-03-13 22:36:28 -06:00
3483a2dd2c PAN-50 Addressed Brittany's comment about nonexistent fields 2019-03-13 22:24:32 -06:00
d19cb5a989 PAN-50 Addressed Brittany's comment about logging consistency 2019-03-13 22:05:08 -06:00
47dd67623e PAN-50 Addressed Brittany's comment about my typo 2019-03-13 21:57:36 -06:00
64dd8397cc PAN-50 Finished integration tests for theorems 2019-03-11 13:07:21 -06:00
fd760293ef PAN-50 Wrote Unit tests for the Theorem Controller, and initial integration Test for the theorem controller, but need to fix custom queries in both accountRepository and theoremRepository 2019-03-11 00:09:34 -06:00
816d85196b PAN-50 added findByUsername to the AccountController class and tests 2019-03-10 23:04:29 -06:00
dantanxiaotian
46122cbafd PAN-15 Created gradle tasks to start the persistence API and to start the API asynchronously 2019-03-10 19:58:04 -06:00
dantanxiaotian
ffaf020b80 PAN-15 WORKING AND WITH TRAVIS!!! 2019-03-10 17:21:32 -06:00
dantanxiaotian
5d429b2c8e PAN-15 Updated tests 2019-03-10 17:06:47 -06:00
dantanxiaotian
ced18dcc97 Merge remote-tracking branch 'origin/PAN-15' into PAN-15 2019-03-10 17:03:59 -06:00
dantanxiaotian
238908f4fa PAN-15 Updated tests 2019-03-10 17:03:50 -06:00
dantanxiaotian
10b0a09690 PAN-15 Updated the gradle dependencies 2019-03-10 16:18:19 -06:00
dantanxiaotian
ba37ffeb57 PAN-15 Created initial UserService implementation and initial integration tests 2019-03-10 15:55:43 -06:00
dantanxiaotian
2dda30753e Merge pull request #19 from atusa17/PAN-60
Pan 60
2019-03-10 13:24:03 -06:00
f4c7b55b62 PAN-60 Fixed a refactoring issue 2019-03-10 13:00:59 -06:00
f617ee7bd9 PAN-60 Fixed an issue with the connection to the database 2019-03-10 12:47:05 -06:00
c826185bba PAN-60 Created an example UserService 2019-03-10 12:33:54 -06:00
22e401062a PAN-60 created the RequestFactory 2019-03-10 12:03:11 -06:00
e9661fdf78 PAN-60 created initial RestService 2019-03-10 11:48:34 -06:00
6d7979c179 PAN-50 Created the findByProven_status method 2019-03-07 11:07:10 -07:00
11aa1f1cf7 PAN-50 Created the findByBranch method 2019-03-07 10:50:22 -07:00
d6b18c2279 PAN-50 Began creation of the TheoremController 2019-03-07 10:27:51 -07:00
zeliu
86c5e8123e Here is the JSP file for hoempage 2019-03-07 10:22:08 -07:00
2c3977e595 Merge remote-tracking branch 'origin/master' 2019-03-07 10:18:13 -07:00
Alex Tusa
484180f717 Merge pull request #18 from atusa17/PAN-10
PAN-10 code & test corrections. 100% coverage & passed.
2019-03-05 11:59:47 -07:00
Alex Tusa
22cd0a74d3 Merge branch 'master' into PAN-10 2019-03-05 11:48:57 -07:00
103d09bb0e PAN-10 added a null check to the recurse method 2019-03-05 11:48:18 -07:00
BrittanyBi
2f5aef8092 PAN-10 ParserService.recurse() code refactored to be more readable. 2019-03-04 23:00:26 -07:00
BrittanyBi
357e9b23cc PAN-10 Refactored direct access of fields to getter and setter methods. 2019-03-04 22:24:27 -07:00
BrittanyBi
6f5bbab5ac PAN-10 Corrected many styling errors which required little refactoring. 2019-03-04 21:23:45 -07:00
Alex Tusa
27e56039f4 Create README.md 2019-03-04 18:15:22 -07:00
Alex Tusa
0167ac1a11 Create README.md 2019-03-04 18:13:36 -07:00
Alex Tusa
0b6e18b795 Update README.md 2019-03-04 18:12:33 -07:00
Alex Tusa
f2498f4bda Update README.md 2019-03-04 18:01:52 -07:00
Alex Tusa
953f8d807c Update README.md 2019-03-04 18:01:24 -07:00
Alex Tusa
b154648fdf Update README.md 2019-03-04 17:59:00 -07:00
Alex Tusa
fae060e039 Update README.md 2019-03-04 17:57:37 -07:00
0e661bbf79 Merge remote-tracking branch 'origin/master' 2019-03-03 21:18:06 -07:00
a0753903b2 PAN-50 Updated the DTO's 2019-03-03 21:12:07 -07:00
Alex Tusa
dbce550625 Merge branch 'master' into PAN-10 2019-03-03 19:05:31 -07:00
Alex Tusa
6a8f239995 Update .travis.yml 2019-03-03 19:04:55 -07:00
3762c10359 PAN-50 Fixed the .travis.yml file 2019-03-03 19:03:48 -07:00
BrittanyBi
e4594dc900 PAN-10 deleted commented-out code 2019-03-03 19:01:01 -07:00
BrittanyBi
cbaea65b56 PAN-10 travis.yml update 2019-03-03 18:58:34 -07:00
BrittanyBi
e47f2556f6 PAN-10 code & tests. 100% coverage.
Node class extracted from ParserService class.
ParserConfig deleted because it wasn't being used.
2019-03-03 18:51:11 -07:00
4999227e1b PAN-50 Created the TheoremRepository 2019-03-03 18:43:16 -07:00
ca8dc5c5df PAN-50 Created the DTO for theorems 2019-03-03 18:38:29 -07:00
9d7673ebf2 PAN-50 Created the DTO for theorems 2019-03-03 18:36:14 -07:00
f6de79a3d4 PAN-50 Added the creation of the theorems table to the local_development.sql 2019-03-03 18:25:46 -07:00
BrittanyBi
4b76f2eb69 PAN-10 code & test corrections. Node class extracted from ParserService class. 2019-03-03 17:32:52 -07:00
d8422f67d7 TEST 2019-03-03 16:25:49 -07:00
4130e7bef3 Added the README 2019-03-03 16:15:35 -07:00
96c90a3c49 change git root 2019-03-03 16:13:24 -07:00
Brittany
a1d5a82570 Merge pull request #15 from atusa17/PAN-48
PAN-48
2019-02-27 19:02:38 -07:00
30988fa94a PAN-48 Updated the sonar configuration 2019-02-24 22:40:33 -07:00
0734f6ff10 PAN-48 Added dependency on utilities to the persistence project 2019-02-24 20:31:24 -07:00
030e66f516 PAN-48 Added update test to Definition integration test 2019-02-24 20:25:20 -07:00
9ad185b033 PAN-48 Wrote IntegrationTests for Accounts 2019-02-24 20:22:22 -07:00
68fb41c067 PAN-48 Wrote IntegrationTests for Accounts 2019-02-24 20:13:01 -07:00
327724faf1 PAN-48 Wrote unit tests for the AccountController 2019-02-24 19:59:49 -07:00
9020b0fdbb PAN-48 Wrote unit tests for the updateDefinition method 2019-02-24 19:48:18 -07:00
a3ab3f10bf PAN-48 Created the updateDefinition method 2019-02-24 19:17:51 -07:00
b77a750c30 PAN-48 Created the AccountController and created the copyNonNullProperties method 2019-02-24 19:14:17 -07:00
8c9f2bbd9c PAN-48 Updated the AccountsDto and the AccountsRepository 2019-02-24 17:30:39 -07:00
dantanxiaotian
92aebf0283 Merge pull request #14 from atusa17/PAN-7
Pan 7
2019-02-24 16:37:42 -07:00
bb28de709a PAN-7 Updated the loaddb.sh file 2019-02-24 16:26:17 -07:00
9e4131f693 PAN-7 Updated the .travis.yml file 2019-02-24 16:18:36 -07:00
d0f8e0bafa PAN-7 Reverted the loadDb task 2019-02-24 16:03:55 -07:00
dbba747283 PAN-7 Added the loaddb task as a dependency to the integration tests 2019-02-24 15:47:51 -07:00
09cbc8c64a PAN-7 Wrote unit tests for the DefinitionController 2019-02-24 15:30:05 -07:00
f2c05fb68f PAN-7 Wrote CRUD integration test 2019-02-23 23:13:45 -07:00
207db50b15 PAN-7 fixed the loaddb.bat file for Windows 2019-02-23 20:51:41 -07:00
21ef4f27c8 PAN-7 Added project names to Sonar in the sub projects 2019-02-21 11:24:34 -07:00
1d44395e7b PAN-7 Cleaned up the gradle files 2019-02-21 11:03:33 -07:00
d8e81b1abb Revert "PAN-7 Updated the build.gradle files"
This reverts commit da673068
2019-02-19 11:00:17 -07:00
da673068bb PAN-7 Updated the build.gradle files 2019-02-17 23:17:15 -07:00
abefb397e3 PAN-7 Finished the DefinitionController 2019-02-17 22:22:05 -07:00
dffe0187df PAN-7 Added response codes to DefinitionRepository methods 2019-02-17 18:23:09 -07:00
a4dde1b216 PAN-7 Set up the findAll method in the DefinitionDTO 2019-02-17 17:42:25 -07:00
cc302f17c3 PAN-7 Initial setup of the persistence with Spring Data JPA, Hibernate, Tomcat Server, and Spring Boot 2019-02-17 16:52:31 -07:00
015c80215c Merge remote-tracking branch 'origin/master' 2019-02-14 12:30:22 -07:00
2200a6a2d3 PAN-7 Initial setup of the persistence with Spring Data JPA 2019-02-14 12:24:34 -07:00
dantanxiaotian
b142de57d5 Merge pull request #10 from atusa17/PAN-6-windows-compatibility
PAN-6 added a Windows batch file to load the DB on Windows systems.
2019-02-12 11:42:42 -07:00
04e662ecd6 PAN-6 added a Windows batch file to load the DB on Windows systems. 2019-02-12 10:59:39 -07:00
126 changed files with 5344 additions and 458 deletions
+15 -8
View File
@@ -13,13 +13,12 @@ addons:
- mysql-client - mysql-client
before_install: before_install:
- chmod +x pandamonium-theorem-prover/gradlew - chmod +x gradlew
- cd pandamonium-theorem-prover
before_script: before_script:
- mysql_upgrade --force -uroot - mysql_upgrade --force -uroot
- mysql -u root -e 'CREATE DATABASE IF NOT EXISTS pandamonium;' - mysql -u root -e 'CREATE DATABASE IF NOT EXISTS pandamonium;'
- mysql -u root -e "CREATE USER 'panda'@'localhost';" - mysql -u root -e "CREATE USER 'panda'@'localhost' IDENTIFIED BY 'secret';"
- mysql -u root -e "GRANT ALL PRIVILEGES ON *.* to 'panda'@'localhost';" - mysql -u root -e "GRANT ALL PRIVILEGES ON *.* to 'panda'@'localhost';"
- mysql -u root pandamonium < persistence/scripts/mysql/local_development.sql - mysql -u root pandamonium < persistence/scripts/mysql/local_development.sql
@@ -31,11 +30,19 @@ stages:
jobs: jobs:
include: include:
- stage: Load Database - stage: "Load Database"
script: ./gradlew loaddb script: ./gradlew loaddb
- stage: Build - stage: "Build"
script: ./gradlew build script: ./gradlew build
- stage: Unit Tests - stage: "Unit Tests"
script: ./gradlew test script: ./gradlew test
- stage: Integration Tests - stage: "Integration Tests"
script: ./gradlew integrationTest script:
- |
./gradlew :persistence:startPersistenceApi &
APP_PID=$!
- |
./gradlew integrationTest
- kill $APP_PID
- stage: "Sonar Analysis"
script: ./gradlew sonar
+53 -1
View File
@@ -1,2 +1,54 @@
# Pandamonium Theorem Prover # Pandamonium Theorem Prover
This is the main repository for the Technical Software Project This project contains several different modules for different parts of the system.
* [persistence](persistence/README.md)
* [web-server](src/README.md)
## Getting Started
1. Clone the project. `git clone git@github.com:atusa17/tsp.git`
2. Open the `pandamonium-theorem-prover` folder with IntelliJ. Use auto-import for a Gradle project.
3. Individual Components have their own README. Continue there.
## Running the Tests
This project is unit tested with JUnit and Mockito. You can run the unit tests with IntelliJ or Gradle. To run them with IntelliJ, browse to any `*Test.java` file and use IntelliJ's built-in test runner to run or debug the test. To run all the unit tests with Gradle:
* On a Linux or Macintosh machine:
```$ ./gradlew test```
* On a Windows machine:
```$ gradlew.bat test```
You can also test modules individually:
* On a Linux or Macintosh machine:
```$ ./gradlew persistence:test```
* On a Windows machine:
```$ gradlew.bat persistence:test```
## Integration Tests
To run the integration tests with IntelliJ, browse to any `*Test.java` file residing in any module name `integrationTest` and use IntelliJ's built-in test runner to run or debug the test. To run all the integration tests with Gradle:
* On a Linux or Macintosh machine:
```$ ./gradlew integrationTest```
* On a Windows machine
```$ gradlew.bat integrationTest```
## Built with
* [Spring Boot](https://projects.spring.io/spring-boot/) - Web framework
* [Spring Web Flow](https://projects.spring.io/spring-webflow/) - MVC framework
* [Gradle](https://gradle.org/) - Dependency management
* [JUnit](http://junit.org/junit4/) - Unit tests
* [Mockito](http://site.mockito.org/) - Mock objects library
* [Lombok](https://projectlombok.org/) - Boilerplate Code Generator
-1
View File
@@ -1 +0,0 @@
theme: jekyll-theme-midnight
@@ -37,6 +37,14 @@ sonarqube {
} }
allprojects { allprojects {
sonarqube {
properties {
property "sonar.host.url", "https://sonarcloud.io"
property "sonar.projectKey", "atusa17_ptp"
property "sonar.organization", "atusa17-github"
property "sonar.login", "9dcc611cd79f175459248b053b25450e36e38463"
}
}
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'jacoco' apply plugin: 'jacoco'
apply plugin: 'org.unbroken-dome.test-sets' apply plugin: 'org.unbroken-dome.test-sets'
@@ -45,6 +53,7 @@ allprojects {
} }
subprojects { subprojects {
apply plugin: 'java'
repositories { repositories {
mavenCentral() mavenCentral()
} }
@@ -56,11 +65,11 @@ subprojects {
compile "joda-time:joda-time:2.2" compile "joda-time:joda-time:2.2"
compile('org.springframework:spring-context:5.0.9.RELEASE') compile('org.springframework:spring-context:5.0.9.RELEASE')
compileOnly 'org.projectlombok:lombok:1.18.4'
testCompile group: 'junit', name: 'junit', version: '4.11' testCompile group: 'junit', name: 'junit', version: '4.11'
testCompile group: 'junit', name: 'junit', version: '4.12' testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile('org.mockito:mockito-core:1.10.19') {exclude(group: 'org.hamcrest')} testCompile('org.mockito:mockito-core:1.10.19') {exclude(group: 'org.hamcrest')}
compileOnly 'org.projectlombok:lombok:1.18.4'
} }
test { test {
@@ -90,15 +99,18 @@ repositories {
} }
dependencies { dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8" compile group: 'org.jacoco', name: 'org.jacoco.core', version: '0.8.3'
compile 'org.codehaus.groovy:groovy-all:2.3.11' compile 'org.codehaus.groovy:groovy-all:2.3.11'
compile 'org.apache.commons:commons-lang3:3.5' compile 'org.apache.commons:commons-lang3:3.5'
// The production code uses the SLF4J logging API at compile time // The production code uses the SLF4J logging API at compile time
compile 'org.slf4j:slf4j-api:1.7.21' compile 'org.slf4j:slf4j-api:1.7.22'
compile "joda-time:joda-time:2.2" compile "joda-time:joda-time:2.2"
compile("org.springframework.boot:spring-boot-starter-web") compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.0.5.RELEASE'
compile('org.springframework.boot:spring-boot-starter-web','org.apache.tomcat.embed:tomcat-embed-jasper'
,'javax.servlet:jstl')
testCompile group: 'junit', name: 'junit', version: '4.11' testCompile 'javax.el:javax.el-api:3.0.0'
testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.1.3.RELEASE'
testCompile group: 'junit', name: 'junit', version: '4.12' testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile "org.springframework:spring-test:5.0.9.RELEASE" testCompile "org.springframework:spring-test:5.0.9.RELEASE"
testCompile('org.mockito:mockito-core:1.10.19') {exclude(group: 'org.hamcrest')} testCompile('org.mockito:mockito-core:1.10.19') {exclude(group: 'org.hamcrest')}
@@ -108,6 +120,12 @@ dependencies {
apt 'org.projectlombok:lombok:1.18.4' apt 'org.projectlombok:lombok:1.18.4'
} }
project(':persistence') {
dependencies {
compile project(':utilities')
}
}
test { test {
if (System.properties['test.profile'] != 'integrationTest') { if (System.properties['test.profile'] != 'integrationTest') {
exclude '**/*integrationTest*' exclude '**/*integrationTest*'
@@ -121,14 +139,7 @@ testSets {
integrationTest integrationTest
} }
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
wrapper { wrapper {
gradleVersion = '4.10.2' gradleVersion = '5.2.1'
distributionType = Wrapper.DistributionType.ALL distributionType = Wrapper.DistributionType.ALL
} }
@@ -0,0 +1,6 @@
#Sun Feb 03 13:43:34 MST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-bin.zip
View File
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="sonarModuleSettings">
<option name="localAnalysisScripName" value="&lt;PROJECT&gt;" />
<option name="serverName" value="&lt;PROJECT&gt;" />
</component>
</module>
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="sonarModuleSettings">
<option name="localAnalysisScripName" value="&lt;PROJECT&gt;" />
<option name="serverName" value="&lt;PROJECT&gt;" />
</component>
</module>
-1
View File
@@ -1 +0,0 @@
# tsp-main
@@ -1,33 +0,0 @@
plugins {
id 'java'
}
description = 'Provides database access and connectivity'
group 'edu.msudenver.tsp'
version '1.0'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile fileTree(dir: 'lib', include: '**/*.jar')
compile 'com.mchange:c3p0:0.9.5.2'
compile 'mysql:mysql-connector-java:5.1.35'
compile 'org.hibernate:hibernate-validator:5.3.4.Final'
compile 'javax.validation:validation-api:1.1.0.Final'
compile('com.googlecode.log4jdbc:log4jdbc:1.2') {
exclude(group: 'org.slf4j')
}
testCompile 'javax.el:javax.el-api:3.0.0'
}
task loadDb(type: Exec, group: 'Verification', description: 'Reloads the local database.') {
workingDir "./scripts/mysql"
commandLine './loaddb.sh'
}
@@ -1,25 +0,0 @@
drop database if exists pandamonium;
create database pandamonium;
use pandamonium;
create table accounts (
id int not null auto_increment primary key unique,
username varchar(50) not null unique,
password varchar(256) not null,
administrator_status boolean default false,
last_login date,
version int default 1
);
insert into accounts (username, password, administrator_status)
values ('admin', 'secret', true),
('atusa', 'secret', true),
('dantanxiaotian', 'secret', true),
('BrittanyBi', 'secret', true),
('lanlanzeliu', 'secret', true),
('tramanh305', 'secret', true);
create table definitions (
id int not null auto_increment primary key unique,
name varchar(200) not null,
definition json not null,
notation json,
version int default 1
);
@@ -1,10 +0,0 @@
package edu.msudenver.tsp.persistence;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class PersistenceConfig {
}
@@ -1,28 +0,0 @@
package edu.msudenver.tsp.persistence.dao;
class BaseDao {
// <T> T findById(final int id) {
// //TODO insert DB calls for finding objects by their ID's
// }
// <T> List<T> queryForList(final String query) {
// //TODO insert DB calls for querying for lists based on the specified query
// }
// <T> T save(final T t) {
// //TODO insert DB calls here for insert and update
// }
<T> void delete(final T t) {
//TODO insert DB calls here to delete
}
// private <T> T insert(final T object) {
// // TODO insert DB calls to insert records
// }
//
// private <T> T update(final T object) {
// //TODO insert DB calls to update records
// }
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.persistence.dao;
public class DefinitionDao extends BaseDao {
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.persistence.dao;
public class NotationDao extends BaseDao {
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.persistence.dao;
public class ProofDao extends BaseDao {
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.persistence.dao;
public class TheoremDao extends BaseDao {
}
@@ -1,9 +0,0 @@
package edu.msudenver.tsp.persistence.dto;
import lombok.Data;
@Data
class BaseDto {
private String id;
private int version;
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.persistence.dto;
public class DefinitionDto extends BaseDto {
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.persistence.dto;
public class NotationDto extends BaseDto {
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.persistence.dto;
public class ProofDto extends BaseDto {
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.persistence.dto;
public class TheoremDto extends BaseDto {
}
@@ -1,11 +0,0 @@
package edu.msudenver.tsp.persistence.manager;
import edu.msudenver.tsp.persistence.dao.DefinitionDao;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@AllArgsConstructor
public class DefinitionManager {
final private DefinitionDao definitionDao;
}
@@ -1,10 +0,0 @@
package edu.msudenver.tsp.persistence.manager;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class ManagerConfig {
}
@@ -1,11 +0,0 @@
package edu.msudenver.tsp.persistence.manager;
import edu.msudenver.tsp.persistence.dao.NotationDao;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@AllArgsConstructor
public class NotationManager {
final private NotationDao notationDao;
}
@@ -1,11 +0,0 @@
package edu.msudenver.tsp.persistence.manager;
import edu.msudenver.tsp.persistence.dao.ProofDao;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@AllArgsConstructor
public class ProofManager {
final private ProofDao proofDao;
}
@@ -1,11 +0,0 @@
package edu.msudenver.tsp.persistence.manager;
import edu.msudenver.tsp.persistence.dao.TheoremDao;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@AllArgsConstructor
public class TheoremManager {
final private TheoremDao theoremDao;
}
@@ -1,11 +0,0 @@
package edu.msudenver.tsp.services.parser;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
//@PropertySource("classpath:development.properties")
public class ParserConfig {
}
@@ -1,26 +0,0 @@
package edu.msudenver.tsp.services.parser;
import edu.msudenver.tsp.persistence.manager.DefinitionManager;
import edu.msudenver.tsp.persistence.manager.NotationManager;
import edu.msudenver.tsp.persistence.manager.ProofManager;
import edu.msudenver.tsp.persistence.manager.TheoremManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
class ParserService {
private final DefinitionManager definitionManager;
private final TheoremManager theoremManager;
private final NotationManager notationManager;
private final ProofManager proofManager;
@Autowired
public ParserService(final DefinitionManager definitionManager, final TheoremManager theoremManager,
final NotationManager notationManager, final ProofManager proofManager) {
this.definitionManager = definitionManager;
this.theoremManager = theoremManager;
this.notationManager = notationManager;
this.proofManager = proofManager;
}
}
@@ -1,16 +0,0 @@
package edu.msudenver.tsp.services.scoring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
//@PropertySource("classpath:development.properties")
public class ScoringConfig {
@Bean
public TheoremScoringService theoremScoringService() {
return new TheoremScoringService();
}
}
@@ -1,8 +0,0 @@
package edu.msudenver.tsp.services.scoring;
import org.springframework.stereotype.Service;
@Service
class TheoremScoringService {
}
@@ -1,17 +0,0 @@
package edu.msudenver.tsp.services.parser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.assertEquals;
@RunWith(MockitoJUnitRunner.class)
public class ParserServiceTest {
@Test
public void test() {
assertEquals(3,3);
}
}
@@ -1,16 +0,0 @@
package edu.msudenver.tsp.services.scoring;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.assertEquals;
@RunWith(MockitoJUnitRunner.class)
public class TheoremScoringServiceTest {
@Test
public void test() {
assertEquals(3,3);
}
}
@@ -1,33 +0,0 @@
package edu.msudenver.tsp.website;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import java.util.Arrays;
@Slf4j
@SpringBootApplication
public class Application {
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(final ApplicationContext ctx) {
return args -> {
LOG.info("Beans provided by Spring Boot:");
final String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (final String beanName : beanNames) {
LOG.info(beanName);
}
};
}
}
@@ -1,13 +0,0 @@
package edu.msudenver.tsp.website;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Welcome to Project Pandamonium!";
}
}
@@ -1,4 +0,0 @@
package edu.msudenver.tsp.website;
public class ProofsDriver {
}
@@ -1,12 +0,0 @@
package edu.msudenver.tsp.website;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
//@PropertySource("classpath:development.properties")
public class WebsiteConfig {
}
@@ -1,16 +0,0 @@
<%--
Created by IntelliJ IDEA.
User: atusa
Date: 2/1/19
Time: 8:03 PM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
$END$
</body>
</html>
@@ -1,13 +0,0 @@
package edu.msudenver.tsp.website;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class HelloControllerTest {
@Test
public void test() {
assertEquals(3, 3);
}
}
@@ -1,5 +0,0 @@
package edu.msudenver.tsp.website;
public class ProofsDriverTest {
}
@@ -1,15 +0,0 @@
package edu.msudenver.tsp.website.integrationTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.assertEquals;
@RunWith(SpringJUnit4ClassRunner.class)
public class HelloControllerIntegrationTest {
@Test
public void test() {
assertEquals(3,3);
}
}
@@ -1,17 +0,0 @@
plugins {
id 'java'
}
group 'edu.msudenver.tsp'
version '1.0'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile fileTree(dir: 'lib', include: '**/*.jar')
}
+61
View File
@@ -0,0 +1,61 @@
## PTP Persistence API
The PTP Persistence API is the web API for accessing the theorems database.
<http://localhost:8090/>
## Running from IntelliJ
* Create a new run configuration in IntelliJ.
```
Name: "PTP Persistence API Tomcat"
Application Server: Tomcat (8.5.12)
HTTP Port: 8090
JMX Port: 1090
Deployment tabe: Deploy persistence-api.war (exploded)
```
## Running the Tests
This project is unit tested with JUnit and Mockito. You can run the unit tests with IntelliJ or Gradle. To run them with IntelliJ, browse to any `*Test.java` file and use IntelliJ's built-in test runner to run or debug the test. To run all the unit tests with Gradle:
* On a Linux or Macintosh machine:
```$ ./gradlew test```
* On a Windows machine:
```$ gradlew.bat test```
You can also test modules individually:
* On a Linux or Macintosh machine:
```$ ./gradlew persistence:test```
* On a Windows machine:
```$ gradlew.bat persistence:test```
## Integration Tests
To run the integration tests with IntelliJ, browse to any `*Test.java` file residing in any module name `integrationTest` and use IntelliJ's built-in test runner to run or debug the test. To run all the integration tests with Gradle:
* On a Linux or Macintosh machine:
```$ ./gradlew integrationTest```
* On a Windows machine
```$ gradlew.bat integrationTest```
## Built with
* [Spring Boot](https://projects.spring.io/spring-boot/) - Web framework
* [Spring Web Flow](https://projects.spring.io/spring-webflow/) - MVC framework
* [Spring Data](https://spring.io/projects/spring-data/) - Persistence framework
* [Gradle](https://gradle.org/) - Dependency management
* [JUnit](http://junit.org/junit4/) - Unit tests
* [Mockito](http://site.mockito.org/) - Mock objects library
* [Lombok](https://projectlombok.org/) - Boilerplate Code Generator
* [Hibernate ORM](http://hibernate.org/orm/) - Object/Relational Mapping
+60
View File
@@ -0,0 +1,60 @@
import org.gradle.internal.os.OperatingSystem
plugins {
id 'java'
}
description = 'Provides database access and connectivity'
group 'edu.msudenver.tsp'
version '1.0'
sourceCompatibility = 1.8
sonarqube {
properties {
property "sonar.projectName", 'Pandamonium Persistence Tier'
}
}
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.springframework.data', name: 'spring-data-jpa', version: '2.0.5.RELEASE'
compile group: 'org.apache.tomcat', name: 'tomcat-jdbc', version: '9.0.16'
compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '2.0.5.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.0.5.RELEASE'
compile group: 'org.springframework', name: 'spring-aspects', version: '5.1.5.RELEASE'
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.4.1.Final'
compile group: 'com.vladmihalcea', name: 'hibernate-types-52', version: '2.4.1'
compile fileTree(dir: 'lib', include: '**/*.jar')
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'
compile('com.googlecode.log4jdbc:log4jdbc:1.2') {
exclude(group: 'org.slf4j')
}
testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.1.2.RELEASE'
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile 'javax.el:javax.el-api:3.0.0'
}
task loadDb(type: Exec, group: 'Verification', description: 'Reloads the local database.') {
if (OperatingSystem.current().isLinux() || OperatingSystem.current().isMacOsX()) {
workingDir "./scripts/mysql"
commandLine './loaddb.sh'
} else {
workingDir "./scripts/mysql"
commandLine=['cmd','/c','loaddb.bat']
}
}
task startPersistenceApi(type: JavaExec, description: 'Starts the Persistence API') {
dependsOn 'loadDb'
dependsOn 'build'
classpath = files('build/libs/persistence-1.0.jar')
classpath += sourceSets.main.runtimeClasspath
main = 'edu.msudenver.tsp.persistence.PersistenceApi'
}
+5
View File
@@ -0,0 +1,5 @@
set mysql_pwd = secret
FOR /R %%s IN (*.sql) do (
echo **** %%s ****
mysql -u panda -psecret < %%s
)
@@ -1,8 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
export MYSQL_PWD=secret
for sqlScript in $( find . -name "*.sql" -print | sort); for sqlScript in $( find . -name "*.sql" -print | sort);
do do
echo "**** $sqlScript ****" echo "**** $sqlScript ****"
mysql --batch --quick --raw --line-numbers --force --user=panda < $sqlScript mysql -u panda -psecret < $sqlScript
done done
@@ -0,0 +1,50 @@
drop database if exists pandamonium;
create database pandamonium;
use pandamonium;
create table accounts (
id int not null auto_increment primary key unique,
username varchar(50) not null unique,
password varchar(256) not null,
administrator boolean default false,
last_login date,
version int default 1
);
insert into accounts (username, password, administrator)
values ('admin', 'secret', true),
('atusa', 'secret', true),
('dantanxiaotian', 'secret', true),
('BrittanyBi', 'secret', true),
('lanlanzeliu', 'secret', true),
('tramanh305', 'secret', true);
create table definitions (
id int not null auto_increment primary key unique,
name varchar(200) not null,
definition json not null,
notation json,
version int default 1
);
create table theorems (
id int not null auto_increment primary key unique,
name varchar(512) not null,
theorem varchar(1024) not null,
theorem_type varchar(20) not null,
branch varchar(512) not null,
referenced_definitions json,
referenced_theorems json,
proven_status boolean default false,
version int default 1
);
create table proofs
(
id int not null auto_increment,
theorem_name varchar(512) not null,
proof varchar(4096) not null,
branch varchar(512) not null,
theorem int not null,
referenced_definitions json,
referenced_theorems json,
date_added date,
last_updated date,
version int default 1,
primary key (id)
);
@@ -0,0 +1,57 @@
package edu.msudenver.tsp.persistence;
import edu.msudenver.tsp.persistence.dto.Account;
import edu.msudenver.tsp.persistence.repository.AccountsRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Optional;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = PersistenceTestConfig.class)
public class AccountsIntegrationTest {
@Autowired private AccountsRepository accountsRepository;
@Test
public void testCRUDFunctionality() {
final Account account = createAccount();
final Account savedAccount = accountsRepository.save(account);
assertNotNull(savedAccount);
assertEquals(Integer.valueOf(0), savedAccount.getVersion());
final int id = savedAccount.getId();
assertEquals("Test username", savedAccount.getUsername());
assertEquals("test password", savedAccount.getPassword());
assertTrue(savedAccount.isAdministrator());
savedAccount.setPassword("Test Update");
final Account updatedAccount = accountsRepository.save(savedAccount);
assertEquals("Test username", savedAccount.getUsername());
assertEquals("Test Update", savedAccount.getPassword());
assertTrue(savedAccount.isAdministrator());
assertEquals(updatedAccount.getId(), id);
accountsRepository.delete(account);
final Optional<Account> deletedAccount = accountsRepository.findById(id);
assertFalse(deletedAccount.isPresent());
}
private Account createAccount() {
final Account account = new Account();
account.setUsername("Test username");
account.setPassword("test password");
account.setAdministrator(true);
return account;
}
}
@@ -0,0 +1,83 @@
package edu.msudenver.tsp.persistence;
import edu.msudenver.tsp.persistence.dto.Definition;
import edu.msudenver.tsp.persistence.repository.DefinitionRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = PersistenceTestConfig.class)
public class DefinitionsIntegrationTest {
@Autowired private DefinitionRepository definitionRepository;
@Test
public void testCRUDFunctionality() {
final Definition definition = createDefinition();
final Definition savedDefinition = definitionRepository.save(definition);
assertNotNull(savedDefinition);
assertEquals(Integer.valueOf(0), savedDefinition.getVersion());
final int id = savedDefinition.getId();
assertEquals("Test Name", savedDefinition.getName());
assertNotNull(savedDefinition.getDefinition());
assertNotNull(savedDefinition.getNotation());
final List<String> definitionsList = savedDefinition.getDefinition();
final List<String> notationList = savedDefinition.getNotation();
assertEquals(2, definitionsList.size());
assertEquals(1, notationList.size());
assertEquals("Test definition 1", definitionsList.get(0));
assertEquals("Test definition 2", definitionsList.get(1));
assertEquals("\\testLaTeX", notationList.get(0));
savedDefinition.setName("Test Update");
final Definition updatedDefinition = definitionRepository.save(savedDefinition);
assertEquals("Test Update", updatedDefinition.getName());
assertNotNull(updatedDefinition.getDefinition());
assertNotNull(updatedDefinition.getNotation());
final List<String> updatedDefinitionsList = updatedDefinition.getDefinition();
final List<String> updatedNotationsList = updatedDefinition.getNotation();
assertEquals(2, updatedDefinitionsList.size());
assertEquals(1, updatedNotationsList.size());
assertEquals("Test definition 1", updatedDefinitionsList.get(0));
assertEquals("Test definition 2", updatedDefinitionsList.get(1));
assertEquals("\\testLaTeX", updatedNotationsList.get(0));
assertEquals(id, updatedDefinition.getId());
definitionRepository.delete(updatedDefinition);
final Optional<Definition> deletedDefinition = definitionRepository.findById(id);
assertFalse(deletedDefinition.isPresent());
}
private Definition createDefinition() {
final List<String> definitionList = new ArrayList<>();
definitionList.add("Test definition 1");
definitionList.add("Test definition 2");
final List<String> notationList = new ArrayList<>();
notationList.add("\\testLaTeX");
final Definition definition = new Definition();
definition.setName("Test Name");
definition.setDefinition(definitionList);
definition.setNotation(notationList);
return definition;
}
}
@@ -0,0 +1,93 @@
package edu.msudenver.tsp.persistence;
import org.hibernate.SessionFactory;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBuilder;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
@EnableJpaRepositories
@EnableJpaAuditing
@EntityScan(basePackages = "edu.msudenver.tsp.persistence")
public class PersistenceTestConfig {
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter());
entityManagerFactoryBean.setDataSource(getDataSource());
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
entityManagerFactoryBean.setPackagesToScan("edu.msudenver.tsp.persistence");
entityManagerFactoryBean.setJpaProperties(additionalProperties());
return entityManagerFactoryBean;
}
@Bean
public JpaTransactionManager jpaTransactionManager() {
final JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return jpaTransactionManager;
}
private HibernateJpaVendorAdapter vendorAdapter() {
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(true);
return vendorAdapter;
}
@Bean(name = "dataSource")
public DataSource getDataSource(){
return DataSourceBuilder
.create()
.username("panda")
.password("secret")
.url("jdbc:mysql://127.0.0.1:3306/pandamonium?autoReconnect=true&useSSL=false&serverTimezone=UTC")
.driverClassName("com.mysql.cj.jdbc.Driver")
.build();
}
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(final DataSource dataSource) {
final LocalSessionFactoryBuilder sessionFactoryBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionFactoryBuilder.scanPackages("edu.msudenver.tsp.persistence.dto");
return sessionFactoryBuilder.buildSessionFactory();
}
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(final SessionFactory sessionFactory) {
return new HibernateTransactionManager(sessionFactory);
}
@Bean
public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
final DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
return initializer;
}
private Properties additionalProperties() {
final Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "update");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
properties.setProperty("spring.jpa.show-sql", "true");
properties.setProperty("spring.datasource.tomcat.max-active", "1");
properties.setProperty("hibernate.id.new_generator_mappings","false");
return properties;
}
}
@@ -0,0 +1,92 @@
package edu.msudenver.tsp.persistence;
import edu.msudenver.tsp.persistence.dto.Proof;
import edu.msudenver.tsp.persistence.repository.ProofRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = PersistenceTestConfig.class)
public class ProofsIntegrationTest {
@Autowired private ProofRepository proofRepository;
@Test
public void testCRUDFunctionality() {
final Proof proof = createProof();
final Proof savedProof = proofRepository.save(proof);
assertNotNull(savedProof);
assertEquals(Integer.valueOf(0), savedProof.getVersion());
final int id = savedProof.getId();
assertEquals("Test proof", savedProof.getTheoremName());
assertEquals("Test branch", savedProof.getBranch());
assertEquals("test", savedProof.getProof());
assertEquals(Integer.valueOf(1), savedProof.getTheorem());
assertNotNull(savedProof.getDateCreated());
assertNotNull(savedProof.getLastUpdated());
assertEquals(2, savedProof.getReferencedTheorems().size());
assertEquals(2, savedProof.getReferencedDefinitions().size());
assertEquals("test theorem 1", savedProof.getReferencedTheorems().get(0));
assertEquals("test theorem 2", savedProof.getReferencedTheorems().get(1));
assertEquals("test definition 1", savedProof.getReferencedDefinitions().get(0));
assertEquals("test definition 2", savedProof.getReferencedDefinitions().get(1));
savedProof.setBranch("Test Update");
final Proof updatedProof = proofRepository.save(savedProof);
assertNotNull(updatedProof);
assertEquals(Integer.valueOf(0), updatedProof.getVersion());
assertEquals("Test proof", updatedProof.getTheoremName());
assertEquals("Test Update", updatedProof.getBranch());
assertEquals("test", updatedProof.getProof());
assertEquals(Integer.valueOf(1), savedProof.getTheorem());
assertNotNull(updatedProof.getLastUpdated());
assertNotNull(updatedProof.getDateCreated());
assertNotEquals(updatedProof.getDateCreated().toInstant(), updatedProof.getLastUpdated().toInstant());
assertEquals(2, updatedProof.getReferencedTheorems().size());
assertEquals(2, updatedProof.getReferencedDefinitions().size());
assertEquals("test theorem 1", updatedProof.getReferencedTheorems().get(0));
assertEquals("test theorem 2", updatedProof.getReferencedTheorems().get(1));
assertEquals("test definition 1", updatedProof.getReferencedDefinitions().get(0));
assertEquals("test definition 2", updatedProof.getReferencedDefinitions().get(1));
assertEquals(updatedProof.getId(), id);
proofRepository.delete(proof);
final Optional<Proof> deletedProof = proofRepository.findById(id);
assertFalse(deletedProof.isPresent());
}
private Proof createProof() {
final List<String> referencedTheoremsList = new ArrayList<>();
referencedTheoremsList.add("test theorem 1");
referencedTheoremsList.add("test theorem 2");
final List<String> referencedDefinitionsList = new ArrayList<>();
referencedDefinitionsList.add("test definition 1");
referencedDefinitionsList.add("test definition 2");
final Proof proof = new Proof();
proof.setTheoremName("Test proof");
proof.setProof("test");
proof.setTheorem(1);
proof.setBranch("Test branch");
proof.setDateCreated(new Date());
proof.setReferencedTheorems(referencedTheoremsList);
proof.setReferencedDefinitions(referencedDefinitionsList);
return proof;
}
}
@@ -0,0 +1,87 @@
package edu.msudenver.tsp.persistence;
import edu.msudenver.tsp.persistence.dto.Theorem;
import edu.msudenver.tsp.persistence.dto.TheoremType;
import edu.msudenver.tsp.persistence.repository.TheoremRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = PersistenceTestConfig.class)
public class TheoremsIntegrationTest {
@Autowired private TheoremRepository theoremRepository;
@Test
public void testCRUDFunctionality() {
final Theorem theorem = createTheorem();
final Theorem savedTheorem = theoremRepository.save(theorem);
assertNotNull(savedTheorem);
assertEquals(Integer.valueOf(0), savedTheorem.getVersion());
final int id = savedTheorem.getId();
assertEquals("Test theorem", savedTheorem.getName());
assertEquals("Test branch", savedTheorem.getBranch());
assertEquals("test", savedTheorem.getTheorem());
assertTrue(savedTheorem.getProvenStatus());
assertEquals(2, savedTheorem.getReferencedTheorems().size());
assertEquals(2, savedTheorem.getReferencedDefinitions().size());
assertEquals("test theorem 1", savedTheorem.getReferencedTheorems().get(0));
assertEquals("test theorem 2", savedTheorem.getReferencedTheorems().get(1));
assertEquals("test definition 1", savedTheorem.getReferencedDefinitions().get(0));
assertEquals("test definition 2", savedTheorem.getReferencedDefinitions().get(1));
savedTheorem.setBranch("Test Update");
final Theorem updatedTheorem = theoremRepository.save(savedTheorem);
assertNotNull(updatedTheorem);
assertEquals(Integer.valueOf(0), updatedTheorem.getVersion());
assertEquals("Test theorem", updatedTheorem.getName());
assertEquals("Test Update", updatedTheorem.getBranch());
assertEquals("test", updatedTheorem.getTheorem());
assertTrue(updatedTheorem.getProvenStatus());
assertEquals(2, updatedTheorem.getReferencedTheorems().size());
assertEquals(2, updatedTheorem.getReferencedDefinitions().size());
assertEquals("test theorem 1", updatedTheorem.getReferencedTheorems().get(0));
assertEquals("test theorem 2", updatedTheorem.getReferencedTheorems().get(1));
assertEquals("test definition 1", updatedTheorem.getReferencedDefinitions().get(0));
assertEquals("test definition 2", updatedTheorem.getReferencedDefinitions().get(1));
assertEquals(updatedTheorem.getId(), id);
theoremRepository.delete(theorem);
final Optional<Theorem> deletedTheorem = theoremRepository.findById(id);
assertFalse(deletedTheorem.isPresent());
}
private Theorem createTheorem() {
final List<String> referencedTheoremsList = new ArrayList<>();
referencedTheoremsList.add("test theorem 1");
referencedTheoremsList.add("test theorem 2");
final List<String> referencedDefinitionsList = new ArrayList<>();
referencedDefinitionsList.add("test definition 1");
referencedDefinitionsList.add("test definition 2");
final Theorem theorem = new Theorem();
theorem.setName("Test theorem");
theorem.setTheorem("test");
theorem.setBranch("Test branch");
theorem.setProvenStatus(true);
theorem.setTheoremType(TheoremType.THEOREM);
theorem.setReferencedTheorems(referencedTheoremsList);
theorem.setReferencedDefinitions(referencedDefinitionsList);
return theorem;
}
}
@@ -0,0 +1,110 @@
package edu.msudenver.tsp.persistence;
import org.hibernate.SessionFactory;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBuilder;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import javax.sql.DataSource;
import java.util.Properties;
@SpringBootApplication
@EnableJpaRepositories
@EnableJpaAuditing
@EntityScan
public class PersistenceApi {
@Value("${spring.datasource.username}") private String username;
@Value("${spring.datasource.password}") private String password;
@Value("${spring.jpa.hibernate.ddl-auto}") private String hibernateTablePolicy;
@Value("${spring.datasource.url}") private String databaseUrl;
@Value("${spring.jpa.properties.hibernate.dialect}") private String hibernateDialect;
@Value("${spring.jpa.show-sql}") private String showSql;
@Value("${spring.datasource.driver-class-name}") private String driverClassName;
@Value("${spring.datasource.tomcat.max-active}") private String tomcatPoolMaxActive;
public static void main(final String[] args) {
SpringApplication.run(PersistenceApi.class, args);
}
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setJpaVendorAdapter(vendorAdapter());
em.setDataSource(getDataSource());
em.setPersistenceProviderClass(HibernatePersistenceProvider.class);
em.setPackagesToScan("edu.msudenver.tsp.persistence");
em.setJpaProperties(additionalProperties());
return em;
}
@Bean
public JpaTransactionManager jpaTransactionManager() {
final JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return jpaTransactionManager;
}
private HibernateJpaVendorAdapter vendorAdapter() {
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(true);
return vendorAdapter;
}
@Bean(name = "dataSource")
public DataSource getDataSource(){
return DataSourceBuilder
.create()
.username(username)
.password(password)
.url(databaseUrl)
.driverClassName(driverClassName)
.build();
}
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(final DataSource dataSource) {
final LocalSessionFactoryBuilder sessionFactoryBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionFactoryBuilder.scanPackages("edu.msudenver.tsp.persistence.dto");
return sessionFactoryBuilder.buildSessionFactory();
}
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(final SessionFactory sessionFactory) {
return new HibernateTransactionManager(sessionFactory);
}
@Bean
public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
final DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
return initializer;
}
Properties additionalProperties() {
final Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "update");
properties.setProperty("hibernate.dialect", hibernateDialect);
properties.setProperty("spring.jpa.show-sql", showSql);
properties.setProperty("spring.datasource.tomcat.max-active", tomcatPoolMaxActive);
properties.setProperty("hibernate.id.new_generator_mappings","false");
return properties;
}
}
@@ -0,0 +1,232 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.dto.Account;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import edu.msudenver.tsp.persistence.repository.AccountsRepository;
import edu.msudenver.tsp.utilities.PersistenceUtilities;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StopWatch;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/accounts")
@Validated
public class AccountController {
private final AccountsRepository accountsRepository;
@GetMapping({"","/"})
public @ResponseBody
ResponseEntity<Iterable<Account>> getListOfAccounts() {
LOG.info("Received request to list all accounts");
LOG.debug("Querying for list of accounts");
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Account> listOfAccounts = (List<Account>) accountsRepository.findAll();
stopWatch.stop();
LOG.debug("Successfully completed query. Query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all accounts with size of {}", listOfAccounts.size());
return new ResponseEntity<>(listOfAccounts, HttpStatus.OK);
}
@GetMapping("/id")
public @ResponseBody
ResponseEntity<Account> getAccountById(@RequestParam("id") final Integer id) throws BadRequestException {
LOG.info("Received request to query for account with id {}", id);
if (id == null) {
LOG.error("ERROR: ID was null");
throw new BadRequestException("ERROR: ID cannot be null");
}
LOG.debug("Querying for account with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Account> account = accountsRepository.findById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return account.map(accountDto -> {
LOG.info("Returning account with id {}", id);
return new ResponseEntity<>(accountDto, HttpStatus.OK);
}).orElseGet(
() -> {
LOG.warn("No account was found with id {}", id);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
);
}
@GetMapping("/username")
public @ResponseBody
ResponseEntity<Account> getAccountByUsername(@RequestParam("username") final String username) throws BadRequestException {
LOG.info("Received request to query for account with username {}", username);
if (username == null) {
LOG.error("ERROR: username was null");
throw new BadRequestException("ERROR: Username cannot be null");
}
LOG.debug("Querying for account with username {}", username);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Account> account = accountsRepository.findByUsername(username);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return account.map(accountDto -> {
LOG.info("Returning account with username {}", username);
return new ResponseEntity<>(accountDto, HttpStatus.OK);
}).orElseGet(
() -> {
LOG.warn("No account was found with username {}", username);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
);
}
@PostMapping({"","/"})
@Validated({Account.Insert.class, Default.class})
public @ResponseBody ResponseEntity<Account> insertAccount(
@Valid @RequestBody final Account account, final BindingResult bindingResult)
throws UnprocessableEntityException, BadRequestException {
LOG.info("Received request to insert a new account");
if (bindingResult.hasErrors()) {
LOG.error("Binding result is unprocessable");
throw new UnprocessableEntityException(bindingResult.getAllErrors().toString());
}
if (account == null) {
LOG.error("Passed account is unprocessable");
throw new BadRequestException("Passed account is unprocessable");
}
LOG.info("Checking for any existing users with username {}", account.getUsername());
final Instant start = Instant.now();
LOG.debug("Querying for existing accounts");
final Optional<Account> existingAccount = accountsRepository.findByUsername(account.getUsername());
LOG.debug("Received response from the server: query took {} ms", Duration.between(start, Instant.now()).toMillis());
if (existingAccount.isPresent()) {
LOG.warn("An account already exists with username {}", account.getUsername());
return new ResponseEntity<>(HttpStatus.CONFLICT);
}
LOG.debug("Saving new account");
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Account savedAccount = accountsRepository.save(account);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning the newly created account");
return new ResponseEntity<>(savedAccount, HttpStatus.CREATED);
}
@PatchMapping("/{id}")
public @ResponseBody ResponseEntity<Account> updateAccount(
@PathVariable("id") final Integer id,
@RequestBody final Account account, final BindingResult bindingResult)
throws UnprocessableEntityException, BadRequestException {
LOG.info("Received request to update an account");
if (bindingResult.hasErrors()) {
LOG.error("Binding result is unprocessable");
throw new UnprocessableEntityException(bindingResult.getAllErrors().toString());
}
if (account == null) {
LOG.error("Passed entity is null");
throw new BadRequestException("Passed account is null");
}
if (id == null) {
LOG.error("Account ID must be specified");
throw new BadRequestException("Account ID must be specified");
}
LOG.debug("Checking for existence of account with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Account> existingAccount = accountsRepository.findById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
if (!existingAccount.isPresent()) {
LOG.error("No account associated with id {}", id);
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
PersistenceUtilities.copyNonNullProperties(account, existingAccount.get());
existingAccount.get().setVersion(existingAccount.get().getVersion()+ 1);
LOG.info("Updating account with id {}", id);
LOG.debug("Querying for account with id {}", id);
stopWatch.start();
final Account updatedAccount = accountsRepository.save(existingAccount.get());
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return new ResponseEntity<>(updatedAccount, HttpStatus.OK);
}
@DeleteMapping("/{id}")
public @ResponseBody ResponseEntity<Void> deleteAccountById(@PathVariable("id") final Integer id) throws BadRequestException {
LOG.info("Received request to delete account with id {}", id);
if (id == null) {
LOG.error("Specified Id is null");
throw new BadRequestException("Specified ID is null");
}
LOG.debug("Deleting account with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
accountsRepository.deleteById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
@@ -0,0 +1,186 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.dto.Definition;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import edu.msudenver.tsp.persistence.repository.DefinitionRepository;
import edu.msudenver.tsp.utilities.PersistenceUtilities;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StopWatch;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import java.util.Optional;
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping(path = "/definitions")
@Validated
public class DefinitionController {
private final DefinitionRepository definitionRepository;
@GetMapping({"","/"})
public @ResponseBody
ResponseEntity<Iterable<Definition>> getAllDefinitions() {
LOG.info("Received request to list all definitions");
LOG.debug("Querying for list of all definitions");
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Definition> listOfDefinitions = definitionRepository.findAll();
stopWatch.stop();
LOG.debug("Successfully completed query. Query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all definition with size {}", listOfDefinitions.size());
return new ResponseEntity<>(listOfDefinitions, HttpStatus.OK);
}
@GetMapping("/{id}")
public @ResponseBody
ResponseEntity<Definition> getDefinitionById(@PathVariable("id") final Integer id)
throws BadRequestException {
LOG.info("Received request to query for definition with id {}", id);
if (id == null) {
LOG.error("ERROR: ID cannot be null");
throw new BadRequestException("ERROR: ID cannot be null");
}
LOG.debug("Querying for definition with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Definition> definition = definitionRepository.findById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return definition.map(definitionDto -> {
LOG.info("Returning definition with id {}", id);
return new ResponseEntity<>(definitionDto, HttpStatus.OK);
}).orElseGet(
() -> {
LOG.warn("No definition was found with id {}",id);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
});
}
@PostMapping({"","/"})
@Validated({Definition.Insert.class, Default.class})
public @ResponseBody ResponseEntity<Definition> insertDefinition(
@Valid @RequestBody final Definition definition,
final BindingResult bindingResult)
throws UnprocessableEntityException, BadRequestException {
LOG.info("Received request to insert a new definition");
if (bindingResult.hasErrors()) {
LOG.error("Binding result is unprocessable");
throw new UnprocessableEntityException(bindingResult.getAllErrors().toString());
}
if (definition == null) {
LOG.error("Passed entity is null");
throw new BadRequestException("Passed definition is be null");
}
LOG.debug("Saving new definition");
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Definition savedDefinition = definitionRepository.save(definition);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning the newly created definition with id {}", savedDefinition.getId());
return new ResponseEntity<>(savedDefinition, HttpStatus.CREATED);
}
@PatchMapping("/{id}")
public @ResponseBody ResponseEntity<Definition> updateDefinition(
@PathVariable("id") final Integer id,
@RequestBody final Definition definition, final BindingResult bindingResult) throws UnprocessableEntityException, BadRequestException {
LOG.info("Received request to update an account");
if (bindingResult.hasErrors()) {
LOG.error("Binding result is unprocessable");
throw new UnprocessableEntityException(bindingResult.getAllErrors().toString());
}
if (definition == null) {
LOG.error("Passed entity is null");
throw new BadRequestException("Passed definition is null");
}
if (id == null) {
LOG.error("Definition ID must be specified");
throw new BadRequestException("Definition ID must be specified");
}
LOG.debug("Checking for existence of definition with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Definition> existingDefinition = definitionRepository.findById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
if (!existingDefinition.isPresent()) {
LOG.error("No definition associated with id {}", id);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
PersistenceUtilities.copyNonNullProperties(definition, existingDefinition.get());
existingDefinition.get().setVersion(existingDefinition.get().getVersion()+ 1);
LOG.info("Updating definition with id {}", id);
LOG.debug("Querying for definition with id {}", id);
stopWatch.start();
final Definition updatedDefinition = definitionRepository.save(existingDefinition.get());
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return new ResponseEntity<>(updatedDefinition, HttpStatus.OK);
}
@DeleteMapping("/{id}")
public @ResponseBody ResponseEntity<Void> deleteDefinitionById(@PathVariable("id") final Integer id) throws BadRequestException {
LOG.info("Received request to delete definition with id {}", id);
if (id == null) {
LOG.error("Specified id is null");
throw new BadRequestException("Specified ID is null");
}
LOG.debug("Deleting definition with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
definitionRepository.deleteById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
@@ -0,0 +1,74 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ValidationException;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@RestControllerAdvice
public class ExceptionHandlingController {
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handleMessageNotReadableException(final HttpServletRequest request, final HttpMessageNotReadableException e) {
LOG.error("Unable to bind post data sent to: {} \nCaught Exception: {}", request.getRequestURI(), e.getMessage());
}
@ExceptionHandler(ValidationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleMessageInvalidRequest(final HttpServletRequest request, final ValidationException e) {
LOG.error("Request did not validate. Experienced the following error: {}", e.getMessage());
return "Request did not evaluate. Experienced the following error: " + e.getMessage();
}
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
public void handleHttpRequestMethodNotSupported(final HttpServletRequest request) {
LOG.error("Unsupported request method ({}) for URL: {}", request.getMethod(), request.getRequestURI());
}
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
@ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
public void handleHttpMediaTypeNotSupportedException(final HttpServletRequest request, final HttpMediaTypeNotSupportedException e) {
LOG.error("Unsupported media type ({}) for URL: {}", e.getContentType(), request.getRequestURI());
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handleException(final HttpServletRequest request, final Exception e) {
LOG.error("Exception caught for URL: {}", request.getRequestURI(), e);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public List<String> handleMethodArgumentNotValidException(final MethodArgumentNotValidException e) {
LOG.error("Request did not evaluate. Experienced the following error: {}", e.getMessage());
return e.getBindingResult().getFieldErrors().stream().map(x -> x.getField() + " " + x.getDefaultMessage()).collect(Collectors.toList());
}
@ExceptionHandler(BadRequestException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public List<String> handleBadRequestException(final BadRequestException e) {
return e.getErrors();
}
@ExceptionHandler(UnprocessableEntityException.class)
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
public List<String> handleUnprocessableEntityException(final UnprocessableEntityException e) {
return Collections.singletonList("Request did not evaluate. Experienced the following error: " + e.getMessage());
}
}
@@ -0,0 +1,256 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.dto.Proof;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import edu.msudenver.tsp.persistence.repository.ProofRepository;
import edu.msudenver.tsp.utilities.PersistenceUtilities;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StopWatch;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import java.util.Optional;
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/proofs")
public class ProofController {
private final ProofRepository proofRepository;
@GetMapping({"","/"})
public @ResponseBody
ResponseEntity<Iterable<Proof>> getAllProofs() {
LOG.info("Received request to list all theorems");
LOG.debug("Querying for list of all theorems");
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Proof> listOfProofs = proofRepository.findAll();
stopWatch.stop();
LOG.debug("Successfully completed query. Query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all theorems with size {}", listOfProofs.size());
return new ResponseEntity<>(listOfProofs, HttpStatus.OK);
}
@GetMapping("/id")
public @ResponseBody
ResponseEntity<Proof> getProofById(@RequestParam("id") final Integer id) throws BadRequestException {
LOG.info("Received request to query for proof with id {}", id);
if (id == null) {
LOG.error("ERROR: ID was null");
throw new BadRequestException("Specified ID is null");
}
LOG.debug("Querying for proof with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Proof> proof = proofRepository.findById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return proof.map(proofDto -> {
LOG.info("Returning proof with id {}", id);
return new ResponseEntity<>(proofDto, HttpStatus.OK);
}).orElseGet(
() -> {
LOG.warn("No proof was found with id {}", id);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
});
}
@GetMapping("/branch")
public @ResponseBody
ResponseEntity<List<Proof>> getAllProofsByBranch(@RequestParam("branch") String branch)
throws BadRequestException {
LOG.info("Received request to query for proofs related to the {} branch of mathematics", branch);
if (branch == null) {
LOG.error("ERROR: branch was null");
throw new BadRequestException("Specified branch is null");
}
if (branch.contains("_") || branch.contains("-")) {
branch = branch.replace("_"," ");
branch = branch.replace("-", " ");
}
LOG.debug("Querying for proofs with branch {}", branch);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Proof> listOfProofs = proofRepository.findByBranch(branch);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all proofs with size {}", listOfProofs.size());
if (listOfProofs.isEmpty()) {
LOG.warn("No proofs were found for branch {}", branch);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
LOG.info("Returning list of proofs with branch {}", branch);
return new ResponseEntity<>(listOfProofs, HttpStatus.OK);
}
@GetMapping("/theorem_name")
public @ResponseBody
ResponseEntity<List<Proof>> getAllProofsByTheoremName(@RequestParam("theorem_name") String theoremName)
throws BadRequestException {
LOG.info("Received request to query for proofs of the theorem {}", theoremName);
if (theoremName == null) {
LOG.error("ERROR: theorem name was null");
throw new BadRequestException("Specified theorem name is null");
}
if (theoremName.contains("_") || theoremName.contains("-")) {
theoremName = theoremName.replace("_"," ");
theoremName = theoremName.replace("-", " ");
}
LOG.debug("Querying for proofs of the theorem {}", theoremName);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Proof> listOfProofs = proofRepository.findByTheoremName(theoremName);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all proofs with size {}", listOfProofs.size());
if (listOfProofs.isEmpty()) {
LOG.warn("No proofs were found of the theorem {}", theoremName);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
LOG.info("Returning list of proofs for the theorem {}", theoremName);
return new ResponseEntity<>(listOfProofs, HttpStatus.OK);
}
@PostMapping({"","/"})
@Validated({Proof.Insert.class, Default.class})
public @ResponseBody ResponseEntity<Proof> insertProof(
@Valid @RequestBody final Proof proof,
final BindingResult bindingResult) throws UnprocessableEntityException, BadRequestException {
LOG.info("Received request to insert a new proof");
if (bindingResult.hasErrors()) {
LOG.error("Binding result is unprocessable");
throw new UnprocessableEntityException(bindingResult.getAllErrors().toString());
}
if (proof == null) {
LOG.error("Passed entity is null");
throw new BadRequestException("Passed proof is null");
}
LOG.debug("Saving new proof");
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Proof savedProof = proofRepository.save(proof);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning the newly created proof with id {}", savedProof.getId());
return new ResponseEntity<>(savedProof, HttpStatus.CREATED);
}
@PatchMapping("/{id}")
public @ResponseBody ResponseEntity<Proof> updateProof(
@PathVariable("id") final Integer id,
@RequestBody final Proof proof, final BindingResult bindingResult)
throws UnprocessableEntityException, BadRequestException {
LOG.info("Received request to update a proof");
if (bindingResult.hasErrors()) {
LOG.error("Binding result is unprocessable");
throw new UnprocessableEntityException(bindingResult.getAllErrors().toString());
}
if (proof == null) {
LOG.error("Passed entity is null");
throw new BadRequestException("Passed proof is null");
}
if (id == null) {
LOG.error("Proof ID must be specified");
throw new BadRequestException("Specified ID is null");
}
LOG.debug("Checking for existence of proof with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Proof> existingProof = proofRepository.findById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
if (!existingProof.isPresent()) {
LOG.error("No proof associated with id {}", id);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
PersistenceUtilities.copyNonNullProperties(proof, existingProof.get());
existingProof.get().setVersion(existingProof.get().getVersion()+ 1);
LOG.info("Updating proof with id {}", id);
LOG.debug("Querying for proof with ID {}", id);
stopWatch.start();
final Proof updatedProof = proofRepository.save(existingProof.get());
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return new ResponseEntity<>(updatedProof, HttpStatus.OK);
}
@DeleteMapping("/{id}")
public @ResponseBody ResponseEntity<Void> deleteProofById(@PathVariable("id") final Integer id) throws BadRequestException {
LOG.info("Received request to delete proof with id {}", id);
if (id == null) {
LOG.error("Specified id is null");
throw new BadRequestException("Specified ID is null");
}
LOG.debug("Deleting proof with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
proofRepository.deleteById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
@@ -0,0 +1,285 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.dto.Theorem;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import edu.msudenver.tsp.persistence.repository.TheoremRepository;
import edu.msudenver.tsp.utilities.PersistenceUtilities;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StopWatch;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import java.util.Optional;
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping(path = "/theorems")
public class TheoremController {
private final TheoremRepository theoremRepository;
@GetMapping({"","/"})
public @ResponseBody
ResponseEntity<Iterable<Theorem>> getAllTheorems() {
LOG.info("Received request to list all theorems");
LOG.debug("Querying for list of all theorems");
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Theorem> listOfTheorems = theoremRepository.findAll();
stopWatch.stop();
LOG.debug("Successfully completed query. Query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all theorems with size {}", listOfTheorems.size());
return new ResponseEntity<>(listOfTheorems, HttpStatus.OK);
}
@GetMapping("/branch")
public @ResponseBody
ResponseEntity<List<Theorem>> getAllTheoremsByBranch(@RequestParam("branch") String branch) throws BadRequestException {
LOG.info("Received request to query for theorems related to the {} branch of mathematics", branch);
if (branch == null) {
LOG.error("ERROR: branch was null");
throw new BadRequestException("Specified branch is null");
}
if (branch.contains("_") || branch.contains("-")) {
branch = branch.replace("_", " ");
branch = branch.replace("-", " ");
}
LOG.debug("Querying for theorems with branch {}", branch);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Theorem> listOfTheorems = theoremRepository.findByBranch(branch);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all theorems with size {}", listOfTheorems.size());
if (listOfTheorems.isEmpty()) {
LOG.warn("No theorems were found for branch {}", branch);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
LOG.info("Returning list of theorems with branch {}", branch);
return new ResponseEntity<>(listOfTheorems, HttpStatus.OK);
}
@GetMapping("/proven_status")
public @ResponseBody
ResponseEntity<List<Theorem>> getAllTheoremsByProvenStatus(@RequestParam("proven_status") final String provenStatus) throws BadRequestException {
LOG.info("Received request to query for theorems whose proven status is {}", provenStatus);
if (provenStatus == null) {
LOG.error("ERROR: status was null");
throw new BadRequestException("Specified status is null");
}
final Boolean isProven = Boolean.parseBoolean(provenStatus);
LOG.debug("Querying for theorems with proven status {}", isProven);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Theorem> listOfTheorems = theoremRepository.findByProvenStatus(isProven);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all theorems with size {}", listOfTheorems.size());
if (listOfTheorems.isEmpty()) {
LOG.warn("No theorems were found for proven status {}", isProven);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
LOG.info("Returning list of theorems with proven status {}", isProven);
return new ResponseEntity<>(listOfTheorems, HttpStatus.OK);
}
@GetMapping("/name")
public @ResponseBody
ResponseEntity<List<Theorem>> getAllTheoremsByName(@RequestParam("name") String name) throws BadRequestException {
LOG.info("Received request to query for theorems whose name is {}", name);
if (name == null) {
LOG.error("ERROR: name was null");
throw new BadRequestException("Specified name is null");
}
if (name.contains("_") || name.contains("-")) {
name = name.replace("_", " ");
name = name.replace("-", " ");
}
LOG.debug("Querying for theorems with name {}", name);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final List<Theorem> listOfTheorems = theoremRepository.findByName(name);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning list of all theorems with size {}", listOfTheorems.size());
if (listOfTheorems.isEmpty()) {
LOG.warn("No theorems were found with name {}", name);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
LOG.info("Returning list of theorems with name {}", name);
return new ResponseEntity<>(listOfTheorems, HttpStatus.OK);
}
@GetMapping("/id")
public @ResponseBody
ResponseEntity<Theorem> getTheoremById(@RequestParam("id") final Integer id) throws BadRequestException {
LOG.info("Received request to query for theorem with id {}", id);
if (id == null) {
LOG.error("ERROR: ID was null");
throw new BadRequestException("Specified ID is null");
}
LOG.debug("Querying for theorem with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Theorem> theorem = theoremRepository.findById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return theorem.map(theoremDto -> {
LOG.info("Returning theorem with id {}", id);
return new ResponseEntity<>(theoremDto, HttpStatus.OK);
}).orElseGet(
() -> {
LOG.warn("No theorem was found with id {}", id);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
});
}
@PostMapping({"","/"})
@Validated({Theorem.Insert.class, Default.class})
public @ResponseBody ResponseEntity<Theorem> insertTheorem(
@Valid @RequestBody final Theorem theorem,
final BindingResult bindingResult) throws UnprocessableEntityException, BadRequestException {
LOG.info("Received request to insert a new theorem");
if (bindingResult.hasErrors()) {
LOG.error("Binding result is unprocessable");
throw new UnprocessableEntityException(bindingResult.getAllErrors().toString());
}
if (theorem == null) {
LOG.error("Passed entity is null");
throw new BadRequestException("Passed theorem is null");
}
LOG.debug("Saving new theorem");
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Theorem savedTheorem = theoremRepository.save(theorem);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
LOG.info("Returning the newly created theorem with id {}", savedTheorem.getId());
return new ResponseEntity<>(savedTheorem, HttpStatus.CREATED);
}
@PatchMapping("/{id}")
public @ResponseBody ResponseEntity<Theorem> updateTheorem(
@PathVariable("id") final Integer id,
@RequestBody final Theorem theorem, final BindingResult bindingResult) throws UnprocessableEntityException, BadRequestException {
LOG.info("Received request to update a theorem");
if (bindingResult.hasErrors()) {
LOG.error("Binding result is unprocessable");
throw new UnprocessableEntityException(bindingResult.getAllErrors().toString());
}
if (theorem == null) {
LOG.error("Passed entity is null");
throw new BadRequestException("Passed theorem is null");
}
if (id == null) {
LOG.error("Theorem ID must be specified");
throw new BadRequestException("Specified ID is null");
}
LOG.debug("Checking for existence of theorem with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
final Optional<Theorem> existingTheorem = theoremRepository.findById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
if (!existingTheorem.isPresent()) {
LOG.error("No theorem associated with id {}", id);
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
PersistenceUtilities.copyNonNullProperties(theorem, existingTheorem.get());
existingTheorem.get().setVersion(existingTheorem.get().getVersion()+ 1);
LOG.info("Updating theorem with id {}", id);
LOG.debug("Querying for theorem with id {}", id);
stopWatch.start();
final Theorem updatedTheorem = theoremRepository.save(existingTheorem.get());
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return new ResponseEntity<>(updatedTheorem, HttpStatus.OK);
}
@DeleteMapping("/{id}")
public @ResponseBody ResponseEntity<Void> deleteTheoremById(@PathVariable("id") final Integer id) throws BadRequestException {
LOG.info("Received request to delete theorem with id {}", id);
if (id == null) {
LOG.error("Specified id is null");
throw new BadRequestException("Specified ID is null");
}
LOG.debug("Deleting theorem with id {}", id);
final StopWatch stopWatch = new StopWatch();
stopWatch.start();
theoremRepository.deleteById(id);
stopWatch.stop();
LOG.debug("Received response from server: query took {}ms to complete", stopWatch.getTotalTimeMillis());
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
@@ -0,0 +1,43 @@
package edu.msudenver.tsp.persistence.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;
@Entity(name = "accounts")
@EntityListeners(AuditingEntityListener.class)
@Data
@EqualsAndHashCode(callSuper = true)
public class Account extends BaseDto implements Serializable {
@NotBlank(groups = Insert.class, message = "A username must be specified") @Size(max = 50) private String username;
@NotBlank(groups = Insert.class, message = "A password must be specified") @Size(max = 256) private String password;
@NotNull private boolean administrator;
@Temporal(TemporalType.DATE) @Column(name = "last_login") private Date lastLogin;
private static final long serialVersionUID = 7095627971593953734L;
@JsonProperty("last_login")
public Date getLastLogin() {
return lastLogin;
}
@JsonProperty("last_login")
public void setLastLogin(final Date lastLogin) {
this.lastLogin = lastLogin;
}
public interface Insert {}
@PrePersist
public void prePersist() {
lastLogin = new Date();
}
}
@@ -0,0 +1,40 @@
package edu.msudenver.tsp.persistence.dto;
import com.vladmihalcea.hibernate.type.array.IntArrayType;
import com.vladmihalcea.hibernate.type.array.StringArrayType;
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
import com.vladmihalcea.hibernate.type.json.JsonNodeBinaryType;
import com.vladmihalcea.hibernate.type.json.JsonNodeStringType;
import com.vladmihalcea.hibernate.type.json.JsonStringType;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import javax.persistence.*;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@MappedSuperclass
@TypeDefs({
@TypeDef(name = "string-array", typeClass = StringArrayType.class),
@TypeDef(name = "int-array", typeClass = IntArrayType.class),
@TypeDef(name = "json", typeClass = JsonStringType.class),
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class),
@TypeDef(name = "jsonb-node", typeClass = JsonNodeBinaryType.class),
@TypeDef(name = "json-node", typeClass = JsonNodeStringType.class),
})
public class BaseDto implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Version
private Integer version;
private static final long serialVersionUID = -1686252381978213945L;
}
@@ -0,0 +1,36 @@
package edu.msudenver.tsp.persistence.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
@Entity(name = "definitions")
@Table(name = "definitions")
@EntityListeners(AuditingEntityListener.class)
@Data
@EqualsAndHashCode(callSuper = true)
public class Definition extends BaseDto implements Serializable {
@NotBlank(groups = Insert.class, message = "A name must be specified")
@Size(min = 1, max = 200, message = "Must be between 1 and 200 characters")
private String name;
@NotNull(groups = Insert.class, message = "At least one (1) definition must be specified")
@Type(type = "json") @Column(columnDefinition = "jsonb") private List<String> definition;
@Type(type = "json") @Column(columnDefinition = "jsonb") private List<String> notation;
private static final long serialVersionUID = -5314619286352932857L;
public interface Insert {}
}
@@ -0,0 +1,97 @@
package edu.msudenver.tsp.persistence.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Entity(name = "proofs")
@EntityListeners(AuditingEntityListener.class)
@Data
@EqualsAndHashCode(callSuper = true)
public class Proof extends BaseDto implements Serializable {
@NotBlank(groups = Insert.class)
@Size(min = 1, max = 512, message = "The name must be at least 1 character and at most 512 characters")
@Column(name = "theorem_name")
private String theoremName;
@NotNull(groups = Insert.class)
@Size(min = 1, max = 4096, message = "The proof must be at least 1 character and at most 4096 characters")
private String proof;
@NotNull(groups = Insert.class)
private Integer theorem;
@NotBlank(groups = Insert.class)
@Size(min = 1, max = 512, message = "The branch must be at least 1 character and at most 512 characters")
private String branch;
@Type(type = "json") @Column(name = "referenced_definitions", columnDefinition = "jsonb") private List<String> referencedDefinitions;
@Type(type = "json") @Column(name = "referenced_theorems", columnDefinition = "jsonb") private List<String> referencedTheorems;
@Temporal(TemporalType.DATE) @Column(name = "date_created") private Date dateCreated;
@Temporal(TemporalType.DATE) @Column(name = "last_updated") private Date lastUpdated;
@JsonProperty("theorem_name")
public String getTheoremName() {
return theoremName;
}
@JsonProperty("theorem_name")
public void setTheoremName(final String theoremName) {
this.theoremName = theoremName;
}
@JsonProperty("referenced_definitions")
public List<String> getReferencedDefinitions() {
return referencedDefinitions;
}
@JsonProperty("referenced_definitions")
public void setReferencedDefinitions(final List<String> referencedDefinitions) {
this.referencedDefinitions = referencedDefinitions;
}
@JsonProperty("referenced_theorems")
public List<String> getReferencedTheorems() {
return referencedTheorems;
}
@JsonProperty("referenced_theorems")
public void setReferencedTheorems(final List<String> referencedTheorems) {
this.referencedTheorems = referencedTheorems;
}
@JsonProperty("date_created")
public Date getDateCreated() {
return dateCreated;
}
@JsonProperty("date_created")
public void setDateCreated(final Date dateCreated) {
this.dateCreated = dateCreated;
}
@JsonProperty("last_updated")
public Date getLastUpdated() {
return lastUpdated;
}
@JsonProperty("last_updated")
public void setLastUpdated(final Date lastUpdated) {
this.lastUpdated = lastUpdated;
}
@PrePersist
public void prePersist() {
lastUpdated = new Date();
}
private static final long serialVersionUID = -7731220940349760402L;
public interface Insert {}
}
@@ -0,0 +1,75 @@
package edu.msudenver.tsp.persistence.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
@Entity(name = "theorems")
@EntityListeners(AuditingEntityListener.class)
@Data
@EqualsAndHashCode(callSuper = true)
public class Theorem extends BaseDto implements Serializable {
@NotBlank(groups = Insert.class) @Size(min = 1, max = 512, message = "theorem name must be between 1 and 512 characters") private String name;
@NotNull(groups = Insert.class) @Size(min = 1, max = 1024, message = "theorem must be between 1 and 1024 characters") private String theorem;
@NotNull(groups = Insert.class) @Column(name = "theorem_type") private TheoremType theoremType;
@NotNull(groups = Insert.class, message = "a branch of mathematics that this theorem is associated with must be specified") private String branch;
@Type(type = "json") @Column(name = "referenced_definitions", columnDefinition = "jsonb") private List<String> referencedDefinitions;
@Type(type = "json") @Column(name = "referenced_theorems", columnDefinition = "jsonb") private List<String> referencedTheorems;
@NotNull(groups = Insert.class) @Column(name = "proven_status") private boolean provenStatus;
@JsonProperty("theorem_type")
public TheoremType getTheoremType() {
return theoremType;
}
@JsonProperty("theorem_type")
public void setTheoremType(final TheoremType theoremType) {
this.theoremType = theoremType;
}
@JsonProperty("referenced_definitions")
public List<String> getReferencedDefinitions() {
return referencedDefinitions;
}
@JsonProperty("referenced_definitions")
public void setReferencedDefinitions(final List<String> referencedDefinitions) {
this.referencedDefinitions = referencedDefinitions;
}
@JsonProperty("referenced_theorems")
public List<String> getReferencedTheorems() {
return referencedTheorems;
}
@JsonProperty("referenced_theorems")
public void setReferencedTheorems(final List<String> referencedTheorems) {
this.referencedTheorems = referencedTheorems;
}
@JsonProperty("proven_status")
public boolean getProvenStatus() {
return provenStatus;
}
@JsonProperty("proven_status")
public void setProvenStatus(final boolean provenStatus) {
this.provenStatus = provenStatus;
}
private static final long serialVersionUID = 1545568391140364425L;
public interface Insert {}
}
@@ -0,0 +1,5 @@
package edu.msudenver.tsp.persistence.dto;
public enum TheoremType {
THEOREM, PROPOSITION, LEMMA, COROLLARY
}
@@ -0,0 +1,20 @@
package edu.msudenver.tsp.persistence.exception;
import lombok.Getter;
import java.util.Collections;
import java.util.List;
public class BadRequestException extends Exception {
@Getter private final List<String> errors;
public BadRequestException(final String message) {
super(message);
errors = Collections.singletonList(message);
}
public BadRequestException(final List<String> errorMessages) {
super(String.join(" ", errorMessages));
errors = errorMessages;
}
}
@@ -0,0 +1,21 @@
package edu.msudenver.tsp.persistence.exception;
import lombok.Getter;
import java.util.Collections;
import java.util.List;
public class UnprocessableEntityException extends Exception {
@Getter
private final List<String> errors;
public UnprocessableEntityException(final String message) {
super(message);
errors = Collections.singletonList(message);
}
public UnprocessableEntityException(final List<String> errorMessages) {
super(String.join(" ", errorMessages));
errors = errorMessages;
}
}
@@ -0,0 +1,12 @@
package edu.msudenver.tsp.persistence.repository;
import edu.msudenver.tsp.persistence.dto.Account;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface AccountsRepository extends CrudRepository<Account, Integer> {
Optional<Account> findByUsername(String username);
}
@@ -0,0 +1,11 @@
package edu.msudenver.tsp.persistence.repository;
import edu.msudenver.tsp.persistence.dto.Definition;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface DefinitionRepository extends JpaRepository<Definition, Integer> {
}
@@ -0,0 +1,15 @@
package edu.msudenver.tsp.persistence.repository;
import edu.msudenver.tsp.persistence.dto.Proof;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ProofRepository extends JpaRepository<Proof, Integer> {
List<Proof> findByBranch(String branch);
List<Proof> findByTheoremName(String name);
}
@@ -0,0 +1,17 @@
package edu.msudenver.tsp.persistence.repository;
import edu.msudenver.tsp.persistence.dto.Theorem;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TheoremRepository extends JpaRepository<Theorem, Integer> {
List<Theorem> findByBranch(String branch);
List<Theorem> findByProvenStatus(Boolean provenStatus);
List<Theorem> findByName(String name);
}
@@ -0,0 +1,13 @@
spring.jpa.hibernate.ddl-auto = none
spring.jpa.database=mysql
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/pandamonium?autoReconnect=true&useSSL=false&serverTimezone=UTC
spring.datasource.username=panda
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql = true
spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.validation-query=SELECT 1
logging.level.org.springframework.web=DEBUG
spring.datasource.tomcat.max-active=5
server.port=8090
@@ -0,0 +1,241 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.dto.Account;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import edu.msudenver.tsp.persistence.repository.AccountsRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
@WebMvcTest(controllers = AccountController.class)
public class AccountControllerTest {
@Mock private AccountsRepository accountsRepository;
@InjectMocks private AccountController accountController;
@Mock private BindingResult bindingResult;
@Test
public void testGetAllAccounts() {
final Account accountDto = createAccount();
final List<Account> accountList = new ArrayList<>();
accountList.add(accountDto);
accountList.add(accountDto);
when(accountsRepository.findAll()).thenReturn(accountList);
final ResponseEntity<Iterable<Account>> responseEntity = accountController.getListOfAccounts();
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(account -> assertEquals(accountDto, account));
}
@Test
public void testGetAccountById() throws BadRequestException {
final Account account = createAccount();
when(accountsRepository.findById(anyInt())).thenReturn(Optional.ofNullable(account));
final ResponseEntity<Account> responseEntity = accountController.getAccountById(1);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(account, responseEntity.getBody());
verify(accountsRepository).findById(anyInt());
}
@Test(expected = BadRequestException.class)
public void testGetAccountById_nullId() throws BadRequestException {
accountController.getAccountById(null);
}
@Test
public void testGetAccountById_noAccountFound() throws BadRequestException {
when(accountsRepository.findById(anyInt())).thenReturn(Optional.empty());
final ResponseEntity responseEntity = accountController.getAccountById(1);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
verify(accountsRepository).findById(anyInt());
}
@Test
public void testGetAccountByUsername() throws BadRequestException {
final Account account = createAccount();
when(accountsRepository.findByUsername(anyString())).thenReturn(Optional.ofNullable(account));
final ResponseEntity<Account> responseEntity = accountController.getAccountByUsername("Test username");
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(account, responseEntity.getBody());
verify(accountsRepository).findByUsername(anyString());
}
@Test(expected = BadRequestException.class)
public void testGetAccountById_nullUsername() throws BadRequestException {
accountController.getAccountByUsername(null);
}
@Test
public void testGetAccountByUsername_noAccountFound() throws BadRequestException {
when(accountsRepository.findByUsername(anyString())).thenReturn(Optional.empty());
final ResponseEntity responseEntity = accountController.getAccountByUsername("Test username");
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
verify(accountsRepository).findByUsername(anyString());
}
@Test
public void testInsertAccount() throws UnprocessableEntityException, BadRequestException {
final Account account = createAccount();
when(accountsRepository.save(any(Account.class))).thenReturn(account);
when(accountsRepository.findByUsername(anyString())).thenReturn(Optional.empty());
final ResponseEntity<Account> responseEntity = accountController.insertAccount(account, bindingResult);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
assertEquals(account, responseEntity.getBody());
verify(accountsRepository).save(any(Account.class));
}
@Test
public void testInsertAccount_usernameAlreadyExists() throws UnprocessableEntityException, BadRequestException {
final Account account = createAccount();
when(accountsRepository.findByUsername(anyString())).thenReturn(Optional.of(account));
final ResponseEntity<Account> responseEntity = accountController.insertAccount(account, bindingResult);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.CONFLICT, responseEntity.getStatusCode());
verify(accountsRepository).findByUsername(anyString());
verify(accountsRepository, times(0)).save(any(Account.class));
}
@Test(expected = BadRequestException.class)
public void testInsertAccount_accountsDtoIsNull() throws UnprocessableEntityException, BadRequestException {
final ResponseEntity responseEntity = accountController.insertAccount(null, bindingResult);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode());
verifyZeroInteractions(accountsRepository);
}
@Test(expected = UnprocessableEntityException.class)
public void testInsertAccount_bindingResultHasErrors() throws UnprocessableEntityException, BadRequestException {
final Account account = createAccount();
when(bindingResult.hasErrors()).thenReturn(true);
accountController.insertAccount(account, bindingResult);
}
@Test
public void testUpdateAccount() throws UnprocessableEntityException, BadRequestException {
final Account existingAccount = createAccount();
existingAccount.setId(1);
existingAccount.setVersion(1);
final Account accountUpdate = new Account();
accountUpdate.setUsername("Test Update");
final Account updatedAccount = existingAccount;
updatedAccount.setUsername("Test Update");
when(accountsRepository.findById(anyInt())).thenReturn(Optional.of(existingAccount));
when(accountsRepository.save(any(Account.class))).thenReturn(updatedAccount);
final ResponseEntity<Account> responseEntity = accountController.updateAccount(1, accountUpdate, bindingResult);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(updatedAccount, responseEntity.getBody());
verify(accountsRepository).findById(anyInt());
verify(accountsRepository).save(any(Account.class));
}
@Test(expected = UnprocessableEntityException.class)
public void testUpdateAccount_bindingResultHasErrors() throws UnprocessableEntityException, BadRequestException {
when(bindingResult.hasErrors()).thenReturn(true);
accountController.updateAccount(1, createAccount(), bindingResult);
}
@Test(expected = BadRequestException.class)
public void testUpdateAccount_accountsDtoIsNull() throws UnprocessableEntityException, BadRequestException {
accountController.updateAccount(1, null, bindingResult);
}
@Test(expected = BadRequestException.class)
public void testUpdateAccount_idIsNull() throws UnprocessableEntityException, BadRequestException {
accountController.updateAccount(null, createAccount(), bindingResult);
}
@Test
public void testUpdateAccount_accountDoesNotExist() throws UnprocessableEntityException, BadRequestException {
when(accountsRepository.findById(anyInt())).thenReturn(Optional.empty());
final ResponseEntity<Account> responseEntity = accountController.updateAccount(1, createAccount(), bindingResult);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode());
verify(accountsRepository, times(0)).save(any(Account.class));
}
@Test
public void testDeleteAccountById() throws BadRequestException {
doNothing().when(accountsRepository).deleteById(anyInt());
final ResponseEntity responseEntity = accountController.deleteAccountById(1);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
verify(accountsRepository).deleteById(anyInt());
}
@Test(expected = BadRequestException.class)
public void testDeleteAccountById_idIsNull() throws BadRequestException {
accountController.deleteAccountById(null);
}
private Account createAccount() {
final Account account = new Account();
account.setUsername("Test username");
account.setPassword("test password");
account.setAdministrator(true);
return account;
}
}
@@ -0,0 +1,194 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.dto.Definition;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import edu.msudenver.tsp.persistence.repository.DefinitionRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.*;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
@WebMvcTest(controllers = DefinitionController.class)
public class DefinitionControllerTest {
@Mock private DefinitionRepository definitionRepository;
@InjectMocks private DefinitionController definitionController;
@Mock private BindingResult bindingResult;
@Test
public void testGetAllDefinitions() {
final Definition definitionDto = createDefinition();
final List<Definition> definitionList = new ArrayList<>();
definitionList.add(definitionDto);
definitionList.add(definitionDto);
when(definitionRepository.findAll()).thenReturn(definitionList);
final ResponseEntity<Iterable<Definition>> responseEntity = definitionController.getAllDefinitions();
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(definition -> assertEquals(definitionDto, definition));
}
@Test
public void testGetDefinitionsById() throws BadRequestException {
final Definition definition = createDefinition();
when(definitionRepository.findById(anyInt())).thenReturn(Optional.ofNullable(definition));
final ResponseEntity<Definition> responseEntity = definitionController.getDefinitionById(1);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(definition, responseEntity.getBody());
verify(definitionRepository).findById(anyInt());
}
@Test(expected = BadRequestException.class)
public void testGetDefinitionById_nullId() throws BadRequestException {
definitionController.getDefinitionById(null);
}
@Test
public void testGetDefinitionById_noDefinitionFound() throws BadRequestException {
when(definitionRepository.findById(anyInt())).thenReturn(Optional.empty());
final ResponseEntity responseEntity = definitionController.getDefinitionById(1);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
verify(definitionRepository).findById(anyInt());
}
@Test
public void testInsertDefinition() throws BadRequestException, UnprocessableEntityException {
final Definition definition = createDefinition();
when(definitionRepository.save(any(Definition.class))).thenReturn(definition);
final ResponseEntity<Definition> responseEntity = definitionController.insertDefinition(definition, bindingResult);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
assertEquals(definition, responseEntity.getBody());
verify(definitionRepository).save(any(Definition.class));
}
@Test(expected = BadRequestException.class)
public void testInsertDefinition_definitionDtoIsNull() throws BadRequestException, UnprocessableEntityException {
definitionController.insertDefinition(null, bindingResult);
}
@Test(expected = UnprocessableEntityException.class)
public void testInsertDefinition_bindingResultHasErrors() throws BadRequestException, UnprocessableEntityException {
final Definition definition = createDefinition();
when(bindingResult.hasErrors()).thenReturn(true);
definitionController.insertDefinition(definition, bindingResult);
}
@Test
public void testUpdateDefinition() throws BadRequestException, UnprocessableEntityException {
final Definition existingDefinition = createDefinition();
existingDefinition.setId(1);
existingDefinition.setVersion(1);
final Definition definitionUpdate = new Definition();
definitionUpdate.setName("Test Update");
final Definition updatedDefinition = existingDefinition;
updatedDefinition.setName("Test Update");
when(definitionRepository.findById(anyInt())).thenReturn(Optional.of(existingDefinition));
when(definitionRepository.save(any(Definition.class))).thenReturn(updatedDefinition);
final ResponseEntity<Definition> responseEntity = definitionController.updateDefinition(1, definitionUpdate, bindingResult);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(updatedDefinition, responseEntity.getBody());
verify(definitionRepository).findById(anyInt());
verify(definitionRepository).save(any(Definition.class));
}
@Test(expected = UnprocessableEntityException.class)
public void testUpdateDefinition_bindingResultErrors() throws BadRequestException, UnprocessableEntityException {
when(bindingResult.hasErrors()).thenReturn(true);
definitionController.updateDefinition(1, createDefinition(), bindingResult);
}
@Test(expected = BadRequestException.class)
public void testUpdateDefinition_definitionDtoIsNull() throws BadRequestException, UnprocessableEntityException {
definitionController.updateDefinition(1, null, bindingResult);
}
@Test(expected = BadRequestException.class)
public void testUpdateDefinition_idIsNull() throws BadRequestException, UnprocessableEntityException {
definitionController.updateDefinition(null, createDefinition(), bindingResult);
}
@Test
public void testUpdateDefinition_definitionDoesntExist() throws BadRequestException, UnprocessableEntityException {
when(definitionRepository.findById(anyInt())).thenReturn(Optional.empty());
final ResponseEntity<Definition> responseEntity = definitionController.updateDefinition(1, createDefinition(), bindingResult);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
verify(definitionRepository, times(0)).save(any(Definition.class));
}
@Test
public void testDeleteDefinitionById() throws BadRequestException {
doNothing().when(definitionRepository).deleteById(anyInt());
final ResponseEntity responseEntity = definitionController.deleteDefinitionById(1);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
verify(definitionRepository).deleteById(anyInt());
}
@Test(expected = BadRequestException.class)
public void testDeleteDefinitionById_nullId() throws BadRequestException {
definitionController.deleteDefinitionById(null);
}
private Definition createDefinition() {
final List<String> definitionList = new ArrayList<>();
definitionList.add("Test definition 1");
final List<String> notationList = new ArrayList<>();
notationList.add("\\testLaTeX");
final Definition definition = new Definition();
definition.setName("Test Name");
definition.setDefinition(definitionList);
definition.setNotation(notationList);
return definition;
}
}
@@ -0,0 +1,54 @@
package edu.msudenver.tsp.persistence.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Matchers.any;
@RunWith(MockitoJUnitRunner.class)
public class ExceptionHandlingControllerTest {
@Mock
ExceptionHandlingController exceptionHandlingController;
@Test
public void testHandleMessageNotReadableException() {
exceptionHandlingController.handleMessageNotReadableException(any(), any());
}
@Test
public void testHandleMessageInvalidRequestException() {
exceptionHandlingController.handleMessageInvalidRequest(any(), any());
}
@Test
public void testHandleHttpRequestMethodNotSupportedException() {
exceptionHandlingController.handleHttpRequestMethodNotSupported(any());
}
@Test
public void testHandleHttpMediaTypeNotSupportedException() {
exceptionHandlingController.handleHttpMediaTypeNotSupportedException(any(), any());
}
@Test
public void testHandleException() {
exceptionHandlingController.handleException(any(), any());
}
@Test
public void testHandleMethodArgumentNotValidException() {
exceptionHandlingController.handleMethodArgumentNotValidException(any());
}
@Test
public void testHandleBadRequestException() {
exceptionHandlingController.handleBadRequestException(any());
}
@Test
public void testHandleUnprocessableEntityException() {
exceptionHandlingController.handleUnprocessableEntityException(any());
}
}
@@ -0,0 +1,267 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.dto.Proof;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import edu.msudenver.tsp.persistence.repository.ProofRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import java.util.*;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.*;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ProofControllerTest {
@Mock private ProofRepository proofRepository;
@InjectMocks private ProofController proofController;
@Mock private BindingResult bindingResult;
@Test
public void testGetAllProofs() {
final Proof proofDto = createProof();
final List<Proof> listOfProofs = new ArrayList<>();
listOfProofs.add(proofDto);
listOfProofs.add(proofDto);
when(proofRepository.findAll()).thenReturn(listOfProofs);
final ResponseEntity<Iterable<Proof>> responseEntity = proofController.getAllProofs();
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(proof -> assertEquals(proofDto, proof));
}
@Test
public void testGetAllProofsByBranch() throws BadRequestException {
final Proof proofDto = createProof();
final List<Proof> listOfProofs = new ArrayList<>();
listOfProofs.add(proofDto);
listOfProofs.add(proofDto);
when(proofRepository.findByBranch(anyString())).thenReturn(listOfProofs);
final ResponseEntity<List<Proof>> responseEntity = proofController.getAllProofsByBranch("Test_branch");
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(proof -> assertEquals(proofDto, proof));
}
@Test(expected = BadRequestException.class)
public void testGetAllProfsByBranch_nullBranch() throws BadRequestException {
proofController.getAllProofsByBranch(null);
}
@Test
public void testGetAllProofsByBranch_noProofsFound() throws BadRequestException {
when(proofRepository.findByBranch(anyString())).thenReturn(Collections.emptyList());
final ResponseEntity<List<Proof>> responseEntity = proofController.getAllProofsByBranch("test-nonexistent-branch");
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
}
@Test
public void testGetAllProofsByTheoremName() throws BadRequestException {
final Proof proofDto = createProof();
final List<Proof> listOfProofs = new ArrayList<>();
listOfProofs.add(proofDto);
listOfProofs.add(proofDto);
when(proofRepository.findByTheoremName(anyString())).thenReturn(listOfProofs);
final ResponseEntity<List<Proof>> responseEntity = proofController.getAllProofsByTheoremName("Test_proof");
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(proof -> assertEquals(proofDto, proof));
}
@Test(expected = BadRequestException.class)
public void testGetAllProofsByTheoremName_nullTheoremName() throws BadRequestException {
proofController.getAllProofsByTheoremName(null);
}
@Test
public void testGetAllProofsByTheoremName_noProofsFound() throws BadRequestException {
when(proofRepository.findByTheoremName(anyString())).thenReturn(Collections.emptyList());
final ResponseEntity<List<Proof>> responseEntity = proofController.getAllProofsByTheoremName("test-nonexistent-proof");
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
}
@Test
public void testGetProofById() throws BadRequestException {
final Proof proof = createProof();
when(proofRepository.findById(anyInt())).thenReturn(Optional.ofNullable(proof));
final ResponseEntity<Proof> responseEntity = proofController.getProofById(1);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(proof, responseEntity.getBody());
verify(proofRepository).findById(anyInt());
}
@Test(expected = BadRequestException.class)
public void testGetProofById_nullId() throws BadRequestException {
proofController.getProofById(null);
}
@Test
public void testGetProofById_noProofFound() throws BadRequestException {
when(proofRepository.findById(anyInt())).thenReturn(Optional.empty());
final ResponseEntity responseEntity = proofController.getProofById(1);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
verify(proofRepository).findById(anyInt());
}
@Test
public void testInsertProof() throws BadRequestException, UnprocessableEntityException {
final Proof proof = createProof();
when(proofRepository.save(any(Proof.class))).thenReturn(proof);
final ResponseEntity<Proof> responseEntity = proofController.insertProof(proof, bindingResult);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
assertEquals(proof, responseEntity.getBody());
verify(proofRepository).save(any(Proof.class));
}
@Test(expected = BadRequestException.class)
public void testInsertProof_proofDtoIsNull() throws BadRequestException, UnprocessableEntityException {
proofController.insertProof(null, bindingResult);
}
@Test(expected = UnprocessableEntityException.class)
public void testInsertProof_bindingResultHasErrors() throws BadRequestException, UnprocessableEntityException {
final Proof proof = createProof();
when(bindingResult.hasErrors()).thenReturn(true);
proofController.insertProof(proof, bindingResult);
}
@Test
public void testUpdateProof() throws BadRequestException, UnprocessableEntityException {
final Proof existingProof = createProof();
existingProof.setId(1);
existingProof.setVersion(1);
final Proof proofUpdate = new Proof();
proofUpdate.setTheoremName("Test Update");
final Proof updatedProof = existingProof;
updatedProof.setTheoremName("Test Update");
when(proofRepository.findById(anyInt())).thenReturn(Optional.of(existingProof));
when(proofRepository.save(any(Proof.class))).thenReturn(updatedProof);
final ResponseEntity<Proof> responseEntity = proofController.updateProof(1, proofUpdate, bindingResult);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(updatedProof, responseEntity.getBody());
verify(proofRepository).findById(anyInt());
verify(proofRepository).save(any(Proof.class));
}
@Test(expected = UnprocessableEntityException.class)
public void testUpdateProof_bindingResultHasErrors() throws BadRequestException, UnprocessableEntityException {
when(bindingResult.hasErrors()).thenReturn(true);
proofController.updateProof(1, createProof(), bindingResult);
}
@Test(expected = BadRequestException.class)
public void testUpdateProof_proofDtoIsNull() throws BadRequestException, UnprocessableEntityException {
proofController.updateProof(1, null, bindingResult);
}
@Test(expected = BadRequestException.class)
public void testUpdateProof_idIsNull() throws BadRequestException, UnprocessableEntityException {
proofController.updateProof(null, createProof(), bindingResult);
}
@Test
public void testUpdateProof_theoremDoesNotExist() throws BadRequestException, UnprocessableEntityException {
when(proofRepository.findById(anyInt())).thenReturn(Optional.empty());
final ResponseEntity<Proof> responseEntity = proofController.updateProof(1, createProof(), bindingResult);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
verify(proofRepository, times(0)).save(any(Proof.class));
}
@Test
public void testDeleteProofById() throws BadRequestException {
doNothing().when(proofRepository).deleteById(anyInt());
final ResponseEntity responseEntity = proofController.deleteProofById(1);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
verify(proofRepository).deleteById(anyInt());
}
@Test(expected = BadRequestException.class)
public void testDeleteProofById_idIsNull() throws BadRequestException {
proofController.deleteProofById(null);
}
private Proof createProof() {
final List<String> referencedTheoremsList = new ArrayList<>();
referencedTheoremsList.add("test theorem 1");
referencedTheoremsList.add("test theorem 2");
final List<String> referencedDefinitionsList = new ArrayList<>();
referencedDefinitionsList.add("test definition 1");
referencedDefinitionsList.add("test definition 2");
final Proof proof = new Proof();
proof.setTheoremName("Test proof");
proof.setTheorem(1);
proof.setBranch("Test branch");
proof.setProof("test proof");
proof.setDateCreated(new Date());
proof.setReferencedTheorems(referencedTheoremsList);
proof.setReferencedDefinitions(referencedDefinitionsList);
return proof;
}
}
@@ -0,0 +1,316 @@
package edu.msudenver.tsp.persistence.controller;
import edu.msudenver.tsp.persistence.dto.Theorem;
import edu.msudenver.tsp.persistence.dto.TheoremType;
import edu.msudenver.tsp.persistence.exception.BadRequestException;
import edu.msudenver.tsp.persistence.exception.UnprocessableEntityException;
import edu.msudenver.tsp.persistence.repository.TheoremRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.*;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
@WebMvcTest(controllers = TheoremController.class)
public class TheoremControllerTest {
@Mock private TheoremRepository theoremRepository;
@InjectMocks private TheoremController theoremController;
@Mock private BindingResult bindingResult;
@Test
public void testGetAllTheorems() {
final Theorem theoremDto = createTheorem();
final List<Theorem> listOfTheorems = new ArrayList<>();
listOfTheorems.add(theoremDto);
listOfTheorems.add(theoremDto);
when(theoremRepository.findAll()).thenReturn(listOfTheorems);
final ResponseEntity<Iterable<Theorem>> responseEntity = theoremController.getAllTheorems();
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(theorem -> assertEquals(theoremDto, theorem));
}
@Test
public void testGetTheoremById() throws BadRequestException {
final Theorem theorem = createTheorem();
when(theoremRepository.findById(anyInt())).thenReturn(Optional.ofNullable(theorem));
final ResponseEntity<Theorem> responseEntity = theoremController.getTheoremById(1);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(theorem, responseEntity.getBody());
verify(theoremRepository).findById(anyInt());
}
@Test(expected = BadRequestException.class)
public void testGetTheoremById_nullId() throws BadRequestException {
theoremController.getTheoremById(null);
}
@Test
public void testGetTheoremById_noTheoremFound() throws BadRequestException {
when(theoremRepository.findById(anyInt())).thenReturn(Optional.empty());
final ResponseEntity responseEntity = theoremController.getTheoremById(1);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
verify(theoremRepository).findById(anyInt());
}
@Test
public void testGetAllTheoremsByBranch() throws BadRequestException {
final Theorem theoremDto = createTheorem();
final List<Theorem> listOfTheorems = new ArrayList<>();
listOfTheorems.add(theoremDto);
listOfTheorems.add(theoremDto);
when(theoremRepository.findByBranch(anyString())).thenReturn(listOfTheorems);
final ResponseEntity<List<Theorem>> responseEntity = theoremController.getAllTheoremsByBranch("test-branch");
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(theorem -> assertEquals(theoremDto, theorem));
}
@Test(expected = BadRequestException.class)
public void testGetAllTheoremsByBranch_nullBranch() throws BadRequestException {
theoremController.getAllTheoremsByBranch(null);
}
@Test
public void testGetAllTheoremsByBranch_noTheoremsFound() throws BadRequestException {
when(theoremRepository.findByBranch(anyString())).thenReturn(Collections.emptyList());
final ResponseEntity<List<Theorem>> responseEntity = theoremController.getAllTheoremsByBranch("test_nonexistent_branch");
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
}
@Test
public void testGetAllTheoremsByProvenStatus() throws BadRequestException {
final Theorem theoremDto = createTheorem();
final List<Theorem> listOfTheorems = new ArrayList<>();
listOfTheorems.add(theoremDto);
listOfTheorems.add(theoremDto);
when(theoremRepository.findByProvenStatus(anyBoolean())).thenReturn(listOfTheorems);
final ResponseEntity<List<Theorem>> responseEntity = theoremController.getAllTheoremsByProvenStatus("true");
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(theorem -> assertEquals(theoremDto, theorem));
}
@Test(expected = BadRequestException.class)
public void testGetAllTheoremsByProvenStatus_nullProvenStatus() throws BadRequestException {
theoremController.getAllTheoremsByProvenStatus(null);
}
@Test
public void testGetAllTheoremsByProvenStatus_invalidProvenStatus() throws BadRequestException {
final ResponseEntity<List<Theorem>> responseEntity = theoremController.getAllTheoremsByProvenStatus("test");
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
}
@Test
public void testGetAllTheoremsByProvenStatus_noTheoremsFound() throws BadRequestException {
when(theoremRepository.findByProvenStatus(anyBoolean())).thenReturn(Collections.emptyList());
final ResponseEntity<List<Theorem>> responseEntity = theoremController.getAllTheoremsByProvenStatus("false");
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
}
@Test
public void testGetAllTheoremsByName() throws BadRequestException {
final Theorem theoremDto = createTheorem();
final List<Theorem> listOfTheorems = new ArrayList<>();
listOfTheorems.add(theoremDto);
listOfTheorems.add(theoremDto);
when(theoremRepository.findByName(anyString())).thenReturn(listOfTheorems);
final ResponseEntity<List<Theorem>> responseEntity = theoremController.getAllTheoremsByName("Test_Theorem");
assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
responseEntity.getBody().forEach(theorem -> assertEquals(theoremDto, theorem));
}
@Test(expected = BadRequestException.class)
public void testGetAllTheoremsByName_nullName() throws BadRequestException {
theoremController.getAllTheoremsByName(null);
}
@Test
public void testGetAllTheoremsByName_noNameFound() throws BadRequestException {
when(theoremRepository.findByName(anyString())).thenReturn(Collections.emptyList());
final ResponseEntity<List<Theorem>> responseEntity = theoremController.getAllTheoremsByName("No-name");
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
}
@Test
public void testInsertTheorem() throws BadRequestException, UnprocessableEntityException {
final Theorem theorem = createTheorem();
when(theoremRepository.save(any(Theorem.class))).thenReturn(theorem);
final ResponseEntity<Theorem> responseEntity = theoremController.insertTheorem(theorem, bindingResult);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertNotNull(responseEntity.getBody());
assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
assertEquals(theorem, responseEntity.getBody());
verify(theoremRepository).save(any(Theorem.class));
}
@Test(expected = BadRequestException.class)
public void testInsertTheorem_theoremDtoIsNull() throws BadRequestException, UnprocessableEntityException {
theoremController.insertTheorem(null, bindingResult);
}
@Test(expected = UnprocessableEntityException.class)
public void testInsertTheorem_bindingResultHasErrors() throws BadRequestException, UnprocessableEntityException {
final Theorem theorem = createTheorem();
when(bindingResult.hasErrors()).thenReturn(true);
theoremController.insertTheorem(theorem, bindingResult);
}
@Test
public void testUpdateTheorem() throws BadRequestException, UnprocessableEntityException {
final Theorem existingTheorem = createTheorem();
existingTheorem.setId(1);
existingTheorem.setVersion(1);
final Theorem theoremUpdate = new Theorem();
theoremUpdate.setName("Test Update");
final Theorem updatedTheorem = existingTheorem;
updatedTheorem.setName("Test Update");
when(theoremRepository.findById(anyInt())).thenReturn(Optional.of(existingTheorem));
when(theoremRepository.save(any(Theorem.class))).thenReturn(updatedTheorem);
final ResponseEntity<Theorem> responseEntity = theoremController.updateTheorem(1, theoremUpdate, bindingResult);
assertNotNull(responseEntity);
assertTrue(responseEntity.hasBody());
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(updatedTheorem, responseEntity.getBody());
verify(theoremRepository).findById(anyInt());
verify(theoremRepository).save(any(Theorem.class));
}
@Test(expected = UnprocessableEntityException.class)
public void testUpdateTheorem_bindingResultHasErrors() throws BadRequestException, UnprocessableEntityException {
when(bindingResult.hasErrors()).thenReturn(true);
theoremController.updateTheorem(1, createTheorem(), bindingResult);
}
@Test(expected = BadRequestException.class)
public void testUpdateTheorem_theoremDtoIsNull() throws BadRequestException, UnprocessableEntityException {
theoremController.updateTheorem(1, null, bindingResult);
}
@Test(expected = BadRequestException.class)
public void testUpdateTheorem_idIsNull() throws BadRequestException, UnprocessableEntityException {
theoremController.updateTheorem(null, createTheorem(), bindingResult);
}
@Test
public void testUpdateTheorem_theoremDoesNotExist() throws BadRequestException, UnprocessableEntityException {
when(theoremRepository.findById(anyInt())).thenReturn(Optional.empty());
final ResponseEntity<Theorem> responseEntity = theoremController.updateTheorem(1, createTheorem(), bindingResult);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
verify(theoremRepository, times(0)).save(any(Theorem.class));
}
@Test
public void testDeleteTheoremById() throws BadRequestException {
doNothing().when(theoremRepository).deleteById(anyInt());
final ResponseEntity responseEntity = theoremController.deleteTheoremById(1);
assertNotNull(responseEntity);
assertFalse(responseEntity.hasBody());
assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
verify(theoremRepository).deleteById(anyInt());
}
@Test(expected = BadRequestException.class)
public void testDeleteTheoremById_idIsNull() throws BadRequestException {
theoremController.deleteTheoremById(null);
}
private Theorem createTheorem() {
final List<String> referencedTheoremsList = new ArrayList<>();
referencedTheoremsList.add("test theorem 1");
referencedTheoremsList.add("test theorem 2");
final List<String> referencedDefinitionsList = new ArrayList<>();
referencedDefinitionsList.add("test definition 1");
referencedDefinitionsList.add("test definition 2");
final Theorem theorem = new Theorem();
theorem.setName("Test theorem");
theorem.setTheorem("test theorem thing here");
theorem.setBranch("Test branch");
theorem.setProvenStatus(true);
theorem.setTheoremType(TheoremType.THEOREM);
theorem.setReferencedTheorems(referencedTheoremsList);
theorem.setReferencedDefinitions(referencedDefinitionsList);
return theorem;
}
}
+32
View File
@@ -0,0 +1,32 @@
plugins {
id 'java'
}
group 'edu.msudenver.tsp'
version '1.0'
sourceCompatibility = 1.8
sonarqube {
properties {
property "sonar.projectName", 'Theorem Prover Services'
}
}
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.4.11'
compile group: 'org.apache.httpcomponents', name: 'fluent-hc', version: '4.5.7'
compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '2.0.5.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.0.5.RELEASE'
compile group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'
compile fileTree(dir: 'lib', include: '**/*.jar')
testCompile "org.springframework:spring-test:5.0.9.RELEASE"
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile group: 'org.springframework', name: 'spring-test', version: '5.1.5.RELEASE'
}
@@ -0,0 +1,85 @@
package edu.msudenver.tsp.services;
import edu.msudenver.tsp.services.dto.Definition;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ServicesTestConfig.class)
@TestPropertySource(locations = "classpath:test.properties")
public class DefinitionServiceIntegrationTest {
@Autowired private DefinitionService definitionService;
@Test
public void testCRUD() {
final Definition testDefinition = createDefinition();
final Optional<Definition> createdDefinition = definitionService.createDefinition(testDefinition);
assertTrue(createdDefinition.isPresent());
assertNotEquals(0, createdDefinition.get().getId());
assertThat(createdDefinition.get().getVersion(), is(0));
assertThat(createdDefinition.get().getName(), is("Test Name"));
assertNotNull(createdDefinition.get().getDefinition());
assertThat(createdDefinition.get().getDefinition().size(), is(1));
assertThat(createdDefinition.get().getDefinition().get(0), is("Test definition 1"));
assertNotNull(createdDefinition.get().getNotation());
assertThat(createdDefinition.get().getNotation().size(), is(1));
assertThat(createdDefinition.get().getNotation().get(0), is("\\testLaTeX"));
final Optional<Definition> definitionFoundById = definitionService.findById(createdDefinition.get().getId());
assertThat(definitionFoundById.get(), is(equalTo(createdDefinition.get())));
final Definition definitionUpdate = new Definition();
definitionUpdate.setId(createdDefinition.get().getId());
definitionUpdate.setName("Test Update");
final Optional<Definition> updatedDefinition = definitionService.updateDefinition(definitionUpdate);
assertTrue(updatedDefinition.isPresent());
assertNotEquals(0, updatedDefinition.get().getId());
assertThat(updatedDefinition.get().getVersion(), is(1));
assertThat(updatedDefinition.get().getName(), is("Test Update"));
assertNotNull(updatedDefinition.get().getDefinition());
assertThat(updatedDefinition.get().getDefinition().size(), is(1));
assertThat(updatedDefinition.get().getDefinition().get(0), is("Test definition 1"));
assertNotNull(updatedDefinition.get().getNotation());
assertThat(updatedDefinition.get().getNotation().size(), is(1));
assertThat(updatedDefinition.get().getNotation().get(0), is("\\testLaTeX"));
final boolean deletionWasSuccessful = definitionService.deleteDefinition(updatedDefinition.get());
assertThat(deletionWasSuccessful, is(true));
final Optional<Definition> deletedDefinitionFoundById = definitionService.findById(createdDefinition.get().getId());
assertFalse(deletedDefinitionFoundById.isPresent());
}
private Definition createDefinition() {
final List<String> definitionList = new ArrayList<>();
definitionList.add("Test definition 1");
final List<String> notationList = new ArrayList<>();
notationList.add("\\testLaTeX");
final Definition definition = new Definition();
definition.setName("Test Name");
definition.setDefinition(definitionList);
definition.setNotation(notationList);
return definition;
}
}
@@ -0,0 +1,17 @@
package edu.msudenver.tsp.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class ServicesTestConfig {
@Bean
@Autowired
public UserService userService(final RestService restService) {
return new UserService(restService);
}
}
@@ -0,0 +1,74 @@
package edu.msudenver.tsp.services;
import edu.msudenver.tsp.services.dto.Account;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Date;
import java.util.Optional;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ServicesTestConfig.class)
@TestPropertySource("classpath:test.properties")
public class UserServiceIntegrationTest {
@Autowired
@Qualifier("userService")
private UserService userService;
@Test
public void testCRUD() {
final Account testAccount = createAccount();
final Optional<Account> testCreatedAccount = userService.createAccount(testAccount);
assertTrue(testCreatedAccount.isPresent());
final Account returnedAccount = testCreatedAccount.get();
assertEquals("test_user", returnedAccount.getUsername());
assertEquals("test_password", returnedAccount.getPassword());
assertFalse(returnedAccount.isAdministrator());
final Optional<Account> getAccountById = userService.findAccountById(returnedAccount.getId());
assertTrue(getAccountById.isPresent());
final Account returnedAccountById = getAccountById.get();
assertEquals("test_user", returnedAccountById.getUsername());
assertEquals("test_password", returnedAccountById.getPassword());
assertFalse(returnedAccountById.isAdministrator());
final Optional<Account> getAccountByUsername = userService.findAccountByUsername(returnedAccount.getUsername());
assertTrue(getAccountByUsername.isPresent());
final Account returnedAccountByUsername = getAccountByUsername.get();
assertEquals("test_user", returnedAccountByUsername.getUsername());
assertEquals("test_password", returnedAccountByUsername.getPassword());
assertFalse(returnedAccountById.isAdministrator());
returnedAccount.setUsername("test_updatedUser");
returnedAccount.setPassword("test_updatedPassword");
final Optional<Account> updatedAccount = userService.updateAccount(returnedAccount);
assertTrue(updatedAccount .isPresent());
final Account returnedUpdatedAccount = updatedAccount.get();
assertEquals("test_updatedUser", returnedUpdatedAccount.getUsername());
assertEquals("test_updatedPassword", returnedUpdatedAccount.getPassword());
assertFalse(returnedUpdatedAccount.isAdministrator());
final boolean result = userService.deleteAccount(returnedUpdatedAccount);
assertTrue(result);
}
private Account createAccount() {
final Account testAccount = new Account();
testAccount.setUsername("test_user");
testAccount.setPassword("test_password");
testAccount.setAdministrator(false);
testAccount.setLastLogin(new Date());
return testAccount;
}
}
@@ -0,0 +1,3 @@
persistence.api.connection.timeout.milliseconds=5000
persistence.api.socket.timeout.milliseconds=10000
persistence.api.base.url=http://localhost:8090/
@@ -0,0 +1,186 @@
package edu.msudenver.tsp.services;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import edu.msudenver.tsp.services.dto.Definition;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
@Slf4j
@Service
public class DefinitionService {
private final RestService restService;
@Value("${persistence.api.connection.timeout.milliseconds}") private int connectionTimeoutMilliseconds;
@Value("${persistence.api.socket.timeout.milliseconds}") private int socketTimeoutMilliseconds;
@Value("${persistence.api.base.url}") private String persistenceApiBaseUrl;
@Autowired
public DefinitionService(final RestService restService) {
this.restService = restService;
}
public Optional<List<Definition>> getAllDefinitions() {
final Instant start = Instant.now();
try {
final TypeToken<List<Definition>> typeToken = new TypeToken<List<Definition>>(){};
final Optional<List<Definition>> persistenceApiResponse =
restService.get(persistenceApiBaseUrl + "definitions/",
typeToken, connectionTimeoutMilliseconds, socketTimeoutMilliseconds, null);
if (persistenceApiResponse.isPresent()) {
LOG.info("Returning {}", persistenceApiResponse.get());
} else {
LOG.info("Unable to get list of definitions");
}
return persistenceApiResponse;
} catch (final Exception e) {
LOG.error("Error getting list of definitions!", e);
return Optional.empty();
} finally {
LOG.info("Get all definitions request took {}ms", Duration.between(start, Instant.now()).toMillis());
}
}
public Optional<Definition> findById(final int id) {
if (id == 0) {
LOG.error("Null id specified; returning {}");
return Optional.empty();
}
LOG.info("Sending request to find definition by id {}", id);
final Instant start = Instant.now();
try {
final TypeToken<Definition> typeToken = new TypeToken<Definition>(){};
final Optional<Definition> persistenceApiResponse = restService.get(persistenceApiBaseUrl + "definitions/" + id,
typeToken, connectionTimeoutMilliseconds, socketTimeoutMilliseconds, null);
if (persistenceApiResponse.isPresent()) {
LOG.info("Returning {}", persistenceApiResponse.get());
} else {
LOG.info("Unable to find definition with id {}", id);
}
return persistenceApiResponse;
} catch (final Exception e) {
LOG.error("Error finding definition by id", e);
return Optional.empty();
} finally {
LOG.info("Find by id request took {}ms", Duration.between(start, Instant.now()).toMillis());
}
}
public Optional<Definition> createDefinition(final Definition definition) {
if (definition == null) {
LOG.error("Given null definition, returning {}");
return Optional.empty();
}
LOG.info("Sending request to insert definition {}", definition);
final Instant start = Instant.now();
try {
final TypeToken<Definition> typeToken = new TypeToken<Definition>() {};
final Optional<Definition> persistenceApiResponse = restService.post(persistenceApiBaseUrl + "definitions/",
new GsonBuilder().create().toJson(definition),
typeToken,
connectionTimeoutMilliseconds,
socketTimeoutMilliseconds);
if (persistenceApiResponse.isPresent()) {
LOG.info("Creation successful. Returning {}", persistenceApiResponse.get());
} else {
LOG.info("Unable to create new definition {}", definition);
}
return persistenceApiResponse;
} catch (final Exception e) {
LOG.error("Error creating new definition", e);
return Optional.empty();
} finally {
LOG.info("Create new definition request took {}ms", Duration.between(start, Instant.now()).toMillis());
}
}
public Optional<Definition> updateDefinition(final Definition definition) {
if (definition == null) {
LOG.error("Given null definition, returning {}");
return Optional.empty();
}
if (definition.getId() == 0) {
LOG.error("Given invalid id 0, returning {}");
return Optional.empty();
}
LOG.info("Sending request to update definition {}", definition);
final Instant start = Instant.now();
try {
final TypeToken<Definition> typeToken = new TypeToken<Definition>(){};
final Optional<Definition> persistenceApiResponse = restService.patch(persistenceApiBaseUrl + "definitions/" + definition.getId(),
new GsonBuilder().create().toJson(definition),
typeToken,
connectionTimeoutMilliseconds,
socketTimeoutMilliseconds);
if (persistenceApiResponse.isPresent()) {
LOG.info("Update successful. Returning {}", persistenceApiResponse.get());
} else {
LOG.info("Unable to update definition {}", definition);
}
return persistenceApiResponse;
} catch (final Exception e) {
LOG.error("Error updating definition", e);
return Optional.empty();
} finally {
LOG.info("Update definition request took {}ms", Duration.between(start, Instant.now()).toMillis());
}
}
public boolean deleteDefinition(final Definition definition) {
if (definition == null) {
LOG.error("Given null definition, returning false");
return false;
}
if (definition.getId() == 0) {
LOG.error("Given invalid id 0, returning false");
return false;
}
LOG.info("Sending request to delete definition {}", definition);
final Instant start = Instant.now();
try {
final boolean deleteIsSuccessful = restService.delete(persistenceApiBaseUrl + "definitions/" + definition.getId(),
connectionTimeoutMilliseconds,
socketTimeoutMilliseconds,
HttpStatus.NO_CONTENT);
if (deleteIsSuccessful) {
LOG.info("Deletion successful. Returning true");
} else {
LOG.info("Unable to delete definition {}", definition);
}
return deleteIsSuccessful;
} catch (final Exception e) {
LOG.error("Error when deleting definition", e);
return false;
} finally {
LOG.info("Delete definition request took {}ms", Duration.between(start, Instant.now()).toMillis());
}
}
}
@@ -0,0 +1,105 @@
package edu.msudenver.tsp.services;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import edu.msudenver.tsp.services.factory.RequestFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.fluent.Request;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Slf4j
@Service
public class RestService {
private static final Gson GSON = new Gson();
private final RequestFactory requestFactory;
@Autowired
public RestService(final RequestFactory requestFactory) {
this.requestFactory = requestFactory;
}
public boolean delete(final String uri, final Integer connectionTimeout, final Integer socketTimeout, final HttpStatus httpStatus) {
LOG.info("Sending DELETE {}", uri);
final Optional<HttpResponse> response = send(requestFactory.delete(uri), null, connectionTimeout, socketTimeout);
return response.isPresent() && response.get().getStatusLine().getStatusCode() == httpStatus.value();
}
<T> Optional<T> get(final String uri, final TypeToken<T> type, final Integer connectionTimeout, final Integer socketTimeout, final String auth) {
LOG.info("Sending GET {}", uri);
return send(requestFactory.get(uri), auth, connectionTimeout, socketTimeout, type);
}
<T> Optional<T> post(final String uri, final String requestJson, final TypeToken<T> type, final Integer connectionTimeout, final Integer socketTimeout) {
LOG.info("Sending POST {} with body: {}", uri, requestJson);
return send(requestFactory.post(uri, requestJson), null, connectionTimeout, socketTimeout, type);
}
Optional<HttpResponse> post(final String uri, final String requestJson, final Integer connectionTimeout, final Integer socketTimeout) {
LOG.info("Sending POST {} with body: {}", uri, requestJson);
return send(requestFactory.post(uri, requestJson), null, connectionTimeout, socketTimeout);
}
<T> Optional<T> put(final String uri, final String requestJson, final TypeToken<T> type, final Integer connectionTimeout, final Integer socketTimeout, final String auth) {
LOG.info("Sending PUT {} with body: {}", uri, requestJson);
return send(requestFactory.put(uri, requestJson), auth, connectionTimeout, socketTimeout, type);
}
<T> Optional<T> patch(final String uri, final String requestJson, final TypeToken<T> type, final Integer connectionTimeout, final Integer socketTimeout) {
LOG.info("Sending PATCH {} with body: {}", uri, requestJson);
return send(requestFactory.patch(uri, requestJson), null, connectionTimeout, socketTimeout, type);
}
private <T> Optional<T> send(final Request request, final String auth, final Integer connectionTimeout, final Integer socketTimeout, final TypeToken<T> type) {
try {
final Optional<HttpResponse> optionalHttpResponse = send(request, auth, connectionTimeout, socketTimeout);
if (optionalHttpResponse.isPresent()) {
final HttpResponse httpResponse = optionalHttpResponse.get();
LOG.info("Received {} response", httpResponse.getStatusLine().getStatusCode());
final String jsonResponse = httpResponse.getEntity() == null ? null : EntityUtils.toString(httpResponse.getEntity());
if (StringUtils.isNotBlank(jsonResponse)) {
final T responses = GSON.fromJson(jsonResponse, type.getType());
if (responses instanceof List) {
LOG.info("Found {} responses.", ((List) responses).size());
if (((List) responses).isEmpty()) {
return Optional.empty();
}
}
return Optional.ofNullable(responses);
}
}
} catch (final Exception e) {
LOG.error("Could not send request", e);
}
return Optional.empty();
}
private Optional<HttpResponse> send(final Request request, final String auth, final Integer connectionTimeout, final Integer socketTimeout) {
if (StringUtils.isNotBlank(auth)) {
request.addHeader("Authorization", "Basic " + auth);
}
try {
return Optional.ofNullable(request.connectTimeout(connectionTimeout)
.socketTimeout(socketTimeout)
.execute()
.returnResponse());
} catch (final Exception e) {
LOG.error("Could not send request", e);
return Optional.empty();
}
}
}

Some files were not shown because too many files have changed in this diff Show More