From 21bd180c1c1600bbdcefbc7aa4d57813c424ad3a Mon Sep 17 00:00:00 2001 From: Thoughtscript Date: Thu, 19 Apr 2018 05:37:34 +0100 Subject: [PATCH 001/136] BAEL-1461 --- pom.xml | 1 + web3j/.gitignore | 3 + web3j/README.md | 4 + web3j/dev_ganache/README.md | 23 + web3j/dev_truffle/README.md | 43 + .../build/contracts/ConvertLib.json | 455 ++++++ .../dev_truffle/build/contracts/Example.json | 251 +++ .../build/contracts/Migrations.json | 1380 +++++++++++++++++ web3j/dev_truffle/contracts/ConvertLib.sol | 8 + web3j/dev_truffle/contracts/Example.sol | 11 + web3j/dev_truffle/contracts/Migrations.sol | 23 + .../migrations/1_initial_migration.js | 3 + .../migrations/2_deploy_contracts.js | 8 + web3j/dev_truffle/truffle.js | 20 + web3j/pom.xml | 210 +++ .../com/baeldung/web3j/config/AppConfig.java | 68 + .../web3j/config/WebAppInitializer.java | 28 + .../baeldung/web3j/constants/Constants.java | 18 + .../com/baeldung/web3j/contracts/Example.java | 74 + .../controllers/EthereumRestController.java | 103 ++ .../baeldung/web3j/helpers/TimeHelper.java | 16 + .../baeldung/web3j/services/Web3Service.java | 156 ++ .../web3j/transfers/ResponseTransfer.java | 28 + web3j/src/main/webapp/WEB-INF/.gitkeep | 0 web3j/src/main/webapp/resources/.gitkeep | 0 ...EthereumRestControllerIntegrationTest.java | 78 + .../EthereumRestControllerUnitTest.java | 76 + .../services/EthereumContractUnitTest.java | 37 + 28 files changed, 3125 insertions(+) create mode 100644 web3j/.gitignore create mode 100644 web3j/README.md create mode 100644 web3j/dev_ganache/README.md create mode 100644 web3j/dev_truffle/README.md create mode 100644 web3j/dev_truffle/build/contracts/ConvertLib.json create mode 100644 web3j/dev_truffle/build/contracts/Example.json create mode 100644 web3j/dev_truffle/build/contracts/Migrations.json create mode 100644 web3j/dev_truffle/contracts/ConvertLib.sol create mode 100644 web3j/dev_truffle/contracts/Example.sol create mode 100644 web3j/dev_truffle/contracts/Migrations.sol create mode 100644 web3j/dev_truffle/migrations/1_initial_migration.js create mode 100644 web3j/dev_truffle/migrations/2_deploy_contracts.js create mode 100644 web3j/dev_truffle/truffle.js create mode 100644 web3j/pom.xml create mode 100644 web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java create mode 100644 web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java create mode 100644 web3j/src/main/java/com/baeldung/web3j/constants/Constants.java create mode 100644 web3j/src/main/java/com/baeldung/web3j/contracts/Example.java create mode 100644 web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java create mode 100644 web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java create mode 100644 web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java create mode 100644 web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java create mode 100644 web3j/src/main/webapp/WEB-INF/.gitkeep create mode 100644 web3j/src/main/webapp/resources/.gitkeep create mode 100644 web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java create mode 100644 web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java create mode 100644 web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java diff --git a/pom.xml b/pom.xml index f0cb72e4d0..750c95679c 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,7 @@ dozer ethereumj + web3j diff --git a/web3j/.gitignore b/web3j/.gitignore new file mode 100644 index 0000000000..f83e8cf07c --- /dev/null +++ b/web3j/.gitignore @@ -0,0 +1,3 @@ +.idea +target +*.iml diff --git a/web3j/README.md b/web3j/README.md new file mode 100644 index 0000000000..bc9909af25 --- /dev/null +++ b/web3j/README.md @@ -0,0 +1,4 @@ +## Web3j + +### Relevant Articles: +- [Lightweight Web3](http://www.baeldung.com/lightweight-web3/) diff --git a/web3j/dev_ganache/README.md b/web3j/dev_ganache/README.md new file mode 100644 index 0000000000..2d3e645504 --- /dev/null +++ b/web3j/dev_ganache/README.md @@ -0,0 +1,23 @@ +# Ganache Readme + +TL:DR - To set up Ganache visit: http://truffleframework.com/ganache/ + +# Three Ways to Install Ganache + +Ganache is provided in three libraries or distributions: + +(1) Ganache - https://github.com/trufflesuite/ganache + +This is a pre-built and out-of-the-box solution. Easiest to set up. It provides an interface and server shell for Ganache CLI. + +(2) Ganache CLI - https://www.npmjs.com/package/ganache-cli + +Ganache CLI abstracts Ganache Core and supplies the default options and arguments used. + +(3) Ganache Core - https://www.npmjs.com/package/ganache-core + +Basically, only use Ganache Core if you need to build a totally customized option. + +# Use + +The default port is *8545* on *localhost* \ No newline at end of file diff --git a/web3j/dev_truffle/README.md b/web3j/dev_truffle/README.md new file mode 100644 index 0000000000..b64e16d570 --- /dev/null +++ b/web3j/dev_truffle/README.md @@ -0,0 +1,43 @@ +# Using Truffle + +Basic Truffle walkthrough readme. + +See also: http://truffleframework.com/docs/ + +# Bash + +Truffle install + +```bash + $ npm install truffle -g + $ truffle version +``` + +Truffle commands: + +```bash + $ truffle init + $ truffle compile + $ truffle migrate + $ truffle test +``` + +# Directory Structure + +The command `$ truffle init` will create a directory structure in the specified root according to the following: + +``` +root -| + |-build (Compiled Solc JSON Output Dir) + |-contracts (Solc Contracts to be Compiled and Migrated) + |-migrations (Specify the Order and Dependencies of Contracts to Be Deployed) + |-test (Truffle Tests) +``` + +# Compile + +Truffle will compile the smart contracts and expose their **JSON ABI's for use with Web3.js** or **Binary ABI's for use with Web3J**. + +# Migration + +Truffle will let you deploy your Solc contracts directly to a blockchin of your choice. \ No newline at end of file diff --git a/web3j/dev_truffle/build/contracts/ConvertLib.json b/web3j/dev_truffle/build/contracts/ConvertLib.json new file mode 100644 index 0000000000..977928c756 --- /dev/null +++ b/web3j/dev_truffle/build/contracts/ConvertLib.json @@ -0,0 +1,455 @@ +{ + "contractName": "ConvertLib", + "abi": [ + { + "constant": false, + "inputs": [ + { + "name": "amount", + "type": "uint256" + }, + { + "name": "conversionRate", + "type": "uint256" + } + ], + "name": "convert", + "outputs": [ + { + "name": "convertedAmount", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60d161002f600b82828239805160001a6073146000811461001f57610021565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146060604052600436106056576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806396e4ee3d14605b575b600080fd5b8115606557600080fd5b608260048080359060200190919080359060200190919050506098565b6040518082815260200191505060405180910390f35b60008183029050929150505600a165627a7a72305820ab84b2740847d7b84a33de9738ae9cf9aabac1b68e6a64d60bd5020b9b6235e40029", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146060604052600436106056576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806396e4ee3d14605b575b600080fd5b8115606557600080fd5b608260048080359060200190919080359060200190919050506098565b6040518082815260200191505060405180910390f35b60008183029050929150505600a165627a7a72305820ab84b2740847d7b84a33de9738ae9cf9aabac1b68e6a64d60bd5020b9b6235e40029", + "sourceMap": "28:148:0:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24", + "deployedSourceMap": "28:148:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;50:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109:20;154:14;145:6;:23;138:30;;50:123;;;;:::o", + "source": "pragma solidity ^0.4.17;\r\n\r\nlibrary ConvertLib{\r\n\tfunction convert(uint amount,uint conversionRate) returns (uint convertedAmount)\r\n\t{\r\n\t\treturn amount * conversionRate;\r\n\t}\r\n}\r\n", + "sourcePath": "C:\\workspace\\current_workspace\\web3java\\dev_truffle\\contracts\\ConvertLib.sol", + "ast": { + "absolutePath": "/C/workspace/current_workspace/web3java/dev_truffle/contracts/ConvertLib.sol", + "exportedSymbols": { + "ConvertLib": [ + 16 + ] + }, + "id": 17, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ], + "nodeType": "PragmaDirective", + "src": "0:24:0" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": null, + "fullyImplemented": true, + "id": 16, + "linearizedBaseContracts": [ + 16 + ], + "name": "ConvertLib", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 14, + "nodeType": "Block", + "src": "133:40:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 10, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "145:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 11, + "name": "conversionRate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "154:14:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "145:23:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9, + "id": 13, + "nodeType": "Return", + "src": "138:30:0" + } + ] + }, + "documentation": null, + "id": 15, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "convert", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "67:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "67:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 5, + "name": "conversionRate", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "79:19:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "79:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "66:33:0" + }, + "payable": false, + "returnParameters": { + "id": 9, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8, + "name": "convertedAmount", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "109:20:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "109:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "108:22:0" + }, + "scope": 16, + "src": "50:123:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 17, + "src": "28:148:0" + } + ], + "src": "0:178:0" + }, + "legacyAST": { + "absolutePath": "/C/workspace/current_workspace/web3java/dev_truffle/contracts/ConvertLib.sol", + "exportedSymbols": { + "ConvertLib": [ + 16 + ] + }, + "id": 17, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ], + "nodeType": "PragmaDirective", + "src": "0:24:0" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": null, + "fullyImplemented": true, + "id": 16, + "linearizedBaseContracts": [ + 16 + ], + "name": "ConvertLib", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 14, + "nodeType": "Block", + "src": "133:40:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 10, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "145:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 11, + "name": "conversionRate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "154:14:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "145:23:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9, + "id": 13, + "nodeType": "Return", + "src": "138:30:0" + } + ] + }, + "documentation": null, + "id": 15, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "convert", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "67:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "67:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 5, + "name": "conversionRate", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "79:19:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "79:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "66:33:0" + }, + "payable": false, + "returnParameters": { + "id": 9, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8, + "name": "convertedAmount", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "109:20:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "109:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "108:22:0" + }, + "scope": 16, + "src": "50:123:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 17, + "src": "28:148:0" + } + ], + "src": "0:178:0" + }, + "compiler": { + "name": "solc", + "version": "0.4.21+commit.dfe3193c.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "2.0.0", + "updatedAt": "2018-04-14T03:37:39.678Z" +} \ No newline at end of file diff --git a/web3j/dev_truffle/build/contracts/Example.json b/web3j/dev_truffle/build/contracts/Example.json new file mode 100644 index 0000000000..82111dab11 --- /dev/null +++ b/web3j/dev_truffle/build/contracts/Example.json @@ -0,0 +1,251 @@ +{ + "contractName": "Example", + "abi": [ + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "constant": false, + "inputs": [], + "name": "ExampleFunction", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60606040523415600e57600080fd5b60848061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063b818dacd146044575b600080fd5b3415604e57600080fd5b60546056565b005b5600a165627a7a72305820bebcbbdf06550591bc772dfcb0eadc842f95953869feb7a9528bac91487d95240029", + "deployedBytecode": "0x606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063b818dacd146044575b600080fd5b3415604e57600080fd5b60546056565b005b5600a165627a7a72305820bebcbbdf06550591bc772dfcb0eadc842f95953869feb7a9528bac91487d95240029", + "sourceMap": "28:134:1:-;;;50:45;;;;;;;;28:134;;;;;;", + "deployedSourceMap": "28:134:1:-;;;;;;;;;;;;;;;;;;;;;;;;101:58;;;;;;;;;;;;;;;:::o", + "source": "pragma solidity ^0.4.17;\r\n\r\ncontract Example {\r\n function Example() {\r\n // constructor\r\n }\r\n\r\n function ExampleFunction() {\r\n // example function\r\n }\r\n}", + "sourcePath": "C:\\workspace\\current_workspace\\web3java\\dev_truffle\\contracts\\Example.sol", + "ast": { + "absolutePath": "/C/workspace/current_workspace/web3java/dev_truffle/contracts/Example.sol", + "exportedSymbols": { + "Example": [ + 27 + ] + }, + "id": 28, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 18, + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ], + "nodeType": "PragmaDirective", + "src": "0:24:1" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 27, + "linearizedBaseContracts": [ + 27 + ], + "name": "Example", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 21, + "nodeType": "Block", + "src": "69:26:1", + "statements": [] + }, + "documentation": null, + "id": 22, + "implemented": true, + "isConstructor": true, + "isDeclaredConst": false, + "modifiers": [], + "name": "Example", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 19, + "nodeType": "ParameterList", + "parameters": [], + "src": "66:2:1" + }, + "payable": false, + "returnParameters": { + "id": 20, + "nodeType": "ParameterList", + "parameters": [], + "src": "69:0:1" + }, + "scope": 27, + "src": "50:45:1", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 25, + "nodeType": "Block", + "src": "128:31:1", + "statements": [] + }, + "documentation": null, + "id": 26, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "ExampleFunction", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 23, + "nodeType": "ParameterList", + "parameters": [], + "src": "125:2:1" + }, + "payable": false, + "returnParameters": { + "id": 24, + "nodeType": "ParameterList", + "parameters": [], + "src": "128:0:1" + }, + "scope": 27, + "src": "101:58:1", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 28, + "src": "28:134:1" + } + ], + "src": "0:162:1" + }, + "legacyAST": { + "absolutePath": "/C/workspace/current_workspace/web3java/dev_truffle/contracts/Example.sol", + "exportedSymbols": { + "Example": [ + 27 + ] + }, + "id": 28, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 18, + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ], + "nodeType": "PragmaDirective", + "src": "0:24:1" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 27, + "linearizedBaseContracts": [ + 27 + ], + "name": "Example", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 21, + "nodeType": "Block", + "src": "69:26:1", + "statements": [] + }, + "documentation": null, + "id": 22, + "implemented": true, + "isConstructor": true, + "isDeclaredConst": false, + "modifiers": [], + "name": "Example", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 19, + "nodeType": "ParameterList", + "parameters": [], + "src": "66:2:1" + }, + "payable": false, + "returnParameters": { + "id": 20, + "nodeType": "ParameterList", + "parameters": [], + "src": "69:0:1" + }, + "scope": 27, + "src": "50:45:1", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 25, + "nodeType": "Block", + "src": "128:31:1", + "statements": [] + }, + "documentation": null, + "id": 26, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "ExampleFunction", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 23, + "nodeType": "ParameterList", + "parameters": [], + "src": "125:2:1" + }, + "payable": false, + "returnParameters": { + "id": 24, + "nodeType": "ParameterList", + "parameters": [], + "src": "128:0:1" + }, + "scope": 27, + "src": "101:58:1", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 28, + "src": "28:134:1" + } + ], + "src": "0:162:1" + }, + "compiler": { + "name": "solc", + "version": "0.4.21+commit.dfe3193c.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "2.0.0", + "updatedAt": "2018-04-14T03:37:39.710Z" +} \ No newline at end of file diff --git a/web3j/dev_truffle/build/contracts/Migrations.json b/web3j/dev_truffle/build/contracts/Migrations.json new file mode 100644 index 0000000000..55f2c7ad69 --- /dev/null +++ b/web3j/dev_truffle/build/contracts/Migrations.json @@ -0,0 +1,1380 @@ +{ + "contractName": "Migrations", + "abi": [ + { + "constant": true, + "inputs": [], + "name": "last_completed_migration", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "constant": false, + "inputs": [ + { + "name": "completed", + "type": "uint256" + } + ], + "name": "setCompleted", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "new_address", + "type": "address" + } + ], + "name": "upgrade", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102d78061005e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610220565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc610226565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561021c578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b5af1151561021857600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102a857806001819055505b505600a165627a7a72305820be5431ce1823a03470fc4376ec6fdfa9e54ca2bd2b05b6271c73eb54ad4e4b060029", + "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610220565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc610226565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561021c578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b5af1151561021857600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102a857806001819055505b505600a165627a7a72305820be5431ce1823a03470fc4376ec6fdfa9e54ca2bd2b05b6271c73eb54ad4e4b060029", + "sourceMap": "26:488:2:-;;;178:58;;;;;;;;221:10;213:5;;:18;;;;;;;;;;;;;;;;;;26:488;;;;;;", + "deployedSourceMap": "26:488:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;347:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;74:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;240:103;;;;;;;;;;;;;;;;;;;;;;;;;;347:165;409:19;161:5;;;;;;;;;;;147:19;;:10;:19;;;143:26;;;442:11;409:45;;460:8;:21;;;482:24;;460:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;143:26;347:165;;:::o;74:36::-;;;;:::o;50:20::-;;;;;;;;;;;;;:::o;240:103::-;161:5;;;;;;;;;;;147:19;;:10;:19;;;143:26;;;329:9;302:24;:36;;;;143:26;240:103;:::o", + "source": "pragma solidity ^0.4.17;\n\ncontract Migrations {\n address public owner;\n uint public last_completed_migration;\n\n modifier restricted() {\n if (msg.sender == owner) _;\n }\n\n function Migrations() public {\n owner = msg.sender;\n }\n\n function setCompleted(uint completed) public restricted {\n last_completed_migration = completed;\n }\n\n function upgrade(address new_address) public restricted {\n Migrations upgraded = Migrations(new_address);\n upgraded.setCompleted(last_completed_migration);\n }\n}\n", + "sourcePath": "C:\\workspace\\current_workspace\\web3java\\dev_truffle\\contracts\\Migrations.sol", + "ast": { + "absolutePath": "/C/workspace/current_workspace/web3java/dev_truffle/contracts/Migrations.sol", + "exportedSymbols": { + "Migrations": [ + 84 + ] + }, + "id": 85, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 29, + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ], + "nodeType": "PragmaDirective", + "src": "0:24:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 84, + "linearizedBaseContracts": [ + 84 + ], + "name": "Migrations", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 31, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 84, + "src": "50:20:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 30, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "50:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 33, + "name": "last_completed_migration", + "nodeType": "VariableDeclaration", + "scope": 84, + "src": "74:36:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 32, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "74:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "body": { + "id": 41, + "nodeType": "Block", + "src": "137:37:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 38, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 35, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 97, + "src": "147:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 36, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "147:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 37, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31, + "src": "161:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "147:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 40, + "nodeType": "IfStatement", + "src": "143:26:2", + "trueBody": { + "id": 39, + "nodeType": "PlaceholderStatement", + "src": "168:1:2" + } + } + ] + }, + "documentation": null, + "id": 42, + "name": "restricted", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 34, + "nodeType": "ParameterList", + "parameters": [], + "src": "134:2:2" + }, + "src": "115:59:2", + "visibility": "internal" + }, + { + "body": { + "id": 50, + "nodeType": "Block", + "src": "207:29:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 48, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 45, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31, + "src": "213:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 46, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 97, + "src": "221:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 47, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "221:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "213:18:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 49, + "nodeType": "ExpressionStatement", + "src": "213:18:2" + } + ] + }, + "documentation": null, + "id": 51, + "implemented": true, + "isConstructor": true, + "isDeclaredConst": false, + "modifiers": [], + "name": "Migrations", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 43, + "nodeType": "ParameterList", + "parameters": [], + "src": "197:2:2" + }, + "payable": false, + "returnParameters": { + "id": 44, + "nodeType": "ParameterList", + "parameters": [], + "src": "207:0:2" + }, + "scope": 84, + "src": "178:58:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 62, + "nodeType": "Block", + "src": "296:47:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 60, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 58, + "name": "last_completed_migration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 33, + "src": "302:24:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 59, + "name": "completed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 53, + "src": "329:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "302:36:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 61, + "nodeType": "ExpressionStatement", + "src": "302:36:2" + } + ] + }, + "documentation": null, + "id": 63, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 56, + "modifierName": { + "argumentTypes": null, + "id": 55, + "name": "restricted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "285:10:2", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "285:10:2" + } + ], + "name": "setCompleted", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 54, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 53, + "name": "completed", + "nodeType": "VariableDeclaration", + "scope": 63, + "src": "262:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 52, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "262:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "261:16:2" + }, + "payable": false, + "returnParameters": { + "id": 57, + "nodeType": "ParameterList", + "parameters": [], + "src": "296:0:2" + }, + "scope": 84, + "src": "240:103:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 82, + "nodeType": "Block", + "src": "403:109:2", + "statements": [ + { + "assignments": [ + 71 + ], + "declarations": [ + { + "constant": false, + "id": 71, + "name": "upgraded", + "nodeType": "VariableDeclaration", + "scope": 83, + "src": "409:19:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Migrations_$84", + "typeString": "contract Migrations" + }, + "typeName": { + "contractScope": null, + "id": 70, + "name": "Migrations", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 84, + "src": "409:10:2", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Migrations_$84", + "typeString": "contract Migrations" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 75, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 73, + "name": "new_address", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 65, + "src": "442:11:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 72, + "name": "Migrations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 84, + "src": "431:10:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Migrations_$84_$", + "typeString": "type(contract Migrations)" + } + }, + "id": 74, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "431:23:2", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Migrations_$84", + "typeString": "contract Migrations" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "409:45:2" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 79, + "name": "last_completed_migration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 33, + "src": "482:24:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 76, + "name": "upgraded", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 71, + "src": "460:8:2", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Migrations_$84", + "typeString": "contract Migrations" + } + }, + "id": 78, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "setCompleted", + "nodeType": "MemberAccess", + "referencedDeclaration": 63, + "src": "460:21:2", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256) external" + } + }, + "id": 80, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "460:47:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 81, + "nodeType": "ExpressionStatement", + "src": "460:47:2" + } + ] + }, + "documentation": null, + "id": 83, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 68, + "modifierName": { + "argumentTypes": null, + "id": 67, + "name": "restricted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "392:10:2", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "392:10:2" + } + ], + "name": "upgrade", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 66, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 65, + "name": "new_address", + "nodeType": "VariableDeclaration", + "scope": 83, + "src": "364:19:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 64, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "364:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "363:21:2" + }, + "payable": false, + "returnParameters": { + "id": 69, + "nodeType": "ParameterList", + "parameters": [], + "src": "403:0:2" + }, + "scope": 84, + "src": "347:165:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 85, + "src": "26:488:2" + } + ], + "src": "0:515:2" + }, + "legacyAST": { + "absolutePath": "/C/workspace/current_workspace/web3java/dev_truffle/contracts/Migrations.sol", + "exportedSymbols": { + "Migrations": [ + 84 + ] + }, + "id": 85, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 29, + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ], + "nodeType": "PragmaDirective", + "src": "0:24:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 84, + "linearizedBaseContracts": [ + 84 + ], + "name": "Migrations", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 31, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 84, + "src": "50:20:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 30, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "50:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 33, + "name": "last_completed_migration", + "nodeType": "VariableDeclaration", + "scope": 84, + "src": "74:36:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 32, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "74:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "body": { + "id": 41, + "nodeType": "Block", + "src": "137:37:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 38, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 35, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 97, + "src": "147:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 36, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "147:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 37, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31, + "src": "161:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "147:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 40, + "nodeType": "IfStatement", + "src": "143:26:2", + "trueBody": { + "id": 39, + "nodeType": "PlaceholderStatement", + "src": "168:1:2" + } + } + ] + }, + "documentation": null, + "id": 42, + "name": "restricted", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 34, + "nodeType": "ParameterList", + "parameters": [], + "src": "134:2:2" + }, + "src": "115:59:2", + "visibility": "internal" + }, + { + "body": { + "id": 50, + "nodeType": "Block", + "src": "207:29:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 48, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 45, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31, + "src": "213:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 46, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 97, + "src": "221:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 47, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "221:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "213:18:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 49, + "nodeType": "ExpressionStatement", + "src": "213:18:2" + } + ] + }, + "documentation": null, + "id": 51, + "implemented": true, + "isConstructor": true, + "isDeclaredConst": false, + "modifiers": [], + "name": "Migrations", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 43, + "nodeType": "ParameterList", + "parameters": [], + "src": "197:2:2" + }, + "payable": false, + "returnParameters": { + "id": 44, + "nodeType": "ParameterList", + "parameters": [], + "src": "207:0:2" + }, + "scope": 84, + "src": "178:58:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 62, + "nodeType": "Block", + "src": "296:47:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 60, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 58, + "name": "last_completed_migration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 33, + "src": "302:24:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 59, + "name": "completed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 53, + "src": "329:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "302:36:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 61, + "nodeType": "ExpressionStatement", + "src": "302:36:2" + } + ] + }, + "documentation": null, + "id": 63, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 56, + "modifierName": { + "argumentTypes": null, + "id": 55, + "name": "restricted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "285:10:2", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "285:10:2" + } + ], + "name": "setCompleted", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 54, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 53, + "name": "completed", + "nodeType": "VariableDeclaration", + "scope": 63, + "src": "262:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 52, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "262:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "261:16:2" + }, + "payable": false, + "returnParameters": { + "id": 57, + "nodeType": "ParameterList", + "parameters": [], + "src": "296:0:2" + }, + "scope": 84, + "src": "240:103:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 82, + "nodeType": "Block", + "src": "403:109:2", + "statements": [ + { + "assignments": [ + 71 + ], + "declarations": [ + { + "constant": false, + "id": 71, + "name": "upgraded", + "nodeType": "VariableDeclaration", + "scope": 83, + "src": "409:19:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Migrations_$84", + "typeString": "contract Migrations" + }, + "typeName": { + "contractScope": null, + "id": 70, + "name": "Migrations", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 84, + "src": "409:10:2", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Migrations_$84", + "typeString": "contract Migrations" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 75, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 73, + "name": "new_address", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 65, + "src": "442:11:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 72, + "name": "Migrations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 84, + "src": "431:10:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Migrations_$84_$", + "typeString": "type(contract Migrations)" + } + }, + "id": 74, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "431:23:2", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Migrations_$84", + "typeString": "contract Migrations" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "409:45:2" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 79, + "name": "last_completed_migration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 33, + "src": "482:24:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 76, + "name": "upgraded", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 71, + "src": "460:8:2", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Migrations_$84", + "typeString": "contract Migrations" + } + }, + "id": 78, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "setCompleted", + "nodeType": "MemberAccess", + "referencedDeclaration": 63, + "src": "460:21:2", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256) external" + } + }, + "id": 80, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "460:47:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 81, + "nodeType": "ExpressionStatement", + "src": "460:47:2" + } + ] + }, + "documentation": null, + "id": 83, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 68, + "modifierName": { + "argumentTypes": null, + "id": 67, + "name": "restricted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "392:10:2", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "392:10:2" + } + ], + "name": "upgrade", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 66, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 65, + "name": "new_address", + "nodeType": "VariableDeclaration", + "scope": 83, + "src": "364:19:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 64, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "364:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "363:21:2" + }, + "payable": false, + "returnParameters": { + "id": 69, + "nodeType": "ParameterList", + "parameters": [], + "src": "403:0:2" + }, + "scope": 84, + "src": "347:165:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 85, + "src": "26:488:2" + } + ], + "src": "0:515:2" + }, + "compiler": { + "name": "solc", + "version": "0.4.21+commit.dfe3193c.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "2.0.0", + "updatedAt": "2018-04-14T03:37:39.710Z" +} \ No newline at end of file diff --git a/web3j/dev_truffle/contracts/ConvertLib.sol b/web3j/dev_truffle/contracts/ConvertLib.sol new file mode 100644 index 0000000000..ec0576fc3f --- /dev/null +++ b/web3j/dev_truffle/contracts/ConvertLib.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.4.17; + +library ConvertLib{ + function convert(uint amount,uint conversionRate) returns (uint convertedAmount) + { + return amount * conversionRate; + } +} diff --git a/web3j/dev_truffle/contracts/Example.sol b/web3j/dev_truffle/contracts/Example.sol new file mode 100644 index 0000000000..c09c54843c --- /dev/null +++ b/web3j/dev_truffle/contracts/Example.sol @@ -0,0 +1,11 @@ +pragma solidity ^0.4.17; + +contract Example { + function Example() { + // constructor + } + + function ExampleFunction() { + // example function + } +} \ No newline at end of file diff --git a/web3j/dev_truffle/contracts/Migrations.sol b/web3j/dev_truffle/contracts/Migrations.sol new file mode 100644 index 0000000000..f170cb4fa7 --- /dev/null +++ b/web3j/dev_truffle/contracts/Migrations.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.4.17; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + modifier restricted() { + if (msg.sender == owner) _; + } + + function Migrations() public { + owner = msg.sender; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } + + function upgrade(address new_address) public restricted { + Migrations upgraded = Migrations(new_address); + upgraded.setCompleted(last_completed_migration); + } +} diff --git a/web3j/dev_truffle/migrations/1_initial_migration.js b/web3j/dev_truffle/migrations/1_initial_migration.js new file mode 100644 index 0000000000..269ad95867 --- /dev/null +++ b/web3j/dev_truffle/migrations/1_initial_migration.js @@ -0,0 +1,3 @@ +module.exports = deployer => { + deployer.deploy(artifacts.require("./Migrations.sol")); +}; diff --git a/web3j/dev_truffle/migrations/2_deploy_contracts.js b/web3j/dev_truffle/migrations/2_deploy_contracts.js new file mode 100644 index 0000000000..b6f30176ae --- /dev/null +++ b/web3j/dev_truffle/migrations/2_deploy_contracts.js @@ -0,0 +1,8 @@ +const Example = artifacts.require("./Example.sol"), + ConvertLib = artifacts.require("./ConvertLib.sol"); + +module.exports = deployer => { + deployer.deploy(ConvertLib); + deployer.link(ConvertLib, Example); + deployer.deploy(Example); +}; diff --git a/web3j/dev_truffle/truffle.js b/web3j/dev_truffle/truffle.js new file mode 100644 index 0000000000..8110fdad45 --- /dev/null +++ b/web3j/dev_truffle/truffle.js @@ -0,0 +1,20 @@ +module.exports = { + contracts_build_directory: "./build/contracts", + networks: { + live: { + network_id: 1, // Ethereum public network + host: 'localhost', + port: 8545 + }, + testnet: { + network_id: 3, // Official Ethereum test network (Ropsten) + host: 'localhost', + port: 8545 + }, + development: { + host: 'localhost', + port: 8545, + network_id: '*' + } + } +} diff --git a/web3j/pom.xml b/web3j/pom.xml new file mode 100644 index 0000000000..7d2eea9047 --- /dev/null +++ b/web3j/pom.xml @@ -0,0 +1,210 @@ + + + 4.0.0 + com.baeldung.web3j + Web3j + war + 1.0.0 + web3j + + + 1.3 + 2.9.3 + 2.3.1 + 3.1.0 + 2.4.0 + 1.2 + 4.12 + 1.2.3 + 2.18.1 + 1.10.19 + 1.7.25 + 5.0.5.RELEASE + + + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-web + ${springframework.version} + + + org.springframework + spring-webmvc + ${springframework.version} + + + + + javax.servlet + javax.servlet-api + ${javax-servlet.version} + + + javax.servlet.jsp.jstl + jstl-api + ${jstl.version} + + + javax.servlet.jsp + javax.servlet.jsp-api + ${javax-jsp.version} + + + javax.servlet + jstl + ${jstl.version} + + + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + + + org.web3j + core + 3.3.1 + + + + + org.mockito + mockito-core + ${mockito.version} + + + org.hamcrest + hamcrest-core + + + test + + + junit + junit + ${junit.version} + test + + + org.hamcrest + hamcrest-core + + + + + org.hamcrest + hamcrest-library + ${hamcrest.version} + test + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-test + ${springframework.version} + test + + + com.jayway.jsonpath + json-path + ${jsonpath.version} + + + + + + + + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + org.apache.tomcat.maven + tomcat8-maven-plugin + 3.0-r1655215 + + /javaweb3 + + + + org.apache.maven.plugins + maven-war-plugin + 3.0.0 + + src/main/webapp + false + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire.version} + + + install + install + + test + + + + + test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java + + + test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java + + + test/com/baeldung/web3j/services/EthereumContractUnitTest.java + + + + + + + + + web3j + + \ No newline at end of file diff --git a/web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java b/web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java new file mode 100644 index 0000000000..75ef948f7a --- /dev/null +++ b/web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java @@ -0,0 +1,68 @@ +package com.baeldung.web3j.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.resource.PathResourceResolver; +import org.springframework.web.servlet.view.JstlView; +import org.springframework.web.servlet.view.UrlBasedViewResolver; + +import java.util.concurrent.Executor; + +@Configuration +@EnableWebMvc +@EnableAsync +@ComponentScan("com.baeldung.web3j") +public class AppConfig implements WebMvcConfigurer { + + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + } + + /** + * Static resource locations including themes + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**/*") + .addResourceLocations("/", "/resources/") + .setCachePeriod(3600) + .resourceChain(true) + .addResolver(new PathResourceResolver()); + } + + /** + * View resolver for JSP + */ + @Bean + public UrlBasedViewResolver viewResolver() { + UrlBasedViewResolver resolver = new UrlBasedViewResolver(); + resolver.setPrefix("/WEB-INF/jsp/"); + resolver.setSuffix(".jsp"); + resolver.setViewClass(JstlView.class); + return resolver; + } + + /** + * Configuration for async thread bean + * + * More: https://docs.spring.io/autorepo/docs/spring-framework/5.0.3.RELEASE/javadoc-api/org/springframework/scheduling/SchedulingTaskExecutor.html + */ + @Bean + public Executor asyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(500); + executor.setThreadNamePrefix("CsvThread"); + executor.initialize(); + return executor; + } + +} \ No newline at end of file diff --git a/web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java b/web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java new file mode 100644 index 0000000000..8a9a8cf8c1 --- /dev/null +++ b/web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java @@ -0,0 +1,28 @@ +package com.baeldung.web3j.config; + +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + //AbstractDispatcherServletInitializer override DEFAULT_SERVLET_NAME + @Override + protected String getServletName() { + return "dispatcher"; + } + + @Override + protected Class[] getRootConfigClasses() { + return new Class[]{}; + } + + @Override + protected Class[] getServletConfigClasses() { + return new Class[]{AppConfig.class}; + } + + @Override + protected String[] getServletMappings() { + return new String[]{"/"}; + } + +} \ No newline at end of file diff --git a/web3j/src/main/java/com/baeldung/web3j/constants/Constants.java b/web3j/src/main/java/com/baeldung/web3j/constants/Constants.java new file mode 100644 index 0000000000..005e4263cd --- /dev/null +++ b/web3j/src/main/java/com/baeldung/web3j/constants/Constants.java @@ -0,0 +1,18 @@ +package com.baeldung.web3j.constants; + +public class Constants { + + public static final String API_BLOCK = "/api/block"; + public static final String API_ACCOUNTS = "/api/accounts"; + public static final String API_TRANSACTIONS = "/api/transactions"; + public static final String API_BALANCE = "/api/balance"; + + public static final String GENERIC_EXCEPTION = "Exception encountered!"; + public static final String PLEASE_SUPPLY_REAL_DATA = "Please Supply Real Data!"; + + public static final String DEFAULT_ADDRESS = "0x281055afc982d96fab65b3a49cac8b878184cb16"; + public static final String DEFAULT_CONTRACT_ADDRESS = "00000000000000000000"; + + + +} diff --git a/web3j/src/main/java/com/baeldung/web3j/contracts/Example.java b/web3j/src/main/java/com/baeldung/web3j/contracts/Example.java new file mode 100644 index 0000000000..6909ca3e0c --- /dev/null +++ b/web3j/src/main/java/com/baeldung/web3j/contracts/Example.java @@ -0,0 +1,74 @@ +package com.baeldung.web3j.contracts; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import org.web3j.abi.TypeReference; +import org.web3j.abi.datatypes.Function; +import org.web3j.abi.datatypes.Type; +import org.web3j.crypto.Credentials; +import org.web3j.protocol.Web3j; +import org.web3j.protocol.core.RemoteCall; +import org.web3j.protocol.core.methods.response.TransactionReceipt; +import org.web3j.tx.Contract; +import org.web3j.tx.TransactionManager; + +/** + *

Auto generated code. + *

Do not modify! + *

Please use the web3j command line tools, + * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the + * codegen module to update. + * + *

Generated with web3j version 3.3.1. + */ +public class Example extends Contract { + private static final String BINARY = "0x60606040523415600e57600080fd5b60848061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063b818dacd146044575b600080fd5b3415604e57600080fd5b60546056565b005b5600a165627a7a72305820bebcbbdf06550591bc772dfcb0eadc842f95953869feb7a9528bac91487d95240029"; + + protected static final HashMap _addresses; + + static { + _addresses = new HashMap<>(); + } + + protected Example(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { + super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit); + } + + protected Example(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { + super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit); + } + + public static RemoteCall deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { + return deployRemoteCall(Example.class, web3j, credentials, gasPrice, gasLimit, BINARY, ""); + } + + public static RemoteCall deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { + return deployRemoteCall(Example.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, ""); + } + + public RemoteCall ExampleFunction() { + final Function function = new Function( + "ExampleFunction", + Arrays.asList(), + Collections.>emptyList()); + return executeRemoteCallTransaction(function); + } + + public static Example load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { + return new Example(contractAddress, web3j, credentials, gasPrice, gasLimit); + } + + public static Example load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { + return new Example(contractAddress, web3j, transactionManager, gasPrice, gasLimit); + } + + protected String getStaticDeployedAddress(String networkId) { + return _addresses.get(networkId); + } + + public static String getPreviouslyDeployedAddress(String networkId) { + return _addresses.get(networkId); + } +} diff --git a/web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java b/web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java new file mode 100644 index 0000000000..e05517bc79 --- /dev/null +++ b/web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java @@ -0,0 +1,103 @@ +package com.baeldung.web3j.controllers; + +import com.baeldung.web3j.constants.Constants; +import com.baeldung.web3j.helpers.TimeHelper; +import com.baeldung.web3j.services.Web3Service; +import com.baeldung.web3j.transfers.ResponseTransfer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.web3j.protocol.core.methods.response.EthAccounts; +import org.web3j.protocol.core.methods.response.EthBlockNumber; +import org.web3j.protocol.core.methods.response.EthGetBalance; +import org.web3j.protocol.core.methods.response.EthGetTransactionCount; + +import java.time.Instant; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +import static com.baeldung.web3j.constants.Constants.GENERIC_EXCEPTION; + +@RestController +public class EthereumRestController { + + @Autowired + Web3Service web3Service; + + @RequestMapping(value = Constants.API_BLOCK, method = RequestMethod.GET) + public Future getBlock() { + ResponseTransfer responseTransfer = new ResponseTransfer(); + Instant start = TimeHelper.start(); + + return CompletableFuture.supplyAsync(() -> { + try { + CompletableFuture result = web3Service.getBlockNumber(); + responseTransfer.setMessage(result.get().toString()); + } catch (Exception e) { + responseTransfer.setMessage(GENERIC_EXCEPTION); + } + return responseTransfer; + }).thenApplyAsync(result -> { + result.setPerformance(TimeHelper.stop(start)); + return result; + }); + } + + @RequestMapping(value = Constants.API_ACCOUNTS, method = RequestMethod.GET) + public Future getAccounts() { + ResponseTransfer responseTransfer = new ResponseTransfer(); + Instant start = TimeHelper.start(); + + return CompletableFuture.supplyAsync(() -> { + try { + CompletableFuture result = web3Service.getEthAccounts(); + responseTransfer.setMessage(result.get().toString()); + } catch (Exception e) { + responseTransfer.setMessage(GENERIC_EXCEPTION); + } + return responseTransfer; + + }).thenApplyAsync(result -> { + result.setPerformance(TimeHelper.stop(start)); + return result; + }); + } + + @RequestMapping(value = Constants.API_TRANSACTIONS, method = RequestMethod.GET) + public Future getTransactions() { + ResponseTransfer responseTransfer = new ResponseTransfer(); + Instant start = TimeHelper.start(); + return CompletableFuture.supplyAsync(() -> { + try { + CompletableFuture result = web3Service.getTransactionCount(); + responseTransfer.setMessage(result.get().toString()); + } catch (Exception e) { + responseTransfer.setMessage(GENERIC_EXCEPTION); + } + return responseTransfer; + }).thenApplyAsync(result -> { + result.setPerformance(TimeHelper.stop(start)); + return result; + }); + } + + @RequestMapping(value = Constants.API_BALANCE, method = RequestMethod.GET) + public Future getBalance() { + ResponseTransfer responseTransfer = new ResponseTransfer(); + Instant start = TimeHelper.start(); + return CompletableFuture.supplyAsync(() -> { + try { + CompletableFuture result = web3Service.getEthBalance(); + responseTransfer.setMessage(result.get().toString()); + } catch (Exception e) { + responseTransfer.setMessage(GENERIC_EXCEPTION); + } + return responseTransfer; + }).thenApplyAsync(result -> { + result.setPerformance(TimeHelper.stop(start)); + return result; + }); + } + +} \ No newline at end of file diff --git a/web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java b/web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java new file mode 100644 index 0000000000..360fe088ba --- /dev/null +++ b/web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java @@ -0,0 +1,16 @@ +package com.baeldung.web3j.helpers; + +import java.time.Duration; +import java.time.Instant; + +public class TimeHelper { + + public static Instant start() { + return Instant.now(); + } + + public static Duration stop(Instant start) { + Instant end = Instant.now(); + return Duration.between(start, end); + } +} diff --git a/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java b/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java new file mode 100644 index 0000000000..790210d557 --- /dev/null +++ b/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java @@ -0,0 +1,156 @@ +package com.baeldung.web3j.services; + +import com.baeldung.web3j.contracts.Example; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.web3j.abi.FunctionEncoder; +import org.web3j.abi.datatypes.Function; +import org.web3j.crypto.Credentials; +import org.web3j.crypto.WalletUtils; +import org.web3j.protocol.Web3j; +import org.web3j.protocol.core.DefaultBlockParameter; +import org.web3j.protocol.core.methods.request.Transaction; +import org.web3j.protocol.core.methods.response.EthAccounts; +import org.web3j.protocol.core.methods.response.EthBlockNumber; +import org.web3j.protocol.core.methods.response.EthGetBalance; +import org.web3j.protocol.core.methods.response.EthGetTransactionCount; +import org.web3j.protocol.http.HttpService; +import org.web3j.tx.Contract; +import org.web3j.tx.ManagedTransaction; + +import java.io.File; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import static com.baeldung.web3j.constants.Constants.DEFAULT_ADDRESS; +import static com.baeldung.web3j.constants.Constants.GENERIC_EXCEPTION; +import static com.baeldung.web3j.constants.Constants.PLEASE_SUPPLY_REAL_DATA; + +@Service +public class Web3Service { + + private Web3j web3j = Web3j.build(new HttpService()); + + //Create and Init the default Web3J connection + public void customInit(String provider) { + this.web3j = Web3j.build(new HttpService(provider)); + } + + //Convert to and from supplied contract ABI bytecode + public static String toBinary(String bytecode) { + return bytecode.replaceFirst("^0x", ""); + } + + public static String toByteCode(String binary) { + return "0x" + binary; + } + + @Async + public CompletableFuture getBlockNumber() { + EthBlockNumber result = new EthBlockNumber(); + try { + this.web3j.ethBlockNumber().sendAsync().thenApply(r -> r.getBlockNumber()); + } catch (Exception ex) { + System.out.println(GENERIC_EXCEPTION); + } + return CompletableFuture.completedFuture(result); + } + + @Async + public CompletableFuture getEthAccounts() { + EthAccounts result = new EthAccounts(); + try { + this.web3j.ethAccounts().sendAsync().thenApply(r -> r.getAccounts()); + } catch (Exception ex) { + System.out.println(GENERIC_EXCEPTION); + } + return CompletableFuture.completedFuture(result); + } + + @Async + public CompletableFuture getTransactionCount() { + EthGetTransactionCount result = new EthGetTransactionCount(); + try { + this.web3j.ethGetTransactionCount(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().thenApply(r -> r.getTransactionCount()); + } catch (Exception ex) { + System.out.println(GENERIC_EXCEPTION); + } + return CompletableFuture.completedFuture(result); + } + + @Async + public CompletableFuture getEthBalance() { + EthGetBalance result = new EthGetBalance(); + try { + this.web3j.ethGetBalance(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().thenApply(r -> r.getBalance()); + } catch (Exception ex) { + System.out.println(GENERIC_EXCEPTION); + } + return CompletableFuture.completedFuture(result); + } + + @Async + public CompletableFuture fromScratchContractExample() { + + String contractAddress = ""; + + try { + //Create a wallet + WalletUtils.generateNewWalletFile("PASSWORD", new File("/path/to/destination"), true); + //Load the credentials from it + Credentials credentials = WalletUtils.loadCredentials("PASSWORD", "/path/to/walletfile"); + + //Deploy contract to address specified by wallet + Example contract = Example.deploy(this.web3j, + credentials, + ManagedTransaction.GAS_PRICE, + Contract.GAS_LIMIT).send(); + + //Het the address + contractAddress = contract.getContractAddress(); + + } catch (Exception ex) { + System.out.println(PLEASE_SUPPLY_REAL_DATA); + return CompletableFuture.completedFuture(PLEASE_SUPPLY_REAL_DATA); + } + return CompletableFuture.completedFuture(contractAddress); + } + + @Async + public CompletableFuture sendTx() { + String transactionHash = ""; + + try { + List inputParams = new ArrayList(); + List outputParams = new ArrayList(); + Function function = new Function("fuctionName", inputParams, outputParams); + + String encodedFunction = FunctionEncoder.encode(function); + + BigInteger nonce = BigInteger.valueOf(100); + BigInteger gasprice = BigInteger.valueOf(100); + BigInteger gaslimit = BigInteger.valueOf(100); + + Transaction transaction = Transaction.createFunctionCallTransaction("FROM_ADDRESS", nonce, gasprice, gaslimit, "TO_ADDRESS", encodedFunction); + + org.web3j.protocol.core.methods.response.EthSendTransaction transactionResponse = web3j.ethSendTransaction(transaction).sendAsync().get(); + transactionHash = transactionResponse.getTransactionHash(); + + } catch (Exception ex) { + System.out.println(PLEASE_SUPPLY_REAL_DATA); + return CompletableFuture.completedFuture(PLEASE_SUPPLY_REAL_DATA); + } + + return CompletableFuture.completedFuture(transactionHash); + } +} + + + + + + + + diff --git a/web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java b/web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java new file mode 100644 index 0000000000..9c5d1799ff --- /dev/null +++ b/web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java @@ -0,0 +1,28 @@ +package com.baeldung.web3j.transfers; + +import java.time.Duration; + +public class ResponseTransfer { + + public ResponseTransfer() {} + + private Duration performance; + private String message; + + public Duration getPerformance() { + return performance; + } + + public void setPerformance(Duration performance) { + this.performance = performance; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + +} diff --git a/web3j/src/main/webapp/WEB-INF/.gitkeep b/web3j/src/main/webapp/WEB-INF/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/web3j/src/main/webapp/resources/.gitkeep b/web3j/src/main/webapp/resources/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java b/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java new file mode 100644 index 0000000000..ee78ab17c2 --- /dev/null +++ b/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java @@ -0,0 +1,78 @@ +package com.baeldung.web3j.controllers; + + +import com.baeldung.web3j.config.AppConfig; +import com.baeldung.web3j.constants.Constants; +import org.junit.After; +import org.junit.Before; +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 org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {AppConfig.class}) +@WebAppConfiguration +public class EthereumRestControllerIntegrationTest { + + private MockMvc mockMvc; + + private void constructAsyncTest(String endpoint) { + try { + MvcResult asyncResult = mockMvc + .perform(get(endpoint)) + .andReturn(); + + mockMvc.perform(asyncDispatch(asyncResult)) + .andDo(print()) + .andExpect(status().isOk()); + + } catch (Exception e) { + System.out.println("Exception: " + e); + } + } + + @Autowired + private WebApplicationContext wac; + + @Before + public void preTest() throws Exception { + mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + } + + @Test + public void accounts() { + constructAsyncTest(Constants.API_ACCOUNTS); + } + + @Test + public void transactions() { + constructAsyncTest(Constants.API_TRANSACTIONS); + } + + @Test + public void block() { + constructAsyncTest(Constants.API_BLOCK); + } + + @Test + public void balance() { + constructAsyncTest(Constants.API_BALANCE); + } + + @After + public void postTest() { + mockMvc = null; + } +} \ No newline at end of file diff --git a/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java b/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java new file mode 100644 index 0000000000..4ceed870f8 --- /dev/null +++ b/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java @@ -0,0 +1,76 @@ +package com.baeldung.web3j.controllers; + +import com.baeldung.web3j.constants.Constants; +import com.baeldung.web3j.services.Web3Service; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class EthereumRestControllerUnitTest { + + private MockMvc mockMvc; + + private void constructAsyncTest(String endpoint) { + try { + MvcResult asyncResult = mockMvc + .perform(get(endpoint)) + .andReturn(); + + mockMvc.perform(asyncDispatch(asyncResult)) + .andDo(print()) + .andExpect(status().isOk()); + + } catch (Exception e) { + System.out.println("Exception: " + e); + } + } + + @Mock + private Web3Service web3Service; + + @InjectMocks + private EthereumRestController ethereumRestController; + + @Before + public void preTest() { + MockitoAnnotations.initMocks(this); + mockMvc = MockMvcBuilders.standaloneSetup(ethereumRestController).build(); + } + + @Test + public void accounts() { + constructAsyncTest(Constants.API_ACCOUNTS); + } + + @Test + public void transactions() { + constructAsyncTest(Constants.API_TRANSACTIONS); + } + + @Test + public void block() { + constructAsyncTest(Constants.API_BLOCK); + } + + @Test + public void balance() { + constructAsyncTest(Constants.API_BALANCE); + } + + @After + public void postTest() { + mockMvc = null; + } + +} diff --git a/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java b/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java new file mode 100644 index 0000000000..5c74e1c7ce --- /dev/null +++ b/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.web3j.services; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.concurrent.CompletableFuture; + +import static com.baeldung.web3j.constants.Constants.PLEASE_SUPPLY_REAL_DATA; + +public class EthereumContractUnitTest { + + private Web3Service web3Service; + + @Before + public void setup() { + web3Service = new Web3Service(); + } + + @Test + public void testContract() { + CompletableFuture result = web3Service.fromScratchContractExample(); + assert (result instanceof CompletableFuture); + } + + @Test + public void sendTx() { + CompletableFuture result = web3Service.sendTx(); + assert (result instanceof CompletableFuture); + } + + @After + public void cleanup() { + } +} From 594b6dda121751e164e79d72ce3972f4ad36afad Mon Sep 17 00:00:00 2001 From: Thoughtscript Date: Fri, 27 Apr 2018 05:54:35 +0100 Subject: [PATCH 002/136] BAEL-1461 refactored --- {ethereumj => ethereum}/README.md | 4 +- {ethereumj => ethereum/ethereumj}/.gitgnore | 0 {web3j => ethereum/ethereumj}/README.md | 4 +- {ethereumj => ethereum/ethereumj}/pom.xml | 70 +++++++------------ .../baeldung/ethereumj/ApplicationMain.java | 0 .../com/baeldung/ethereumj/Constants.java | 0 .../com/baeldung/ethereumj/beans/EthBean.java | 0 .../baeldung/ethereumj/config/EthConfig.java | 0 .../ethereumj/controllers/EthController.java | 0 .../ethereumj/listeners/EthListener.java | 0 .../ethereumj/transfer/EthResponse.java | 0 .../java/com/baeldung/web3j/Template.java | 0 .../baeldung/web3j/contracts/Greeting.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/solidity/Greeting.sol | 0 .../resources/solidity/build/Greeting.abi | 0 .../resources/solidity/build/Greeting.bin | 0 .../controllers/EthControllerLiveTest.java | 0 ethereum/pom.xml | 9 +++ {web3j => ethereum/web3j}/.gitignore | 0 .../web3j}/dev_ganache/README.md | 0 .../web3j}/dev_truffle/README.md | 0 .../build/contracts/ConvertLib.json | 0 .../dev_truffle/build/contracts/Example.json | 0 .../build/contracts/Migrations.json | 0 .../dev_truffle/contracts/ConvertLib.sol | 0 .../web3j}/dev_truffle/contracts/Example.sol | 0 .../dev_truffle/contracts/Migrations.sol | 0 .../migrations/1_initial_migration.js | 0 .../migrations/2_deploy_contracts.js | 0 .../web3j}/dev_truffle/truffle.js | 0 {web3j => ethereum/web3j}/pom.xml | 2 +- .../com/baeldung/web3j/config/AppConfig.java | 0 .../web3j/config/WebAppInitializer.java | 0 .../baeldung/web3j/constants/Constants.java | 0 .../com/baeldung/web3j/contracts/Example.java | 0 .../controllers/EthereumRestController.java | 0 .../baeldung/web3j/helpers/TimeHelper.java | 0 .../baeldung/web3j/services/Web3Service.java | 13 ++-- .../web3j/transfers/ResponseTransfer.java | 0 .../web3j}/src/main/webapp/WEB-INF/.gitkeep | 0 .../web3j}/src/main/webapp/resources/.gitkeep | 0 ...EthereumRestControllerIntegrationTest.java | 0 .../EthereumRestControllerUnitTest.java | 0 .../services/EthereumContractUnitTest.java | 0 pom.xml | 3 +- xml/pom.xml | 2 - 47 files changed, 45 insertions(+), 62 deletions(-) rename {ethereumj => ethereum}/README.md (53%) rename {ethereumj => ethereum/ethereumj}/.gitgnore (100%) rename {web3j => ethereum/ethereumj}/README.md (53%) rename {ethereumj => ethereum/ethereumj}/pom.xml (59%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/ethereumj/ApplicationMain.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/ethereumj/Constants.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/ethereumj/beans/EthBean.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/ethereumj/config/EthConfig.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/ethereumj/controllers/EthController.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/web3j/Template.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/java/com/baeldung/web3j/contracts/Greeting.java (100%) rename {ethereumj => ethereum/ethereumj}/src/main/resources/application.properties (100%) rename {ethereumj => ethereum/ethereumj}/src/main/resources/solidity/Greeting.sol (100%) rename {ethereumj => ethereum/ethereumj}/src/main/resources/solidity/build/Greeting.abi (100%) rename {ethereumj => ethereum/ethereumj}/src/main/resources/solidity/build/Greeting.bin (100%) rename {ethereumj => ethereum/ethereumj}/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java (100%) create mode 100644 ethereum/pom.xml rename {web3j => ethereum/web3j}/.gitignore (100%) rename {web3j => ethereum/web3j}/dev_ganache/README.md (100%) rename {web3j => ethereum/web3j}/dev_truffle/README.md (100%) rename {web3j => ethereum/web3j}/dev_truffle/build/contracts/ConvertLib.json (100%) rename {web3j => ethereum/web3j}/dev_truffle/build/contracts/Example.json (100%) rename {web3j => ethereum/web3j}/dev_truffle/build/contracts/Migrations.json (100%) rename {web3j => ethereum/web3j}/dev_truffle/contracts/ConvertLib.sol (100%) rename {web3j => ethereum/web3j}/dev_truffle/contracts/Example.sol (100%) rename {web3j => ethereum/web3j}/dev_truffle/contracts/Migrations.sol (100%) rename {web3j => ethereum/web3j}/dev_truffle/migrations/1_initial_migration.js (100%) rename {web3j => ethereum/web3j}/dev_truffle/migrations/2_deploy_contracts.js (100%) rename {web3j => ethereum/web3j}/dev_truffle/truffle.js (100%) rename {web3j => ethereum/web3j}/pom.xml (99%) rename {web3j => ethereum/web3j}/src/main/java/com/baeldung/web3j/config/AppConfig.java (100%) rename {web3j => ethereum/web3j}/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java (100%) rename {web3j => ethereum/web3j}/src/main/java/com/baeldung/web3j/constants/Constants.java (100%) rename {web3j => ethereum/web3j}/src/main/java/com/baeldung/web3j/contracts/Example.java (100%) rename {web3j => ethereum/web3j}/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java (100%) rename {web3j => ethereum/web3j}/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java (100%) rename {web3j => ethereum/web3j}/src/main/java/com/baeldung/web3j/services/Web3Service.java (90%) rename {web3j => ethereum/web3j}/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java (100%) rename {web3j => ethereum/web3j}/src/main/webapp/WEB-INF/.gitkeep (100%) rename {web3j => ethereum/web3j}/src/main/webapp/resources/.gitkeep (100%) rename {web3j => ethereum/web3j}/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java (100%) rename {web3j => ethereum/web3j}/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java (100%) rename {web3j => ethereum/web3j}/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java (100%) diff --git a/ethereumj/README.md b/ethereum/README.md similarity index 53% rename from ethereumj/README.md rename to ethereum/README.md index d2e2753438..eb695e4bc3 100644 --- a/ethereumj/README.md +++ b/ethereum/README.md @@ -1,4 +1,6 @@ -## EthereumJ +## Ethereum ### Relevant Articles: - [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) +- [Lightweight Web3](http://www.baeldung.com/lightweight-web3/) + diff --git a/ethereumj/.gitgnore b/ethereum/ethereumj/.gitgnore similarity index 100% rename from ethereumj/.gitgnore rename to ethereum/ethereumj/.gitgnore diff --git a/web3j/README.md b/ethereum/ethereumj/README.md similarity index 53% rename from web3j/README.md rename to ethereum/ethereumj/README.md index bc9909af25..eb695e4bc3 100644 --- a/web3j/README.md +++ b/ethereum/ethereumj/README.md @@ -1,4 +1,6 @@ -## Web3j +## Ethereum ### Relevant Articles: +- [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) - [Lightweight Web3](http://www.baeldung.com/lightweight-web3/) + diff --git a/ethereumj/pom.xml b/ethereum/ethereumj/pom.xml similarity index 59% rename from ethereumj/pom.xml rename to ethereum/ethereumj/pom.xml index 8b6d3677c9..903e23bfda 100644 --- a/ethereumj/pom.xml +++ b/ethereum/ethereumj/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 com.baeldung.ethereumj ethereumj @@ -11,9 +13,18 @@ parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-5 + ../../parent-boot-5 + + UTF-8 + 1.8 + 8.5.4 + 1.5.0-RELEASE + 3.3.1 + 2.5.0 + + Ethereum @@ -23,7 +34,6 @@ - org.springframework.boot @@ -33,28 +43,24 @@ org.springframework.boot spring-boot-starter-tomcat - org.springframework.boot spring-boot-starter-test test - org.ethereum ethereumj-core - 1.5.0-RELEASE + ${ethereumj-core.version} - org.web3j core - 3.3.1 + ${web3j.core.version} - javax.servlet @@ -63,12 +69,20 @@ com.fasterxml.jackson.core jackson-databind - 2.5.0 + ${jackson-databind.version} + + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + org.springframework.boot spring-boot-maven-plugin @@ -77,40 +91,4 @@ ethereumj - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - */EthControllerTestOne.java - - - - - - - - - - - - UTF-8 - 1.8 - 8.5.4 - - \ No newline at end of file diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java b/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java rename to ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java b/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java rename to ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java b/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java rename to ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java b/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java rename to ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java b/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java rename to ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java b/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java rename to ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java diff --git a/ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java b/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java rename to ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java diff --git a/ethereumj/src/main/java/com/baeldung/web3j/Template.java b/ethereum/ethereumj/src/main/java/com/baeldung/web3j/Template.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/web3j/Template.java rename to ethereum/ethereumj/src/main/java/com/baeldung/web3j/Template.java diff --git a/ethereumj/src/main/java/com/baeldung/web3j/contracts/Greeting.java b/ethereum/ethereumj/src/main/java/com/baeldung/web3j/contracts/Greeting.java similarity index 100% rename from ethereumj/src/main/java/com/baeldung/web3j/contracts/Greeting.java rename to ethereum/ethereumj/src/main/java/com/baeldung/web3j/contracts/Greeting.java diff --git a/ethereumj/src/main/resources/application.properties b/ethereum/ethereumj/src/main/resources/application.properties similarity index 100% rename from ethereumj/src/main/resources/application.properties rename to ethereum/ethereumj/src/main/resources/application.properties diff --git a/ethereumj/src/main/resources/solidity/Greeting.sol b/ethereum/ethereumj/src/main/resources/solidity/Greeting.sol similarity index 100% rename from ethereumj/src/main/resources/solidity/Greeting.sol rename to ethereum/ethereumj/src/main/resources/solidity/Greeting.sol diff --git a/ethereumj/src/main/resources/solidity/build/Greeting.abi b/ethereum/ethereumj/src/main/resources/solidity/build/Greeting.abi similarity index 100% rename from ethereumj/src/main/resources/solidity/build/Greeting.abi rename to ethereum/ethereumj/src/main/resources/solidity/build/Greeting.abi diff --git a/ethereumj/src/main/resources/solidity/build/Greeting.bin b/ethereum/ethereumj/src/main/resources/solidity/build/Greeting.bin similarity index 100% rename from ethereumj/src/main/resources/solidity/build/Greeting.bin rename to ethereum/ethereumj/src/main/resources/solidity/build/Greeting.bin diff --git a/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java b/ethereum/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java similarity index 100% rename from ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java rename to ethereum/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java diff --git a/ethereum/pom.xml b/ethereum/pom.xml new file mode 100644 index 0000000000..7737348771 --- /dev/null +++ b/ethereum/pom.xml @@ -0,0 +1,9 @@ + + 4.0.0 + com.baeldung.ethereum + ethereum + 0.0.1-SNAPSHOT + ethereum + + diff --git a/web3j/.gitignore b/ethereum/web3j/.gitignore similarity index 100% rename from web3j/.gitignore rename to ethereum/web3j/.gitignore diff --git a/web3j/dev_ganache/README.md b/ethereum/web3j/dev_ganache/README.md similarity index 100% rename from web3j/dev_ganache/README.md rename to ethereum/web3j/dev_ganache/README.md diff --git a/web3j/dev_truffle/README.md b/ethereum/web3j/dev_truffle/README.md similarity index 100% rename from web3j/dev_truffle/README.md rename to ethereum/web3j/dev_truffle/README.md diff --git a/web3j/dev_truffle/build/contracts/ConvertLib.json b/ethereum/web3j/dev_truffle/build/contracts/ConvertLib.json similarity index 100% rename from web3j/dev_truffle/build/contracts/ConvertLib.json rename to ethereum/web3j/dev_truffle/build/contracts/ConvertLib.json diff --git a/web3j/dev_truffle/build/contracts/Example.json b/ethereum/web3j/dev_truffle/build/contracts/Example.json similarity index 100% rename from web3j/dev_truffle/build/contracts/Example.json rename to ethereum/web3j/dev_truffle/build/contracts/Example.json diff --git a/web3j/dev_truffle/build/contracts/Migrations.json b/ethereum/web3j/dev_truffle/build/contracts/Migrations.json similarity index 100% rename from web3j/dev_truffle/build/contracts/Migrations.json rename to ethereum/web3j/dev_truffle/build/contracts/Migrations.json diff --git a/web3j/dev_truffle/contracts/ConvertLib.sol b/ethereum/web3j/dev_truffle/contracts/ConvertLib.sol similarity index 100% rename from web3j/dev_truffle/contracts/ConvertLib.sol rename to ethereum/web3j/dev_truffle/contracts/ConvertLib.sol diff --git a/web3j/dev_truffle/contracts/Example.sol b/ethereum/web3j/dev_truffle/contracts/Example.sol similarity index 100% rename from web3j/dev_truffle/contracts/Example.sol rename to ethereum/web3j/dev_truffle/contracts/Example.sol diff --git a/web3j/dev_truffle/contracts/Migrations.sol b/ethereum/web3j/dev_truffle/contracts/Migrations.sol similarity index 100% rename from web3j/dev_truffle/contracts/Migrations.sol rename to ethereum/web3j/dev_truffle/contracts/Migrations.sol diff --git a/web3j/dev_truffle/migrations/1_initial_migration.js b/ethereum/web3j/dev_truffle/migrations/1_initial_migration.js similarity index 100% rename from web3j/dev_truffle/migrations/1_initial_migration.js rename to ethereum/web3j/dev_truffle/migrations/1_initial_migration.js diff --git a/web3j/dev_truffle/migrations/2_deploy_contracts.js b/ethereum/web3j/dev_truffle/migrations/2_deploy_contracts.js similarity index 100% rename from web3j/dev_truffle/migrations/2_deploy_contracts.js rename to ethereum/web3j/dev_truffle/migrations/2_deploy_contracts.js diff --git a/web3j/dev_truffle/truffle.js b/ethereum/web3j/dev_truffle/truffle.js similarity index 100% rename from web3j/dev_truffle/truffle.js rename to ethereum/web3j/dev_truffle/truffle.js diff --git a/web3j/pom.xml b/ethereum/web3j/pom.xml similarity index 99% rename from web3j/pom.xml rename to ethereum/web3j/pom.xml index 7d2eea9047..b65f120218 100644 --- a/web3j/pom.xml +++ b/ethereum/web3j/pom.xml @@ -8,7 +8,7 @@ 1.0.0 web3j - + 1.3 2.9.3 2.3.1 diff --git a/web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java b/ethereum/web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java similarity index 100% rename from web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java rename to ethereum/web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java diff --git a/web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java b/ethereum/web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java similarity index 100% rename from web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java rename to ethereum/web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java diff --git a/web3j/src/main/java/com/baeldung/web3j/constants/Constants.java b/ethereum/web3j/src/main/java/com/baeldung/web3j/constants/Constants.java similarity index 100% rename from web3j/src/main/java/com/baeldung/web3j/constants/Constants.java rename to ethereum/web3j/src/main/java/com/baeldung/web3j/constants/Constants.java diff --git a/web3j/src/main/java/com/baeldung/web3j/contracts/Example.java b/ethereum/web3j/src/main/java/com/baeldung/web3j/contracts/Example.java similarity index 100% rename from web3j/src/main/java/com/baeldung/web3j/contracts/Example.java rename to ethereum/web3j/src/main/java/com/baeldung/web3j/contracts/Example.java diff --git a/web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java b/ethereum/web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java similarity index 100% rename from web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java rename to ethereum/web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java diff --git a/web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java b/ethereum/web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java similarity index 100% rename from web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java rename to ethereum/web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java diff --git a/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java b/ethereum/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java similarity index 90% rename from web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java rename to ethereum/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java index 790210d557..c943ee4006 100644 --- a/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java +++ b/ethereum/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java @@ -47,51 +47,46 @@ public class Web3Service { return "0x" + binary; } - @Async public CompletableFuture getBlockNumber() { EthBlockNumber result = new EthBlockNumber(); try { - this.web3j.ethBlockNumber().sendAsync().thenApply(r -> r.getBlockNumber()); + result = this.web3j.ethBlockNumber().sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } return CompletableFuture.completedFuture(result); } - @Async public CompletableFuture getEthAccounts() { EthAccounts result = new EthAccounts(); try { - this.web3j.ethAccounts().sendAsync().thenApply(r -> r.getAccounts()); + result = this.web3j.ethAccounts().sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } return CompletableFuture.completedFuture(result); } - @Async public CompletableFuture getTransactionCount() { EthGetTransactionCount result = new EthGetTransactionCount(); try { - this.web3j.ethGetTransactionCount(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().thenApply(r -> r.getTransactionCount()); + result = this.web3j.ethGetTransactionCount(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } return CompletableFuture.completedFuture(result); } - @Async public CompletableFuture getEthBalance() { EthGetBalance result = new EthGetBalance(); try { - this.web3j.ethGetBalance(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().thenApply(r -> r.getBalance()); + result = this.web3j.ethGetBalance(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } return CompletableFuture.completedFuture(result); } - @Async public CompletableFuture fromScratchContractExample() { String contractAddress = ""; diff --git a/web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java b/ethereum/web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java similarity index 100% rename from web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java rename to ethereum/web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java diff --git a/web3j/src/main/webapp/WEB-INF/.gitkeep b/ethereum/web3j/src/main/webapp/WEB-INF/.gitkeep similarity index 100% rename from web3j/src/main/webapp/WEB-INF/.gitkeep rename to ethereum/web3j/src/main/webapp/WEB-INF/.gitkeep diff --git a/web3j/src/main/webapp/resources/.gitkeep b/ethereum/web3j/src/main/webapp/resources/.gitkeep similarity index 100% rename from web3j/src/main/webapp/resources/.gitkeep rename to ethereum/web3j/src/main/webapp/resources/.gitkeep diff --git a/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java b/ethereum/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java similarity index 100% rename from web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java rename to ethereum/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java diff --git a/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java b/ethereum/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java similarity index 100% rename from web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java rename to ethereum/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java diff --git a/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java b/ethereum/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java similarity index 100% rename from web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java rename to ethereum/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java diff --git a/pom.xml b/pom.xml index 750c95679c..72c24aee76 100644 --- a/pom.xml +++ b/pom.xml @@ -73,8 +73,7 @@ deltaspike dozer - ethereumj - web3j + ethereum diff --git a/xml/pom.xml b/xml/pom.xml index c001c264d2..166cb6dd4e 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -285,8 +285,6 @@ 2.4 1.8 - - 1.3.1 From 2636f0cc7ca2bffaefa641384f8c564bfb11535d Mon Sep 17 00:00:00 2001 From: Thoughtscript Date: Wed, 2 May 2018 20:42:11 +0100 Subject: [PATCH 003/136] BAEL-1461: Combined modules and refactored --- ethereum/{ethereumj => }/.gitgnore | 0 ethereum/ethereumj/README.md | 6 - ethereum/ethereumj/pom.xml | 94 ------- ethereum/pom.xml | 233 ++++++++++++++++++ .../baeldung/ethereumj/ApplicationMain.java | 0 .../com/baeldung/ethereumj/Constants.java | 0 .../com/baeldung/ethereumj/beans/EthBean.java | 0 .../baeldung/ethereumj/config/EthConfig.java | 0 .../ethereumj/controllers/EthController.java | 0 .../ethereumj/listeners/EthListener.java | 0 .../ethereumj/transfer/EthResponse.java | 0 .../java/com/baeldung/web3j/Template.java | 0 .../com/baeldung/web3j/config/AppConfig.java | 0 .../web3j/config/WebAppInitializer.java | 0 .../baeldung/web3j/constants/Constants.java | 0 .../com/baeldung/web3j/contracts/Example.java | 0 .../baeldung/web3j/contracts/Greeting.java | 0 .../controllers/EthereumRestController.java | 0 .../baeldung/web3j/helpers/TimeHelper.java | 0 .../baeldung/web3j/services/Web3Service.java | 0 .../web3j/transfers/ResponseTransfer.java | 0 .../src/main/resources/application.properties | 0 .../main/resources}/dev_ganache/README.md | 0 .../main/resources}/dev_truffle/README.md | 0 .../build/contracts/ConvertLib.json | 0 .../dev_truffle/build/contracts/Example.json | 0 .../build/contracts/Migrations.json | 0 .../dev_truffle/contracts/ConvertLib.sol | 0 .../dev_truffle/contracts/Example.sol | 0 .../dev_truffle/contracts/Migrations.sol | 0 .../migrations/1_initial_migration.js | 0 .../migrations/2_deploy_contracts.js | 0 .../main/resources}/dev_truffle/truffle.js | 0 .../src/main/resources/solidity/Greeting.sol | 0 .../resources/solidity/build/Greeting.abi | 0 .../resources/solidity/build/Greeting.bin | 0 .../src/main/webapp/WEB-INF/.gitkeep | 0 .../src/main/webapp/resources/.gitkeep | 0 .../controllers/EthControllerLiveTest.java | 2 +- ...EthereumRestControllerIntegrationTest.java | 0 .../EthereumRestControllerUnitTest.java | 0 .../services/EthereumContractUnitTest.java | 4 - ethereum/web3j/.gitignore | 3 - ethereum/web3j/pom.xml | 210 ---------------- 44 files changed, 234 insertions(+), 318 deletions(-) rename ethereum/{ethereumj => }/.gitgnore (100%) delete mode 100644 ethereum/ethereumj/README.md delete mode 100644 ethereum/ethereumj/pom.xml rename ethereum/{ethereumj => }/src/main/java/com/baeldung/ethereumj/ApplicationMain.java (100%) rename ethereum/{ethereumj => }/src/main/java/com/baeldung/ethereumj/Constants.java (100%) rename ethereum/{ethereumj => }/src/main/java/com/baeldung/ethereumj/beans/EthBean.java (100%) rename ethereum/{ethereumj => }/src/main/java/com/baeldung/ethereumj/config/EthConfig.java (100%) rename ethereum/{ethereumj => }/src/main/java/com/baeldung/ethereumj/controllers/EthController.java (100%) rename ethereum/{ethereumj => }/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java (100%) rename ethereum/{ethereumj => }/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java (100%) rename ethereum/{ethereumj => }/src/main/java/com/baeldung/web3j/Template.java (100%) rename ethereum/{web3j => }/src/main/java/com/baeldung/web3j/config/AppConfig.java (100%) rename ethereum/{web3j => }/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java (100%) rename ethereum/{web3j => }/src/main/java/com/baeldung/web3j/constants/Constants.java (100%) rename ethereum/{web3j => }/src/main/java/com/baeldung/web3j/contracts/Example.java (100%) rename ethereum/{ethereumj => }/src/main/java/com/baeldung/web3j/contracts/Greeting.java (100%) rename ethereum/{web3j => }/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java (100%) rename ethereum/{web3j => }/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java (100%) rename ethereum/{web3j => }/src/main/java/com/baeldung/web3j/services/Web3Service.java (100%) rename ethereum/{web3j => }/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java (100%) rename ethereum/{ethereumj => }/src/main/resources/application.properties (100%) rename ethereum/{web3j => src/main/resources}/dev_ganache/README.md (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/README.md (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/build/contracts/ConvertLib.json (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/build/contracts/Example.json (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/build/contracts/Migrations.json (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/contracts/ConvertLib.sol (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/contracts/Example.sol (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/contracts/Migrations.sol (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/migrations/1_initial_migration.js (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/migrations/2_deploy_contracts.js (100%) rename ethereum/{web3j => src/main/resources}/dev_truffle/truffle.js (100%) rename ethereum/{ethereumj => }/src/main/resources/solidity/Greeting.sol (100%) rename ethereum/{ethereumj => }/src/main/resources/solidity/build/Greeting.abi (100%) rename ethereum/{ethereumj => }/src/main/resources/solidity/build/Greeting.bin (100%) rename ethereum/{web3j => }/src/main/webapp/WEB-INF/.gitkeep (100%) rename ethereum/{web3j => }/src/main/webapp/resources/.gitkeep (100%) rename ethereum/{ethereumj => }/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java (99%) rename ethereum/{web3j/src/test => src/test/java}/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java (100%) rename ethereum/{web3j/src/test => src/test/java}/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java (100%) rename ethereum/{web3j/src/test => src/test/java}/com/baeldung/web3j/services/EthereumContractUnitTest.java (81%) delete mode 100644 ethereum/web3j/.gitignore delete mode 100644 ethereum/web3j/pom.xml diff --git a/ethereum/ethereumj/.gitgnore b/ethereum/.gitgnore similarity index 100% rename from ethereum/ethereumj/.gitgnore rename to ethereum/.gitgnore diff --git a/ethereum/ethereumj/README.md b/ethereum/ethereumj/README.md deleted file mode 100644 index eb695e4bc3..0000000000 --- a/ethereum/ethereumj/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Ethereum - -### Relevant Articles: -- [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) -- [Lightweight Web3](http://www.baeldung.com/lightweight-web3/) - diff --git a/ethereum/ethereumj/pom.xml b/ethereum/ethereumj/pom.xml deleted file mode 100644 index 903e23bfda..0000000000 --- a/ethereum/ethereumj/pom.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - 4.0.0 - com.baeldung.ethereumj - ethereumj - war - 1.0.0 - ethereumj - - - parent-boot-5 - com.baeldung - 0.0.1-SNAPSHOT - ../../parent-boot-5 - - - - UTF-8 - 1.8 - 8.5.4 - 1.5.0-RELEASE - 3.3.1 - 2.5.0 - - - - - Ethereum - Ethereum - https://dl.bintray.com/ethereum/maven/ - - - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.ethereum - ethereumj-core - ${ethereumj-core.version} - - - - org.web3j - core - ${web3j.core.version} - - - - javax.servlet - jstl - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-databind.version} - - - - - - - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - - - org.springframework.boot - spring-boot-maven-plugin - - - ethereumj - - - \ No newline at end of file diff --git a/ethereum/pom.xml b/ethereum/pom.xml index 7737348771..02b9e5afe1 100644 --- a/ethereum/pom.xml +++ b/ethereum/pom.xml @@ -6,4 +6,237 @@ 0.0.1-SNAPSHOT ethereum + + + + + UTF-8 + 1.8 + 8.5.4 + 1.5.0-RELEASE + 3.3.1 + 5.0.5.RELEASE + 1.5.6.RELEASE + 2.18.1 + 1.10.19 + 2.5.0 + 1.3 + 2.9.3 + 2.3.1 + 3.1.0 + 2.4.0 + 1.2 + 4.12 + 1.2.3 + 1.7.25 + + + + + Ethereum + Ethereum + https://dl.bintray.com/ethereum/maven/ + + + + + + + + org.springframework.boot + spring-boot-starter + ${spring.boot.version} + + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-tomcat + ${spring.boot.version} + + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-web + ${springframework.version} + + + org.springframework + spring-webmvc + ${springframework.version} + + + + + org.ethereum + ethereumj-core + ${ethereumj-core.version} + + + org.web3j + core + ${web3j.core.version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + + + javax.servlet + jstl + ${jstl.version} + + + javax.servlet + javax.servlet-api + ${javax-servlet.version} + + + javax.servlet.jsp.jstl + jstl-api + ${jstl.version} + + + javax.servlet.jsp + javax.servlet.jsp-api + ${javax-jsp.version} + + + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + org.springframework.boot + spring-boot-starter-test + test + ${spring.boot.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-test + ${springframework.version} + test + + + + + org.mockito + mockito-core + ${mockito.version} + + + org.hamcrest + hamcrest-core + + + test + + + junit + junit + ${junit.version} + test + + + org.hamcrest + hamcrest-core + + + + + org.hamcrest + hamcrest-library + ${hamcrest.version} + test + + + com.jayway.jsonpath + json-path + ${jsonpath.version} + + + + + + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-war-plugin + 3.0.0 + + src/main/webapp + false + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire.version} + + + install + install + + test + + + + + + ethereum + diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java b/ethereum/src/main/java/com/baeldung/ethereumj/ApplicationMain.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/ApplicationMain.java rename to ethereum/src/main/java/com/baeldung/ethereumj/ApplicationMain.java diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java b/ethereum/src/main/java/com/baeldung/ethereumj/Constants.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/Constants.java rename to ethereum/src/main/java/com/baeldung/ethereumj/Constants.java diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java b/ethereum/src/main/java/com/baeldung/ethereumj/beans/EthBean.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/beans/EthBean.java rename to ethereum/src/main/java/com/baeldung/ethereumj/beans/EthBean.java diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java b/ethereum/src/main/java/com/baeldung/ethereumj/config/EthConfig.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/config/EthConfig.java rename to ethereum/src/main/java/com/baeldung/ethereumj/config/EthConfig.java diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java b/ethereum/src/main/java/com/baeldung/ethereumj/controllers/EthController.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/controllers/EthController.java rename to ethereum/src/main/java/com/baeldung/ethereumj/controllers/EthController.java diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java b/ethereum/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java rename to ethereum/src/main/java/com/baeldung/ethereumj/listeners/EthListener.java diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java b/ethereum/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java rename to ethereum/src/main/java/com/baeldung/ethereumj/transfer/EthResponse.java diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/web3j/Template.java b/ethereum/src/main/java/com/baeldung/web3j/Template.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/web3j/Template.java rename to ethereum/src/main/java/com/baeldung/web3j/Template.java diff --git a/ethereum/web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java b/ethereum/src/main/java/com/baeldung/web3j/config/AppConfig.java similarity index 100% rename from ethereum/web3j/src/main/java/com/baeldung/web3j/config/AppConfig.java rename to ethereum/src/main/java/com/baeldung/web3j/config/AppConfig.java diff --git a/ethereum/web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java b/ethereum/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java similarity index 100% rename from ethereum/web3j/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java rename to ethereum/src/main/java/com/baeldung/web3j/config/WebAppInitializer.java diff --git a/ethereum/web3j/src/main/java/com/baeldung/web3j/constants/Constants.java b/ethereum/src/main/java/com/baeldung/web3j/constants/Constants.java similarity index 100% rename from ethereum/web3j/src/main/java/com/baeldung/web3j/constants/Constants.java rename to ethereum/src/main/java/com/baeldung/web3j/constants/Constants.java diff --git a/ethereum/web3j/src/main/java/com/baeldung/web3j/contracts/Example.java b/ethereum/src/main/java/com/baeldung/web3j/contracts/Example.java similarity index 100% rename from ethereum/web3j/src/main/java/com/baeldung/web3j/contracts/Example.java rename to ethereum/src/main/java/com/baeldung/web3j/contracts/Example.java diff --git a/ethereum/ethereumj/src/main/java/com/baeldung/web3j/contracts/Greeting.java b/ethereum/src/main/java/com/baeldung/web3j/contracts/Greeting.java similarity index 100% rename from ethereum/ethereumj/src/main/java/com/baeldung/web3j/contracts/Greeting.java rename to ethereum/src/main/java/com/baeldung/web3j/contracts/Greeting.java diff --git a/ethereum/web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java b/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java similarity index 100% rename from ethereum/web3j/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java rename to ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java diff --git a/ethereum/web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java b/ethereum/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java similarity index 100% rename from ethereum/web3j/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java rename to ethereum/src/main/java/com/baeldung/web3j/helpers/TimeHelper.java diff --git a/ethereum/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java b/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java similarity index 100% rename from ethereum/web3j/src/main/java/com/baeldung/web3j/services/Web3Service.java rename to ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java diff --git a/ethereum/web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java b/ethereum/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java similarity index 100% rename from ethereum/web3j/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java rename to ethereum/src/main/java/com/baeldung/web3j/transfers/ResponseTransfer.java diff --git a/ethereum/ethereumj/src/main/resources/application.properties b/ethereum/src/main/resources/application.properties similarity index 100% rename from ethereum/ethereumj/src/main/resources/application.properties rename to ethereum/src/main/resources/application.properties diff --git a/ethereum/web3j/dev_ganache/README.md b/ethereum/src/main/resources/dev_ganache/README.md similarity index 100% rename from ethereum/web3j/dev_ganache/README.md rename to ethereum/src/main/resources/dev_ganache/README.md diff --git a/ethereum/web3j/dev_truffle/README.md b/ethereum/src/main/resources/dev_truffle/README.md similarity index 100% rename from ethereum/web3j/dev_truffle/README.md rename to ethereum/src/main/resources/dev_truffle/README.md diff --git a/ethereum/web3j/dev_truffle/build/contracts/ConvertLib.json b/ethereum/src/main/resources/dev_truffle/build/contracts/ConvertLib.json similarity index 100% rename from ethereum/web3j/dev_truffle/build/contracts/ConvertLib.json rename to ethereum/src/main/resources/dev_truffle/build/contracts/ConvertLib.json diff --git a/ethereum/web3j/dev_truffle/build/contracts/Example.json b/ethereum/src/main/resources/dev_truffle/build/contracts/Example.json similarity index 100% rename from ethereum/web3j/dev_truffle/build/contracts/Example.json rename to ethereum/src/main/resources/dev_truffle/build/contracts/Example.json diff --git a/ethereum/web3j/dev_truffle/build/contracts/Migrations.json b/ethereum/src/main/resources/dev_truffle/build/contracts/Migrations.json similarity index 100% rename from ethereum/web3j/dev_truffle/build/contracts/Migrations.json rename to ethereum/src/main/resources/dev_truffle/build/contracts/Migrations.json diff --git a/ethereum/web3j/dev_truffle/contracts/ConvertLib.sol b/ethereum/src/main/resources/dev_truffle/contracts/ConvertLib.sol similarity index 100% rename from ethereum/web3j/dev_truffle/contracts/ConvertLib.sol rename to ethereum/src/main/resources/dev_truffle/contracts/ConvertLib.sol diff --git a/ethereum/web3j/dev_truffle/contracts/Example.sol b/ethereum/src/main/resources/dev_truffle/contracts/Example.sol similarity index 100% rename from ethereum/web3j/dev_truffle/contracts/Example.sol rename to ethereum/src/main/resources/dev_truffle/contracts/Example.sol diff --git a/ethereum/web3j/dev_truffle/contracts/Migrations.sol b/ethereum/src/main/resources/dev_truffle/contracts/Migrations.sol similarity index 100% rename from ethereum/web3j/dev_truffle/contracts/Migrations.sol rename to ethereum/src/main/resources/dev_truffle/contracts/Migrations.sol diff --git a/ethereum/web3j/dev_truffle/migrations/1_initial_migration.js b/ethereum/src/main/resources/dev_truffle/migrations/1_initial_migration.js similarity index 100% rename from ethereum/web3j/dev_truffle/migrations/1_initial_migration.js rename to ethereum/src/main/resources/dev_truffle/migrations/1_initial_migration.js diff --git a/ethereum/web3j/dev_truffle/migrations/2_deploy_contracts.js b/ethereum/src/main/resources/dev_truffle/migrations/2_deploy_contracts.js similarity index 100% rename from ethereum/web3j/dev_truffle/migrations/2_deploy_contracts.js rename to ethereum/src/main/resources/dev_truffle/migrations/2_deploy_contracts.js diff --git a/ethereum/web3j/dev_truffle/truffle.js b/ethereum/src/main/resources/dev_truffle/truffle.js similarity index 100% rename from ethereum/web3j/dev_truffle/truffle.js rename to ethereum/src/main/resources/dev_truffle/truffle.js diff --git a/ethereum/ethereumj/src/main/resources/solidity/Greeting.sol b/ethereum/src/main/resources/solidity/Greeting.sol similarity index 100% rename from ethereum/ethereumj/src/main/resources/solidity/Greeting.sol rename to ethereum/src/main/resources/solidity/Greeting.sol diff --git a/ethereum/ethereumj/src/main/resources/solidity/build/Greeting.abi b/ethereum/src/main/resources/solidity/build/Greeting.abi similarity index 100% rename from ethereum/ethereumj/src/main/resources/solidity/build/Greeting.abi rename to ethereum/src/main/resources/solidity/build/Greeting.abi diff --git a/ethereum/ethereumj/src/main/resources/solidity/build/Greeting.bin b/ethereum/src/main/resources/solidity/build/Greeting.bin similarity index 100% rename from ethereum/ethereumj/src/main/resources/solidity/build/Greeting.bin rename to ethereum/src/main/resources/solidity/build/Greeting.bin diff --git a/ethereum/web3j/src/main/webapp/WEB-INF/.gitkeep b/ethereum/src/main/webapp/WEB-INF/.gitkeep similarity index 100% rename from ethereum/web3j/src/main/webapp/WEB-INF/.gitkeep rename to ethereum/src/main/webapp/WEB-INF/.gitkeep diff --git a/ethereum/web3j/src/main/webapp/resources/.gitkeep b/ethereum/src/main/webapp/resources/.gitkeep similarity index 100% rename from ethereum/web3j/src/main/webapp/resources/.gitkeep rename to ethereum/src/main/webapp/resources/.gitkeep diff --git a/ethereum/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java b/ethereum/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java similarity index 99% rename from ethereum/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java rename to ethereum/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java index f62d229261..7676b99224 100644 --- a/ethereum/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java +++ b/ethereum/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java @@ -74,4 +74,4 @@ public class EthControllerLiveTest { assertTrue("Dynamic data returned?", a.hasBody()); System.out.println("Dynamic data returned?: " + a.hasBody()); } -} +} \ No newline at end of file diff --git a/ethereum/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java b/ethereum/src/test/java/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java similarity index 100% rename from ethereum/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java rename to ethereum/src/test/java/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java diff --git a/ethereum/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java b/ethereum/src/test/java/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java similarity index 100% rename from ethereum/web3j/src/test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java rename to ethereum/src/test/java/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java diff --git a/ethereum/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java b/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java similarity index 81% rename from ethereum/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java rename to ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java index 5c74e1c7ce..382c96e985 100644 --- a/ethereum/web3j/src/test/com/baeldung/web3j/services/EthereumContractUnitTest.java +++ b/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java @@ -3,13 +3,9 @@ package com.baeldung.web3j.services; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; import java.util.concurrent.CompletableFuture; -import static com.baeldung.web3j.constants.Constants.PLEASE_SUPPLY_REAL_DATA; - public class EthereumContractUnitTest { private Web3Service web3Service; diff --git a/ethereum/web3j/.gitignore b/ethereum/web3j/.gitignore deleted file mode 100644 index f83e8cf07c..0000000000 --- a/ethereum/web3j/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.idea -target -*.iml diff --git a/ethereum/web3j/pom.xml b/ethereum/web3j/pom.xml deleted file mode 100644 index b65f120218..0000000000 --- a/ethereum/web3j/pom.xml +++ /dev/null @@ -1,210 +0,0 @@ - - - 4.0.0 - com.baeldung.web3j - Web3j - war - 1.0.0 - web3j - - - 1.3 - 2.9.3 - 2.3.1 - 3.1.0 - 2.4.0 - 1.2 - 4.12 - 1.2.3 - 2.18.1 - 1.10.19 - 1.7.25 - 5.0.5.RELEASE - - - - - - org.springframework - spring-core - ${springframework.version} - - - org.springframework - spring-web - ${springframework.version} - - - org.springframework - spring-webmvc - ${springframework.version} - - - - - javax.servlet - javax.servlet-api - ${javax-servlet.version} - - - javax.servlet.jsp.jstl - jstl-api - ${jstl.version} - - - javax.servlet.jsp - javax.servlet.jsp-api - ${javax-jsp.version} - - - javax.servlet - jstl - ${jstl.version} - - - - - org.slf4j - jcl-over-slf4j - ${slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - - - org.web3j - core - 3.3.1 - - - - - org.mockito - mockito-core - ${mockito.version} - - - org.hamcrest - hamcrest-core - - - test - - - junit - junit - ${junit.version} - test - - - org.hamcrest - hamcrest-core - - - - - org.hamcrest - hamcrest-library - ${hamcrest.version} - test - - - org.springframework - spring-context - ${springframework.version} - - - org.springframework - spring-test - ${springframework.version} - test - - - com.jayway.jsonpath - json-path - ${jsonpath.version} - - - - - - - - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - - - org.apache.tomcat.maven - tomcat8-maven-plugin - 3.0-r1655215 - - /javaweb3 - - - - org.apache.maven.plugins - maven-war-plugin - 3.0.0 - - src/main/webapp - false - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire.version} - - - install - install - - test - - - - - test/com/baeldung/web3j/controllers/EthereumRestControllerIntegrationTest.java - - - test/com/baeldung/web3j/controllers/EthereumRestControllerUnitTest.java - - - test/com/baeldung/web3j/services/EthereumContractUnitTest.java - - - - - - - - - web3j - - \ No newline at end of file From e90737e54fa1e1ffe34d0d79844973ef83208086 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 3 May 2018 13:45:14 +0100 Subject: [PATCH 004/136] Add files via upload --- .../WorkingWithArraysInThymeleafApplication.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java new file mode 100644 index 0000000000..d15e14ef35 --- /dev/null +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.thymeleaf; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WorkingWithArraysInThymeleafApplication { + + public static void main(String[] args) { + SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); + } +} From 0c609288a60130c3896bacd9690bb497751cc148 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 3 May 2018 14:04:44 +0100 Subject: [PATCH 005/136] Delete WorkingWithArraysInThymeleafApplication.java --- .../WorkingWithArraysInThymeleafApplication.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java deleted file mode 100644 index d15e14ef35..0000000000 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.thymeleaf; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class WorkingWithArraysInThymeleafApplication { - - public static void main(String[] args) { - SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); - } -} From afb5fd317b261d99a6cd1bc04dd28def57aaf673 Mon Sep 17 00:00:00 2001 From: Adam InTae Gerard Date: Mon, 7 May 2018 13:05:04 -0700 Subject: [PATCH 006/136] Removed white-spacing conflict --- xml/pom.xml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/xml/pom.xml b/xml/pom.xml index 166cb6dd4e..8c578cdad9 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -1,10 +1,9 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung xml 0.1-SNAPSHOT - xml @@ -236,8 +235,8 @@ - + maven-assembly-plugin ${project.basedir} @@ -256,10 +255,8 @@ - make-assembly - package + make-assembly + package attached @@ -285,10 +282,10 @@ 2.4 1.8 + 1.3.1 - From 936dc5e346da30509dfede38e3f30ccc1a06bcfd Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 12:38:20 +0100 Subject: [PATCH 007/136] Add files via upload --- .../thymeleaf/controller/ArrayController.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ArrayController.java diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ArrayController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ArrayController.java new file mode 100644 index 0000000000..e36dcdf092 --- /dev/null +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ArrayController.java @@ -0,0 +1,25 @@ +package com.baeldung.thymeleaf.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class ArrayController { + @GetMapping("/") + public String arrayController(Model model) { + String[] continents = new String[7]; + + continents[0] = "Africa"; + continents[1] = "Antarctica"; + continents[2] = "Assia"; + continents[3] = "Australia"; + continents[4] = "Europe"; + continents[5] = "North America"; + continents[6] = "Sourth America"; + + model.addAttribute("continents", continents); + + return "continents"; + } +} From 77227cdc9fb215c56404a210ae89976833a16ed5 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 12:43:28 +0100 Subject: [PATCH 008/136] Create continents.html --- .../main/resources/templates/continents.html | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 spring-thymeleaf/src/main/resources/templates/continents.html diff --git a/spring-thymeleaf/src/main/resources/templates/continents.html b/spring-thymeleaf/src/main/resources/templates/continents.html new file mode 100644 index 0000000000..d170ccae23 --- /dev/null +++ b/spring-thymeleaf/src/main/resources/templates/continents.html @@ -0,0 +1,48 @@ + + + +Arrays in Thymeleaf + + + + +

THE CONTINENTS

+

+ We have a total of + continents in this world. Following is a list showing their order + based on the number of population in each of them. +

+ +
    +
  1. +
  2. +
  3. +
  4. +
  5. +
  6. +
  7. +
+ + + +

+ +

+ The greatest + continents. +

+ +

+ Europe is a continent: . +

+ +

+ Array of continents is empty . +

+ + + Date: Thu, 10 May 2018 12:45:35 +0100 Subject: [PATCH 009/136] Add files via upload --- .../WorkingWithArraysInThymeleafApplication.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java new file mode 100644 index 0000000000..d15e14ef35 --- /dev/null +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.thymeleaf; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WorkingWithArraysInThymeleafApplication { + + public static void main(String[] args) { + SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); + } +} From c3c8b73e2146de89f7f2002653a27e9368377c6c Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 12:51:25 +0100 Subject: [PATCH 010/136] Update pom.xml --- spring-thymeleaf/pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index d13356b3d7..e74f7c2300 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -98,6 +98,13 @@ ${springframework-security.version} test + + + org.springframework.boot + spring-boot-autoconfigure + 2.0.1.RELEASE + jar + @@ -173,4 +180,4 @@ 2.2 - \ No newline at end of file + From 517b6d4bc8ea7f63ab991be8a989d43bae1f3dd0 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 13:10:34 +0100 Subject: [PATCH 011/136] Update pom.xml --- spring-thymeleaf/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index e74f7c2300..8add2a850c 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -99,12 +99,12 @@ test - + From ddd6019631c5f8be849067a1356447996121d558 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 13:11:24 +0100 Subject: [PATCH 012/136] Update WorkingWithArraysInThymeleafApplication.java --- ...orkingWithArraysInThymeleafApplication.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java index d15e14ef35..bce0660fda 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java @@ -1,12 +1,12 @@ -package com.baeldung.thymeleaf; +// package com.baeldung.thymeleaf; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; +// import org.springframework.boot.SpringApplication; +// import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication -public class WorkingWithArraysInThymeleafApplication { +// @SpringBootApplication +// public class WorkingWithArraysInThymeleafApplication { - public static void main(String[] args) { - SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); - } -} +// public static void main(String[] args) { +// SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); +// } +// } From 300d6000dbd16fa24ef56cf154808615f496c111 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 13:12:33 +0100 Subject: [PATCH 013/136] Update ArrayController.java From 26521fb2ff58fce02fd5471e087743b1e2457225 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 13:13:58 +0100 Subject: [PATCH 014/136] Update continents.html --- .../main/resources/templates/continents.html | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/spring-thymeleaf/src/main/resources/templates/continents.html b/spring-thymeleaf/src/main/resources/templates/continents.html index d170ccae23..849f479413 100644 --- a/spring-thymeleaf/src/main/resources/templates/continents.html +++ b/spring-thymeleaf/src/main/resources/templates/continents.html @@ -1,48 +1,48 @@ - -Arrays in Thymeleaf - - - - -

THE CONTINENTS

-

- We have a total of - continents in this world. Following is a list showing their order - based on the number of population in each of them. -

+ + Arrays in Thymeleaf + + + + +

THE CONTINENTS

+

+ We have a total of + continents in this world. Following is a list showing their order + based on the number of population in each of them. +

-
    -
  1. -
  2. -
  3. -
  4. -
  5. -
  6. -
  7. -
+
    +
  1. +
  2. +
  3. +
  4. +
  5. +
  6. +
  7. +
-
    -
  • -
+
    +
  • +
-

+

-

- The greatest - continents. -

+

+ The greatest + continents. +

-

- Europe is a continent: . -

+

+ Europe is a continent: . +

-

- Array of continents is empty . -

+

+ Array of continents is empty . +

- + Date: Thu, 10 May 2018 14:23:43 +0100 Subject: [PATCH 015/136] Delete ArrayController.java --- .../thymeleaf/controller/ArrayController.java | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ArrayController.java diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ArrayController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ArrayController.java deleted file mode 100644 index e36dcdf092..0000000000 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ArrayController.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.thymeleaf.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; - -@Controller -public class ArrayController { - @GetMapping("/") - public String arrayController(Model model) { - String[] continents = new String[7]; - - continents[0] = "Africa"; - continents[1] = "Antarctica"; - continents[2] = "Assia"; - continents[3] = "Australia"; - continents[4] = "Europe"; - continents[5] = "North America"; - continents[6] = "Sourth America"; - - model.addAttribute("continents", continents); - - return "continents"; - } -} From 5deaa416e61a58200f9e5780993cb848b5fe7321 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 14:24:55 +0100 Subject: [PATCH 016/136] Add files via upload --- .../controller/ThymeleafArrayController.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java new file mode 100644 index 0000000000..789c87d870 --- /dev/null +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java @@ -0,0 +1,25 @@ +package com.baeldung.thymeleaf.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class ThymeleafArrayController { + @GetMapping("/") + public String arrayController(Model model) { + String[] continents = new String[7]; + + continents[0] = "Africa"; + continents[1] = "Antarctica"; + continents[2] = "Assia"; + continents[3] = "Australia"; + continents[4] = "Europe"; + continents[5] = "North America"; + continents[6] = "Sourth America"; + + model.addAttribute("continents", continents); + + return "continents"; + } +} From bc4594dacfa21ab99bc67fed2b80215e698cec1b Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 14:43:41 +0100 Subject: [PATCH 017/136] Update ThymeleafArrayController.java --- .../baeldung/thymeleaf/controller/ThymeleafArrayController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java index 789c87d870..5732827a3e 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.GetMapping; @Controller public class ThymeleafArrayController { - @GetMapping("/") + @GetMapping("/arrays") public String arrayController(Model model) { String[] continents = new String[7]; From 8aad495404f8a65f7e98a8dcb2bbeb11248d8c64 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 15:56:45 +0100 Subject: [PATCH 018/136] Update continents.html --- spring-thymeleaf/src/main/resources/templates/continents.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-thymeleaf/src/main/resources/templates/continents.html b/spring-thymeleaf/src/main/resources/templates/continents.html index 849f479413..0e7ffa3f58 100644 --- a/spring-thymeleaf/src/main/resources/templates/continents.html +++ b/spring-thymeleaf/src/main/resources/templates/continents.html @@ -5,6 +5,7 @@ +

THE CONTINENTS

@@ -45,4 +46,4 @@

- From 012bf35ffd7a24b107bc8b1ad6af879efd5e7be6 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 15:57:46 +0100 Subject: [PATCH 019/136] Update pom.xml --- spring-thymeleaf/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index 8add2a850c..a914a6d27e 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -99,12 +99,13 @@ test
- + + From 4e4b65c2fcc71158439b60f6905f5c69c62b5e0e Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Thu, 10 May 2018 15:58:29 +0100 Subject: [PATCH 020/136] Update WorkingWithArraysInThymeleafApplication.java --- ...orkingWithArraysInThymeleafApplication.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java index bce0660fda..d15e14ef35 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java @@ -1,12 +1,12 @@ -// package com.baeldung.thymeleaf; +package com.baeldung.thymeleaf; -// import org.springframework.boot.SpringApplication; -// import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; -// @SpringBootApplication -// public class WorkingWithArraysInThymeleafApplication { +@SpringBootApplication +public class WorkingWithArraysInThymeleafApplication { -// public static void main(String[] args) { -// SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); -// } -// } + public static void main(String[] args) { + SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); + } +} From 86b4b39852eec2798c30ebad0566f1073563860c Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 09:38:11 +0100 Subject: [PATCH 021/136] Update WorkingWithArraysInThymeleafApplication.java --- ...orkingWithArraysInThymeleafApplication.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java index d15e14ef35..bce0660fda 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java @@ -1,12 +1,12 @@ -package com.baeldung.thymeleaf; +// package com.baeldung.thymeleaf; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; +// import org.springframework.boot.SpringApplication; +// import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication -public class WorkingWithArraysInThymeleafApplication { +// @SpringBootApplication +// public class WorkingWithArraysInThymeleafApplication { - public static void main(String[] args) { - SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); - } -} +// public static void main(String[] args) { +// SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); +// } +// } From 460c314d986b39809f663afff452d03ceb67630b Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 09:39:56 +0100 Subject: [PATCH 022/136] Update pom.xml --- spring-thymeleaf/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index a914a6d27e..e05564abd8 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -99,12 +99,12 @@ test - + From a4c502058208513bd8b5924d988bddb7f3105691 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 09:42:28 +0100 Subject: [PATCH 023/136] Update continents.html From c510a4e72ee562bff2c76614740810828f28f391 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 09:49:12 +0100 Subject: [PATCH 024/136] Update pom.xml --- spring-thymeleaf/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index e05564abd8..a914a6d27e 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -99,12 +99,12 @@ test - + From 08d5edba2ff6a049b7faa6d239ebb26d96c9ffdf Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 09:58:14 +0100 Subject: [PATCH 025/136] Update WorkingWithArraysInThymeleafApplication.java --- ...orkingWithArraysInThymeleafApplication.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java index bce0660fda..d15e14ef35 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java @@ -1,12 +1,12 @@ -// package com.baeldung.thymeleaf; +package com.baeldung.thymeleaf; -// import org.springframework.boot.SpringApplication; -// import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; -// @SpringBootApplication -// public class WorkingWithArraysInThymeleafApplication { +@SpringBootApplication +public class WorkingWithArraysInThymeleafApplication { -// public static void main(String[] args) { -// SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); -// } -// } + public static void main(String[] args) { + SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); + } +} From ab93b6272fa9e499301016bfbe40667adecc3ce9 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 10:19:59 +0100 Subject: [PATCH 026/136] Update pom.xml --- spring-thymeleaf/pom.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index a914a6d27e..d496addb87 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -106,6 +106,17 @@ jar + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-web + + @@ -158,6 +169,14 @@ + + + + org.springframework.boot + spring-boot-maven-plugin + + + From a9827c6becd89669e8c721d06732bccfe542ba25 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 10:21:15 +0100 Subject: [PATCH 027/136] Update WorkingWithArraysInThymeleafApplication.java From 22ee523b8eca254a6ecf44e768673c99aada3b33 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 10:35:49 +0100 Subject: [PATCH 028/136] Update pom.xml --- spring-thymeleaf/pom.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index d496addb87..d4fcfe5f14 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -113,9 +113,9 @@ - org.springframework.boot - spring-boot-starter-web - + org.springframework.boot + spring-boot-starter-web + @@ -129,6 +129,7 @@ false + org.codehaus.cargo cargo-maven2-plugin @@ -148,6 +149,7 @@ + org.apache.tomcat.maven tomcat7-maven-plugin @@ -168,15 +170,13 @@ + + + org.springframework.boot + spring-boot-maven-plugin + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - From 7ceb31f3407d7f09d6ce5179133d3b028c908350 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 10:44:54 +0100 Subject: [PATCH 029/136] Update pom.xml --- spring-thymeleaf/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index d4fcfe5f14..68fa28018e 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -170,12 +170,6 @@ - - - org.springframework.boot - spring-boot-maven-plugin - -
From fdaa866ffab470ef7595aef9f06d8651f3df465f Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 10:52:20 +0100 Subject: [PATCH 030/136] Update pom.xml --- spring-thymeleaf/pom.xml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index 68fa28018e..b774c453be 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -111,12 +111,7 @@ spring-boot-starter-test test - - - org.springframework.boot - spring-boot-starter-web - - + From a27ef5a9a755f647827174256f5998fde00edc5f Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 11:06:43 +0100 Subject: [PATCH 031/136] Update pom.xml --- spring-thymeleaf/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index b774c453be..81ff93f013 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -99,7 +99,7 @@ test - + From c2d37e99e13bd5622dfe9180597db08123e58a3d Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 11 May 2018 11:08:48 +0100 Subject: [PATCH 032/136] Update WorkingWithArraysInThymeleafApplication.java --- ...orkingWithArraysInThymeleafApplication.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java index d15e14ef35..bce0660fda 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/WorkingWithArraysInThymeleafApplication.java @@ -1,12 +1,12 @@ -package com.baeldung.thymeleaf; +// package com.baeldung.thymeleaf; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; +// import org.springframework.boot.SpringApplication; +// import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication -public class WorkingWithArraysInThymeleafApplication { +// @SpringBootApplication +// public class WorkingWithArraysInThymeleafApplication { - public static void main(String[] args) { - SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); - } -} +// public static void main(String[] args) { +// SpringApplication.run(WorkingWithArraysInThymeleafApplication.class, args); +// } +// } From 1d94492e2992aacc2fdabd98dd47fb7fa11c7d21 Mon Sep 17 00:00:00 2001 From: jabyte <32500012+jabyte@users.noreply.github.com> Date: Fri, 18 May 2018 11:04:20 +0100 Subject: [PATCH 033/136] Array declared and initialized in one line. --- .../controller/ThymeleafArrayController.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java index 5732827a3e..8276cc4376 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ThymeleafArrayController.java @@ -8,16 +8,8 @@ import org.springframework.web.bind.annotation.GetMapping; public class ThymeleafArrayController { @GetMapping("/arrays") public String arrayController(Model model) { - String[] continents = new String[7]; - - continents[0] = "Africa"; - continents[1] = "Antarctica"; - continents[2] = "Assia"; - continents[3] = "Australia"; - continents[4] = "Europe"; - continents[5] = "North America"; - continents[6] = "Sourth America"; - + String[] continents = {"Africa", "Antarctica", "Asia", "Australia", "Europe", "North America", "Sourth America"}; + model.addAttribute("continents", continents); return "continents"; From 5a92adbc39545c6b580ffb99cdf236ab15946ea3 Mon Sep 17 00:00:00 2001 From: Mohamed El Tahawy Date: Tue, 22 May 2018 16:18:23 +0400 Subject: [PATCH 034/136] Typo "oponent" to "opponent" --- .../algorithms/mcts/montecarlo/MonteCarloTreeSearch.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java b/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java index f428df45d3..a4918f674d 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java @@ -10,7 +10,7 @@ public class MonteCarloTreeSearch { private static final int WIN_SCORE = 10; private int level; - private int oponent; + private int opponent; public MonteCarloTreeSearch() { this.level = 3; @@ -32,11 +32,11 @@ public class MonteCarloTreeSearch { long start = System.currentTimeMillis(); long end = start + 60 * getMillisForCurrentLevel(); - oponent = 3 - playerNo; + opponent = 3 - playerNo; Tree tree = new Tree(); Node rootNode = tree.getRoot(); rootNode.getState().setBoard(board); - rootNode.getState().setPlayerNo(oponent); + rootNode.getState().setPlayerNo(opponent); while (System.currentTimeMillis() < end) { // Phase 1 - Selection @@ -93,7 +93,7 @@ public class MonteCarloTreeSearch { State tempState = tempNode.getState(); int boardStatus = tempState.getBoard().checkStatus(); - if (boardStatus == oponent) { + if (boardStatus == opponent) { tempNode.getParent().getState().setWinScore(Integer.MIN_VALUE); return boardStatus; } From d5177c158e9521196be9c5d08eb7e1328604a708 Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Wed, 23 May 2018 18:44:15 +0100 Subject: [PATCH 035/136] Added for eval article --- .../baeldung/reactive/client/StockClient.java | 24 ++++++++++++ .../controller/StockReactiveController.java | 38 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java new file mode 100644 index 0000000000..6c37c6b763 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java @@ -0,0 +1,24 @@ +package com.baeldung.reactive.client; + +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec; + +import com.baeldung.reactive.model.Stock; + +public class StockClient { + + public void getStockUpdates(String stockCode) { + WebClient client = WebClient.create("localhost:9111"); + RequestHeadersSpec request = client.get().uri("/rtes/stocks/"+stockCode).accept(MediaType.TEXT_EVENT_STREAM); + request.retrieve().bodyToFlux(Stock.class).toStream().forEach(System.out::println); + } + + public static void main(String[] args) throws InterruptedException { + new StockClient().getStockUpdates("GOOGL"); + + while(true) { + Thread.sleep(1000L); + } + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java new file mode 100644 index 0000000000..4015d660b9 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java @@ -0,0 +1,38 @@ +package com.baeldung.reactive.controller; + +import java.math.BigDecimal; +import java.time.Duration; +import java.util.Random; +import java.util.stream.Stream; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.reactive.model.Stock; + +import reactor.core.publisher.Flux; +import reactor.util.function.Tuple2; + +@RestController +@RequestMapping("/rtes") +public class StockReactiveController { + + @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/stocks/{code}") + public Flux getStocks(@PathVariable String code) { + BigDecimal startingPrice = new BigDecimal("100"); + Flux stockFlux = Flux.fromStream(Stream.generate(() -> new Stock( + code, + new Random().nextBoolean() ? + startingPrice.add(BigDecimal.valueOf(new Random().nextDouble())): + startingPrice.subtract(BigDecimal.valueOf(new Random().nextDouble()))))); + Flux emmitFlux = Flux.interval(Duration.ofSeconds(1)); + return Flux.zip(stockFlux, emmitFlux).map(Tuple2::getT1); + } + + public static void main(String [] args) { + + } +} From 5268c3e8c25a977370fb86aafeb05a956e73c542 Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Wed, 23 May 2018 18:49:26 +0100 Subject: [PATCH 036/136] Removed unused code --- .../java/com/baeldung/reactive/client/StockClient.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java index 6c37c6b763..909c9f3de4 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java @@ -12,13 +12,5 @@ public class StockClient { WebClient client = WebClient.create("localhost:9111"); RequestHeadersSpec request = client.get().uri("/rtes/stocks/"+stockCode).accept(MediaType.TEXT_EVENT_STREAM); request.retrieve().bodyToFlux(Stock.class).toStream().forEach(System.out::println); - } - - public static void main(String[] args) throws InterruptedException { - new StockClient().getStockUpdates("GOOGL"); - - while(true) { - Thread.sleep(1000L); - } - } + } } From c170f2111d298782edf5908ea5e1e50ac546a4e4 Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Thu, 24 May 2018 13:06:02 +0100 Subject: [PATCH 037/136] Used log() in StockClient and formatted in eclipse --- .../baeldung/reactive/client/StockClient.java | 24 +++++++++---------- .../controller/StockReactiveController.java | 14 +++++------ 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java index 6c37c6b763..8a65b77b37 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java @@ -6,19 +6,17 @@ import org.springframework.web.reactive.function.client.WebClient.RequestHeaders import com.baeldung.reactive.model.Stock; +import reactor.core.publisher.Flux; + public class StockClient { - public void getStockUpdates(String stockCode) { - WebClient client = WebClient.create("localhost:9111"); - RequestHeadersSpec request = client.get().uri("/rtes/stocks/"+stockCode).accept(MediaType.TEXT_EVENT_STREAM); - request.retrieve().bodyToFlux(Stock.class).toStream().forEach(System.out::println); - } - - public static void main(String[] args) throws InterruptedException { - new StockClient().getStockUpdates("GOOGL"); - - while(true) { - Thread.sleep(1000L); - } - } + public Flux getStockUpdates(String stockCode) { + WebClient client = WebClient.create("localhost:8080"); + RequestHeadersSpec request = client.get() + .uri("/rtes/stocks/" + stockCode) + .accept(MediaType.TEXT_EVENT_STREAM); + return request.retrieve() + .bodyToFlux(Stock.class) + .log(); + } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java index 4015d660b9..8f8de79561 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java @@ -23,16 +23,14 @@ public class StockReactiveController { @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/stocks/{code}") public Flux getStocks(@PathVariable String code) { BigDecimal startingPrice = new BigDecimal("100"); - Flux stockFlux = Flux.fromStream(Stream.generate(() -> new Stock( - code, - new Random().nextBoolean() ? - startingPrice.add(BigDecimal.valueOf(new Random().nextDouble())): - startingPrice.subtract(BigDecimal.valueOf(new Random().nextDouble()))))); + Flux stockFlux = Flux.fromStream(Stream.generate(() -> new Stock(code, getLatestPrice(startingPrice)))); Flux emmitFlux = Flux.interval(Duration.ofSeconds(1)); - return Flux.zip(stockFlux, emmitFlux).map(Tuple2::getT1); + return Flux.zip(stockFlux, emmitFlux) + .map(Tuple2::getT1); } - public static void main(String [] args) { - + private BigDecimal getLatestPrice(BigDecimal startingPrice) { + BigDecimal priceChange = BigDecimal.valueOf(new Random().nextDouble()); + return new Random().nextBoolean() ? startingPrice.add(priceChange) : startingPrice.subtract(priceChange); } } From c0852bf743b98c040e69ab6ad888d50021824d50 Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Thu, 24 May 2018 13:15:52 +0100 Subject: [PATCH 038/136] Added model class --- .../com/baeldung/reactive/model/Stock.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java new file mode 100644 index 0000000000..6743de064e --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java @@ -0,0 +1,32 @@ +package com.baeldung.reactive.model; + +import java.math.BigDecimal; + +public class Stock { + + private String code; + + private BigDecimal price; + + public Stock(String code, BigDecimal price) { + this.code = code; + this.price = price; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + +} From a4a8e1dc6cce17ed5ace6ddd41be3b0a42f03728 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 27 May 2018 13:40:54 +0200 Subject: [PATCH 039/136] BAEL-1792 overview of visitor design pattern --- .../java/com/baeldung/visitor/Document.java | 20 ++++++++++++++++ .../java/com/baeldung/visitor/Element.java | 12 ++++++++++ .../com/baeldung/visitor/ElementVisitor.java | 14 +++++++++++ .../com/baeldung/visitor/JsonElement.java | 12 ++++++++++ .../java/com/baeldung/visitor/Visitor.java | 8 +++++++ .../com/baeldung/visitor/VisitorDemo.java | 23 +++++++++++++++++++ .../java/com/baeldung/visitor/XmlElement.java | 12 ++++++++++ 7 files changed, 101 insertions(+) create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/visitor/Document.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/visitor/Element.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/visitor/ElementVisitor.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/visitor/JsonElement.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/visitor/Visitor.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/visitor/VisitorDemo.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/visitor/XmlElement.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Document.java b/patterns/design-patterns/src/main/java/com/baeldung/visitor/Document.java new file mode 100644 index 0000000000..575146a8e0 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/visitor/Document.java @@ -0,0 +1,20 @@ +package com.baeldung.visitor; + +import java.util.ArrayList; +import java.util.List; + +public class Document extends Element { + + List elements = new ArrayList<>(); + + public Document(String uuid) { + super(uuid); + } + + @Override + public void accept(Visitor v) { + for (Element e : this.elements) { + e.accept(v); + } + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Element.java b/patterns/design-patterns/src/main/java/com/baeldung/visitor/Element.java new file mode 100644 index 0000000000..70c96c99e1 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/visitor/Element.java @@ -0,0 +1,12 @@ +package com.baeldung.visitor; + +public abstract class Element { + + public String uuid; + + public Element(String uuid) { + this.uuid = uuid; + } + + public abstract void accept(Visitor v); +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/ElementVisitor.java b/patterns/design-patterns/src/main/java/com/baeldung/visitor/ElementVisitor.java new file mode 100644 index 0000000000..f8af42d554 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/visitor/ElementVisitor.java @@ -0,0 +1,14 @@ +package com.baeldung.visitor; + +public class ElementVisitor implements Visitor { + + @Override + public void visit(XmlElement xe) { + System.out.println("processing xml element with uuid: " + xe.uuid); + } + + @Override + public void visit(JsonElement je) { + System.out.println("processing json element with uuid: " + je.uuid); + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/JsonElement.java b/patterns/design-patterns/src/main/java/com/baeldung/visitor/JsonElement.java new file mode 100644 index 0000000000..a65fe277f1 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/visitor/JsonElement.java @@ -0,0 +1,12 @@ +package com.baeldung.visitor; + +public class JsonElement extends Element { + + public JsonElement(String uuid) { + super(uuid); + } + + public void accept(Visitor v) { + v.visit(this); + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Visitor.java b/patterns/design-patterns/src/main/java/com/baeldung/visitor/Visitor.java new file mode 100644 index 0000000000..1cd94911a3 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/visitor/Visitor.java @@ -0,0 +1,8 @@ +package com.baeldung.visitor; + +public interface Visitor { + + void visit(XmlElement xe); + + void visit(JsonElement je); +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/VisitorDemo.java b/patterns/design-patterns/src/main/java/com/baeldung/visitor/VisitorDemo.java new file mode 100644 index 0000000000..ee3436616a --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/visitor/VisitorDemo.java @@ -0,0 +1,23 @@ +package com.baeldung.visitor; + +import java.util.UUID; + +public class VisitorDemo { + + public static void main(String[] args) { + + Visitor v = new ElementVisitor(); + + Document d = new Document(generateUuid()); + d.elements.add(new JsonElement(generateUuid())); + d.elements.add(new JsonElement(generateUuid())); + d.elements.add(new XmlElement(generateUuid())); + + d.accept(v); + } + + private static String generateUuid() { + return UUID.randomUUID() + .toString(); + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/XmlElement.java b/patterns/design-patterns/src/main/java/com/baeldung/visitor/XmlElement.java new file mode 100644 index 0000000000..41998de428 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/visitor/XmlElement.java @@ -0,0 +1,12 @@ +package com.baeldung.visitor; + +public class XmlElement extends Element { + + public XmlElement(String uuid) { + super(uuid); + } + + public void accept(Visitor v) { + v.visit(this); + } +} \ No newline at end of file From f1d4024a596e5e048e67a8068ead53908ea78180 Mon Sep 17 00:00:00 2001 From: hemant Date: Wed, 30 May 2018 20:56:16 +0530 Subject: [PATCH 040/136] Added springbootnonwebapp project code --- .../springbootnonwebapp/HelloController.java | 20 ++++++++++++++++ .../baeldung/springbootnonwebapp/Runner.java | 23 +++++++++++++++++++ .../SpringBootNonWebappApplication.java | 21 +++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 spring-boot/src/main/java/com/baeldung/springbootnonwebapp/HelloController.java create mode 100644 spring-boot/src/main/java/com/baeldung/springbootnonwebapp/Runner.java create mode 100644 spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootNonWebappApplication.java diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/HelloController.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/HelloController.java new file mode 100644 index 0000000000..bec02a7b0c --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/HelloController.java @@ -0,0 +1,20 @@ +package com.baeldung.springbootnonwebapp; + +import java.time.LocalDate; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Controller exposing rest web services + * @author hemant + * + */ +@RestController +public class HelloController { + + @RequestMapping("/") + public LocalDate getMinLocalDate() { + return LocalDate.MIN; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/Runner.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/Runner.java new file mode 100644 index 0000000000..7eca1c0abe --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/Runner.java @@ -0,0 +1,23 @@ +package com.baeldung.springbootnonwebapp; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class Runner implements CommandLineRunner { + + private static final Logger LOG = LoggerFactory.getLogger(Runner.class); + + /** + * This method will be executed after the application context is loaded and + * right before the Spring Application main method is completed. + */ + @Override + public void run(String... args) throws Exception { + LOG.info("START : command line runner"); + LOG.info("EXECUTING : command line runner"); + LOG.info("END : command line runner"); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootNonWebappApplication.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootNonWebappApplication.java new file mode 100644 index 0000000000..de9d1ebd9e --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootNonWebappApplication.java @@ -0,0 +1,21 @@ +package com.baeldung.springbootnonwebapp; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootNonWebappApplication { + + private static final Logger LOG = LoggerFactory.getLogger(SpringBootNonWebappApplication.class); + + public static void main(String[] args) { + LOG.info("STARTING THE APPLICATION"); + SpringApplication app = new SpringApplication(SpringBootNonWebappApplication.class); + // This line of code, disables the web app setting + app.setWebEnvironment(false); + app.run(args); + LOG.info("APPLICATION STARTED"); + } +} From 98d37d0f8c8866bd10d6692b5e1d1c48b6a67ecb Mon Sep 17 00:00:00 2001 From: hemantvsn Date: Mon, 11 Jun 2018 23:41:00 +0530 Subject: [PATCH 041/136] Removed the controller Based on the editor comments in the post. --- .../springbootnonwebapp/HelloController.java | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 spring-boot/src/main/java/com/baeldung/springbootnonwebapp/HelloController.java diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/HelloController.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/HelloController.java deleted file mode 100644 index bec02a7b0c..0000000000 --- a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/HelloController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.springbootnonwebapp; - -import java.time.LocalDate; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * Controller exposing rest web services - * @author hemant - * - */ -@RestController -public class HelloController { - - @RequestMapping("/") - public LocalDate getMinLocalDate() { - return LocalDate.MIN; - } -} From 400f86a65799b6a0f313200434ba06a18110825d Mon Sep 17 00:00:00 2001 From: hemant Date: Sat, 16 Jun 2018 01:01:14 +0530 Subject: [PATCH 042/136] Removed 2 classes for main and other for Runner. Replaced them with a single class serving both the purposes --- .../baeldung/springbootnonwebapp/Runner.java | 23 ------------ .../SpringBootConsoleApplication.java | 37 +++++++++++++++++++ .../SpringBootNonWebappApplication.java | 21 ----------- 3 files changed, 37 insertions(+), 44 deletions(-) delete mode 100644 spring-boot/src/main/java/com/baeldung/springbootnonwebapp/Runner.java create mode 100644 spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java delete mode 100644 spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootNonWebappApplication.java diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/Runner.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/Runner.java deleted file mode 100644 index 7eca1c0abe..0000000000 --- a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/Runner.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.springbootnonwebapp; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; - -@Component -public class Runner implements CommandLineRunner { - - private static final Logger LOG = LoggerFactory.getLogger(Runner.class); - - /** - * This method will be executed after the application context is loaded and - * right before the Spring Application main method is completed. - */ - @Override - public void run(String... args) throws Exception { - LOG.info("START : command line runner"); - LOG.info("EXECUTING : command line runner"); - LOG.info("END : command line runner"); - } -} diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java new file mode 100644 index 0000000000..6c3fbaff45 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java @@ -0,0 +1,37 @@ +package com.baeldung.springbootnonwebapp; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 1. Act as main class for spring boot application + * 2. Also implements CommandLineRunner, so that code within run method + * is executed before application startup but after all beans are effectively created + * @author hemant + * + */ +@SpringBootApplication +public class SpringBootConsoleApplication implements CommandLineRunner { + + private static final Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class); + + public static void main(String[] args) { + LOG.info("STARTING THE APPLICATION"); + SpringApplication.run(SpringBootConsoleApplication.class, args); + LOG.info("APPLICATION STARTED"); + } + + /** + * This method will be executed after the application context is loaded and + * right before the Spring Application main method is completed. + */ + @Override + public void run(String... args) throws Exception { + LOG.info("START : command line runner"); + LOG.info("EXECUTING : command line runner"); + LOG.info("END : command line runner"); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootNonWebappApplication.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootNonWebappApplication.java deleted file mode 100644 index de9d1ebd9e..0000000000 --- a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootNonWebappApplication.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.springbootnonwebapp; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SpringBootNonWebappApplication { - - private static final Logger LOG = LoggerFactory.getLogger(SpringBootNonWebappApplication.class); - - public static void main(String[] args) { - LOG.info("STARTING THE APPLICATION"); - SpringApplication app = new SpringApplication(SpringBootNonWebappApplication.class); - // This line of code, disables the web app setting - app.setWebEnvironment(false); - app.run(args); - LOG.info("APPLICATION STARTED"); - } -} From 9241c90660fd2b425ca32c51f2605a2f585850fa Mon Sep 17 00:00:00 2001 From: hemantvsn Date: Fri, 22 Jun 2018 12:24:19 +0530 Subject: [PATCH 043/136] Update SpringBootConsoleApplication.java --- .../springbootnonwebapp/SpringBootConsoleApplication.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java index 6c3fbaff45..5b0fda992d 100644 --- a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java +++ b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java @@ -16,12 +16,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootConsoleApplication implements CommandLineRunner { - private static final Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class); + private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class); public static void main(String[] args) { LOG.info("STARTING THE APPLICATION"); SpringApplication.run(SpringBootConsoleApplication.class, args); - LOG.info("APPLICATION STARTED"); + LOG.info("APPLICATION FINISHED"); } /** @@ -30,8 +30,6 @@ public class SpringBootConsoleApplication implements CommandLineRunner { */ @Override public void run(String... args) throws Exception { - LOG.info("START : command line runner"); LOG.info("EXECUTING : command line runner"); - LOG.info("END : command line runner"); } } From 8a960353db912cb743a7cef04c2ffbe78954d0d1 Mon Sep 17 00:00:00 2001 From: hemantvsn Date: Mon, 25 Jun 2018 14:27:30 +0530 Subject: [PATCH 044/136] Logged the arguements of run method --- .../springbootnonwebapp/SpringBootConsoleApplication.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java index 5b0fda992d..9faa463378 100644 --- a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java +++ b/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java @@ -31,5 +31,8 @@ public class SpringBootConsoleApplication implements CommandLineRunner { @Override public void run(String... args) throws Exception { LOG.info("EXECUTING : command line runner"); + for (int i = 0; i < args.length; ++i) { + LOG.info("args[{}]: {}", i, args[i]); + } } } From a0b0e1c70532b18663ab717307f2694dbd87c303 Mon Sep 17 00:00:00 2001 From: gangadkho Date: Tue, 26 Jun 2018 14:48:41 +0800 Subject: [PATCH 045/136] Java Custom Exception --- core-java/pom.xml | 18 +++++--- .../baeldung/customexception/FileManager.java | 43 +++++++++++++++++++ .../IncorrectFileExtensionException.java | 9 ++++ .../IncorrectFileNameException.java | 9 ++++ ...correctFileExtensionExceptionUnitTest.java | 29 +++++++++++++ .../IncorrectFileNameExceptionUnitTest.java | 19 ++++++++ .../correctFileNameWithoutProperExtension | 0 7 files changed, 120 insertions(+), 7 deletions(-) create mode 100644 core-java/src/main/java/com/baeldung/customexception/FileManager.java create mode 100644 core-java/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java create mode 100644 core-java/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java create mode 100644 core-java/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java create mode 100644 core-java/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java create mode 100644 core-java/src/test/resources/correctFileNameWithoutProperExtension diff --git a/core-java/pom.xml b/core-java/pom.xml index a823d836e8..ecbdae52f2 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -10,8 +10,8 @@ com.baeldung parent-java - 0.0.1-SNAPSHOT - ../parent-java + 0.0.1-SNAPSHOT + ../parent-java @@ -198,11 +198,6 @@ mail ${javax.mail.version} - - javax.mail - mail - 1.5.0-b01 - @@ -250,6 +245,7 @@ org.apache.maven.plugins maven-jar-plugin + ${maven-jar-plugin.version} @@ -288,6 +284,7 @@ org.apache.maven.plugins maven-shade-plugin + ${maven-shade-plugin.version} @@ -309,6 +306,7 @@ com.jolira onejar-maven-plugin + ${onejar-maven-plugin.version} @@ -326,6 +324,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} @@ -473,6 +472,11 @@ 3.0.0-M1 1.6.0 1.5.0-b01 + 3.0.2 + 1.4.4 + 3.1.1 + 2.0.3.RELEASE + \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/customexception/FileManager.java b/core-java/src/main/java/com/baeldung/customexception/FileManager.java new file mode 100644 index 0000000000..b6f4d960aa --- /dev/null +++ b/core-java/src/main/java/com/baeldung/customexception/FileManager.java @@ -0,0 +1,43 @@ +package com.baeldung.customexception; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Scanner; + +public class FileManager { + + public static String getFirstLine(String fileName) throws IncorrectFileNameException { + try (Scanner file = new Scanner(new File(fileName))) { + if (file.hasNextLine()) { + return file.nextLine(); + } else { + throw new IllegalArgumentException("Non readable file"); + } + } catch (FileNotFoundException err) { + if (!isCorrectFileName(fileName)) { + throw new IncorrectFileNameException("Incorrect filename : " + fileName, err); + } + // Logging etc + } catch (IllegalArgumentException err) { + if (!containsExtension(fileName)) { + throw new IncorrectFileExtensionException("Filename does not contain extension : " + fileName, err); + } + // Other error cases and logging + } + return "Default First Line"; + } + + private static boolean containsExtension(String fileName) { + if (fileName.contains(".txt") || fileName.contains(".doc")) + return true; + return false; + } + + private static boolean isCorrectFileName(String fileName) { + if (fileName.equals("wrongFileName.txt")) + return false; + else + return true; + } + +} diff --git a/core-java/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java b/core-java/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java new file mode 100644 index 0000000000..c6dc6d6964 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java @@ -0,0 +1,9 @@ +package com.baeldung.customexception; + +public class IncorrectFileExtensionException extends RuntimeException{ + private static final long serialVersionUID = 1L; + + public IncorrectFileExtensionException(String errorMessage, Throwable err) { + super(errorMessage, err); + } +} diff --git a/core-java/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java b/core-java/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java new file mode 100644 index 0000000000..a804cadb84 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java @@ -0,0 +1,9 @@ +package com.baeldung.customexception; + +public class IncorrectFileNameException extends Exception { + private static final long serialVersionUID = 1L; + + public IncorrectFileNameException(String errorMessage, Throwable err) { + super(errorMessage, err); + } +} diff --git a/core-java/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java b/core-java/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java new file mode 100644 index 0000000000..230698f719 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.customexception; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; + +import org.junit.Test; + +public class IncorrectFileExtensionExceptionUnitTest { + + @Test + public void testWhenCorrectFileExtensionGiven_ReceivesNoException() throws IncorrectFileNameException { + assertThat(FileManager.getFirstLine("correctFileNameWithProperExtension.txt")).isEqualTo("Default First Line"); + } + + @Test(expected = IncorrectFileExtensionException.class) + public void testWhenCorrectFileNameExceptionThrown_ReceivesNoException() throws IncorrectFileNameException { + StringBuffer sBuffer = new StringBuffer(); + sBuffer.append("src"); + sBuffer.append(File.separator); + sBuffer.append("test"); + sBuffer.append(File.separator); + sBuffer.append("resources"); + sBuffer.append(File.separator); + sBuffer.append("correctFileNameWithoutProperExtension"); + FileManager.getFirstLine(sBuffer.toString()); + } + +} diff --git a/core-java/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java b/core-java/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java new file mode 100644 index 0000000000..acb05eb763 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.customexception; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class IncorrectFileNameExceptionUnitTest { + + @Test(expected = IncorrectFileNameException.class) + public void testWhenIncorrectFileNameExceptionThrown_ReceivesIncorrectFileNameException() throws IncorrectFileNameException { + FileManager.getFirstLine("wrongFileName.txt"); + } + + @Test + public void testWhenCorrectFileNameExceptionThrown_ReceivesNoException() throws IncorrectFileNameException { + assertThat(FileManager.getFirstLine("correctFileName.txt")).isEqualTo("Default First Line"); + } + +} diff --git a/core-java/src/test/resources/correctFileNameWithoutProperExtension b/core-java/src/test/resources/correctFileNameWithoutProperExtension new file mode 100644 index 0000000000..e69de29bb2 From 642eaa2a859790adbfa4e0102c4a43de06820b50 Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 26 Jun 2018 18:39:22 +0200 Subject: [PATCH 046/136] BAEL-1891 interpreter design pattern in java --- .../com/baeldung/interpreter/Context.java | 107 ++++++++++++++++++ .../com/baeldung/interpreter/Expression.java | 7 ++ .../java/com/baeldung/interpreter/From.java | 27 +++++ .../baeldung/interpreter/InterpreterDemo.java | 23 ++++ .../java/com/baeldung/interpreter/Row.java | 17 +++ .../java/com/baeldung/interpreter/Select.java | 20 ++++ .../java/com/baeldung/interpreter/Where.java | 19 ++++ 7 files changed, 220 insertions(+) create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/interpreter/Context.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/interpreter/Expression.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/interpreter/From.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/interpreter/InterpreterDemo.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/interpreter/Row.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/interpreter/Select.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/interpreter/Where.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Context.java b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Context.java new file mode 100644 index 0000000000..f2416988ea --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Context.java @@ -0,0 +1,107 @@ +package com.baeldung.interpreter; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +class Context { + + private static Map> tables = new HashMap<>(); + + static { + List list = new ArrayList<>(); + list.add(new Row("John", "Doe")); + list.add(new Row("Jan", "Kowalski")); + list.add(new Row("Dominic", "Doom")); + + tables.put("people", list); + } + + private String table; + private String column; + + /** + * Index of column to be shown in result. + * Calculated in {@link #setColumnMapper()} + */ + private int colIndex = -1; + + /** + * Default setup, used for clearing the context for next queries. + * See {@link Context#clear()} + */ + private static final Predicate matchAnyString = s -> s.length() > 0; + private static final Function> matchAllColumns = Stream::of; + /** + * Varies based on setup in subclasses of {@link Expression} + */ + private Predicate whereFilter = matchAnyString; + private Function> columnMapper = matchAllColumns; + + void setColumn(String column) { + this.column = column; + setColumnMapper(); + } + + void setTable(String table) { + this.table = table; + } + + void setFilter(Predicate filter) { + whereFilter = filter; + } + + /** + * Clears the context to defaults. + * No filters, match all columns. + */ + void clear() { + column = ""; + columnMapper = matchAllColumns; + whereFilter = matchAnyString; + } + + List search() { + + List result = tables.entrySet() + .stream() + .filter(entry -> entry.getKey().equalsIgnoreCase(table)) + .flatMap(entry -> Stream.of(entry.getValue())) + .flatMap(Collection::stream) + .map(Row::toString) + .flatMap(columnMapper) + .filter(whereFilter) + .collect(Collectors.toList()); + + clear(); + + return result; + } + + /** + * Sets column mapper based on {@link #column} attribute. + * Note: If column is unknown, will remain to look for all columns. + */ + private void setColumnMapper() { + switch (column) { + case "*": + colIndex = -1; + break; + case "name": + colIndex = 0; + break; + case "surname": + colIndex = 1; + break; + } + if (colIndex != -1) { + columnMapper = s -> Stream.of(s.split(" ")[colIndex]); + } + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Expression.java b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Expression.java new file mode 100644 index 0000000000..7f0893e719 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Expression.java @@ -0,0 +1,7 @@ +package com.baeldung.interpreter; + +import java.util.List; + +interface Expression { + List interpret(Context ctx); +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/From.java b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/From.java new file mode 100644 index 0000000000..d0690e3e85 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/From.java @@ -0,0 +1,27 @@ +package com.baeldung.interpreter; + +import java.util.List; + +class From implements Expression { + + private String table; + private Where where; + + From(String table) { + this.table = table; + } + + From(String table, Where where) { + this.table = table; + this.where = where; + } + + @Override + public List interpret(Context ctx) { + ctx.setTable(table); + if (where == null) { + return ctx.search(); + } + return where.interpret(ctx); + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/InterpreterDemo.java b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/InterpreterDemo.java new file mode 100644 index 0000000000..9b37037bb9 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/InterpreterDemo.java @@ -0,0 +1,23 @@ +package com.baeldung.interpreter; + +import java.util.List; + + +public class InterpreterDemo { + + public static void main(String[] args) { + + Expression query = new Select("name", new From("people")); + Context ctx = new Context(); + List result = query.interpret(ctx); + System.out.println(result); + + Expression query2 = new Select("*", new From("people")); + List result2 = query2.interpret(ctx); + System.out.println(result2); + + Expression query3 = new Select("name", new From("people", new Where(name -> name.toLowerCase().startsWith("d")))); + List result3 = query3.interpret(ctx); + System.out.println(result3); + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Row.java b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Row.java new file mode 100644 index 0000000000..00fd2d993a --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Row.java @@ -0,0 +1,17 @@ +package com.baeldung.interpreter; + +class Row { + + private String name; + private String surname; + + Row(String name, String surname) { + this.name = name; + this.surname = surname; + } + + @Override + public String toString() { + return name + " " + surname; + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Select.java b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Select.java new file mode 100644 index 0000000000..f235ce2a87 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Select.java @@ -0,0 +1,20 @@ +package com.baeldung.interpreter; + +import java.util.List; + +class Select implements Expression { + + private String column; + private From from; + + Select(String column, From from) { + this.column = column; + this.from = from; + } + + @Override + public List interpret(Context ctx) { + ctx.setColumn(column); + return from.interpret(ctx); + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Where.java b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Where.java new file mode 100644 index 0000000000..b31fa54cff --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Where.java @@ -0,0 +1,19 @@ +package com.baeldung.interpreter; + +import java.util.List; +import java.util.function.Predicate; + +class Where implements Expression { + + private Predicate filter; + + Where(Predicate filter) { + this.filter = filter; + } + + @Override + public List interpret(Context ctx) { + ctx.setFilter(filter); + return ctx.search(); + } +} \ No newline at end of file From 5d2d79308e4f51d15dcec717ff215a24adf9910a Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Thu, 28 Jun 2018 00:42:55 +0400 Subject: [PATCH 047/136] GWT app new branch --- google-web-toolkit/pom.xml | 116 ++++++++++++++++++ .../com/baeldung/Google_web_toolkit.gwt.xml | 31 +++++ .../baeldung/client/Google_web_toolkit.java | 108 ++++++++++++++++ .../baeldung/server/MessageServiceImpl.java | 22 ++++ .../com/baeldung/shared/MessageService.java | 12 ++ .../baeldung/shared/MessageServiceAsync.java | 10 ++ .../src/main/webapp/Google_web_toolkit.css | 31 +++++ .../src/main/webapp/Google_web_toolkit.html | 35 ++++++ .../src/main/webapp/WEB-INF/web.xml | 24 ++++ .../src/main/webapp/favicon.ico | Bin 0 -> 1082 bytes pom.xml | 1 + 11 files changed, 390 insertions(+) create mode 100644 google-web-toolkit/pom.xml create mode 100644 google-web-toolkit/src/main/java/com/baeldung/Google_web_toolkit.gwt.xml create mode 100644 google-web-toolkit/src/main/java/com/baeldung/client/Google_web_toolkit.java create mode 100644 google-web-toolkit/src/main/java/com/baeldung/server/MessageServiceImpl.java create mode 100644 google-web-toolkit/src/main/java/com/baeldung/shared/MessageService.java create mode 100644 google-web-toolkit/src/main/java/com/baeldung/shared/MessageServiceAsync.java create mode 100644 google-web-toolkit/src/main/webapp/Google_web_toolkit.css create mode 100644 google-web-toolkit/src/main/webapp/Google_web_toolkit.html create mode 100644 google-web-toolkit/src/main/webapp/WEB-INF/web.xml create mode 100644 google-web-toolkit/src/main/webapp/favicon.ico diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml new file mode 100644 index 0000000000..d96a589e32 --- /dev/null +++ b/google-web-toolkit/pom.xml @@ -0,0 +1,116 @@ + + + + + 4.0.0 + com.baeldung + google_web_toolkit + war + 1.0-SNAPSHOT + com.baeldung.Google_web_toolkit + + + + + 1.8 + 1.8 + + + UTF-8 + UTF-8 + + + + + + + com.google.gwt + gwt + 2.8.2 + pom + import + + + + + + + com.google.gwt + gwt-servlet + runtime + + + com.google.gwt + gwt-user + provided + + + com.google.gwt + gwt-dev + provided + + + junit + junit + 4.11 + test + + + + + + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + + + + + + net.ltgt.gwt.maven + gwt-maven-plugin + 1.0-rc-8 + + + + compile + test + + + + + com.baeldung.Google_web_toolkit + Google_web_toolkit + true + + 1.8 + + + + -compileReport + -XcompilerMetrics + + + ${project.build.directory}/${project.build.finalName} + compile+runtime + + + Google_web_toolkit.html + + + + + + + maven-surefire-plugin + 2.17 + + true + + + + + + diff --git a/google-web-toolkit/src/main/java/com/baeldung/Google_web_toolkit.gwt.xml b/google-web-toolkit/src/main/java/com/baeldung/Google_web_toolkit.gwt.xml new file mode 100644 index 0000000000..1d8ca819d9 --- /dev/null +++ b/google-web-toolkit/src/main/java/com/baeldung/Google_web_toolkit.gwt.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/google-web-toolkit/src/main/java/com/baeldung/client/Google_web_toolkit.java b/google-web-toolkit/src/main/java/com/baeldung/client/Google_web_toolkit.java new file mode 100644 index 0000000000..ae0ae7da38 --- /dev/null +++ b/google-web-toolkit/src/main/java/com/baeldung/client/Google_web_toolkit.java @@ -0,0 +1,108 @@ +package com.baeldung.client; + +import com.baeldung.shared.MessageService; +import com.baeldung.shared.MessageServiceAsync; +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyCodes; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; + +/** + * Entry point classes define onModuleLoad(). + */ +public class Google_web_toolkit implements EntryPoint { + private final MessageServiceAsync messageServiceAsync = GWT.create(MessageService.class); + + public void onModuleLoad() { + Button sendButton = new Button("Submit"); + TextBox nameField = new TextBox(); + nameField.setText("Hi there"); + + Label warningLabel = new Label(); + + sendButton.addStyleName("sendButton"); + + RootPanel.get("nameFieldContainer").add(nameField); + RootPanel.get("sendButtonContainer").add(sendButton); + RootPanel.get("errorLabelContainer").add(warningLabel); + + Button closeButton = new Button("Thanks"); + closeButton.getElement().setId("closeButton"); + + Label textToServerLabel = new Label(); + HTML serverResponseLabel = new HTML(); + VerticalPanel vPanel = new VerticalPanel(); + vPanel.addStyleName("vPanel"); + vPanel.add(new HTML("Sending message to the server:")); + vPanel.add(textToServerLabel); + vPanel.add(new HTML("
Server replies:")); + vPanel.add(serverResponseLabel); + vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT); + vPanel.add(closeButton); + vPanel.setVisible(false); + RootPanel.get("serverResponseContainer").add(vPanel); + + closeButton.addClickHandler(event -> { + sendButton.setEnabled(true); + sendButton.setFocus(true); + vPanel.setVisible(false); + }); + + class MyHandler implements ClickHandler, KeyUpHandler { + + public void onClick(ClickEvent event) { + sendMessageToServer(); + } + + public void onKeyUp(KeyUpEvent event) { + if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { + sendMessageToServer(); + } + } + + private void sendMessageToServer() { + + warningLabel.setText(""); + String textToServer = nameField.getText(); + if (textToServer == null || textToServer.isEmpty()) { + warningLabel.setText("Please enter the message"); + return; + } + + sendButton.setEnabled(false); + textToServerLabel.setText(textToServer); + serverResponseLabel.setText(""); + messageServiceAsync.sendMessage(textToServer, new AsyncCallback() { + public void onFailure(Throwable caught) { + serverResponseLabel.addStyleName("serverResponseLabelError"); + serverResponseLabel.setHTML("server error occurred"); + closeButton.setFocus(true); + } + + public void onSuccess(String result) { + serverResponseLabel.removeStyleName("serverResponseLabelError"); + serverResponseLabel.setHTML(result); + closeButton.setFocus(true); + vPanel.setVisible(true); + } + }); + } + } + + // Add a handler to send the name to the server + MyHandler handler = new MyHandler(); + sendButton.addClickHandler(handler); + nameField.addKeyUpHandler(handler); + } +} diff --git a/google-web-toolkit/src/main/java/com/baeldung/server/MessageServiceImpl.java b/google-web-toolkit/src/main/java/com/baeldung/server/MessageServiceImpl.java new file mode 100644 index 0000000000..41e2a4725c --- /dev/null +++ b/google-web-toolkit/src/main/java/com/baeldung/server/MessageServiceImpl.java @@ -0,0 +1,22 @@ +package com.baeldung.server; + +import com.baeldung.shared.MessageService; +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import java.time.LocalDateTime; + +/** + * The server-side implementation of the RPC service. + */ +@SuppressWarnings("serial") +public class MessageServiceImpl extends RemoteServiceServlet implements MessageService { + + public String sendMessage(String message) throws IllegalArgumentException { + if (message == null) { + throw new IllegalArgumentException("message is null"); + } + + return "Hello, " + message + "!

Time received: " + LocalDateTime.now(); + } + +} diff --git a/google-web-toolkit/src/main/java/com/baeldung/shared/MessageService.java b/google-web-toolkit/src/main/java/com/baeldung/shared/MessageService.java new file mode 100644 index 0000000000..2c74a5c00d --- /dev/null +++ b/google-web-toolkit/src/main/java/com/baeldung/shared/MessageService.java @@ -0,0 +1,12 @@ +package com.baeldung.shared; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +/** + * The client-side stub for the RPC service. + */ +@RemoteServiceRelativePath("greet") +public interface MessageService extends RemoteService { + String sendMessage(String message) throws IllegalArgumentException; +} diff --git a/google-web-toolkit/src/main/java/com/baeldung/shared/MessageServiceAsync.java b/google-web-toolkit/src/main/java/com/baeldung/shared/MessageServiceAsync.java new file mode 100644 index 0000000000..49d4a29b7b --- /dev/null +++ b/google-web-toolkit/src/main/java/com/baeldung/shared/MessageServiceAsync.java @@ -0,0 +1,10 @@ +package com.baeldung.shared; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * The async counterpart of MessageService. + */ +public interface MessageServiceAsync { + void sendMessage(String input, AsyncCallback callback) throws IllegalArgumentException; +} diff --git a/google-web-toolkit/src/main/webapp/Google_web_toolkit.css b/google-web-toolkit/src/main/webapp/Google_web_toolkit.css new file mode 100644 index 0000000000..b02f219589 --- /dev/null +++ b/google-web-toolkit/src/main/webapp/Google_web_toolkit.css @@ -0,0 +1,31 @@ +/** Add css rules here for your application. */ +h1 { + font-size: 2em; + font-weight: bold; + color: #777777; + margin: 40px 0px 70px; + text-align: center; +} + +.sendButton { + display: block; + font-size: 16pt; +} + +/** Most GWT widgets already have a style name defined */ +.gwt-DialogBox { + width: 400px; +} + +.vPanel { + margin: 5px; +} + +.serverResponseLabelError { + color: red; +} + +/** Set ids using widget.getElement().setId("idOfElement") */ +#closeButton { + margin: 15px 6px 6px; +} \ No newline at end of file diff --git a/google-web-toolkit/src/main/webapp/Google_web_toolkit.html b/google-web-toolkit/src/main/webapp/Google_web_toolkit.html new file mode 100644 index 0000000000..20bba68eff --- /dev/null +++ b/google-web-toolkit/src/main/webapp/Google_web_toolkit.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + Sample GWT Application + + + + + +

Sample GWT Application

+ + + + + + + + + + + + + + +
Please enter your message:
+ + \ No newline at end of file diff --git a/google-web-toolkit/src/main/webapp/WEB-INF/web.xml b/google-web-toolkit/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..820d3d9916 --- /dev/null +++ b/google-web-toolkit/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,24 @@ + + + + + + greetServlet + com.baeldung.server.MessageServiceImpl + + + + greetServlet + /google_web_toolkit/greet + + + + + Google_web_toolkit.html + + + diff --git a/google-web-toolkit/src/main/webapp/favicon.ico b/google-web-toolkit/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..858a707523f540b16b6bd2cd79d8e870e5be524e GIT binary patch literal 1082 zcmZ`%ZETZO6uxD(Y;;{a>DsOByS{zfwcXaP?KZm7ZL*C*$bz2`oQXsMV+;XBQWYWr zYPJc6iP}IxBVpqQ{7{GsCSoK&zqdJ}*@R%GfJNp6J26{7Sl7o}lPdi1+&uT3oR8<6 zb8`vd(IXKPdb32wCqzaFF;Ykmn-B47&A#g@=I{@kviGeTm7B8>BFG2x znvr(r&4;vx+4o87i{n`_doHasp1I3#$0pRw!NdB>cUIZNPvu5=NEoSyFw&lXd~E5? zS2&j+jhmBLP#(r2HUtUx4djL|AuJoXD_G2F>pSGS3Nf=cL+sl+FyDB6W8y76rG3697TyP3Ylpb+NM$PRZ*1cFF~W& z_c>=hF}blXfooG4)OUVI>jEJ15J<^I_#@L;SQ(}}1t4Jj;FSmPh$?_$?GQ>00cg}8 zd~0bwnf@aU3||GLRo_FT8HJF$i~>~{o7_KQ#dBj2RfQp^GpyNkmBykFaUn=+!{Bs> z;--dUzuulo!{bSzu`Y$ymJ}Ks@oaTN3@XzVtl980R&`y&lP~;)Uhgju>LTbjMc8pct~ zjzVrc2X%SR2_D%Z=92?1MXC3-D)sRr?T+plr+GCRYKM}}`q-?)GCNaWoygjZXJO#( zz-FF+$r72@>iZK4;hXjc|01>d&p*@F-`-dewVT(Su^P93Z87*F4$DU~%k7mcFN5b%ULc)s3%Ms*f*gs@bMx qKWr^5TrSP^$>&dkkc&AiBV_MF>di6z%a+gjPv4-iKWScu=Kl?kF{Cg6 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 78e0fa925e..bda4a760db 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,7 @@ geotools testing-modules/groovy-spock google-cloud + google_web_toolkit gson guava guava-modules/guava-18 From 52b1f322ef22fcba2976a5f2d3f301a5439ea890 Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Thu, 28 Jun 2018 00:55:48 +0400 Subject: [PATCH 048/136] GWT app new branch --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2076fbcff0..4d3ea91ad2 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ geotools testing-modules/groovy-spock google-cloud - google_web_toolkit + google-web-toolkit gson guava guava-modules/guava-18 From 0d84a49456772369d2fc49d8e826f6740b8f7f4f Mon Sep 17 00:00:00 2001 From: amitabhmandal Date: Thu, 28 Jun 2018 15:42:30 +0530 Subject: [PATCH 049/136] BAEL-1896: Guide to GregorianCalendar --- .../calendar/GregorianCalendarExample.java | 69 +++++++ .../calendar/GregorianCalendarTester.java | 168 ++++++++++++++++++ 2 files changed, 237 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java create mode 100644 core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java diff --git a/core-java/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java b/core-java/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java new file mode 100644 index 0000000000..d8018cefd5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java @@ -0,0 +1,69 @@ +package com.baeldung.gregorian.calendar; + +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; +import java.util.TimeZone; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; + +public class GregorianCalendarExample { + + + public Date setMonth(GregorianCalendar calendar, int amount) { + calendar.set(Calendar.MONTH, amount); + return calendar.getTime(); + } + + + public Date rollAdd(GregorianCalendar calendar, int amount) { + calendar.roll(GregorianCalendar.MONTH, amount); + return calendar.getTime(); + } + + public boolean isLeapYearExample(int year) { + GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance(); + return cal.isLeapYear(year); + } + + + + public Date subtractDays(GregorianCalendar calendar, int daysToSubtract) { + GregorianCalendar cal = calendar; + cal.add(Calendar.DATE, -daysToSubtract); + return cal.getTime(); + } + + public Date addDays(GregorianCalendar calendar, int daysToAdd) { + GregorianCalendar cal = calendar; + cal.add(Calendar.DATE, daysToAdd); + return cal.getTime(); + } + + public XMLGregorianCalendar toXMLGregorianCalendar(GregorianCalendar calendar) throws DatatypeConfigurationException { + DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); + return datatypeFactory.newXMLGregorianCalendar(calendar); + } + + public Date toDate(XMLGregorianCalendar calendar) { + return calendar.toGregorianCalendar() + .getTime(); + } + + public int compareDates(GregorianCalendar firstDate, GregorianCalendar secondDate) { + return firstDate.compareTo(secondDate); + } + + public String formatDate(GregorianCalendar calendar) { + return calendar.toZonedDateTime() + .format(DateTimeFormatter.ofPattern("d MMM uuuu")); + } + +} diff --git a/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java b/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java new file mode 100644 index 0000000000..0dd48f8dff --- /dev/null +++ b/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java @@ -0,0 +1,168 @@ +package com.baeldung.gregorian.calendar; + +import static org.junit.Assert.*; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Locale; +import java.util.TimeZone; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; + +import org.junit.Test; + +import com.baeldung.gregorian.calendar.GregorianCalendarExample; + +public class GregorianCalendarTester { + + @Test + public void test_Calendar_Return_Type_Valid() { + Calendar calendar = Calendar.getInstance(); + assert ("gregory".equals(calendar.getCalendarType())); + } + + @Test + public void test_Calendar_Return_Type_InValid() { + Calendar calendar = Calendar.getInstance(); + assertNotEquals("gregorys", calendar.getCalendarType()); + } + + @Test(expected = ClassCastException.class) + public void test_Class_Cast_Exception() { + TimeZone tz = TimeZone.getTimeZone("GMT+9:00"); + Locale loc = new Locale("ja", "JP", "JP"); + Calendar calendar = Calendar.getInstance(loc); + GregorianCalendar gc = (GregorianCalendar) calendar; + } + + @Test + public void test_Getting_Calendar_information() { + GregorianCalendar calendar = new GregorianCalendar(2018, 5, 28); + assertTrue(false == calendar.isLeapYear(calendar.YEAR)); + assertTrue(52 == calendar.getWeeksInWeekYear()); + assertTrue(2018 == calendar.getWeekYear()); + assertTrue(30 == calendar.getActualMaximum(calendar.DAY_OF_MONTH)); + assertTrue(1 == calendar.getActualMinimum(calendar.DAY_OF_MONTH)); + assertTrue(1 == calendar.getGreatestMinimum(calendar.DAY_OF_MONTH)); + assertTrue(28 == calendar.getLeastMaximum(calendar.DAY_OF_MONTH)); + assertTrue(31 == calendar.getMaximum(calendar.DAY_OF_MONTH)); + assertTrue(1 == calendar.getMinimum(calendar.DAY_OF_MONTH)); + assertTrue(52 == calendar.getWeeksInWeekYear()); + + } + + @Test + public void test_Compare_Date_FirstDate_Greater_SecondDate() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar firstDate = new GregorianCalendar(2018, 6, 28); + GregorianCalendar secondDate = new GregorianCalendar(2018, 5, 28); + assertTrue(1 == calendarDemo.compareDates(firstDate, secondDate)); + + } + + @Test + public void test_Compare_Date_FirstDate_Smaller_SecondDate() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar firstDate = new GregorianCalendar(2018, 5, 28); + GregorianCalendar secondDate = new GregorianCalendar(2018, 6, 28); + assertTrue(-1 == calendarDemo.compareDates(firstDate, secondDate)); + + } + + @Test + public void test_Compare_Date_Both_Dates_Equal() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar firstDate = new GregorianCalendar(2018, 6, 28); + GregorianCalendar secondDate = new GregorianCalendar(2018, 6, 28); + assertTrue(0 == calendarDemo.compareDates(firstDate, secondDate)); + + } + + @Test + public void test_date_format() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar calendar = new GregorianCalendar(2018, 6, 28); + assertEquals("28 Jul 2018", calendarDemo.formatDate(calendar)); + } + + @Test + public void test_addDays() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.add(Calendar.DATE, 1); + Date expectedDate = calendarExpected.getTime(); + assertEquals(expectedDate, calendarDemo.addDays(calendarActual, 1)); + + } + + @Test + public void test_subDays() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.add(Calendar.DATE, -1); + Date expectedDate = calendarExpected.getTime(); + assertEquals(expectedDate, calendarDemo.subtractDays(calendarActual, 1)); + + } + + @Test + public void test_rollAdd() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.roll(Calendar.MONTH, 8); + Date expectedDate = calendarExpected.getTime(); + assertEquals(expectedDate, calendarDemo.rollAdd(calendarActual, 8)); + } + + @Test + public void test_rollSubtract() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.roll(Calendar.MONTH, -8); + Date expectedDate = calendarExpected.getTime(); + assertEquals(expectedDate, calendarDemo.rollAdd(calendarActual, -8)); + } + + @Test + public void test_setMonth() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.set(Calendar.MONTH, 3); + Date expectedDate = calendarExpected.getTime(); + assertEquals(expectedDate, calendarDemo.setMonth(calendarActual, 3)); + + } + + @Test + public void test_toXMLGregorianCalendar() throws DatatypeConfigurationException { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); + GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + XMLGregorianCalendar expectedXMLGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(calendarExpected); + assertEquals(expectedXMLGregorianCalendar, calendarDemo.toXMLGregorianCalendar(calendarActual)); + + } + + @Test + public void test_isLeapYear_True() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + assertEquals(true, calendarDemo.isLeapYearExample(2016)); + + } + + @Test + public void test_isLeapYear_False() { + GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); + assertEquals(false, calendarDemo.isLeapYearExample(2018)); + + } +} From d834de3f2398f337ab212bb5c66d8c2c3a418ea6 Mon Sep 17 00:00:00 2001 From: Syed Mansoor Date: Fri, 29 Jun 2018 09:59:06 +1000 Subject: [PATCH 050/136] [BAEL-1753] added ToDo application controllers --- kotlin-ktor/build.gradle | 2 +- kotlin-ktor/src/main/kotlin/APIServer.kt | 40 +++++++++++++++++------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/kotlin-ktor/build.gradle b/kotlin-ktor/build.gradle index 11aef74857..5c8f523cf1 100755 --- a/kotlin-ktor/build.gradle +++ b/kotlin-ktor/build.gradle @@ -5,7 +5,7 @@ version '1.0-SNAPSHOT' buildscript { - ext.kotlin_version = '1.2.40' + ext.kotlin_version = '1.2.41' ext.ktor_version = '0.9.2' repositories { diff --git a/kotlin-ktor/src/main/kotlin/APIServer.kt b/kotlin-ktor/src/main/kotlin/APIServer.kt index e67609e8b2..57ccbbe523 100755 --- a/kotlin-ktor/src/main/kotlin/APIServer.kt +++ b/kotlin-ktor/src/main/kotlin/APIServer.kt @@ -1,26 +1,26 @@ @file:JvmName("APIServer") - import io.ktor.application.call import io.ktor.application.install import io.ktor.features.CallLogging import io.ktor.features.ContentNegotiation import io.ktor.features.DefaultHeaders import io.ktor.gson.gson -import io.ktor.http.ContentType import io.ktor.request.path +import io.ktor.request.receive import io.ktor.response.respond -import io.ktor.response.respondText -import io.ktor.routing.get -import io.ktor.routing.routing +import io.ktor.routing.* import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty import org.slf4j.event.Level data class Author(val name: String, val website: String) +data class ToDo(var id: Int, val name: String, val description: String, val completed: Boolean) + fun main(args: Array) { + val toDoList = ArrayList(); val jsonResponse = """{ "id": 1, "task": "Pay waterbill", @@ -42,15 +42,31 @@ fun main(args: Array) { setPrettyPrinting() } } - routing { - get("/todo") { - call.respondText(jsonResponse, ContentType.Application.Json) - } - get("/author") { - val author = Author("baeldung", "baeldung.com") - call.respond(author) + routing() { + route("/todo") { + post { + var toDo = call.receive(); + toDo.id = toDoList.size; + toDoList.add(toDo); + call.respond("Added") + } + delete("/{id}") { + call.respond(toDoList.removeAt(call.parameters["id"]!!.toInt())); + } + get("/{id}") { + + call.respond(toDoList[call.parameters["id"]!!.toInt()]); + } + get { + call.respond(toDoList); + } } + get("/author"){ + call.respond(Author("Baeldung","baeldung.com")); + + } + } }.start(wait = true) From 0c1cee1a0bfee2dd369e3b5257e6c6633aaf6654 Mon Sep 17 00:00:00 2001 From: Priyesh Mashelkar Date: Fri, 29 Jun 2018 01:16:37 +0100 Subject: [PATCH 051/136] Please enter the commit message for your changes. Lines starting Added test classes for article --- .../java/org/baeldung/MockAnnotationTest.java | 33 +++++++++++++++++++ .../MockBeanAnnotationIntegrationTest.java | 31 +++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 spring-boot/src/test/java/org/baeldung/MockAnnotationTest.java create mode 100644 spring-boot/src/test/java/org/baeldung/MockBeanAnnotationIntegrationTest.java diff --git a/spring-boot/src/test/java/org/baeldung/MockAnnotationTest.java b/spring-boot/src/test/java/org/baeldung/MockAnnotationTest.java new file mode 100644 index 0000000000..a70b31177f --- /dev/null +++ b/spring-boot/src/test/java/org/baeldung/MockAnnotationTest.java @@ -0,0 +1,33 @@ +package org.baeldung; + +import org.baeldung.repository.UserRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class MockAnnotationTest { + + @Mock + UserRepository mockRepository; + + @Test + public void testMockAnnotation() { + Mockito.when(mockRepository.count()).thenReturn(123L); + long userCount = mockRepository.count(); + Assert.assertEquals(123L, userCount); + Mockito.verify(mockRepository).count(); + } + + @Test + public void testMockitoMockMethod() { + UserRepository localMockRepository = Mockito.mock(UserRepository.class); + Mockito.when(localMockRepository.count()).thenReturn(111L); + long userCount = localMockRepository.count(); + Assert.assertEquals(111L, userCount); + Mockito.verify(localMockRepository).count(); + } +} diff --git a/spring-boot/src/test/java/org/baeldung/MockBeanAnnotationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/MockBeanAnnotationIntegrationTest.java new file mode 100644 index 0000000000..0c93004a49 --- /dev/null +++ b/spring-boot/src/test/java/org/baeldung/MockBeanAnnotationIntegrationTest.java @@ -0,0 +1,31 @@ +package org.baeldung; + +import org.baeldung.repository.UserRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; + + +@RunWith(SpringRunner.class) +public class MockBeanAnnotationIntegrationTest { + + @MockBean + UserRepository mockRepository; + + @Autowired + ApplicationContext context; + + @Test + public void testMockBean() { + Mockito.when(mockRepository.count()).thenReturn(123L); + UserRepository userRepoFromContext = context.getBean(UserRepository.class); + long userCount = userRepoFromContext.count(); + Assert.assertEquals(123L, userCount); + Mockito.verify(mockRepository).count(); + } +} From b1d194cdb57712ae3c620d1519e3b674ce17dd1e Mon Sep 17 00:00:00 2001 From: Eric Martin Date: Thu, 28 Jun 2018 22:59:08 -0500 Subject: [PATCH 052/136] BAEL-1815: RomanNumeral and RomanArabicConverter (#4565) * BAEL-1815: RomanNumeral and RomanArabicConverter * Refactored getReverseSortedValues --- .../romannumerals/RomanArabicConverter.java | 52 +++++++++++++++++++ .../romannumerals/RomanNumeral.java | 26 ++++++++++ .../RomanArabicConverterUnitTest.java | 29 +++++++++++ 3 files changed, 107 insertions(+) create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java create mode 100644 algorithms/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java diff --git a/algorithms/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java b/algorithms/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java new file mode 100644 index 0000000000..ab0922ecf4 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java @@ -0,0 +1,52 @@ +package com.baeldung.algorithms.romannumerals; + +import java.util.List; + +class RomanArabicConverter { + + public static int romanToArabic(String input) { + String romanNumeral = input.toUpperCase(); + int result = 0; + + List romanNumerals = RomanNumeral.getReverseSortedValues(); + + int i = 0; + + while ((romanNumeral.length() > 0) && (i < romanNumerals.size())) { + RomanNumeral symbol = romanNumerals.get(i); + if (romanNumeral.startsWith(symbol.name())) { + result += symbol.getValue(); + romanNumeral = romanNumeral.substring(symbol.name().length()); + } else { + i++; + } + } + if (romanNumeral.length() > 0) { + throw new IllegalArgumentException(input + " cannot be converted to a Roman Numeral"); + } + + return result; + } + + public static String arabicToRoman(int number) { + if ((number <= 0) || (number > 4000)) { + throw new IllegalArgumentException(number + " is not in range (0,4000]"); + } + + List romanNumerals = RomanNumeral.getReverseSortedValues(); + + int i = 0; + StringBuilder sb = new StringBuilder(); + + while (number > 0 && i < romanNumerals.size()) { + RomanNumeral currentSymbol = romanNumerals.get(i); + if (currentSymbol.getValue() <= number) { + sb.append(currentSymbol.name()); + number -= currentSymbol.getValue(); + } else { + i++; + } + } + return sb.toString(); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java b/algorithms/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java new file mode 100644 index 0000000000..219f0b5090 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java @@ -0,0 +1,26 @@ +package com.baeldung.algorithms.romannumerals; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +enum RomanNumeral { + I(1), IV(4), V(5), IX(9), X(10), XL(40), L(50), XC(90), C(100), CD(400), D(500), CM(900), M(1000); + + private int value; + + RomanNumeral(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static List getReverseSortedValues() { + return Arrays.stream(values()) + .sorted(Comparator.comparing((RomanNumeral e) -> e.value).reversed()) + .collect(Collectors.toList()); + } +} diff --git a/algorithms/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java b/algorithms/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java new file mode 100644 index 0000000000..b289ec6bc9 --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.algorithms.romannumerals; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class RomanArabicConverterUnitTest { + + @Test + public void given2018Roman_WhenConvertingToArabic_ThenReturn2018() { + + String roman2018 = "MMXVIII"; + + int result = RomanArabicConverter.romanToArabic(roman2018); + + assertThat(result).isEqualTo(2018); + } + + @Test + public void given1999Arabic_WhenConvertingToRoman_ThenReturnMCMXCIX() { + + int arabic1999 = 1999; + + String result = RomanArabicConverter.arabicToRoman(arabic1999); + + assertThat(result).isEqualTo("MCMXCIX"); + } + +} From ebed45b3ef3f0c60e69280ba4b1135254994d5ea Mon Sep 17 00:00:00 2001 From: harriteja <37623394+harriteja@users.noreply.github.com> Date: Fri, 29 Jun 2018 09:29:39 +0530 Subject: [PATCH 053/136] Pivovarit patch 4 (#4570) * Update baeldung-pmd-rules.xml * Update baeldung-pmd-rules.xml (#4561) --- baeldung-pmd-rules.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/baeldung-pmd-rules.xml b/baeldung-pmd-rules.xml index 7625d68242..8175e80e19 100644 --- a/baeldung-pmd-rules.xml +++ b/baeldung-pmd-rules.xml @@ -3,8 +3,8 @@ xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> Baeldung custom PMD rules - + Test does not follow Baeldung naming convention 3 - \ No newline at end of file + From b741e4e6487eecadad9a59d085509504b00e8a54 Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Thu, 24 May 2018 13:15:52 +0100 Subject: [PATCH 054/136] Added model class --- .../com/baeldung/reactive/model/Stock.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java new file mode 100644 index 0000000000..6743de064e --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java @@ -0,0 +1,32 @@ +package com.baeldung.reactive.model; + +import java.math.BigDecimal; + +public class Stock { + + private String code; + + private BigDecimal price; + + public Stock(String code, BigDecimal price) { + this.code = code; + this.price = price; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + +} From 6656f45f0d08925b92f0269d1de667104ada9ee8 Mon Sep 17 00:00:00 2001 From: Andrea Ligios Date: Sat, 30 Jun 2018 04:43:22 +0200 Subject: [PATCH 055/136] BAEL-1783 (#4545) * BAEL-1783 * tabs to spaces, artifact id renamed * tabs to spaces * Added module spring-boot-logging-log4j2 * Removed node * @GetMapping instead of the older @RequestMapping * @GetMapping instead of the older @RequestMapping --- pom.xml | 1 + spring-boot-logging-log4j2/.gitignore | 29 ++++++++++ spring-boot-logging-log4j2/pom.xml | 58 +++++++++++++++++++ .../springbootlogging/LoggingController.java | 37 ++++++++++++ .../SpringBootLoggingApplication.java | 12 ++++ .../src/main/resources/application.properties | 0 .../src/main/resources/log4j2-spring.xml | 38 ++++++++++++ .../springbootmvc/LoggingController.java | 23 ++++++++ 8 files changed, 198 insertions(+) create mode 100644 spring-boot-logging-log4j2/.gitignore create mode 100644 spring-boot-logging-log4j2/pom.xml create mode 100644 spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java create mode 100644 spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java create mode 100644 spring-boot-logging-log4j2/src/main/resources/application.properties create mode 100644 spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml create mode 100644 spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/LoggingController.java diff --git a/pom.xml b/pom.xml index e1b85e27c0..45421969ec 100644 --- a/pom.xml +++ b/pom.xml @@ -147,6 +147,7 @@ spring-boot-ops spring-boot-security spring-boot-mvc + spring-boot-logging-log4j2 spring-cloud-data-flow spring-cloud spring-core diff --git a/spring-boot-logging-log4j2/.gitignore b/spring-boot-logging-log4j2/.gitignore new file mode 100644 index 0000000000..d129c74ec9 --- /dev/null +++ b/spring-boot-logging-log4j2/.gitignore @@ -0,0 +1,29 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/logs/ +/bin/ +/mvnw +/mvnw.cmd diff --git a/spring-boot-logging-log4j2/pom.xml b/spring-boot-logging-log4j2/pom.xml new file mode 100644 index 0000000000..c07c157eee --- /dev/null +++ b/spring-boot-logging-log4j2/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.baeldung + spring-boot-logging-log4j2 + 0.0.1-SNAPSHOT + jar + Demo project for Spring Boot Logging with Log4J2 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java b/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java new file mode 100644 index 0000000000..07763c8c3b --- /dev/null +++ b/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java @@ -0,0 +1,37 @@ +package com.baeldung.springbootlogging; + +import org.apache.logging.log4j.LogManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class LoggingController { + + private final static Logger logger = LoggerFactory.getLogger(LoggingController.class); + + @GetMapping("/") + public String index() { + logger.trace("A TRACE Message"); + logger.debug("A DEBUG Message"); + logger.info("An INFO Message"); + logger.warn("A WARN Message"); + logger.error("An ERROR Message"); + + return "Howdy! Check out the Logs to see the output..."; + } + + private static final org.apache.logging.log4j.Logger loggerNative = LogManager.getLogger(LoggingController.class); + + @GetMapping("/native") + public String nativeLogging() { + loggerNative.trace("This TRACE message has been printed by Log4j2 without passing through SLF4J"); + loggerNative.debug("This DEBUG message has been printed by Log4j2 without passing through SLF4J"); + loggerNative.info("This INFO message has been printed by Log4j2 without passing through SLF4J"); + loggerNative.warn("This WARN message been printed by Log4j2 without passing through SLF4J"); + loggerNative.error("This ERROR message been printed by Log4j2 without passing through SLF4J"); + loggerNative.fatal("This FATAL message been printed by Log4j2 without passing through SLF4J"); + return "Howdy! Check out the Logs to see the output printed directly throguh Log4j2..."; + } +} diff --git a/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java b/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java new file mode 100644 index 0000000000..336997a81e --- /dev/null +++ b/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.springbootlogging; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootLoggingApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootLoggingApplication.class, args); + } +} diff --git a/spring-boot-logging-log4j2/src/main/resources/application.properties b/spring-boot-logging-log4j2/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml b/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml new file mode 100644 index 0000000000..b08cd2d22d --- /dev/null +++ b/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + %d %p %C{1.} [%t] %m%n + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/LoggingController.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/LoggingController.java new file mode 100644 index 0000000000..819ee589fe --- /dev/null +++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/LoggingController.java @@ -0,0 +1,23 @@ +package com.baeldung.springbootmvc; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class LoggingController { + + Logger logger = LoggerFactory.getLogger(LoggingController.class); + + @GetMapping("/") + public String index() { + logger.trace("A TRACE Message"); + logger.debug("A DEBUG Message"); + logger.info("An INFO Message"); + logger.warn("A WARN Message"); + logger.error("An ERROR Message"); + + return "Howdy! Check out the Logs to see the output..."; + } +} From c66845c60126f7413ebce96a2ab1311c4f53808c Mon Sep 17 00:00:00 2001 From: psevestre Date: Sat, 30 Jun 2018 00:21:08 -0300 Subject: [PATCH 056/136] BAEL-1474 take2 - Code cleanup (#4585) * BAEL-1474 Take2 * Remove extra code --- .../amqp/SpringWebfluxAmqpApplication.java | 255 ------------------ 1 file changed, 255 deletions(-) diff --git a/spring-webflux-amqp/src/main/java/org/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java b/spring-webflux-amqp/src/main/java/org/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java index eb3b858ddc..30614e7ee6 100755 --- a/spring-webflux-amqp/src/main/java/org/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java +++ b/spring-webflux-amqp/src/main/java/org/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java @@ -1,270 +1,15 @@ package org.baeldung.spring.amqp; -import java.util.stream.Stream; - -import org.baeldung.spring.amqp.DestinationsConfig.DestinationInfo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.amqp.AmqpException; -import org.springframework.amqp.core.AmqpAdmin; -import org.springframework.amqp.core.AmqpTemplate; -import org.springframework.amqp.core.Binding; -import org.springframework.amqp.core.BindingBuilder; -import org.springframework.amqp.core.Exchange; -import org.springframework.amqp.core.ExchangeBuilder; -import org.springframework.amqp.core.Queue; -import org.springframework.amqp.core.QueueBuilder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.core.scheduler.Schedulers; @SpringBootApplication @EnableConfigurationProperties(DestinationsConfig.class) -@RestController public class SpringWebfluxAmqpApplication { - private static Logger log = LoggerFactory.getLogger(SpringWebfluxAmqpApplication.class); - - @Autowired - private AmqpTemplate amqpTemplate; - - @Autowired - private AmqpAdmin amqpAdmin; - - @Autowired - private DestinationsConfig destinationsConfig; - - public static void main(String[] args) { SpringApplication.run(SpringWebfluxAmqpApplication.class, args); } - - @Bean - public CommandLineRunner setupQueueDestinations(AmqpAdmin amqpAdmin,DestinationsConfig destinationsConfig) { - - return (args) -> { - - log.info("[I48] Creating Destinations..."); - - destinationsConfig.getQueues() - .forEach((key, destination) -> { - - log.info("[I54] Creating directExchange: key={}, name={}, routingKey={}", key, destination.getExchange(), destination.getRoutingKey()); - - Exchange ex = ExchangeBuilder - .directExchange(destination.getExchange()) - .durable(true) - .build(); - - amqpAdmin.declareExchange(ex); - - Queue q = QueueBuilder - .durable(destination.getRoutingKey()) - .build(); - - amqpAdmin.declareQueue(q); - - Binding b = BindingBuilder.bind(q) - .to(ex) - .with(destination.getRoutingKey()) - .noargs(); - amqpAdmin.declareBinding(b); - - log.info("[I70] Binding successfully created."); - - }); - - }; - - } - - @Bean - public CommandLineRunner setupTopicDestinations(AmqpAdmin amqpAdmin, DestinationsConfig destinationsConfig) { - - return (args) -> { - - // For topic each consumer will have its own Queue, so no binding - destinationsConfig.getTopics() - .forEach((key, destination) -> { - - log.info("[I98] Creating TopicExchange: name={}, exchange={}", key, destination.getExchange()); - - Exchange ex = ExchangeBuilder.topicExchange(destination.getExchange()) - .durable(true) - .build(); - - amqpAdmin.declareExchange(ex); - - log.info("[I107] Topic Exchange successfully created."); - - }); - }; - } - - @PostMapping(value = "/queue/{name}") - public Mono> sendMessageToQueue(@PathVariable String name, @RequestBody String payload) { - - // Lookup exchange details - final DestinationInfo d = destinationsConfig.getQueues() - .get(name); - if (d == null) { - // Destination not found. - return Mono.just(ResponseEntity.notFound().build()); - } - - return Mono.fromCallable(() -> { - - log.info("[I51] sendMessageToQueue: queue={}, routingKey={}", d.getExchange(), d.getRoutingKey()); - amqpTemplate.convertAndSend(d.getExchange(), d.getRoutingKey(), payload); - - return ResponseEntity.accepted().build(); - - }); - - } - - - /** - * Receive messages for the given queue - * @param name - * @return - */ - @GetMapping(value = "/queue/{name}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux receiveMessagesFromQueue(@PathVariable String name) { - - final DestinationInfo d = destinationsConfig.getQueues().get(name); - - if (d == null) { - return Flux.just(ResponseEntity.notFound().build()); - } - - Stream s = Stream.generate(() -> { - String queueName = d.getRoutingKey(); - - log.info("[I137] Polling {}", queueName); - - Object payload = amqpTemplate.receiveAndConvert(queueName,5000); - if ( payload == null ) { - payload = "No news is good news..."; - } - - return payload.toString(); - }); - - - return Flux - .fromStream(s) - .subscribeOn(Schedulers.elastic()); - - } - - /** - * send message to a given topic - * @param name - * @param payload - * @return - */ - @PostMapping(value = "/topic/{name}") - public Mono> sendMessageToTopic(@PathVariable String name, @RequestBody String payload) { - - // Lookup exchange details - final DestinationInfo d = destinationsConfig.getTopics().get(name); - if (d == null) { - // Destination not found. - return Mono.just(ResponseEntity.notFound().build()); - } - - return Mono.fromCallable(() -> { - - log.info("[I51] sendMessageToTopic: topic={}, routingKey={}", d.getExchange(), d.getRoutingKey()); - amqpTemplate.convertAndSend(d.getExchange(), d.getRoutingKey(), payload); - - return ResponseEntity.accepted().build(); - - }); - } - - - @GetMapping(value = "/topic/{name}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux receiveMessagesFromTopic(@PathVariable String name) { - - DestinationInfo d = destinationsConfig.getTopics().get(name); - - if (d == null) { - return Flux.just(ResponseEntity.notFound().build()); - } - - final Queue topicQueue = createTopicQueue(d); - - Stream s = Stream.generate(() -> { - String queueName = topicQueue.getName(); - - log.info("[I137] Polling {}", queueName); - - try { - Object payload = amqpTemplate.receiveAndConvert(queueName,5000); - if ( payload == null ) { - payload = "No news is good news..."; - } - - return payload.toString(); - } - catch(AmqpException ex) { - log.warn("[W247] Received an AMQP Exception: {}", ex.getMessage()); - return null; - } - }); - - - return Flux.fromStream(s) - .doOnCancel(() -> { - log.info("[I250] doOnCancel()"); - amqpAdmin.deleteQueue(topicQueue.getName()); - }) - .subscribeOn(Schedulers.elastic()); - - - } - - - private Queue createTopicQueue(DestinationInfo destination) { - - Exchange ex = ExchangeBuilder.topicExchange(destination.getExchange()) - .durable(true) - .build(); - - amqpAdmin.declareExchange(ex); - - // Create a durable queue - Queue q = QueueBuilder - .durable() - .build(); - - amqpAdmin.declareQueue(q); - - Binding b = BindingBuilder.bind(q) - .to(ex) - .with(destination.getRoutingKey()) - .noargs(); - - amqpAdmin.declareBinding(b); - - return q; - } - } From 4e785fdc152de8601917a13bfe897ad3ec8f5426 Mon Sep 17 00:00:00 2001 From: IvanLjubicic Date: Sat, 30 Jun 2018 05:27:36 +0200 Subject: [PATCH 057/136] BAEL-1760 Console I/O in Java (#4379) * ivan.ljubicic.app.developer@gmail.com * Added unit tests, configuration class and minor adjustments * primefaces intro module added * deleted primefaces old module * deleted different bean injection types sample project * deleted addition different bean injection types file * Renaming archetype in web.xml * Added primefaces in jsf module * Primefaces improvements * Added commandButton and dialog * Added PFM * Code formatting * Update pom.xml * Formatting changes * ConsoleDemo initial version * Added new classes, renamed ConsoleDemo class * Removed System.in class, renamed Scanner class and reorganized * Added more method examples --- .../baeldung/console/ConsoleConsoleClass.java | 26 +++++++ .../baeldung/console/ConsoleScannerClass.java | 76 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java create mode 100644 core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java diff --git a/core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java b/core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java new file mode 100644 index 0000000000..a5c704345f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java @@ -0,0 +1,26 @@ +package com.baeldung.console; + +import java.io.Console; + +public class ConsoleConsoleClass { + + public static void main(String[] args) { + Console console = System.console(); + + if (console == null) { + System.out.print("No console available"); + return; + } + + String progLanguauge = console.readLine("Enter your favourite programming language: "); + console.printf(progLanguauge + " is very interesting!"); + + char[] pass = console.readPassword("To finish, enter password: "); + + if ("BAELDUNG".equals(pass.toString().toUpperCase())) + console.printf("Good! Regards!"); + else + console.printf("Nice try. Regards."); + + } +} diff --git a/core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java b/core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java new file mode 100644 index 0000000000..7b7a7a4ade --- /dev/null +++ b/core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java @@ -0,0 +1,76 @@ +package com.baeldung.console; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Scanner; +import java.util.regex.Pattern; + +public class ConsoleScannerClass { + + public static void main(String[] args) { + System.out.println("Please enter your name and surname: "); + + Scanner scanner = new Scanner(System.in); + + String nameSurname = scanner.nextLine(); + + System.out.println("Please enter your gender: "); + + char gender = scanner.next().charAt(0); + + System.out.println("Please enter your age: "); + + int age = scanner.nextInt(); + + System.out.println("Please enter your height in meters: "); + + double height = scanner.nextDouble(); + + System.out.println(nameSurname + ", " + age + ", is a great " + (gender == 'm' ? "guy" : "girl") + " with " + height + " meters height" + " and " + (gender == 'm' ? "he" : "she") + " reads Baeldung."); + + System.out.print("Have a good"); + System.out.print(" one!"); + + System.out.println("\nPlease enter number of years of experience as a developer: "); + + BufferedReader buffReader = new BufferedReader(new InputStreamReader(System.in)); + + int i = 0; + + try { + i = Integer.parseInt(buffReader.readLine()); + } catch (NumberFormatException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + System.out.println("You are a " + (i > 5 ? "great" : "good") + " developer!"); + + int sum = 0, count = 0; + + System.out.println("Please enter your college degrees. To finish, enter baeldung website url"); + + while (scanner.hasNextInt()) { + int nmbr = scanner.nextInt(); + sum += nmbr; + count++; + } + int mean = sum / count; + + System.out.println("Your average degree is " + mean); + + if (scanner.hasNext(Pattern.compile("www.baeldung.com"))) + System.out.println("Correct!"); + else + System.out.println("Baeldung website url is www.baeldung.com"); + + if (scanner != null) + scanner.close(); + + } + +} From f6f62ea0f59137c25c79908e4fc426f51fd8b0f8 Mon Sep 17 00:00:00 2001 From: markusgulden Date: Sat, 30 Jun 2018 05:49:16 +0200 Subject: [PATCH 058/136] BAEL-1727 (#4575) * Moved Lambda examples to separate module Implementation of API Gateway example * Format fixes * Format fixes * Minor fixes * Minor fixes * Minor fixes * Adding SAM templates for "Introduction to AWS Serverless Application Model" * Fixing formatting with spaces --- .../sam-templates/template-implicit.yaml | 75 ++++++ .../template-inline-swagger.yaml | 127 +++++++++++ .../lambda/apigateway/APIDemoHandler.java | 214 +++++++++--------- .../lambda/apigateway/model/Person.java | 94 ++++---- 4 files changed, 356 insertions(+), 154 deletions(-) create mode 100644 aws-lambda/sam-templates/template-implicit.yaml create mode 100644 aws-lambda/sam-templates/template-inline-swagger.yaml diff --git a/aws-lambda/sam-templates/template-implicit.yaml b/aws-lambda/sam-templates/template-implicit.yaml new file mode 100644 index 0000000000..73289b8bb1 --- /dev/null +++ b/aws-lambda/sam-templates/template-implicit.yaml @@ -0,0 +1,75 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: 'AWS::Serverless-2016-10-31' +Description: Baeldung Serverless Application Model Example with Implicit API Definition +Globals: + Api: + EndpointConfiguration: REGIONAL + Name: "TestAPI" +Resources: + PersonTable: + Type: AWS::Serverless::SimpleTable + Properties: + PrimaryKey: + Name: id + Type: Number + TableName: Person + StorePersonFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.baeldung.lambda.apigateway.APIDemoHandler::handleRequest + Runtime: java8 + Timeout: 15 + MemorySize: 512 + CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar + Policies: + - DynamoDBCrudPolicy: + TableName: !Ref PersonTable + Environment: + Variables: + TABLE_NAME: !Ref PersonTable + Events: + StoreApi: + Type: Api + Properties: + Path: /persons + Method: PUT + GetPersonByPathParamFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.baeldung.lambda.apigateway.APIDemoHandler::handleGetByPathParam + Runtime: java8 + Timeout: 15 + MemorySize: 512 + CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar + Policies: + - DynamoDBReadPolicy: + TableName: !Ref PersonTable + Environment: + Variables: + TABLE_NAME: !Ref PersonTable + Events: + GetByPathApi: + Type: Api + Properties: + Path: /persons/{id} + Method: GET + GetPersonByQueryParamFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.baeldung.lambda.apigateway.APIDemoHandler::handleGetByQueryParam + Runtime: java8 + Timeout: 15 + MemorySize: 512 + CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar + Policies: + - DynamoDBReadPolicy: + TableName: !Ref PersonTable + Environment: + Variables: + TABLE_NAME: !Ref PersonTable + Events: + GetByQueryApi: + Type: Api + Properties: + Path: /persons + Method: GET \ No newline at end of file diff --git a/aws-lambda/sam-templates/template-inline-swagger.yaml b/aws-lambda/sam-templates/template-inline-swagger.yaml new file mode 100644 index 0000000000..f704d47c25 --- /dev/null +++ b/aws-lambda/sam-templates/template-inline-swagger.yaml @@ -0,0 +1,127 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: 'AWS::Serverless-2016-10-31' +Description: Baeldung Serverless Application Model Example with Inline Swagger API Definition +Resources: + PersonTable: + Type: AWS::Serverless::SimpleTable + Properties: + PrimaryKey: + Name: id + Type: Number + TableName: Person + StorePersonFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.baeldung.lambda.apigateway.APIDemoHandler::handleRequest + Runtime: java8 + Timeout: 15 + MemorySize: 512 + CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar + Policies: + - DynamoDBCrudPolicy: + TableName: !Ref PersonTable + Environment: + Variables: + TABLE_NAME: !Ref PersonTable + Events: + StoreApi: + Type: Api + Properties: + Path: /persons + Method: PUT + RestApiId: + Ref: MyApi + GetPersonByPathParamFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.baeldung.lambda.apigateway.APIDemoHandler::handleGetByPathParam + Runtime: java8 + Timeout: 15 + MemorySize: 512 + CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar + Policies: + - DynamoDBReadPolicy: + TableName: !Ref PersonTable + Environment: + Variables: + TABLE_NAME: !Ref PersonTable + Events: + GetByPathApi: + Type: Api + Properties: + Path: /persons/{id} + Method: GET + RestApiId: + Ref: MyApi + GetPersonByQueryParamFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.baeldung.lambda.apigateway.APIDemoHandler::handleGetByQueryParam + Runtime: java8 + Timeout: 15 + MemorySize: 512 + CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar + Policies: + - DynamoDBReadPolicy: + TableName: !Ref PersonTable + Environment: + Variables: + TABLE_NAME: !Ref PersonTable + Events: + GetByQueryApi: + Type: Api + Properties: + Path: /persons + Method: GET + RestApiId: + Ref: MyApi + MyApi: + Type: AWS::Serverless::Api + Properties: + StageName: test + EndpointConfiguration: REGIONAL + DefinitionBody: + swagger: "2.0" + info: + title: "TestAPI" + paths: + /persons: + get: + parameters: + - name: "id" + in: "query" + required: true + type: "string" + x-amazon-apigateway-request-validator: "Validate query string parameters and\ + \ headers" + x-amazon-apigateway-integration: + uri: + Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetPersonByQueryParamFunction.Arn}/invocations + responses: {} + httpMethod: "POST" + type: "aws_proxy" + put: + x-amazon-apigateway-integration: + uri: + Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${StorePersonFunction.Arn}/invocations + responses: {} + httpMethod: "POST" + type: "aws_proxy" + /persons/{id}: + get: + parameters: + - name: "id" + in: "path" + required: true + type: "string" + responses: {} + x-amazon-apigateway-integration: + uri: + Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetPersonByPathParamFunction.Arn}/invocations + responses: {} + httpMethod: "POST" + type: "aws_proxy" + x-amazon-apigateway-request-validators: + Validate query string parameters and headers: + validateRequestParameters: true + validateRequestBody: false \ No newline at end of file diff --git a/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java index 328915c028..71889eaf1b 100644 --- a/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java +++ b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java @@ -15,152 +15,152 @@ import java.io.*; public class APIDemoHandler implements RequestStreamHandler { - private JSONParser parser = new JSONParser(); - private static final String DYNAMODB_TABLE_NAME = System.getenv("TABLE_NAME"); + private JSONParser parser = new JSONParser(); + private static final String DYNAMODB_TABLE_NAME = System.getenv("TABLE_NAME"); - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - JSONObject responseJson = new JSONObject(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + JSONObject responseJson = new JSONObject(); - AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); - DynamoDB dynamoDb = new DynamoDB(client); + AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); + DynamoDB dynamoDb = new DynamoDB(client); - try { - JSONObject event = (JSONObject) parser.parse(reader); + try { + JSONObject event = (JSONObject) parser.parse(reader); - if (event.get("body") != null) { + if (event.get("body") != null) { - Person person = new Person((String) event.get("body")); + Person person = new Person((String) event.get("body")); - dynamoDb.getTable(DYNAMODB_TABLE_NAME) - .putItem(new PutItemSpec().withItem(new Item().withNumber("id", person.getId()) - .withString("firstName", person.getFirstName()) - .withString("lastName", person.getLastName()).withNumber("age", person.getAge()) - .withString("address", person.getAddress()))); - } + dynamoDb.getTable(DYNAMODB_TABLE_NAME) + .putItem(new PutItemSpec().withItem(new Item().withNumber("id", person.getId()) + .withString("firstName", person.getFirstName()) + .withString("lastName", person.getLastName()).withNumber("age", person.getAge()) + .withString("address", person.getAddress()))); + } - JSONObject responseBody = new JSONObject(); - responseBody.put("message", "New item created"); + JSONObject responseBody = new JSONObject(); + responseBody.put("message", "New item created"); - JSONObject headerJson = new JSONObject(); - headerJson.put("x-custom-header", "my custom header value"); + JSONObject headerJson = new JSONObject(); + headerJson.put("x-custom-header", "my custom header value"); - responseJson.put("statusCode", 200); - responseJson.put("headers", headerJson); - responseJson.put("body", responseBody.toString()); + responseJson.put("statusCode", 200); + responseJson.put("headers", headerJson); + responseJson.put("body", responseBody.toString()); - } catch (ParseException pex) { - responseJson.put("statusCode", 400); - responseJson.put("exception", pex); - } + } catch (ParseException pex) { + responseJson.put("statusCode", 400); + responseJson.put("exception", pex); + } - OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); - writer.write(responseJson.toString()); - writer.close(); - } + OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write(responseJson.toString()); + writer.close(); + } - public void handleGetByPathParam(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { + public void handleGetByPathParam(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - JSONObject responseJson = new JSONObject(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + JSONObject responseJson = new JSONObject(); - AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); - DynamoDB dynamoDb = new DynamoDB(client); + AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); + DynamoDB dynamoDb = new DynamoDB(client); - Item result = null; - try { - JSONObject event = (JSONObject) parser.parse(reader); - JSONObject responseBody = new JSONObject(); + Item result = null; + try { + JSONObject event = (JSONObject) parser.parse(reader); + JSONObject responseBody = new JSONObject(); - if (event.get("pathParameters") != null) { + if (event.get("pathParameters") != null) { - JSONObject pps = (JSONObject) event.get("pathParameters"); - if (pps.get("id") != null) { + JSONObject pps = (JSONObject) event.get("pathParameters"); + if (pps.get("id") != null) { - int id = Integer.parseInt((String) pps.get("id")); - result = dynamoDb.getTable(DYNAMODB_TABLE_NAME).getItem("id", id); - } + int id = Integer.parseInt((String) pps.get("id")); + result = dynamoDb.getTable(DYNAMODB_TABLE_NAME).getItem("id", id); + } - } - if (result != null) { + } + if (result != null) { - Person person = new Person(result.toJSON()); - responseBody.put("Person", person); - responseJson.put("statusCode", 200); - } else { + Person person = new Person(result.toJSON()); + responseBody.put("Person", person); + responseJson.put("statusCode", 200); + } else { - responseBody.put("message", "No item found"); - responseJson.put("statusCode", 404); - } + responseBody.put("message", "No item found"); + responseJson.put("statusCode", 404); + } - JSONObject headerJson = new JSONObject(); - headerJson.put("x-custom-header", "my custom header value"); + JSONObject headerJson = new JSONObject(); + headerJson.put("x-custom-header", "my custom header value"); - responseJson.put("headers", headerJson); - responseJson.put("body", responseBody.toString()); + responseJson.put("headers", headerJson); + responseJson.put("body", responseBody.toString()); - } catch (ParseException pex) { - responseJson.put("statusCode", 400); - responseJson.put("exception", pex); - } + } catch (ParseException pex) { + responseJson.put("statusCode", 400); + responseJson.put("exception", pex); + } - OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); - writer.write(responseJson.toString()); - writer.close(); - } + OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write(responseJson.toString()); + writer.close(); + } - public void handleGetByQueryParam(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { + public void handleGetByQueryParam(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - JSONObject responseJson = new JSONObject(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + JSONObject responseJson = new JSONObject(); - AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); - DynamoDB dynamoDb = new DynamoDB(client); + AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); + DynamoDB dynamoDb = new DynamoDB(client); - Item result = null; - try { - JSONObject event = (JSONObject) parser.parse(reader); - JSONObject responseBody = new JSONObject(); + Item result = null; + try { + JSONObject event = (JSONObject) parser.parse(reader); + JSONObject responseBody = new JSONObject(); - if (event.get("queryStringParameters") != null) { + if (event.get("queryStringParameters") != null) { - JSONObject qps = (JSONObject) event.get("queryStringParameters"); - if (qps.get("id") != null) { + JSONObject qps = (JSONObject) event.get("queryStringParameters"); + if (qps.get("id") != null) { - int id = Integer.parseInt((String) qps.get("id")); - result = dynamoDb.getTable(DYNAMODB_TABLE_NAME).getItem("id", id); - } - } + int id = Integer.parseInt((String) qps.get("id")); + result = dynamoDb.getTable(DYNAMODB_TABLE_NAME).getItem("id", id); + } + } - if (result != null) { + if (result != null) { - Person person = new Person(result.toJSON()); - responseBody.put("Person", person); - responseJson.put("statusCode", 200); - } else { + Person person = new Person(result.toJSON()); + responseBody.put("Person", person); + responseJson.put("statusCode", 200); + } else { - responseBody.put("message", "No item found"); - responseJson.put("statusCode", 404); - } + responseBody.put("message", "No item found"); + responseJson.put("statusCode", 404); + } - JSONObject headerJson = new JSONObject(); - headerJson.put("x-custom-header", "my custom header value"); + JSONObject headerJson = new JSONObject(); + headerJson.put("x-custom-header", "my custom header value"); - responseJson.put("headers", headerJson); - responseJson.put("body", responseBody.toString()); + responseJson.put("headers", headerJson); + responseJson.put("body", responseBody.toString()); - } catch (ParseException pex) { - responseJson.put("statusCode", 400); - responseJson.put("exception", pex); - } + } catch (ParseException pex) { + responseJson.put("statusCode", 400); + responseJson.put("exception", pex); + } - OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); - writer.write(responseJson.toString()); - writer.close(); - } + OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write(responseJson.toString()); + writer.close(); + } } diff --git a/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java index 3be7b261cd..df00994651 100644 --- a/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java +++ b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java @@ -5,64 +5,64 @@ import com.google.gson.GsonBuilder; public class Person { - private int id; - private String firstName; - private String lastName; - private int age; - private String address; + private int id; + private String firstName; + private String lastName; + private int age; + private String address; - public Person(String json) { - Gson gson = new Gson(); - Person request = gson.fromJson(json, Person.class); - this.id = request.getId(); - this.firstName = request.getFirstName(); - this.lastName = request.getLastName(); - this.age = request.getAge(); - this.address = request.getAddress(); - } + public Person(String json) { + Gson gson = new Gson(); + Person request = gson.fromJson(json, Person.class); + this.id = request.getId(); + this.firstName = request.getFirstName(); + this.lastName = request.getLastName(); + this.age = request.getAge(); + this.address = request.getAddress(); + } - public String toString() { - final Gson gson = new GsonBuilder().setPrettyPrinting().create(); - return gson.toJson(this); - } + public String toString() { + final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + return gson.toJson(this); + } - public int getId() { - return id; - } + public int getId() { + return id; + } - public void setId(int id) { - this.id = id; - } + public void setId(int id) { + this.id = id; + } - public String getFirstName() { - return firstName; - } + public String getFirstName() { + return firstName; + } - public void setFirstName(String firstName) { - this.firstName = firstName; - } + public void setFirstName(String firstName) { + this.firstName = firstName; + } - public String getLastName() { - return lastName; - } + public String getLastName() { + return lastName; + } - public void setLastName(String lastName) { - this.lastName = lastName; - } + public void setLastName(String lastName) { + this.lastName = lastName; + } - public int getAge() { - return age; - } + public int getAge() { + return age; + } - public void setAge(int age) { - this.age = age; - } + public void setAge(int age) { + this.age = age; + } - public String getAddress() { - return address; - } + public String getAddress() { + return address; + } - public void setAddress(String address) { - this.address = address; + public void setAddress(String address) { + this.address = address; } } From 172eb6c21899c1037762e4e7e5bb8973f90d86d3 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Fri, 29 Jun 2018 23:05:28 -0500 Subject: [PATCH 059/136] BAEL-1774: Moved SpringBootConsoleApplication from spring-boot to spring-boot-ops --- .../springbootnonwebapp/SpringBootConsoleApplication.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {spring-boot => spring-boot-ops}/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java (100%) diff --git a/spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java b/spring-boot-ops/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java rename to spring-boot-ops/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java From f4d9ba7c0d55f7efa7299d4181cc7757693f75a3 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Sat, 30 Jun 2018 11:34:57 +0530 Subject: [PATCH 060/136] [BAEL-7057] - Fixed Junits in Jenkins for libraries-data Module (#4588) --- libraries-data/src/main/resources/db.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries-data/src/main/resources/db.sql b/libraries-data/src/main/resources/db.sql index 1dac59307b..e6a9ed3fc2 100644 --- a/libraries-data/src/main/resources/db.sql +++ b/libraries-data/src/main/resources/db.sql @@ -1,3 +1,7 @@ +drop table if exists emp; +drop table if exists dept; + + create table dept( deptno numeric, dname varchar(14), From 2191bb639d1f4d6dac8d9d474bdef2fc6b456ad5 Mon Sep 17 00:00:00 2001 From: amitabhmandal Date: Sat, 30 Jun 2018 14:37:38 +0530 Subject: [PATCH 061/136] BAEL-1896 Added test cases --- .../calendar/GregorianCalendarTester.java | 87 +++++++++++++++++-- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java b/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java index 0dd48f8dff..2832f416bf 100644 --- a/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java +++ b/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java @@ -2,6 +2,7 @@ package com.baeldung.gregorian.calendar; import static org.junit.Assert.*; +import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -51,7 +52,6 @@ public class GregorianCalendarTester { assertTrue(31 == calendar.getMaximum(calendar.DAY_OF_MONTH)); assertTrue(1 == calendar.getMinimum(calendar.DAY_OF_MONTH)); assertTrue(52 == calendar.getWeeksInWeekYear()); - } @Test @@ -60,8 +60,15 @@ public class GregorianCalendarTester { GregorianCalendar firstDate = new GregorianCalendar(2018, 6, 28); GregorianCalendar secondDate = new GregorianCalendar(2018, 5, 28); assertTrue(1 == calendarDemo.compareDates(firstDate, secondDate)); - } + + @Test + public void test_CompareFirstDateGreaterSecondDate() { + GregorianCalendar firstDate = new GregorianCalendar(2018, 6, 28); + GregorianCalendar secondDate = new GregorianCalendar(2018, 5, 28); + assertTrue(1 == firstDate.compareTo(secondDate)); + } + @Test public void test_Compare_Date_FirstDate_Smaller_SecondDate() { @@ -69,7 +76,13 @@ public class GregorianCalendarTester { GregorianCalendar firstDate = new GregorianCalendar(2018, 5, 28); GregorianCalendar secondDate = new GregorianCalendar(2018, 6, 28); assertTrue(-1 == calendarDemo.compareDates(firstDate, secondDate)); - + } + + @Test + public void test_CompareFirstDateSmallerSecondDate() { + GregorianCalendar firstDate = new GregorianCalendar(2018, 5, 28); + GregorianCalendar secondDate = new GregorianCalendar(2018, 6, 28); + assertTrue(-1 == firstDate.compareTo(secondDate)); } @Test @@ -78,7 +91,13 @@ public class GregorianCalendarTester { GregorianCalendar firstDate = new GregorianCalendar(2018, 6, 28); GregorianCalendar secondDate = new GregorianCalendar(2018, 6, 28); assertTrue(0 == calendarDemo.compareDates(firstDate, secondDate)); - + } + + @Test + public void test_CompareDatesEqual() { + GregorianCalendar firstDate = new GregorianCalendar(2018, 6, 28); + GregorianCalendar secondDate = new GregorianCalendar(2018, 6, 28); + assertTrue(0 == firstDate.compareTo(secondDate)); } @Test @@ -88,6 +107,13 @@ public class GregorianCalendarTester { assertEquals("28 Jul 2018", calendarDemo.formatDate(calendar)); } + @Test + public void test_dateFormatdMMMuuuu() { + String expectedDate = new GregorianCalendar(2018, 6, 28).toZonedDateTime() + .format(DateTimeFormatter.ofPattern("d MMM uuuu")); + assertEquals("28 Jul 2018", expectedDate); + } + @Test public void test_addDays() { GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); @@ -96,7 +122,22 @@ public class GregorianCalendarTester { calendarExpected.add(Calendar.DATE, 1); Date expectedDate = calendarExpected.getTime(); assertEquals(expectedDate, calendarDemo.addDays(calendarActual, 1)); + } + @Test + public void test_addOneDay() { + final int finalDay29 = 29; + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.add(Calendar.DATE, 1); + assertEquals(calendarExpected.get(Calendar.DATE), finalDay29); + } + + @Test + public void test_subtractOneDay() { + final int finalDay27 = 27; + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.add(Calendar.DATE, -1); + assertEquals(calendarExpected.get(Calendar.DATE), finalDay27); } @Test @@ -107,7 +148,6 @@ public class GregorianCalendarTester { calendarExpected.add(Calendar.DATE, -1); Date expectedDate = calendarExpected.getTime(); assertEquals(expectedDate, calendarDemo.subtractDays(calendarActual, 1)); - } @Test @@ -120,6 +160,24 @@ public class GregorianCalendarTester { assertEquals(expectedDate, calendarDemo.rollAdd(calendarActual, 8)); } + @Test + public void test_rollAddEightMonths() { + final int rolledUpMonthMarch = 2, orginalYear2018 = 2018; + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.roll(Calendar.MONTH, 8); + assertEquals(calendarExpected.get(Calendar.MONTH), rolledUpMonthMarch); + assertEquals(calendarExpected.get(Calendar.YEAR), orginalYear2018); + } + + @Test + public void test_rollSubstractEightMonths() { + final int rolledDownMonthNovember = 10, orginalYear2018 = 2018; + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.roll(Calendar.MONTH, -8); + assertEquals(calendarExpected.get(Calendar.MONTH), rolledDownMonthNovember); + assertEquals(calendarExpected.get(Calendar.YEAR), orginalYear2018); + } + @Test public void test_rollSubtract() { GregorianCalendarExample calendarDemo = new GregorianCalendarExample(); @@ -138,7 +196,16 @@ public class GregorianCalendarTester { calendarExpected.set(Calendar.MONTH, 3); Date expectedDate = calendarExpected.getTime(); assertEquals(expectedDate, calendarDemo.setMonth(calendarActual, 3)); + } + @Test + public void test_setMonthApril() { + final int setMonthApril = 3, orginalYear2018 = 2018, originalDate28 = 28; + GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); + calendarExpected.set(Calendar.MONTH, 3); + assertEquals(calendarExpected.get(Calendar.MONTH), setMonthApril); + assertEquals(calendarExpected.get(Calendar.YEAR), orginalYear2018); + assertEquals(calendarExpected.get(Calendar.DATE), originalDate28); } @Test @@ -149,7 +216,6 @@ public class GregorianCalendarTester { GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); XMLGregorianCalendar expectedXMLGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(calendarExpected); assertEquals(expectedXMLGregorianCalendar, calendarDemo.toXMLGregorianCalendar(calendarActual)); - } @Test @@ -165,4 +231,13 @@ public class GregorianCalendarTester { assertEquals(false, calendarDemo.isLeapYearExample(2018)); } + + @Test + public void test_toDate() throws DatatypeConfigurationException { + GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); + DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); + XMLGregorianCalendar expectedXMLGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(calendarActual); + expectedXMLGregorianCalendar.toGregorianCalendar().getTime(); + assertEquals(calendarActual.getTime(), expectedXMLGregorianCalendar.toGregorianCalendar().getTime() ); + } } From 111c39d4c95cb0ae2f6aa2e200fa89d104cfa70a Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 30 Jun 2018 08:28:44 -0500 Subject: [PATCH 062/136] Update README files (#4589) * BAEL-1766: Update README * BAEL-1853: add link to article * BAEL-1801: add link to article * Added links back to articles --- core-java/README.md | 1 + patterns/design-patterns/README.md | 1 + spring-thymeleaf/README.md | 1 + 3 files changed, 3 insertions(+) diff --git a/core-java/README.md b/core-java/README.md index fa2d7e4cf0..8800e2b862 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -160,3 +160,4 @@ - [Guide to the super Java Keyword](http://www.baeldung.com/java-super) - [Guide to the this Java Keyword](http://www.baeldung.com/java-this) - [Jagged Arrays In Java](http://www.baeldung.com/java-jagged-arrays) +- [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class) diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md index 77ead0b317..8b9d7a8193 100644 --- a/patterns/design-patterns/README.md +++ b/patterns/design-patterns/README.md @@ -9,3 +9,4 @@ - [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking) - [Composite Design Pattern in Java](http://www.baeldung.com/java-composite-pattern) - [Visitor Design Pattern in Java](http://www.baeldung.com/java-visitor-pattern) +- [The DAO Pattern in Java](http://www.baeldung.com/java-dao-pattern) diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index 27af6c077a..99f46c2f39 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -15,6 +15,7 @@ - [Conditionals in Thymeleaf](http://www.baeldung.com/spring-thymeleaf-conditionals) - [Iteration in Thymeleaf](http://www.baeldung.com/thymeleaf-iteration) - [Working With Arrays in Thymeleaf](http://www.baeldung.com/thymeleaf-arrays) +- [Spring with Thymeleaf Pagination for a List](http://www.baeldung.com/spring-thymeleaf-pagination) ### Build the Project From 97bddd2a204bb2fb75ef68d2b23eec7b48f9a7fd Mon Sep 17 00:00:00 2001 From: abialas Date: Sat, 30 Jun 2018 19:12:01 +0200 Subject: [PATCH 063/136] BAEL-1924 (#4590) * Revert "BAEL-1924 (#4573)" This reverts commit b1b34e2fcad274cbe91737b2a6d1fbfbffb62ea6. * BAEL-1924 move code to new spring-boot-persistence module * BAEL-1924 add new spring-boot-persistence module --- pom.xml | 1 + spring-boot-persistence/.gitignore | 5 + .../.mvn/wrapper/maven-wrapper.properties | 1 + spring-boot-persistence/README.MD | 3 + spring-boot-persistence/mvnw | 227 ++++++++++++++++++ spring-boot-persistence/mvnw.cmd | 145 +++++++++++ spring-boot-persistence/pom.xml | 53 ++++ .../main/java/com/baeldung/Application.java | 14 ++ .../main/java/com/baeldung}/domain/User.java | 2 +- .../baeldung}/repository/UserRepository.java | 4 +- .../src/main/resources/application.properties | 0 .../UserRepositoryIntegrationTest.java | 8 +- .../src/test/resources/application.properties | 16 ++ .../test/resources/import_active_users.sql | 2 +- .../test/resources/import_inactive_users.sql | 0 .../src/test/resources/migrated_users.sql | 3 + .../info/TotalUsersInfoContributor.java | 2 +- .../main/java/org/baeldung/model/User.java | 49 ++++ .../baeldung/repository/UserRepository.java | 82 +++++++ .../UserRepositoryIntegrationTest.java | 7 +- .../application-integrationtest.properties | 2 - .../src/test/resources/application.properties | 4 +- 22 files changed, 613 insertions(+), 17 deletions(-) create mode 100644 spring-boot-persistence/.gitignore create mode 100755 spring-boot-persistence/.mvn/wrapper/maven-wrapper.properties create mode 100644 spring-boot-persistence/README.MD create mode 100755 spring-boot-persistence/mvnw create mode 100755 spring-boot-persistence/mvnw.cmd create mode 100644 spring-boot-persistence/pom.xml create mode 100644 spring-boot-persistence/src/main/java/com/baeldung/Application.java rename {spring-boot/src/main/java/org/baeldung/boot => spring-boot-persistence/src/main/java/com/baeldung}/domain/User.java (96%) rename {spring-boot/src/main/java/org/baeldung/boot => spring-boot-persistence/src/main/java/com/baeldung}/repository/UserRepository.java (97%) create mode 100644 spring-boot-persistence/src/main/resources/application.properties rename spring-boot/src/test/java/org/baeldung/boot/repository/UserRepositoryDataJpaIntegrationTest.java => spring-boot-persistence/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java (77%) create mode 100644 spring-boot-persistence/src/test/resources/application.properties rename {spring-boot => spring-boot-persistence}/src/test/resources/import_active_users.sql (67%) rename {spring-boot => spring-boot-persistence}/src/test/resources/import_inactive_users.sql (100%) create mode 100644 spring-boot-persistence/src/test/resources/migrated_users.sql create mode 100644 spring-boot/src/main/java/org/baeldung/model/User.java create mode 100644 spring-boot/src/main/java/org/baeldung/repository/UserRepository.java rename spring-boot/src/test/java/org/baeldung/{boot => }/repository/UserRepositoryIntegrationTest.java (95%) diff --git a/pom.xml b/pom.xml index 45421969ec..661258ef1d 100644 --- a/pom.xml +++ b/pom.xml @@ -145,6 +145,7 @@ spring-boot-bootstrap spring-boot-admin spring-boot-ops + spring-boot-persistence spring-boot-security spring-boot-mvc spring-boot-logging-log4j2 diff --git a/spring-boot-persistence/.gitignore b/spring-boot-persistence/.gitignore new file mode 100644 index 0000000000..88e3308e9d --- /dev/null +++ b/spring-boot-persistence/.gitignore @@ -0,0 +1,5 @@ +/target/ +.settings/ +.classpath +.project + diff --git a/spring-boot-persistence/.mvn/wrapper/maven-wrapper.properties b/spring-boot-persistence/.mvn/wrapper/maven-wrapper.properties new file mode 100755 index 0000000000..a447c9fa81 --- /dev/null +++ b/spring-boot-persistence/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip \ No newline at end of file diff --git a/spring-boot-persistence/README.MD b/spring-boot-persistence/README.MD new file mode 100644 index 0000000000..71cd226b3a --- /dev/null +++ b/spring-boot-persistence/README.MD @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Spring Boot with multiple SQL import files](http://www.baeldung.com/spring-Boot-with-multiple-SQL-import-files) \ No newline at end of file diff --git a/spring-boot-persistence/mvnw b/spring-boot-persistence/mvnw new file mode 100755 index 0000000000..e96ccd5fbb --- /dev/null +++ b/spring-boot-persistence/mvnw @@ -0,0 +1,227 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/spring-boot-persistence/mvnw.cmd b/spring-boot-persistence/mvnw.cmd new file mode 100755 index 0000000000..4f0b068a03 --- /dev/null +++ b/spring-boot-persistence/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/spring-boot-persistence/pom.xml b/spring-boot-persistence/pom.xml new file mode 100644 index 0000000000..af0d7ea505 --- /dev/null +++ b/spring-boot-persistence/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + com.baeldung + spring-boot-persistence + 0.0.1-SNAPSHOT + jar + spring-boot-persistence + This is a simple Spring Data Repositories test + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter + + + + + spring-boot-persistence + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + + + pl.project13.maven + git-commit-id-plugin + + + + + \ No newline at end of file diff --git a/spring-boot-persistence/src/main/java/com/baeldung/Application.java b/spring-boot-persistence/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..43888c2d67 --- /dev/null +++ b/spring-boot-persistence/src/main/java/com/baeldung/Application.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot/src/main/java/org/baeldung/boot/domain/User.java b/spring-boot-persistence/src/main/java/com/baeldung/domain/User.java similarity index 96% rename from spring-boot/src/main/java/org/baeldung/boot/domain/User.java rename to spring-boot-persistence/src/main/java/com/baeldung/domain/User.java index b6d68b8c3c..9d1fc4c8ad 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/domain/User.java +++ b/spring-boot-persistence/src/main/java/com/baeldung/domain/User.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.domain; +package com.baeldung.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot/src/main/java/org/baeldung/boot/repository/UserRepository.java b/spring-boot-persistence/src/main/java/com/baeldung/repository/UserRepository.java similarity index 97% rename from spring-boot/src/main/java/org/baeldung/boot/repository/UserRepository.java rename to spring-boot-persistence/src/main/java/com/baeldung/repository/UserRepository.java index 2463a416d2..bdc1e0af33 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/repository/UserRepository.java +++ b/spring-boot-persistence/src/main/java/com/baeldung/repository/UserRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.boot.repository; +package com.baeldung.repository; -import org.baeldung.boot.domain.User; +import com.baeldung.domain.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; diff --git a/spring-boot-persistence/src/main/resources/application.properties b/spring-boot-persistence/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-boot/src/test/java/org/baeldung/boot/repository/UserRepositoryDataJpaIntegrationTest.java b/spring-boot-persistence/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java similarity index 77% rename from spring-boot/src/test/java/org/baeldung/boot/repository/UserRepositoryDataJpaIntegrationTest.java rename to spring-boot-persistence/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java index dc4c6eedcf..af5abc22d7 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/repository/UserRepositoryDataJpaIntegrationTest.java +++ b/spring-boot-persistence/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java @@ -1,6 +1,6 @@ -package org.baeldung.boot.repository; +package com.baeldung.repository; -import org.baeldung.boot.domain.User; +import com.baeldung.domain.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -16,7 +16,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ @RunWith(SpringRunner.class) @DataJpaTest -public class UserRepositoryDataJpaIntegrationTest { +public class UserRepositoryIntegrationTest { @Autowired private UserRepository userRepository; @@ -24,7 +24,7 @@ public class UserRepositoryDataJpaIntegrationTest { public void givenTwoImportFilesWhenFindAllShouldReturnSixUsers() { Collection users = userRepository.findAll(); - assertThat(users.size()).isEqualTo(6); + assertThat(users.size()).isEqualTo(9); } } diff --git a/spring-boot-persistence/src/test/resources/application.properties b/spring-boot-persistence/src/test/resources/application.properties new file mode 100644 index 0000000000..a5c1d983cf --- /dev/null +++ b/spring-boot-persistence/src/test/resources/application.properties @@ -0,0 +1,16 @@ +# spring.datasource.x +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +spring.datasource.username=sa +spring.datasource.password=sa + +# hibernate.X +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop +hibernate.cache.use_second_level_cache=true +hibernate.cache.use_query_cache=true +hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory + +spring.jpa.properties.hibernate.hbm2ddl.import_files=migrated_users.sql +spring.datasource.data=import_*_users.sql \ No newline at end of file diff --git a/spring-boot/src/test/resources/import_active_users.sql b/spring-boot-persistence/src/test/resources/import_active_users.sql similarity index 67% rename from spring-boot/src/test/resources/import_active_users.sql rename to spring-boot-persistence/src/test/resources/import_active_users.sql index e1bdfef5a8..0ec3161d91 100644 --- a/spring-boot/src/test/resources/import_active_users.sql +++ b/spring-boot-persistence/src/test/resources/import_active_users.sql @@ -1,3 +1,3 @@ insert into USERS(name, status, id) values('Peter', 1, 1); insert into USERS(name, status, id) values('David', 1, 2); -insert into USERS(name, status, id) values('Ed', 1, 3); \ No newline at end of file +insert into USERS(name, status, id) values('Ed', 1, 3); diff --git a/spring-boot/src/test/resources/import_inactive_users.sql b/spring-boot-persistence/src/test/resources/import_inactive_users.sql similarity index 100% rename from spring-boot/src/test/resources/import_inactive_users.sql rename to spring-boot-persistence/src/test/resources/import_inactive_users.sql diff --git a/spring-boot-persistence/src/test/resources/migrated_users.sql b/spring-boot-persistence/src/test/resources/migrated_users.sql new file mode 100644 index 0000000000..11d1a69110 --- /dev/null +++ b/spring-boot-persistence/src/test/resources/migrated_users.sql @@ -0,0 +1,3 @@ +insert into USERS(name, status, id) values('Peter', 1, 7); +insert into USERS(name, status, id) values('David', 1, 8); +insert into USERS(name, status, id) values('Ed', 1, 9); diff --git a/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java b/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java index 790584644f..34b50a2c0a 100644 --- a/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java +++ b/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java @@ -3,7 +3,7 @@ package org.baeldung.endpoints.info; import java.util.HashMap; import java.util.Map; -import org.baeldung.boot.repository.UserRepository; +import org.baeldung.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; diff --git a/spring-boot/src/main/java/org/baeldung/model/User.java b/spring-boot/src/main/java/org/baeldung/model/User.java new file mode 100644 index 0000000000..eb886338a0 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/model/User.java @@ -0,0 +1,49 @@ +package org.baeldung.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue + private Integer id; + private String name; + private Integer status; + + public User() { + } + + public User(String name, Integer status) { + this.name = name; + this.status = status; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java b/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java new file mode 100644 index 0000000000..cba504b6c6 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java @@ -0,0 +1,82 @@ +package org.baeldung.repository; + +import org.baeldung.model.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Repository; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Stream; + +@Repository("userRepository") +public interface UserRepository extends JpaRepository { + + int countByStatus(int status); + + Optional findOneByName(String name); + + Stream findAllByName(String name); + + @Async + CompletableFuture findOneByStatus(Integer status); + + @Query("SELECT u FROM User u WHERE u.status = 1") + Collection findAllActiveUsers(); + + @Query(value = "SELECT * FROM USERS u WHERE u.status = 1", nativeQuery = true) + Collection findAllActiveUsersNative(); + + @Query("SELECT u FROM User u WHERE u.status = ?1") + User findUserByStatus(Integer status); + + @Query(value = "SELECT * FROM Users u WHERE u.status = ?1", nativeQuery = true) + User findUserByStatusNative(Integer status); + + @Query("SELECT u FROM User u WHERE u.status = ?1 and u.name = ?2") + User findUserByStatusAndName(Integer status, String name); + + @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name") + User findUserByStatusAndNameNamedParams(@Param("status") Integer status, @Param("name") String name); + + @Query(value = "SELECT * FROM Users u WHERE u.status = :status AND u.name = :name", nativeQuery = true) + User findUserByStatusAndNameNamedParamsNative(@Param("status") Integer status, @Param("name") String name); + + @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name") + User findUserByUserStatusAndUserName(@Param("status") Integer userStatus, @Param("name") String userName); + + @Query("SELECT u FROM User u WHERE u.name like ?1%") + User findUserByNameLike(String name); + + @Query("SELECT u FROM User u WHERE u.name like :name%") + User findUserByNameLikeNamedParam(@Param("name") String name); + + @Query(value = "SELECT * FROM users u WHERE u.name LIKE ?1%", nativeQuery = true) + User findUserByNameLikeNative(String name); + + @Query(value = "SELECT u FROM User u") + List findAllUsers(Sort sort); + + @Query(value = "SELECT u FROM User u ORDER BY id") + Page findAllUsersWithPagination(Pageable pageable); + + @Query(value = "SELECT * FROM Users ORDER BY id \n-- #pageable\n", countQuery = "SELECT count(*) FROM Users", nativeQuery = true) + Page findAllUsersWithPaginationNative(Pageable pageable); + + @Modifying + @Query("update User u set u.status = :status where u.name = :name") + int updateUserSetStatusForName(@Param("status") Integer status, @Param("name") String name); + + @Modifying + @Query(value = "UPDATE Users u SET u.status = ? WHERE u.name = ?", nativeQuery = true) + int updateUserSetStatusForNameNative(Integer status, String name); + +} diff --git a/spring-boot/src/test/java/org/baeldung/boot/repository/UserRepositoryIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java similarity index 95% rename from spring-boot/src/test/java/org/baeldung/boot/repository/UserRepositoryIntegrationTest.java rename to spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java index a0f3a7a80f..72d204820e 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/repository/UserRepositoryIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java @@ -1,7 +1,7 @@ -package org.baeldung.boot.repository; +package org.baeldung.repository; import org.baeldung.boot.config.H2JpaConfig; -import org.baeldung.boot.domain.User; +import org.baeldung.model.User; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; @@ -27,7 +27,8 @@ public class UserRepositoryIntegrationTest { private final String USER_NAME_ADAM = "Adam"; private final Integer ACTIVE_STATUS = 1; - @Autowired private UserRepository userRepository; + @Autowired + private UserRepository userRepository; @Test public void givenEmptyDBWhenFindOneByNameThenReturnEmptyOptional() { diff --git a/spring-boot/src/test/resources/application-integrationtest.properties b/spring-boot/src/test/resources/application-integrationtest.properties index 1a5bd502dd..bcd03226d3 100644 --- a/spring-boot/src/test/resources/application-integrationtest.properties +++ b/spring-boot/src/test/resources/application-integrationtest.properties @@ -2,5 +2,3 @@ spring.datasource.url=jdbc:mysql://localhost:3306/employee_int_test spring.datasource.username=root spring.datasource.password=root -spring.jpa.hibernate.ddl-auto=update -spring.datasource.data=import_*_users.sql diff --git a/spring-boot/src/test/resources/application.properties b/spring-boot/src/test/resources/application.properties index fef16d556e..85e4e6e66f 100644 --- a/spring-boot/src/test/resources/application.properties +++ b/spring-boot/src/test/resources/application.properties @@ -16,6 +16,4 @@ hibernate.show_sql=true hibernate.hbm2ddl.auto=create-drop hibernate.cache.use_second_level_cache=true hibernate.cache.use_query_cache=true -hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory - -spring.jpa.properties.hibernate.hbm2ddl.import_files=import_active_users.sql,import_inactive_users.sql \ No newline at end of file +hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory \ No newline at end of file From 00a14a67074a6d2320a1d6c82a503794c0553e7f Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 30 Jun 2018 21:52:26 +0300 Subject: [PATCH 064/136] fix surefire version --- spring-ldap/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-ldap/pom.xml b/spring-ldap/pom.xml index 41683d32a1..ab5f557736 100644 --- a/spring-ldap/pom.xml +++ b/spring-ldap/pom.xml @@ -118,6 +118,7 @@ org.apache.maven.plugins maven-surefire-plugin + ${maven-surefire-plugin.version} integration-test From aae4c2668519be30cc21bce0ce27084240222c3e Mon Sep 17 00:00:00 2001 From: DOHA Date: Sat, 30 Jun 2018 23:35:29 +0300 Subject: [PATCH 065/136] add java configuration --- ...SimpleUrlAuthenticationSuccessHandler.java | 2 +- .../baeldung/spring/SecSecurityConfig.java | 64 +++++++++++++++++-- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java b/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java index 19f1ca76a6..19f49ea59d 100644 --- a/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java +++ b/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java @@ -21,7 +21,7 @@ public class MySimpleUrlAuthenticationSuccessHandler implements AuthenticationSu private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); - protected MySimpleUrlAuthenticationSuccessHandler() { + public MySimpleUrlAuthenticationSuccessHandler() { super(); } diff --git a/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java index e9d5bc4f70..ebe23950a7 100644 --- a/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java @@ -1,16 +1,70 @@ package org.baeldung.spring; +import org.baeldung.security.MySimpleUrlAuthenticationSuccessHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.ImportResource; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; @Configuration -@ImportResource({ "classpath:webSecurityConfig.xml" }) -public class SecSecurityConfig { +//@ImportResource({ "classpath:webSecurityConfig.xml" }) +@EnableWebSecurity +public class SecSecurityConfig extends WebSecurityConfigurerAdapter { - - public SecSecurityConfig() { super(); } + @Bean("authenticationManager") + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + // @formatter:off + auth.inMemoryAuthentication() + .withUser("user1").password("{noop}user1Pass").roles("USER") + .and() + .withUser("admin1").password("{noop}admin1Pass").roles("ADMIN"); + // @formatter:on + } + + @Override + protected void configure(final HttpSecurity http) throws Exception { + // @formatter:off + http.authorizeRequests() + .antMatchers("/anonymous*").anonymous() + .antMatchers("/login*").permitAll() + .anyRequest().authenticated() + + .and() + .formLogin() + .loginPage("/login.html") + .loginProcessingUrl("/login") + .successHandler(myAuthenticationSuccessHandler()) + .failureUrl("/login.html?error=true") + + .and() + .logout().deleteCookies("JSESSIONID") + + .and() + .rememberMe().key("uniqueAndSecret").tokenValiditySeconds(86400) + + .and() + .csrf().disable() + ; + // @formatter:on + } + + @Bean + public AuthenticationSuccessHandler myAuthenticationSuccessHandler(){ + return new MySimpleUrlAuthenticationSuccessHandler(); + } } From 0a5b8c3a00ab696d75ef1d9e88f4f7eae14bc7aa Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 1 Jul 2018 10:58:13 +0300 Subject: [PATCH 066/136] update to spring 5 --- parent-spring-5/pom.xml | 1 + spring-dispatcher-servlet/pom.xml | 4 ++-- .../springdispatcherservlet/configuration/AppConfig.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml index 87479d5e2f..84e1a29a0d 100644 --- a/parent-spring-5/pom.xml +++ b/parent-spring-5/pom.xml @@ -31,6 +31,7 @@ 5.0.6.RELEASE 5.0.2 + 2.9.6 \ No newline at end of file diff --git a/spring-dispatcher-servlet/pom.xml b/spring-dispatcher-servlet/pom.xml index 9dfd3c0f39..35c6b1ad33 100644 --- a/spring-dispatcher-servlet/pom.xml +++ b/spring-dispatcher-servlet/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-spring-4 + parent-spring-5 0.0.1-SNAPSHOT - ../parent-spring-4 + ../parent-spring-5 diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/AppConfig.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/AppConfig.java index f5ad032e84..c8a6cf06a6 100644 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/AppConfig.java +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/AppConfig.java @@ -17,7 +17,7 @@ import java.io.IOException; @Configuration @EnableWebMvc @ComponentScan("com.baeldung.springdispatcherservlet") -public class AppConfig extends WebMvcConfigurerAdapter { +public class AppConfig implements WebMvcConfigurer { public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); From 92340e9ca5d6317242f36641454896b100cd210b Mon Sep 17 00:00:00 2001 From: Siben Nayak Date: Sun, 1 Jul 2018 16:11:31 +0530 Subject: [PATCH 067/136] [BAEL-1847] Iterate Backwards through a List (#4540) * [BAEL-1847] Iterate Backwards through a List * [BAEL-1847] Updated unit tests --- .../baeldung/java/list/ReverseIterator.java | 80 +++++++++++++++++ .../java/list/ReverseIteratorUnitTest.java | 87 +++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java create mode 100644 core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java b/core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java new file mode 100644 index 0000000000..42dd543ed4 --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java @@ -0,0 +1,80 @@ +package com.baeldung.java.list; + +import java.util.Collections; +import java.util.List; +import java.util.ListIterator; + +import org.apache.commons.collections4.iterators.ReverseListIterator; + +import com.google.common.collect.Lists; + +/** + * Provides methods for iterating backward over a list. + */ +public class ReverseIterator { + + /** + * Iterate using the for loop. + * + * @param list the list + */ + public void iterateUsingForLoop(final List list) { + + for (int i = list.size(); i-- > 0; ) { + System.out.println(list.get(i)); + } + } + + /** + * Iterate using the Java {@link ListIterator}. + * + * @param list the list + */ + public void iterateUsingListIterator(final List list) { + + final ListIterator listIterator = list.listIterator(list.size()); + while (listIterator.hasPrevious()) { + System.out.println(listIterator.previous()); + } + } + + /** + * Iterate using Java {@link Collections} API. + * + * @param list the list + */ + public void iterateUsingCollections(final List list) { + + Collections.reverse(list); + for (final String item : list) { + System.out.println(item); + } + } + + /** + * Iterate using Apache Commons {@link ReverseListIterator}. + * + * @param list the list + */ + public void iterateUsingApacheReverseListIterator(final List list) { + + final ReverseListIterator listIterator = new ReverseListIterator(list); + while (listIterator.hasNext()) { + System.out.println(listIterator.next()); + } + } + + /** + * Iterate using Guava {@link Lists} API. + * + * @param list the list + */ + public void iterateUsingGuava(final List list) { + + final List reversedList = Lists.reverse(list); + for (final String item : reversedList) { + System.out.println(item); + } + } + +} diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java new file mode 100644 index 0000000000..172a2fe417 --- /dev/null +++ b/core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.java.list; + +import static org.junit.Assert.assertEquals; + +import java.util.Collections; +import java.util.List; +import java.util.ListIterator; + +import org.apache.commons.collections4.iterators.ReverseListIterator; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.google.common.collect.Lists; + +public class ReverseIteratorUnitTest { + + private final ReverseIterator reverseIterator = new ReverseIterator(); + + private List list; + + private final String originalString = "ABCDE"; + + @BeforeEach + void setUp() { + + list = Lists.newArrayList("A", "B", "C", "D", "E"); + } + + @Test + void whenIteratingUsingForLoop_thenCorrect() { + + String reverseString = ""; + for (int i = list.size(); i-- > 0; ) { + reverseString += list.get(i); + } + assertEquals(reverseString, StringUtils.reverse(originalString)); + } + + @Test + void whenIteratingUsingListIterator_thenCorrect() { + + String reverseString = ""; + final ListIterator listIterator = list.listIterator(list.size()); + while (listIterator.hasPrevious()) { + reverseString += listIterator.previous(); + } + assertEquals(reverseString, StringUtils.reverse(originalString)); + } + + @Test + void whenIteratingUsingCollections_thenCorrect() { + + String reverseString = ""; + Collections.reverse(list); + for (final String item : list) { + reverseString += item; + } + assertEquals(reverseString, StringUtils.reverse(originalString)); + + assertEquals("E", list.get(0)); + } + + @Test + void whenIteratingUsingApacheReverseListIterator_thenCorrect() { + + String reverseString = ""; + final ReverseListIterator listIterator = new ReverseListIterator(list); + while (listIterator.hasNext()) { + reverseString += listIterator.next(); + } + assertEquals(reverseString, StringUtils.reverse(originalString)); + } + + @Test + void whenIteratingUsingGuava_thenCorrect() { + + String reverseString = ""; + final List reversedList = Lists.reverse(list); + for (final String item : reversedList) { + reverseString += item; + } + assertEquals(reverseString, StringUtils.reverse(originalString)); + + assertEquals("A", list.get(0)); + } +} \ No newline at end of file From 06577f129d6441861981b7a292a8a3dbfda892d8 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 1 Jul 2018 15:33:12 +0300 Subject: [PATCH 068/136] update to spring 5 --- spring-mvc-forms-jsp/pom.xml | 24 ++++++------------- .../ApplicationConfiguration.java | 5 ++-- .../baeldung/springmvcforms/domain/User.java | 5 ++-- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/spring-mvc-forms-jsp/pom.xml b/spring-mvc-forms-jsp/pom.xml index 359e186f52..3c18403c71 100644 --- a/spring-mvc-forms-jsp/pom.xml +++ b/spring-mvc-forms-jsp/pom.xml @@ -13,15 +13,16 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 org.springframework spring-webmvc - ${springframework.version} + ${spring.version} commons-logging @@ -65,11 +66,10 @@ commons-fileupload ${fileupload.version} - com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson-databind.version} @@ -104,24 +104,14 @@ - - - 1 - jstl - https://mvnrepository.com/artifact/javax.servlet/jstl - - - - 4.3.7.RELEASE 2.6 1.2 2.3.1 3.1.0 - 5.4.0.Final + 6.0.10.Final server default deploy directory - 1.3.2 - 2.8.7 + 1.3.3 5.2.5.Final 5.1.40 diff --git a/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java index 93fab9caf8..b8b36df84e 100644 --- a/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java +++ b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java @@ -8,14 +8,13 @@ import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc @ComponentScan(basePackages = {"com.baeldung.springmvcforms", "com.baeldung.jstl"}) -class ApplicationConfiguration extends WebMvcConfigurerAdapter { +class ApplicationConfiguration implements WebMvcConfigurer { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { diff --git a/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java index 49f006f422..9e0e7c99be 100644 --- a/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java +++ b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java @@ -1,13 +1,12 @@ package com.baeldung.springmvcforms.domain; import javax.validation.constraints.Digits; +import javax.validation.constraints.Email; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import org.hibernate.validator.constraints.Email; -import org.hibernate.validator.constraints.NotBlank; - public class User { @NotNull From f9ea250fd2a6d956b3f561f120bd60ac31f17f17 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 1 Jul 2018 15:35:48 +0300 Subject: [PATCH 069/136] Update README.md --- spring-mvc-forms-jsp/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-mvc-forms-jsp/README.md b/spring-mvc-forms-jsp/README.md index 44786d5ec7..588828c9cf 100644 --- a/spring-mvc-forms-jsp/README.md +++ b/spring-mvc-forms-jsp/README.md @@ -4,5 +4,4 @@ - [MaxUploadSizeExceededException in Spring](http://www.baeldung.com/spring-maxuploadsizeexceeded) - [Getting Started with Forms in Spring MVC](http://www.baeldung.com/spring-mvc-form-tutorial) - [Form Validation with AngularJS and Spring MVC](http://www.baeldung.com/validation-angularjs-spring-mvc) -- [Guide to JSTL](http://www.baeldung.com/guide-to-jstl) - [A Guide to the JSTL Library](http://www.baeldung.com/jstl) From 0cd80319bd72a8bbb79556acc822c17c8dae031d Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 1 Jul 2018 16:30:43 +0300 Subject: [PATCH 070/136] update to spring 5 --- spring-data-rest/pom.xml | 4 ++-- .../src/main/java/com/baeldung/config/MvcConfig.java | 7 ++----- .../projection/SpringDataProjectionIntegrationTest.java | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml index 0e525474e3..b3d2b0e359 100644 --- a/spring-data-rest/pom.xml +++ b/spring-data-rest/pom.xml @@ -10,10 +10,10 @@ Intro to Spring Data REST - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-data-rest/src/main/java/com/baeldung/config/MvcConfig.java b/spring-data-rest/src/main/java/com/baeldung/config/MvcConfig.java index 82cb936348..e5748f2f55 100644 --- a/spring-data-rest/src/main/java/com/baeldung/config/MvcConfig.java +++ b/spring-data-rest/src/main/java/com/baeldung/config/MvcConfig.java @@ -3,17 +3,14 @@ package com.baeldung.config; import com.baeldung.events.AuthorEventHandler; import com.baeldung.events.BookEventHandler; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc -public class MvcConfig extends WebMvcConfigurerAdapter{ +public class MvcConfig implements WebMvcConfigurer { public MvcConfig(){ super(); diff --git a/spring-data-rest/src/test/java/com/baeldung/projection/SpringDataProjectionIntegrationTest.java b/spring-data-rest/src/test/java/com/baeldung/projection/SpringDataProjectionIntegrationTest.java index 4091fdf154..2b1f6d4d4f 100644 --- a/spring-data-rest/src/test/java/com/baeldung/projection/SpringDataProjectionIntegrationTest.java +++ b/spring-data-rest/src/test/java/com/baeldung/projection/SpringDataProjectionIntegrationTest.java @@ -38,7 +38,7 @@ public class SpringDataProjectionIntegrationTest { @Before public void setup(){ - if(bookRepo.findOne(1L) == null){ + if(bookRepo.findById(1L) == null){ Book book = new Book("Animal Farm"); book.setIsbn("978-1943138425"); book = bookRepo.save(book); From c0aaed7474a01ccac78a71a82b9448856408d3a2 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Sun, 1 Jul 2018 21:05:28 +0200 Subject: [PATCH 071/136] [BAEL-1930] Encryption and decryption of files using JDK --- .gitmodules | 3 - .../encrypt/FileEncrypterDecrypter.java | 61 +++++++++++++++++++ ...FileEncrypterDecrypterIntegrationTest.java | 33 ++++++++++ 3 files changed, 94 insertions(+), 3 deletions(-) delete mode 100644 .gitmodules create mode 100644 core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java create mode 100644 core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 9c5cdb8f2d..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "testgitrepo"] - path = testgitrepo - url = /home/prd/Development/projects/idea/tutorials/spring-boot/src/main/resources/testgitrepo/ diff --git a/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java b/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java new file mode 100644 index 0000000000..aad2089d8b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java @@ -0,0 +1,61 @@ +package com.baeldung.encrypt; + +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +class FileEncrypterDecrypter { + + private SecretKey secretKey; + private Cipher cipher; + + FileEncrypterDecrypter(SecretKey secretKey, String cipher) throws NoSuchPaddingException, NoSuchAlgorithmException { + this.secretKey = secretKey; + this.cipher = Cipher.getInstance(cipher); + } + + void encrypt(String content, String fileName) throws InvalidKeyException, IOException { + cipher.init(Cipher.ENCRYPT_MODE, secretKey); + byte[] iv = cipher.getIV(); + + try ( + FileOutputStream fileOut = new FileOutputStream(fileName); + CipherOutputStream cipherOut = new CipherOutputStream(fileOut, cipher) + ) { + fileOut.write(iv); + cipherOut.write(content.getBytes()); + } + + } + + String decrypt(String fileName) throws InvalidAlgorithmParameterException, InvalidKeyException, IOException { + + String content; + + try (FileInputStream fileIn = new FileInputStream(fileName)) { + byte[] fileIv = new byte[16]; + fileIn.read(fileIv); + cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(fileIv)); + + try (CipherInputStream cipherIn = new CipherInputStream(fileIn, cipher)) { + InputStreamReader inReader = new InputStreamReader(cipherIn); + + StringBuilder sb = new StringBuilder(); + int c = inReader.read(); + while (c != -1) { + sb.append((char) c); + c = inReader.read(); + } + content = sb.toString(); + } + + } + return content; + } +} diff --git a/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java b/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java new file mode 100644 index 0000000000..6cadfcde1d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.encrypt; + +import org.junit.Test; + +import javax.crypto.KeyGenerator; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; +import java.io.File; +import java.io.IOException; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +public class FileEncrypterDecrypterIntegrationTest { + + @Test + public void givenStringAndFilename_whenEncryptingIntoFile_andDecryptingFileAgain_thenOriginalStringIsReturned() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, InvalidAlgorithmParameterException { + String originalContent = "foobar"; + SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); + + FileEncrypterDecrypter fileEncrypterDecrypter = new FileEncrypterDecrypter(secretKey, "AES/CBC/PKCS5Padding"); + fileEncrypterDecrypter.encrypt(originalContent, "baz.enc"); + + String decryptedContent = fileEncrypterDecrypter.decrypt("baz.enc"); + assertThat(decryptedContent, is(originalContent)); + + new File("baz.enc").delete(); // cleanup + } + +} \ No newline at end of file From 3e3e577eeeb5e3d79912d61ce7af55da9a9eb4ba Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Mon, 2 Jul 2018 12:29:05 +0100 Subject: [PATCH 072/136] Deleted file from evaluation --- .../com/baeldung/reactive/model/Stock.java | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java deleted file mode 100644 index 6743de064e..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.reactive.model; - -import java.math.BigDecimal; - -public class Stock { - - private String code; - - private BigDecimal price; - - public Stock(String code, BigDecimal price) { - this.code = code; - this.price = price; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public BigDecimal getPrice() { - return price; - } - - public void setPrice(BigDecimal price) { - this.price = price; - } - -} From c7d58f3e583beefa6af3d4f83bd6756d92f51b4f Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Mon, 2 Jul 2018 12:29:42 +0100 Subject: [PATCH 073/136] Delete file from evaluation --- .../controller/StockReactiveController.java | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java deleted file mode 100644 index 8f8de79561..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockReactiveController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.reactive.controller; - -import java.math.BigDecimal; -import java.time.Duration; -import java.util.Random; -import java.util.stream.Stream; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.reactive.model.Stock; - -import reactor.core.publisher.Flux; -import reactor.util.function.Tuple2; - -@RestController -@RequestMapping("/rtes") -public class StockReactiveController { - - @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/stocks/{code}") - public Flux getStocks(@PathVariable String code) { - BigDecimal startingPrice = new BigDecimal("100"); - Flux stockFlux = Flux.fromStream(Stream.generate(() -> new Stock(code, getLatestPrice(startingPrice)))); - Flux emmitFlux = Flux.interval(Duration.ofSeconds(1)); - return Flux.zip(stockFlux, emmitFlux) - .map(Tuple2::getT1); - } - - private BigDecimal getLatestPrice(BigDecimal startingPrice) { - BigDecimal priceChange = BigDecimal.valueOf(new Random().nextDouble()); - return new Random().nextBoolean() ? startingPrice.add(priceChange) : startingPrice.subtract(priceChange); - } -} From 44caf3b868547ff83748029798ed6594b86dc32e Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Mon, 2 Jul 2018 12:30:59 +0100 Subject: [PATCH 074/136] Deleted file from evaluation --- .../baeldung/reactive/client/StockClient.java | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java deleted file mode 100644 index 8a65b77b37..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/client/StockClient.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.reactive.client; - -import org.springframework.http.MediaType; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec; - -import com.baeldung.reactive.model.Stock; - -import reactor.core.publisher.Flux; - -public class StockClient { - - public Flux getStockUpdates(String stockCode) { - WebClient client = WebClient.create("localhost:8080"); - RequestHeadersSpec request = client.get() - .uri("/rtes/stocks/" + stockCode) - .accept(MediaType.TEXT_EVENT_STREAM); - return request.retrieve() - .bodyToFlux(Stock.class) - .log(); - } -} From 92acea607e3ce092d540622d680470f8f75a0df3 Mon Sep 17 00:00:00 2001 From: Alejandro Gervasio Date: Mon, 2 Jul 2018 22:59:39 -0300 Subject: [PATCH 075/136] Context and Servlet Initialization Parameters (#4594) * Initial Commit * Update pom.xml --- javax-servlet-init-params/pom.xml | 56 +++++++++++++++++++ .../com/baeldung/servlets/UserServlet.java | 49 ++++++++++++++++ .../src/main/webapp/WEB-INF/jsp/result.jsp | 16 ++++++ .../src/main/webapp/WEB-INF/web.xml | 14 +++++ .../src/main/webapp/index.jsp | 19 +++++++ .../baeldung/test/UserServletUnitTest.java | 52 +++++++++++++++++ 6 files changed, 206 insertions(+) create mode 100644 javax-servlet-init-params/pom.xml create mode 100644 javax-servlet-init-params/src/main/java/com/baeldung/servlets/UserServlet.java create mode 100644 javax-servlet-init-params/src/main/webapp/WEB-INF/jsp/result.jsp create mode 100644 javax-servlet-init-params/src/main/webapp/WEB-INF/web.xml create mode 100644 javax-servlet-init-params/src/main/webapp/index.jsp create mode 100644 javax-servlet-init-params/src/test/java/com/baeldung/test/UserServletUnitTest.java diff --git a/javax-servlet-init-params/pom.xml b/javax-servlet-init-params/pom.xml new file mode 100644 index 0000000000..4f766a7e2c --- /dev/null +++ b/javax-servlet-init-params/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + com.baeldung.javax-servlet-init-params + javax-servlet-init-params + 1.0 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + junit + junit + 4.12 + test + + + org.assertj + assertj-core + 3.9.1 + test + + + org.hamcrest + hamcrest-core + 1.3 + test + + + org.mockito + mockito-core + 2.18.3 + test + + + javax + javaee-web-api + 7.0 + provided + + + jstl + jstl + 1.2 + + + javax.el + el-api + 2.2 + + + \ No newline at end of file diff --git a/javax-servlet-init-params/src/main/java/com/baeldung/servlets/UserServlet.java b/javax-servlet-init-params/src/main/java/com/baeldung/servlets/UserServlet.java new file mode 100644 index 0000000000..e195aa092a --- /dev/null +++ b/javax-servlet-init-params/src/main/java/com/baeldung/servlets/UserServlet.java @@ -0,0 +1,49 @@ +package com.baeldung.servlets; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebInitParam; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"}, initParams={ + @WebInitParam(name="name", value="Not provided"), + @WebInitParam(name="email", value="Not provided")}) +public class UserServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + processRequest(request, response); + forwardRequest(request, response, "/WEB-INF/jsp/result.jsp"); + } + + protected void processRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.setAttribute("name", getRequestParameter(request, "name")); + request.setAttribute("email", getRequestParameter(request, "email")); + request.setAttribute("province", getContextParameter("province")); + request.setAttribute("country", getContextParameter("country")); + } + + protected String getRequestParameter(HttpServletRequest request, String name) { + String param = request.getParameter(name); + return !param.isEmpty() ? param : getInitParameter(name); + } + + protected String getContextParameter(String name) { + return getServletContext().getInitParameter(name); + } + + protected void forwardRequest(HttpServletRequest request, HttpServletResponse response, String path) + throws ServletException, IOException { + request.getRequestDispatcher(path).forward(request, response); + } +} \ No newline at end of file diff --git a/javax-servlet-init-params/src/main/webapp/WEB-INF/jsp/result.jsp b/javax-servlet-init-params/src/main/webapp/WEB-INF/jsp/result.jsp new file mode 100644 index 0000000000..01cc54858e --- /dev/null +++ b/javax-servlet-init-params/src/main/webapp/WEB-INF/jsp/result.jsp @@ -0,0 +1,16 @@ +<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> +<%@ page contentType="text/html" pageEncoding="UTF-8"%> + + + + + User Data + + +

User Information

+

Name: ${name}

+

Email: ${email}

+

Province: ${province}

+

Country: ${country}

+ + diff --git a/javax-servlet-init-params/src/main/webapp/WEB-INF/web.xml b/javax-servlet-init-params/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..1b801171b3 --- /dev/null +++ b/javax-servlet-init-params/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,14 @@ + + + + province + Mendoza + + + country + Argentina + + diff --git a/javax-servlet-init-params/src/main/webapp/index.jsp b/javax-servlet-init-params/src/main/webapp/index.jsp new file mode 100644 index 0000000000..ca41942e5d --- /dev/null +++ b/javax-servlet-init-params/src/main/webapp/index.jsp @@ -0,0 +1,19 @@ +<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> +<%@ page contentType="text/html" pageEncoding="UTF-8"%> + + + + Context and Initialization Servlet Parameters + + + +

Please fill the form below:

+
+ + + + + +
+ + diff --git a/javax-servlet-init-params/src/test/java/com/baeldung/test/UserServletUnitTest.java b/javax-servlet-init-params/src/test/java/com/baeldung/test/UserServletUnitTest.java new file mode 100644 index 0000000000..ef3d877dd7 --- /dev/null +++ b/javax-servlet-init-params/src/test/java/com/baeldung/test/UserServletUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.test; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class UserServletUnitTest { + + private static HttpServletRequest request; + private static HttpServletResponse response; + + + @BeforeClass + public static void setUpHttpServletRequestMockInstance() { + request = mock(HttpServletRequest.class); + } + + @BeforeClass + public static void setUpHttpServletResponsetMockInstance() { + response = mock(HttpServletResponse.class); + } + + @Test + public void givenHttpServletRequestMockInstance_whenCalledgetParameter_thenCalledAtLeastOnce() { + request.getParameter("name"); + verify(request, atLeast(1)).getParameter("name"); + } + + @Test + public void givenHttpServletRequestMockInstance_whenCalledgetParameter_thenOneAssertion() { + when(request.getParameter("name")).thenReturn("username"); + assertThat(request.getParameter("name")).isEqualTo("username"); + } + + @Test + public void givenHttpServletResponseMockInstance_whenCalledgetContentType_thenCalledAtLeastOnce() { + response.getContentType(); + verify(response, atLeast(1)).getContentType(); + } + + @Test + public void givenHttpServletResponseMockInstance_whenCalledgetContentType_thenOneAssertion() { + when(response.getContentType()).thenReturn("text/html"); + assertThat(response.getContentType()).isEqualTo("text/html"); + } +} \ No newline at end of file From 1487b9195bf1aeb5e3b0afc35634b4216c71cdef Mon Sep 17 00:00:00 2001 From: amitabhmandal Date: Tue, 3 Jul 2018 14:52:42 +0530 Subject: [PATCH 076/136] BAEL-1896. Fixed Junits --- .../calendar/GregorianCalendarTester.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java b/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java index 2832f416bf..cd7d090631 100644 --- a/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java +++ b/core-java/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java @@ -161,20 +161,20 @@ public class GregorianCalendarTester { } @Test - public void test_rollAddEightMonths() { - final int rolledUpMonthMarch = 2, orginalYear2018 = 2018; + public void test_whenRollUpOneMonth_thenYearIsUnchanged() { + final int rolledUpMonthJuly = 7, orginalYear2018 = 2018; GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); - calendarExpected.roll(Calendar.MONTH, 8); - assertEquals(calendarExpected.get(Calendar.MONTH), rolledUpMonthMarch); + calendarExpected.roll(Calendar.MONTH, 1); + assertEquals(calendarExpected.get(Calendar.MONTH), rolledUpMonthJuly); assertEquals(calendarExpected.get(Calendar.YEAR), orginalYear2018); } @Test - public void test_rollSubstractEightMonths() { - final int rolledDownMonthNovember = 10, orginalYear2018 = 2018; + public void test_whenRollDownOneMonth_thenYearIsUnchanged() { + final int rolledDownMonthJune = 5, orginalYear2018 = 2018; GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); - calendarExpected.roll(Calendar.MONTH, -8); - assertEquals(calendarExpected.get(Calendar.MONTH), rolledDownMonthNovember); + calendarExpected.roll(Calendar.MONTH, -1); + assertEquals(calendarExpected.get(Calendar.MONTH), rolledDownMonthJune); assertEquals(calendarExpected.get(Calendar.YEAR), orginalYear2018); } @@ -214,8 +214,10 @@ public class GregorianCalendarTester { DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); GregorianCalendar calendarExpected = new GregorianCalendar(2018, 6, 28); - XMLGregorianCalendar expectedXMLGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(calendarExpected); - assertEquals(expectedXMLGregorianCalendar, calendarDemo.toXMLGregorianCalendar(calendarActual)); + XMLGregorianCalendar expectedXMLGregorianCalendar = datatypeFactory + .newXMLGregorianCalendar(calendarExpected); + assertEquals(expectedXMLGregorianCalendar, + calendarDemo.toXMLGregorianCalendar(calendarActual)); } @Test @@ -236,8 +238,10 @@ public class GregorianCalendarTester { public void test_toDate() throws DatatypeConfigurationException { GregorianCalendar calendarActual = new GregorianCalendar(2018, 6, 28); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); - XMLGregorianCalendar expectedXMLGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(calendarActual); + XMLGregorianCalendar expectedXMLGregorianCalendar = datatypeFactory + .newXMLGregorianCalendar(calendarActual); expectedXMLGregorianCalendar.toGregorianCalendar().getTime(); - assertEquals(calendarActual.getTime(), expectedXMLGregorianCalendar.toGregorianCalendar().getTime() ); + assertEquals(calendarActual.getTime(), + expectedXMLGregorianCalendar.toGregorianCalendar().getTime() ); } } From 396df6fdca8577c32ec5e29e56485451b5d71563 Mon Sep 17 00:00:00 2001 From: Syed Mansoor Date: Tue, 3 Jul 2018 21:16:12 +1000 Subject: [PATCH 077/136] [BAEL-1753] Moved Kotlin-ktor in core-kotlin module --- .../.gradle/4.4/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../4.4/fileContent/annotation-processors.bin | Bin 0 -> 19073 bytes .../.gradle/4.4/fileContent/fileContent.lock | Bin 0 -> 38 bytes .../.gradle/4.4/fileHashes/fileHashes.bin | Bin 0 -> 26997 bytes .../.gradle/4.4/fileHashes/fileHashes.lock | Bin 0 -> 38 bytes .../4.4/fileHashes/resourceHashesCache.bin | Bin 0 -> 23665 bytes .../.gradle/4.4/taskHistory/taskHistory.bin | Bin 0 -> 80724 bytes .../.gradle/4.4/taskHistory/taskHistory.lock | Bin 0 -> 38 bytes .../buildOutputCleanup.lock | Bin 0 -> 38 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 18713 bytes core-kotlin/build.gradle | 57 ++++++ .../META-INF/KtorWithKotlin.kotlin_module | Bin 0 -> 294 bytes core-kotlin/build/kotlin-build/version.txt | 1 + .../kotlin/compileKotlin/build-history.bin | Bin 0 -> 150 bytes .../caches-jvm/inputs/source-to-output.tab | Bin 0 -> 65536 bytes .../inputs/source-to-output.tab.keystream | Bin 0 -> 32768 bytes .../inputs/source-to-output.tab.keystream.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.values.at | Bin 0 -> 10869 bytes .../caches-jvm/inputs/source-to-output.tab_i | Bin 0 -> 32768 bytes .../inputs/source-to-output.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-fq-name-to-source.tab | Bin 0 -> 65536 bytes .../class-fq-name-to-source.tab.keystream | Bin 0 -> 4096 bytes .../class-fq-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/class-fq-name-to-source.tab.len | Bin 0 -> 8 bytes .../class-fq-name-to-source.tab.values.at | Bin 0 -> 5315 bytes .../jvm/kotlin/class-fq-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/class-fq-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/constants.tab | Bin 0 -> 65536 bytes .../jvm/kotlin/constants.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/constants.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/constants.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/constants.tab.values.at | Bin 0 -> 82 bytes .../caches-jvm/jvm/kotlin/constants.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/constants.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/internal-name-to-source.tab | Bin 0 -> 65536 bytes .../internal-name-to-source.tab.keystream | Bin 0 -> 4096 bytes .../internal-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/internal-name-to-source.tab.len | Bin 0 -> 8 bytes .../internal-name-to-source.tab.values.at | Bin 0 -> 8704 bytes .../jvm/kotlin/internal-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/internal-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/package-parts.tab | Bin 0 -> 65536 bytes .../jvm/kotlin/package-parts.tab.keystream | Bin 0 -> 4096 bytes .../kotlin/package-parts.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/package-parts.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/package-parts.tab.values.at | Bin 0 -> 73 bytes .../caches-jvm/jvm/kotlin/package-parts.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/package-parts.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab | Bin 0 -> 65536 bytes .../caches-jvm/jvm/kotlin/proto.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/proto.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.values.at | Bin 0 -> 18673 bytes .../caches-jvm/jvm/kotlin/proto.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/proto.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab | Bin 0 -> 65536 bytes .../kotlin/source-to-classes.tab.keystream | Bin 0 -> 32768 bytes .../source-to-classes.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab.len | Bin 0 -> 8 bytes .../kotlin/source-to-classes.tab.values.at | Bin 0 -> 3168 bytes .../jvm/kotlin/source-to-classes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/source-to-classes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab | Bin 0 -> 65536 bytes .../jvm/kotlin/subtypes.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/subtypes.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/subtypes.tab.values.at | Bin 0 -> 647 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/supertypes.tab | Bin 0 -> 65536 bytes .../jvm/kotlin/supertypes.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/supertypes.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/supertypes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/supertypes.tab.values.at | Bin 0 -> 501 bytes .../caches-jvm/jvm/kotlin/supertypes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/supertypes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/counters.tab | 2 + .../caches-jvm/lookups/file-to-id.tab | Bin 0 -> 65536 bytes .../lookups/file-to-id.tab.keystream | Bin 0 -> 32768 bytes .../lookups/file-to-id.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/file-to-id.tab.len | Bin 0 -> 8 bytes .../lookups/file-to-id.tab.values.at | Bin 0 -> 289 bytes .../caches-jvm/lookups/file-to-id.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/file-to-id.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab | Bin 0 -> 65536 bytes .../lookups/id-to-file.tab.keystream | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab.len | Bin 0 -> 8 bytes .../lookups/id-to-file.tab.values.at | Bin 0 -> 4357 bytes .../caches-jvm/lookups/id-to-file.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/id-to-file.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab | Bin 0 -> 65536 bytes .../caches-jvm/lookups/lookups.tab.keystream | Bin 0 -> 32768 bytes .../lookups/lookups.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.values.at | Bin 0 -> 11033 bytes .../caches-jvm/lookups/lookups.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/lookups.tab_i.len | Bin 0 -> 8 bytes .../data-container-format-version.txt | 1 + .../kotlin/compileKotlin/format-version.txt | 1 + .../compileKotlin/gradle-format-version.txt | 1 + .../build/kotlin/compileKotlin/last-build.bin | Bin 0 -> 81 bytes core-kotlin/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + core-kotlin/gradlew | 172 ++++++++++++++++++ core-kotlin/gradlew.bat | 84 +++++++++ core-kotlin/kotlin-ktor/.gitignore | 14 ++ core-kotlin/kotlin-ktor/build.gradle | 47 +++++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + core-kotlin/kotlin-ktor/gradlew | 172 ++++++++++++++++++ core-kotlin/kotlin-ktor/gradlew.bat | 84 +++++++++ core-kotlin/kotlin-ktor/resources/logback.xml | 11 ++ core-kotlin/kotlin-ktor/settings.gradle | 2 + .../kotlin-ktor/src/main/kotlin/APIServer.kt | 73 ++++++++ .../kotlin-ktor/webapp/WEB-INF/web.xml | 35 ++++ core-kotlin/resources/logback.xml | 11 ++ core-kotlin/settings.gradle | 2 + .../kotlin/com/baeldung/ktor/APIServer.kt | 73 ++++++++ kotlin-ktor/src/main/kotlin/APIServer.kt | 2 +- 122 files changed, 856 insertions(+), 1 deletion(-) create mode 100644 core-kotlin/.gradle/4.4/fileChanges/last-build.bin create mode 100644 core-kotlin/.gradle/4.4/fileContent/annotation-processors.bin create mode 100644 core-kotlin/.gradle/4.4/fileContent/fileContent.lock create mode 100644 core-kotlin/.gradle/4.4/fileHashes/fileHashes.bin create mode 100644 core-kotlin/.gradle/4.4/fileHashes/fileHashes.lock create mode 100644 core-kotlin/.gradle/4.4/fileHashes/resourceHashesCache.bin create mode 100644 core-kotlin/.gradle/4.4/taskHistory/taskHistory.bin create mode 100644 core-kotlin/.gradle/4.4/taskHistory/taskHistory.lock create mode 100644 core-kotlin/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 core-kotlin/.gradle/buildOutputCleanup/cache.properties create mode 100644 core-kotlin/.gradle/buildOutputCleanup/outputFiles.bin create mode 100755 core-kotlin/build.gradle create mode 100644 core-kotlin/build/classes/kotlin/main/META-INF/KtorWithKotlin.kotlin_module create mode 100644 core-kotlin/build/kotlin-build/version.txt create mode 100644 core-kotlin/build/kotlin/compileKotlin/build-history.bin create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.at create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i create mode 100644 core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i.len create mode 100644 core-kotlin/build/kotlin/compileKotlin/data-container-format-version.txt create mode 100644 core-kotlin/build/kotlin/compileKotlin/format-version.txt create mode 100644 core-kotlin/build/kotlin/compileKotlin/gradle-format-version.txt create mode 100644 core-kotlin/build/kotlin/compileKotlin/last-build.bin create mode 100755 core-kotlin/gradle/wrapper/gradle-wrapper.jar create mode 100755 core-kotlin/gradle/wrapper/gradle-wrapper.properties create mode 100755 core-kotlin/gradlew create mode 100755 core-kotlin/gradlew.bat create mode 100644 core-kotlin/kotlin-ktor/.gitignore create mode 100755 core-kotlin/kotlin-ktor/build.gradle create mode 100755 core-kotlin/kotlin-ktor/gradle/wrapper/gradle-wrapper.jar create mode 100755 core-kotlin/kotlin-ktor/gradle/wrapper/gradle-wrapper.properties create mode 100755 core-kotlin/kotlin-ktor/gradlew create mode 100755 core-kotlin/kotlin-ktor/gradlew.bat create mode 100755 core-kotlin/kotlin-ktor/resources/logback.xml create mode 100755 core-kotlin/kotlin-ktor/settings.gradle create mode 100755 core-kotlin/kotlin-ktor/src/main/kotlin/APIServer.kt create mode 100755 core-kotlin/kotlin-ktor/webapp/WEB-INF/web.xml create mode 100755 core-kotlin/resources/logback.xml create mode 100755 core-kotlin/settings.gradle create mode 100755 core-kotlin/src/main/kotlin/com/baeldung/ktor/APIServer.kt diff --git a/core-kotlin/.gradle/4.4/fileChanges/last-build.bin b/core-kotlin/.gradle/4.4/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/core-kotlin/.gradle/4.4/fileContent/annotation-processors.bin b/core-kotlin/.gradle/4.4/fileContent/annotation-processors.bin new file mode 100644 index 0000000000000000000000000000000000000000..114bb513f163c3885eeb105a37c0239df388b2ce GIT binary patch literal 19073 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 jOK$`| literal 0 HcmV?d00001 diff --git a/core-kotlin/.gradle/4.4/fileHashes/resourceHashesCache.bin b/core-kotlin/.gradle/4.4/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..28dd081876aed1784aad324f024c1dd9ab50fd17 GIT binary patch literal 23665 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 literal 0 HcmV?d00001 diff --git a/core-kotlin/.gradle/4.4/taskHistory/taskHistory.bin b/core-kotlin/.gradle/4.4/taskHistory/taskHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..ecbab3d3dd088cd88f667d20b20f6705b4871614 GIT binary patch literal 80724 zcmeIb2Y3_5_C9P`3J`h?kOTsRmJmy;-PNuZ0>q7K8)MT#32e1xWXY%)n;JrKz;q0u zg$^Nv5(p)fTuOk@LJbfIz4y>U5B$%rRM zsZ{!z{4d1yPv!d6EIcHn;XL?%b@_eem%@O;fWm;nfWm;nfWm;nfWm;nfWm;nfWm;n zfWm;nfWm;nfWm;nfWm;n!2dV{Z2^B#R~ssQ6e|9wRL_tQq&WO1G_>2<+mo_1Z@50b z-`IVAP`7QH>HF#Hi(KyyzUY46{TtqgGX>?J!hphn!hphn!hphn!hphn!hphn!hphn z!hphn!hphn!hphn!hphn!hphn!hphn!hphn!hphn!hphn!hphn!hphn!hphn!hphn z!hphn!hphn!hphn!hpg+K{J3skf5*OXT0_pNx!vvoyn^0?trg~FJbU-I&TZJ z@D4|&4$)FtREO~_fnp5K6M70qX+cjBMghlZPCyWz)8n{aPa*~Zd%l1$sQ_&XZBv(? z_*R4Wn~saCQ^zp=yO#Aj+|eBM11g)W?P0ZR&DJD_X1nX;-(eC1CRV4{qR<`^A!s9G zL=l3gIgBuh_%Vv(P!i$vdV!;Gqrfl-pZD=F>2Vj@cRt*8v`y3;W2JX`9UL&`Y@+5D zKhXLRn`F0IWI|brr39YmQ4*s$#DL)p!y5#W6i7YKW0+A-qJkh8Nf)8wgWg0YwEy;O z>eiyiyVe{yVY_{g(mlTveoVgW38#Fxj<2r!Spmwvj}ZOX@j1?8Np~^D2^s+ zjxri?jwOLvpPu(B#v69@(>~M2x7h#PqYwYi*j{;bgyvv?V6#>mFB40mln4u9IhG)J z14dIU!mtcsqy*d`-~taVpa>H2!7D!R4Rr4056)7vtGu6JepaV=`iL@`J+BHh+2KeF zV@+1~cp^xG6$AsxViaTGFb)%FmNbxp0WeamQ82Kaks#&ncR%b6v3Bo=rAn@T`gWzW zwLkdk{H}hlE}dd6GCbZ$5V(LcMuUMtX@=BeAd3`*7zvR~%D@XGVPtvQMWO`HYnWpk zqFb=I{yInhwtGG(Irb;bwpV4(=`fk??hXdRNZbg+8zp%G(_=J7VKCkq#DFp!&$Ae) zB*Nf=COzm)+o6o+^{;L!@?q;jb$f<1J{F_-^;NNfn(S${b(hf@a6Q7Zv>qc6k_Ppo zrws-cXN&|7Z|HHJqFDxok>r9WKkE(f9?wqvXzkWvSJ!^?Bm!^zOLCg(qum58EsVi$1wn?q2xfEc`b_ZuRF<~iOccUA(9-(oDWI)dw z1kQ+}953kgG(wUF3T7fu_82Hw)WEuNdllh>y;hwsr=`xm5?<%#olH%q8b}balWy!d zYd{1RBN%}pNlefaAQLEM;5gdIG89jtG=>}XG|Z+_&xPe;Cw;KDPZ?y~iKe$5Q@H;0 zo?)4!=1zck&yZ`*fVseCg+XKidqH9!(W0o9AREm4oJLMj!S&joEmYky|KmUYHddkUi4SB-I~(@Z-&VlmXe+dV-(Tq5giY5 zAqXr@a|}+=pzI6;0rRoJ!0`r{c1gwvePT4`qIW$GpvA{spnn|N{+NYdNL4@9c-vv! zclR}a1{|~(_tL~6F>f#sEI}a@XgL7|?Pp{t7B}#$0W=LIkenWao&a+!Kjxts-n^gt zYi`rnQZ=HZZ#^1jPVSi)T=9|TXsHo2VZa%fhEbN`1dPIAvNQ68!0Jg1)8j0Ka-0F| z%G?g{qCzakrx~>dOgzwj==Ml_$hu02t+_PKi2(J4@9=XEUJj!u6hT0VGZ;_epdZ21 z)4|chI`j=vZoK?qf7_8apCt|x{X(PRY zhU0iPOtfK89S#-gDQy!IthjUpVPH7uTppk?7+7W$iW8!eMtQI>z{tS_nCx+*?zwWp zyvuPRZ+h{Qc1!!-Da8M0Tir_s%U&3(iEgD|9S^ zXuRbnuhAUvgY_3J+eFLVwPwReBc;bUm>5}tg=G-QqcjS(2QLUH3!rHhg~^@DU9yRa zz-zr`FTQk$<%2)}%9wn!YU!iDmC7mcb|<6$~`V!IA<8ZN^f#o}&?+v|^JUadG(V;5Hl5n%+K^I;97fH1M{=uN8%l zS*N2d7OR66w+HMxJ*Gu;l%5h0PT=(v=pvj)U=)!Y&C*~LlY)_9C>kY5l%~9&3=^Mp zL2Tz7crE9hEg{X5_dJ{b``J*yNrmy^IIiJ}6< z5qd%3SnRp6mCw)`n@DU~+Oz$Leea!^*P-zE+kWZ)Jh+o-3+$NKd_hwzX~YeBSOF1& z5lkGCg*6fjh8qDJAUI|;63`Bs#bwZP8TlYCI`!1IPY?ewTYvQ2P>bdGB)|4S@*tMf zm@i(M!#Ny7DAvFrdOd={oPcvMC&2Oq3l?Kb<2C5FWnQ zJZ|7F&6!u13x^H%rqZl7hc9B_lMoDgST1p_o(5ScLcYXRGyb|&Vcmk|eUPf9u4|6HI%>u#2ziBqFwhLx0HCQ@9v2K?xsU|R4Gb>8 zgoY4c8<32FrFa>#tB8E?9;UHUr*>UmR)5N+-K|3_P1l@!b-Xs-ZZ*SJo-fHHN0AI~ zgeeUOHo#b;aE_vJ8Vq7sM4<*AF~U09&9S?Td?1IcZ%TePd+fbVKW*tU@>03PKu|32 zJ$Xx^jzNuj3KmIvJ%_=T8EfE;7;NE?yg2@N*oh(yMuI|fCt`8?Dj&QV)jqkD*ub$Z zv`ddI{RR*HR1>lUs!MY^crFrt!)B<>v&~x5WxaKEZJl;aGdq(^mXHw513!AjM{Va> zjf()pio^I+h6me%fqh!ZRMhKu9HUrJf~X$$Hb{hLINX545)sT095#wLmZk`p+&wGv ze2S8$M_e|ZR`;#)XyJ#I#!UC}&G!-5wfQI>>dA`Evodqw*I=hX9GYrqp6?~SeQb+C$P*FOD=FObbk_2TQ z4Ro2X1ar{Rkpz@}Hh87$Vy)>W9?ovmrR%=6bM94iz>bQ8D^{9L9*afxmlFcCfU?d%Vxb{jV}_{ zWyFC{&#>DB9ubQ9E(afC)PauVc%et6h4^V|C>9f~ma?5G}R8 z|ECXoo$3-^-JCOPO6i03&;n_{r}p7FXE(Jb-Gnr8(HtceGk~PV9J3<0~w0HSh=TpQR8l&I}{JaQ=3c9*98SG5;L{ru>-I`UkQs%^GnKcJH+PZ03VRb>trbuUNWMk!g4EqOB76*&?@iT@zS0B*66s-X^iy zVBMcjde7eX-k0Yejj!4;drSe;E}Cz0?W6xTWj?$)<4RhSs+GHqq`p;09u7FQ-OY4{ z)e;m7z*V#^(rI^CQ{!!LLxy#U%-hrA@CLdaoqnPZ;V{3l4ZtRxRtA{6_9%cwiPfANZ=*iQ87ZRyx z9mkvbB$!V{r51RrNnW6MD$$ATF*Iz;irscB|jFV#D`vEfeYW;}zalJH60iqkoD|ji%GR-a0Qxhekr8YMR zYqxa#PqV)Mp+R-avpHAxsv}PXi|6ie7Gn}s|Fz)OAZ<+8tY+AelbZO+XZ5=EzHzZp z@kyhuG6OHJ4#uKd=GN6j&?MqjOm*p}Bd*@it?!+>e#FU%6YuZdAH<<6*W7|*SaCN#YTUqBX0*ALJV)=L>RHOg-()n%>6sf zip}}`WV;TNYnA`FYT?d7w2BgW+RVFlIKJQf%j8Z`nx|*~)1$+tcArNEv5P$hfo|NI zQ2mnl>^e^uH0rUvUB4g>>-NdKCBh7{C9XQ*3M6RMXAv9!zV~=>qq1)0X)8f3LQ^ z`+R%EVs+A?X?v3+xfxHVXEwLMaVKpy^>UpsxtLw2`lNEgr#+i(jJSVj?$VT1>hKWN zC=Pb!;S!>Fxhu+K%lB|K-#6FfcRnxse`y`Gy}Mo8Qd&jI7aqDs@o?e_nvheKZoR8i z-yF)&xLEB)YpR;#8C5_F%hRMHvvaTXLZ|0@-9nue9Ty%E6FnX_Jz<}b=fZ7CaD;4e z*kkFmk{_!@_c*y7wg@MDr@6(h9tomF zJ=`8`vsrC+^$-D$pLz8-_{`eV#Zf%?mw}b${wN!6*tUa{3g{ELpyBeB3$Y6Kw`Rg! zSC{}`|IliSgu>#iwp34-0}fvOC14UGl&th6R9dJb@9&B~F z))8w_%9E-59vo--fm& z@ecJMz1FDCb}g-%SyOrW8>7v%CCLdr>Dzk~#T`O6Gcgr_N78mjxBykRv1Phj__f(e zb8fk6VzUCXX<)wd7S_bOiYum2kVAw@DW|-QOMwA0+c^_i#9*gYJ`sbiTzJox$>H;#XT)qBGLW zCf4ML?g3x1H?i6xtQkBPCrY~f{h=0Xa|^ftdFmTtv9{p4yFbphSX)6^sit0@FO0QV zrQUcR(RhnBfoFLWSfS5SnPfD{{K^&XIH7?SCi-VW8nc(ct z)8mtEaH0{#0}qm-6mMo(KvvmY(aN$xH_&cz8Vi5HHA2@Q5l=)sC1txlfwM)y-Ow!8 zO&#~2lU;wpp`Ub1F4~fAvRN(SNO22}>kA(HO@4cX9W;lTcL}k(uu1mrrnFezL36Mb zEDM^{b?z@r6u%%3qWnIe0b0YvIz(L}_8rZb%qB(V+Ez^^|z!wU4IV;#bV=Kib*wAR131gjfZT{a`9qv(I=^d9EYSHp8w!0Kn<0#CRc0QfSh%QMybFtdlqXPPY~y_bWa{qxeUrg&-p|IbVNXFsklvfz-w@Nh1vlh5nK z`}%sFQM{y!!5wb!XT}j$Z#01WqhMe#Be)TRuPKHia1R-QtA5gz=>i^L;V# zSIYl>qRpzZnkl!BD9+=G^Y|-=Hc*_${R*`qJAfmdtw+!?gidH@QU-e=t8bIkN=C=TX7y&oX7Kzq9(4@3dDI_@yzyh zX;nP470+zNGh2*W;@aZ*pZCo6C*GdV(WiHei{M1ZP@Kox!YR$aiZbfcLwOwG73Xm{ zfpf*PaXaiQ&f|*nxZ*tScdP)Pn_-Icco5v6;HX>TRrH(pxUPFVm=))7#d-V{!+m%S z;TO58E6(G2o%eN$^SEEJWpag0@`l$b&f|fI*pthucuCMMU0Re}*A?gSSBQg@%c`#z zx8z}#KVESj7yUdH z=W)e(JOGmWhaUTB%AzE{-X~lW`AIG)LB~A1K@^VmDoX2yi5k0Hq zn7WGdI9Pk0_{gH~lo$damn!KU#d%zD9tY>~5cXGpA|5c{QO)V3@di=5-PRC<<5sEs z3d8%t@^qfCCN;%q-!=6$^;)S~b?IBvuN~_A#{H%VIQqw)8^&rXzhXcCi<;5gx|eEK z40x*RI_li%mS}?U*vtZ`8+Et4b@rDX-`HGiSdHBwWS7xB2M3*TPtC1<3tP0T&FuD7 z|MR3&iRxFr33{usT*gPANwd$dGeF;;>NhSi{BH1Djk)>0@iYDjzj!NFZfK7U+6|i? zsr-ty{4eAT_m=X7E5iravn+?}{50js%-O`k0;%28;{yh79k(EkNRQsJD{E9%=!62P z-NXF+RjcBjIX=9)sek`X^Oqm{tUzkV-Tgjn?%^dL?9F~yxp#9mV-)8My0k;TyX!s` z*K~h!-x~>i(r4YDb#l^(0;t>5=O1>oCUti7ueFcdIVgK{of|>dFCNBgBj}$4H6PS- zYvB70%n%@y+SR z6V0ono;*9P%l^tLzj92xq@hknveo9Ut^A6Ntsgc+L&twKcg@1p*^#P!fo&cbm#RRw zz}sL|1zHZg3(t)VrBeA7O!39NkbgCD04mvtX&pXlO3%^d2Z!YR%(iQ}q^at0!22fG z@b|2d+_wN)I%KQLEh=eEHqdLoulhrm1~J*u|07Ok`{DJFGEQ=95hK_ii_h{?Q+I&<&yoeM`y&K#Ka-Cz3$ ztSVSuyphBgder3mV})wAoRYnDH5{6vYQj4S5|l!Ty629OI|9~#!x>JNd41c`=V;ycgtih ze(l(~Y5!qw^OLjwF4G4aeepGcl9QCkpcb?bZPV+~Gc@R5C|j;`3dzgF>*Q7KoCmJC;Ie!c9u zmB0}C?VpZlD%qFZ*m`>4PhXW*`4tKEANHy%`HSjd5Y?UQMx8qgOwC9!@Rvmlc`ZwE znI~HoY^%#R+}yfViw?WS*AJ?i$pfZotC%P^jv9Zj3t9Z`lsyA7yN*uWt7)WqP;jKg z$Aq_O9@jS3jb-JWl}*oXi@sKSgWgu5DZL@6Gh-f35}U`gi%xJO={m3MzFtkL+LkRF zi}f#C> zIpOx^w^V+`eEo-`GWWWqO7%w&wNh?9UKxdIiedP~KyNV+H83Jmd~GX6y@Tk2(KMSZ z{++v%;pj7@Mh*K?M$Q1gZBmXgP9ZZv7#P4yf7$={u)%Q1NP5Vsv`q$rfA}YUv^!`Ipaoqt`1$AvB-!t{ikR&&DwMx}5Zs}i7 z_jW9%xpZLiouKN6JQrSN2p2B24bMK6u=2~()hhJ;yTrAi8t=XkqQuNeGK{zAxv@W~ zf8nDR?S9)Zn;0G3ZkO)Wse;>7*WEqu)CqD^S9DqT{qQ8=(3j;SPk!eJTOL$vSU!I8 z*bS~MG|$@+shZ?{r>Zn)i4Gc+u1nwYo9ccLr-}SQxkcgj*0921mLDcZj9t*+oU@Ed zbv5`c>1CtXxe3XlU2 zs@y%N#oe%3#Twka+d6gY_QGNJIn}m;WGPOJoNKjlO{`7}=Lz8JmKXG+h*jZBZ|}Q* z^O1x(&z82?K8QG%CEF2|8(whDHwMGuiU$5FXY_@mb%?b+es+pg_-cDiN6xcGvYIP#>7laVaQnze7_e`bx^8+M{b zTBn}L1z~;3NIdD|WGDkonbrr$^55@`Zqg!dP`lu6p7_d19<{Y*#+=5r7xY2*pS|_N zoX|oAVv^=fGbWRgeR}QY&8s5NF{f7@UvVh(a6xEL-wby$kecz4UnDI3oFHjw>>~Z&bzdyPEtJ)RQN9%(S(bGQ@qRnvmuO zlA3tUY^!@`WMG|$N!O3IKHa=85n2#y2M?MAKFMjOZ6Y!^JK9?%jufs(58ZmJ{NpvT zQ#%)g%zE%7W~MS$$npUjZ{6L1(l=L1L^po%s8qYYRUgk!FBR0g4SBlDjiFGb`v*3{pOMdHim)-%hQ0XIN^5suiYZP1u!M5SF_4l4%b0@uH)4=Wv^(z zt3>Agc9j?vM3N8M@#Ax##LTH&qU14AleSnPovAGs+M16(tM}+>-xcqU|8ul({Olyv z=>miX>4+es4+}~}Owto>v05@ytxkIrr-c>YsL9G7@=a|t=e3vK=8v(qPKQIXhP<8f z>rLWmJJq4r20BK{%=kj2tu4jF{RAUb{(k?y2Z~~ zX|C90$>>rE4Wm?B3lOtO%=!db%tXCa(+-JyY+n8TUaO2R>U6tx)j9&H8>%0{s31Q~ zfsG?b*44%uVM>CGwDMp|rIR369c2B|BZ&N#XUH42uV=ExHfTKTLfwdZnu!@fopmF4<>$RESDmMJ2ByqzhE?Dnh{2J$LK6^9>< z`17*7iiL(rYx^`vd>az-Uz{#+T*(>3KdZRAdY_MGKE8XZdr!?#f3o}~YkOGjTC+8Y zfgF@N`FEJafQgk-KLsXT;-AAN5A1hp#Ig?)2UvQ2Q}Tf3l{3F3LHbrXe;G@$lmMw+ zQ4*s$#DL)p!y5#W6i7YKW0+A-qJkh8NnLl?=nE4cgj7zH7Ig)!pLuhZ{tWT+Y+b_} z_h)p7v}pc2(j_u#YO49S+eaHziCLkZaLw{Rk}ff&PAIvXoUngdy0cw+c9qMTgMNsm z$qJF+tTtDF!3_aO=o%)bP?GzbL@Ao1j0nrI1i>3Hnqm=#We6iB;06H~AU7pJ5hU{5 z^WNRw>_Rj$@BPk=d%xNDhtLu96OBKy|9yapxd_8pDeDyomkuLHf)xY<$zl{^;4lso zXh@Pt3I@PPu|~nbaz=ubrPBSdH^il>x@#BC&z*f_+V#{zGY>R+^+6M`bcvNqwG3PS z_0~1#4`eJGHK5T_4cut?*KzrM*mF8eX1lwCfiMy`(nba)c>&X7G)7@0LNJH{WjLN^ zF$CcWgR6g~2fb-4ktD5@*aC75nMJr&~HV`{@05 z`z^btfi0|mP2S6r8bBgrGn{I;Q}@AG!BIjFOoBL4G%L_JZ)6c1Mi9XxdQQL*Ba9+Q z+A7^X2$LTV(}Rk{5to+idil_I;l#R6*R;KBuN*(Ow&qfRG3TZnG`ex?5gKPm1|evJ zz!_1L<008BjgX{)A`t@tG68xYHLz~nUPbs|KOEPu=cw;zwM=hTyY~0L;mv}GopfUl zRJz33lcx=6Rl0H9jCC=#lTT~MXzm1v_k2_KrEuMiFa}XnYtT^)il9c^D8MTTsul#s zU?hzMPa6!l!07d)fiU6-BeS0&YG^AAMhkBb6U%`iDVF0BpKa>T&-cw~{obEzFDKP1 z`p$3-Y>Ed&=V(cMXu^OqFb$(D!wDFL!(?aV34zs<7^cTr3gtKh!gIMD;6;U4j*s{} z?A84EyF;T(w7;fl>g=+)w&p~Ddcs$AxCbwXQ51?GC_*zBPvW2-3EIf(aa3R^oWTeL zG^r60jJ{9%=$!uPN3slcn$17aH)Cgo%c>(9@Q?FL;O%0fM4j{+z;ua2Hg^gc`Rlv$ zR~BoyDD(cj^%^*l_}B1Yw_59fQw2LM@DK;eBAAkZK@8G_qpU#E1j~{XiJ?3O5}+q= zk|S{hM@fo85SAt|o)T<`-KSQZ7JF0qU0 zLH~8zDmdPHRJ6skd9}CtJ&BaM_E;{+CC2^LmoB#+W4*dDwfpe%rb1CpR1ZO2lX8_+x>wVq;!dyF-=3OEDYQ6MT0FDx;^`=spfwqUE<23 zPaTh#)zpC-o9FlZ<;*p|lxv<5mrPqYGj9u0y2P#Rgpi8AtT;Wtma1&2#hb(Y+WW|Z zn1xWrtS?@g!#Ny7DAvFrdOd;>ERAylL9?`;LMS7~kp`Av^psB0HDLch31K)4FFmDg zlA9H8U;XIRt~XncYVt186&~5dK#b+ zsGes~8kV4f9#k%2LOiTP5kFZ%9nGxPnL?KH<;9W~<=f|f3^ z*72GBHtzhr#FS&pzFYps^!}QYua4Ko+pT8UeDEci0*L#%ZuN zVTFPkc*F>cR5!=&GV-Cg`W_JB!lOfesJs%6{^r*Y1jR5Xr^3dVw-o9a)TpQQ1gqC` z7;KZV2HuFl{s_slATK;afgBqN3N?DM5R{m{Pf^hZOfR`T@U!RW#Y4L z4S2f5yAg(rhc~CUd2F4zW4UmmnkHllFp>uM=~_x_+g46Tn$r_Lmqz5hn} z8z1zTjD7rD*K+IBv9BS@(ZIOo!&}!aUVpTs|B*)RtE^YYzNWZBv0sNHIcxWYZod!} z(YfQwSas~{3i*>cDK2qGBBE)edvbnj*>xq=v9B%WPgwH60XtI8?zLAwbg0k(;+8u0 zwFdp!_3PUMC~Tx=<&nXen`_UEEMR85qyA(I>z&6QtsZl<{x8D@{@C=fI`;L1{b{%{ zZBpk+u_uH-)p6SvXT4o;J(O?UpTDZ~8>X!ql<5?v(xT=vd(L(D(s6mF+3S3@0J z@Nr(ozEE-?OPn&PI+lalUZ@& zd!Cw*P_fdkKMqy9b-7@n_{KEZP;wsq?x`~ywtl+);nYcu=LgradRf4c?8!yQ$nyPS zvhGwk7kO~r!r)4(Z@3Tl&Cy$Z=6_ft=f|7oYdwB#SnUA}++Z3Gz8Jhij$9ekX2iKz z$2Z-!v@p@v&y)x<4wqkaKJh?WOuRUm-qE=8nLnRgZ}`KZ`oW!>WnZ93cObDB1q2yY ze$y85#;S38=pQth;GZqzWH9ivXOh$v9Bet!ue00eptgY zfb2J9=|#3q^u8bu9+$x6iLB7)?LWq(99Va$bCECpp5JOa7;*(1T7hjgNWIe<`R)Em z*Z2-Y+2{fpHTlF=cs$`7yM!X&=n9sOC(0!cEBuM}dj{ zVcRH}=7S zfBD^KQL%N)e7@0Aui~%mdK8Fq&*MklZt_{W-|^cK8;+m&^usNejs* z$=jD$y!7l1n>oGK(kYRNJ)l<#APSWSPClOGC622?b}loXz%Fhmweik{VFe<%9zglI zlE)RDUOfGay~%IY!|r$eaJV(NJIHx@%xzGAwfSUtuX;Zmp4$xn{EsptrUrL^AP)#{ zXYv(y>%aNYx6yk)`etL#mmlW$T>UFvOnz~3f=Kv5zQ@u z=v;2mtm$jsJ2daD=`*TcDUgBme2}?ZN5~yf=HZ|2ZXLh7w{d-1oD=r9{)^(dt$ws1 zdvKFAkNK%pGk%XLI&Khmwd7;ZW&h z6)Ms^yvUo6-mBd`M;#k76RvH+HFHxsA8vst7*fcIc$-y>?PImYg9BB*KFw3CX<{e} zyOyz99Z)fyCLPC%4p;epf1LaKcB|9I@-O^emg{p>NYO3+_@zIW)l#Jn-yM*GJXvy7 z>S(`?BM?e>NvlGoWGZTz#tc@J&^ZsT2Lm zNcMl#nkWUSX)F5H$Q3`An=~=d{b#0oWkUb?b^YNb?GcOBNvcAOxYCTL(=(exun-e% zHuaKJkKDj@s!u8>eA=_w#)$ie<}OWHrA`b{jp88J3f#yO6%Q=bR3RmH`XjWyu^l9V z5>tn&RC@wg8r+G7q-TC9iWlG$OZ2D=mFi4@!Fr1J(nf&@War`62Y+rQzUj`^=bYZ6 zeQWdGm4JtW z8wMiW*vl|@be3Fy%vZn9;&RMo>3c_awRn5N<3I!pd|Cb8+DnE&or$=N{yeotp>=Oe z|8>UR`$6nxNsk30p!o}$_qOZB4jAy-7c z*5wc4ebgifh6WKA=`@qpLEF1SWJ=eaQEdwt>Ec-*+#l^4B?eK4Fvy&$v~AI+$ahEE zrGI9u-@fDMiuKgHRX*2R<;X(ra?{MtB$GuehFmlA(p(IY?dY^L2qGuVXQD|Pm1&_< zO%OoLoLN(^D&2ZlslGXsp>eU=i`G;%$1?$e8CaC)^CIqx8Ey-TYQ#8jj&Lov*RU!Q;mm$l-f|phsB|a}dFvDGyPbtzLF?>32 z4jJSA0&juq{*aj_WP;}%F)E&GcY`;nlj5k)%H_t9s`T9g&9x^0Jtj&4*&oF literal 0 HcmV?d00001 diff --git a/core-kotlin/.gradle/buildOutputCleanup/cache.properties b/core-kotlin/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000000..1cae56dfec --- /dev/null +++ b/core-kotlin/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Tue Jul 03 21:01:49 AEST 2018 +gradle.version=4.4 diff --git a/core-kotlin/.gradle/buildOutputCleanup/outputFiles.bin b/core-kotlin/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..fdf5abf9788a7ce77f0beae68cc6ecdb606699fb GIT binary patch literal 18713 zcmeI&F(^cF9KiAa$s_MB-f}r9i!v#s?8?BV&W#4c-5>+I1F;=SJQ*JUu1zOUZ@{rmpk@cy6m{RfPRIiGTw>J_a{nIV7x0tg_0 z00IagfB*srAbi>h~!}88{*3C=r*M88pzx%P!VM#A(zbO~arHhO@~AKx?KH+_j-*8l(j literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin-build/version.txt b/core-kotlin/build/kotlin-build/version.txt new file mode 100644 index 0000000000..01aabacbfd --- /dev/null +++ b/core-kotlin/build/kotlin-build/version.txt @@ -0,0 +1 @@ +11001 \ No newline at end of file diff --git a/core-kotlin/build/kotlin/compileKotlin/build-history.bin b/core-kotlin/build/kotlin/compileKotlin/build-history.bin new file mode 100644 index 0000000000000000000000000000000000000000..e3926f1cead83a2a82c5113b45c79ec058c52e74 GIT binary patch literal 150 zcmZ4UmVvc=0s{naFfcHt#Gmtyg7QHWNTB60n!pB_4ycNYewL^zF4q~L3S2RLf+}z| NQw~+&X4pQs001I@7Lxz~ literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab new file mode 100644 index 0000000000000000000000000000000000000000..9a13eeb034a1b6ec7d61627dd37c8dff955e7b01 GIT binary patch literal 65536 zcmeIvzpGDi9LMoD7uWUU-jzX2Vv)io-ASa}yWT&53?`!xgHaZPfyqi18SX9folwe; z{J6Iyzq|QyWuTY$w~*0zhsV3ld3Mg{^y$;%4DX#8t)6Xz+uvDMb+&4}GiZ7SOaFc| zSQ=b^X0SH#`{CdBf7X=%0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&w zb%DD{j`ks^x(~W@Ka<_ds(yY?u6D0|ONN$L?dTrw-d;@RySusvhpIMzP40BZJ||mO zR9*g*T6j^#0wG-5=d`-6O+Qm)<9{-Rtj?ovW+% zbgy)$-zFm?Rr|VUy3=oxm)-r{Lu;z;z3%xi$e!>?ba(M#vd}%%UF!eV`3Mjo zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk o1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ;Qs`E0S98F761SM literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..64fb36c0cdb60248e71ad76ac345ecf3bbfc3252 GIT binary patch literal 32768 zcmeI#!A=`75C-7BP;2!O3ZW7xQ4yg<>Y=K$o+j4Xp49fD@b(?=8ikgt&7u0a5DsWE z-;RIJlKRGO@|4sA$5CB!$Q1HJwAqHe%2VcOwM%N?Nbg6^&IXm@puCn3_3web+G%oT zl7AVUK5%^bWuMA{S9GW+@1jWsx-)et!B_Eofs@lx8%*2-Bqa8{W-Mo{(f>kQ`<`otzF9~Eb zs|)7w+|L^x-aAT@%hKVGP94@^Yo6mT<8{r0cK4FC(#Nh-A6KV&rawxF_DQe|!`h~N zb&{PRNv=wru~RGcvMBpUWas8EXudVPdOor>P<=+t^ZQlANwIlFS=FUQG)-U4<=SmN z8ZQ}F({klXGu)|}jm`)1adRT4BYP#0AkU?1_I&3+rWC5#(|nRC zOg^bg9Zh+akan6+z&~qnd10K7jO`Qxb<{Q-_PoSeujQbuaU#}y6J4Ikb$KXj>uuR@ zes{up-r&|0OxfZ#I_Q0$D^*^=N#Fng literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..a8a65c788a049fa13437cfd9e8f407982b2825e6 GIT binary patch literal 8 McmZQz00Ds*004vlZ2$lO literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..b3155f95730bcd91e447627020d273d6a58689c7 GIT binary patch literal 8 McmZQz0D(pa00Bw>!T zIBRn7-_>@i{9j^o>+32OX*8To$$jom@yYN*YqQk6tKlxX2S@@pGINI>G0` z?U6JE7s=4_B1_VOX^r0tZJ)?d|W zg&D|0p68(YM&TlgOO^|6YzF&x?}oR6Sug4{3(B#X#RAuYu}V~N`K(3*rr21r;6D@6 zT!O01__97Taxe{6q_$wL3;0@%)9?;FRMdpk8ws`@r(fIyC*j3js>)N*}ALCQVaj_`pug9L%7T>tZ z6{NVI%{=l)^&$6XW>7{#J?MOeo6@5Zy-RtwxXCfQQX~pTj*s2Z4r}%=v z{2xrY=j&z*yPb^;T`GcnYglb$8AM!tU1_P`uq7&w`^RoHCiK?}$H$Yh&&qMN+fB#; z8?qcTfh_7eEMfZ%gklXgUcC0P{_#!H(SVP22m5ay)P$#jTWod>txhABkUb`F_7RGT zas@3RgO^nY-K?MgN&Cx45SH@FsK-|jDPamld?@8;rGU0XTuwpTBFuG)XhaxjUsB7S zNXihe)6%X)6*@qU>a+X%PIN`?W@|d{#QR%ZHndx;&t@0rvn@9s(Tl<4ESi!>HxPd} z@>Q}Zs)qPHB2;+)swkX_!m_GfMK8(SUNQ^Bo=;?(VOH!bTh&n5A@mEqMOtOoW8So0 zYk5~cj_4(IkKv@RM1hy;Cu0ao&%^)uPW0|Z(|usgr40M}#YUezkj)^C-{0tS4^BF6 z|EktrO7rj)$poYrl~g5037RXX_2pjW4LMHmhd65Y{kkLe=6)45Vs9SQ;?0A~8%|qm zh*Kj{sJ9w?3N=>)QeE{BVz&hiH>NzkMVi3o=krNVPI#dCzwT0=rz|1YCXCNFy4F_a z05@Q+Y>!(=E2)MHN;xpj6|wyNF6m6bi<`bpQ_$M?YRVCWhifxlSQVz9u{9KARQ8@Xa)+X5AlL9h_yA*8S-J&cZ5Vq7wgQ@wQ4(~1Df!Hcs-0yVHTc;kC z@KAXT_2H9l(_=oPtKK!tlkUNwb9~nGxP+63HQcqCGwA|aJ9~3C+$z=eETW(ChyL4> zB9{x<|JzPPnB>r++>qVfC28Qo%@=3s^fO9_>kI0N^4P|gRL3=mE-!f)!q$<}F5YKy j1L&3Gguiwo!b^pCaE>R#7}zo1U&6bMgX*s>PDuX&E*>y4 literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..d8b968522fbcceebb2dd7bf4ecb83257c7d8bd0a GIT binary patch literal 32768 zcmeI(%}Z2a6vy#{63iwTq{RdUrWKPASzt_&k&$5_7&U^msnDohQuHPikA;wJvM3ma zU@9E7vDIz9|=5KG$)c52%1%w@1AvrUJShYatM5fq1t_&zX;{UYDFOB6oK7 zS9`5rXx&epH(E2?vd}($ou5?SzrPAqe$8ht0tna_IA=uOZ|^AB?;Nd;@6>7Aw~3x; zrHWpfD|(&&bX9GRUNRDeNg$=~mv%3^{VYs7&$ery5xLwwSTox(oPH_05J14TK&=tU%ELz6ed&h)0`>)r5qbW$li%gor==qT2q1s}0tf_5Aa6vmZlnhFUl|Duok@O`uUy@~K!(S=&Utpu`<%|{(Yy7*vX;o(i`de^lAF&Yt>x3C*829wO3!NcBjYE<7r=dA-ywObvxaej;60a zSB zcB<+`dOp39u1%k$cRy53r32~e?$%yRR_#iM(xd6j`>K)jQhGD(Psh@S@A6(cn6B(; z?af5hru1~WH(imQO0SLoW{jjEK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ KfB=DiE$|D~)Xgve literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..e64763e3641013fe082591324289367e1f9fa5c8 GIT binary patch literal 4096 zcmeHH$!;4l4DF%lHx%7>w1?`{A4q5H!ofH(yfi>>vc!%BOQNC0u>U?1tOU_iwsYul zbmikC`5vif7v8PVJe^~WuNW$_q#(K1E#cHrCaJY#j9UTkyFqY50a;k6y`fH^{%{o0 zAfvLT4!)d+%meEgrU-d^lxYG+AU|H|4{G4CnMm_8qXF%eB^5P%zTb4Z$YW$SYJLx< z?@pwXU)N3j=@eknT+ByTi}B}EpbFK7>LBmy0%{a{ZG;l;M;2Y9lR^^?6524SC095F zhK3K(Yd+X9*hI(3>7*bMUD9B1qRDOfr$$%>lh2zVBM0h6xK$NeY0>PTm&!&^Zt8>V z8JMkL9n&Ag$5hi6OfFH1UvAZms*Qw?rLxtXya&wpM_|Z(PJR=qUL&j<>>Owt6#iD? z8&kIe6>f&v>kS-^#};S*iMUR)7rSpj^N30F=i8k6nR&**+G1=-h4cnql)9XP_0ko+ zicaUNpK2|%*bRk*cs}`W(gA!eRlLh4Q)s=UCNkxB++iWLFu+_`siMyJe6zh;q7r$9fDZv$q%rPSyt z#ro(rx#HqpmzJM%;Iro6!%qzr@1oAh=m7ko|86Mg9iX=@ztZp<`pas*!F0m(xhZ2X zjM@#Y!$JY$A!og$lS3AAP!B}P za78AO`wPON$33TT)||+&gItrWRb^;Vui|F?A7HFNZ~X_$-Mrp>Kh+N*h4X@841hon z?SoYnREywD&4sZz0)^D;xjlsqgrl!&-V;T@^z;#1uq*xg#BMWprst?gs9Kg#4j9;6 znS6J|&Shmjr>KGuF_39oA$>*ET(Uf=Kf=5PMq8Oni0tlb4+8Z|h`B-VSPjtoK*%-g z{x*=ic(w-73OkOoZ=Y4N18nVdCsk+Ka*A6A0yXpI6951J literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..56bab89b950b557799390d2ffb3c30f11f801743 GIT binary patch literal 32768 zcmeI)T}V@57zgmjyhsXjur3VAR$#dHrrsL@5tGU}=DW*ej9+0Nc`&VM($_nh~A{?G56 zxmS_V5-KKnlrYiB*n&Ub;sF5&m_(qKiQ-$kc`i*+xA1t0(c2q+?O zi-{_4w1yRlV|a}B(*LXt(>;b4MnMQ<5$I#0`7LkXWjV#xhZ5p*cH@}a)(B{x0>_AM zmu~Uro1$FmJl%7<jC2CR*Dz^Q+c*`99wv{q)U=jOM!z)`tKDAOHafKmY=%0)E+t zbiHuSP968i`2MmYU+OrX+e@IFi8{l}PS~sK^lm%k^)Qg|UP?b=%!rGL4nA4A!kB92 zsge|z@a2V_swD1^JfqRXYgO_f2L$XS;Af)c(an{1>KVO400Iy&QlLck!{0Z3+h=4= z)Pev6AOL~f2{03l`_Amm-HKQV0_q7oV4{&o-A?tAArS-$FVMq8&Wbl5CX&?1{{GYP zpDh#5^?vP^^&`CvNxkb}J_H~D0SH)ApjO^@?hpF5TC+RtU3r-(+PH0=_L-Og0SG_< z0#*{JVWNxf2K*n8l`d)ldTEw@R&b500F_bF4gwA)S{>qkJM@YkApn7Y0v;wh{F!a@ zxiq-$#tKx+{k3Ch@Vv2AQ7zX3ALTku^&a?<>vgdn1R!92fhLxHM(>POR_nA``r75J z`uo|OR_hJ@KmY;|fPnb~>gDgn$tjOR=1Y#mW)Qf-MCZotoiamKWVF73SAO2jZEXx# zzf*Lmfs zY!HBeNd=hbPU(eqlcv`nTlP8Y+8*NfJpGbcS7;Jv_qF1ItS4nS*e&y(ca_`s{>)&4 zAqYSK0uX=z1STiol6^&}f9UGuW@8ovAfQEHkmd8L1MADQ%)z-3fPk6;EbpK3k!izf Yrb8;T3%p{Y-M_Bm{xbW8{LlQq0cFgMpa1{> literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab new file mode 100644 index 0000000000000000000000000000000000000000..ff97d1b01f7463ac580636bd3c6379ed90086b51 GIT binary patch literal 65536 zcmeIuu?c`c3)uw6@foZ)B?N z|5X2-xB8Un_s>QpK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk;|p97 zG5(bOmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#3c eX8;05Am(K7WpHGOV2Ee%Veka9JsCnkQX&8*Dis9) literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..c83b7e08403a62cc1bd8fa245717ab58724c7e59 GIT binary patch literal 32768 zcmeIu0Sy2k3Jg{ zZ^>FZp6;R#za~fNYI>e_r?=>dFUfm4l~y+^<;~}$7u`Sy(|&XcJ^LxCr!(nJ`tf6O zims>kXiwUvqLgDFlKylYok$zrCyVF;x{0=<$LPU#$yGX*ex`TcCOw*$vYd{fo#{e) z;7ziF4xtz6>DS3~I*nGh;CWvqgXm^Do(`mS^ukNtpU$R-=%*LlPq)w)w3c>lS<1QR z$w)e#&Zmvfk~MTGJwz+%1-kcXa-WW(p*I_oE|sM$qeEy1I+gB!lB}S^=zeIrQoMWFuWe&(PkqvNay}lF4)y z-A%vUWu0!Jx9I>HdhSlrw+(J|0)5tyY^AH{aau!f&;z%VuXHr+-nNu$w~{fmj`Ev0 z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apuj&B F_zAm#Pl*5k literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..405d891a7de8d39633c3e9847cf58a983be31ffe GIT binary patch literal 4096 zcmeHJOK;ma5Z*(vKyO8{SQLG2yUV@~ts*Bt&xs#_Yq<$*rvZAS#i>F>;&@3au>XCB zF%yI`Z6`hTkQ@?+^UXKIZyxlY`?Wno{a}I}e7JwyAA`OC{pk7=tGHAwecU{V9ku>i zLA6*KJ8Z4;?XKc>V?p*-aeFNNdnGa*t~+kU(Yx{EXu#I<9IIr?p%k?$62UFcOKwau z#0v?p))>cJi7Czp_T4ssm;H4U2Ub>)oEYfTnp=tL-?fMgb6$41g}2)w6Jp)M&fuVCQuuz8CN9liwLUka?NBV?OtF#M_Wpj2q>YTo0{Y+jvz-ZdRQybo#!xf6??zg ziA3U4ZeUcx{7hXaMp zal_lK6qz@g=Z1aA6)!-Cy?(>){RcKIhDUt4sK%EU_%D`N`>K#j%*R_`*tJhIqf8px zom)_bYWX3?H{|vVDw@vR9L-=krY5S+0phv8T{Qa)lyDfYP&haK{^L5&!I-G6$7NY- zcpA%c1g0)+w3@C}!XfjqPL!PYWC?Ci!v)v?M0@N>ZzmZ}gyE83SMp@n5o-4?wRYbVfgJ@@sR|9n>mzxIF8 zukk3AyqXH0WS4&iwiP7PFfyrrfYxxigPHli<{DVq-r`~>cpwX!-LZ87Q}%_Dwib}? z?D(TJl(-ods+nCdMT?SZMBg)ZH%0_EcfvDsg*0cHr3V{*3b1Wn=G1U*`7Xs^^fF$a zz@g@XE}Gq$!mUJ~bdzj&2eN&IYEfZrdbP@3f-9*tmQcy(sFHSVELO)F1vPhL^p^;4 zYpk8X=3bg`P-$4GjI_&Vq!vA3ldDey8@?_-XmriO5HfL7JOWZt9|rf1LYO9`^Po|M zgN6HjVkl$}b(iO7?thkU40Wod1sy)#er=qi0D6DhsI11aT=U#{REJ|2CnWhIra3{P cTiG)VQ5Cp_#xM6j?tktTxL4p_f!|MopTBoAFaQ7m literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..d43f4d11d97a07ee7716e69fa82130792b9a4dcf GIT binary patch literal 8 McmZQz00Hh)004skaR2}S literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..46eb98bf025aac853a88d494b80031592fa8000a GIT binary patch literal 8 McmZQz0D-0%00E={8vppj7QhlQZz?r6pyYjCYv&bd=6lCd;6?r3lGhEOGd;i3@f-T{)x{j+1ICYC z9vP#r#<&{K$CyjTocNad(W++GHOfGS)V~b{lVufkuTau5R)Cg_ya&HgKvOoWnk69o zF!Vm@6Nu*KaaDF{WIQV_-^Eu(wYv`GjU5+d)2G(kEECAJl`-gW!6BS92QoB}gfh=d zxL)O5`|w%Zq}nT!@czMa@hB~!KuNEt(>3^&!%qzPp}q^b@gk$&2SA`MR5uk1N`r3O z65of$5lBMSZr zyiY-SA)=?YvzhcUQMWx!QT-O?O);3loI&6jUP-8+ehM+?2o8&QJPd?fQK+R&pdqR! z>28VP*m1}e>01JOM7?$-y%{^arvtM}yFQ=>Q;vO``^b}egFMfuIZv07|InT9m3ob- zcSW5G=-20M-Og72FRVa1cHkQWdOCc_Wc(5F%9J%a>Wz+)P_hoz6!b}-GWn}WhLbKI z4}sBBw;^pA5}nx-MwxQ3EdsMuE>2vRxX)aUJ$Bs>0yOmDSvKVcksX9}(UUU8m{J+?nV4pD$K>~bRk5(q%RyIG`bUu=GWVaE=8wutP_$>0U-*co7A z5(qtkR=gjTXMdF)`pko8tbne{2{DHU_j2!O3G@%&o^<}5!fSZldG?EW?_SfAfIoq2 zN+f>q-tYa7`S15&y!H2WpZOotX+IMEKSzF@t&?VIH6~D^M6PW4FWShn1AeuiOxS1S z$MLrW(r`ciJS*cj@*n{_2o$5gP9{w3vm-WRk^l*i00|fq$isc{u%?-9fjoPaNMmZ| zu0Z2%Ii7{}WaqP*L&54vLYzDCJ==nf!}%oOPe9>1^F+KF>3@v-B;XbTh3L=tS#=NG zqK7)(5=c@a^%vt#B*Qkqk_!ot011!)34{ZIdL27B@)Z%0fUOcz{xX3f!Ne#?R z0wkaZfm%H872P`0qK8_l43C<}TfDR%bN&@aT?qkJ)+jCjlo2 z6r*3G(mt=VI(H)C{+sHnvN~?K#4A@K3zPr660&-5KKg(8`R|bBVC`p&5KjHV4>kq%C2SUKKdiWPOM|{0SNZv`OHYq!S1~;O zP)F_Is5u4wmU#X8H{nAORAvpFkF#*SllJe`$XvW*~v^Cy2fRF$mOO}ABgE0svoqA9nmipMx4Fc^V)TyIm)4R0UJhhrpQM8JbSnt$+6myw@U z<31&lelzZbf?WV>Rb0j)0TLhq68Ja*$$0LlDR}(t$Ia%fP!p)cy1jDj*9D=@%X}n2 z0wh2JLz6%?)}77gtD3a0UWuFj| zp4ZzY)$n&C(r|rtH(#pOrZ5V1gg_qp=|<`P3cHh+BF~+psejm=hw;r3h*lzxX51e5 z{2J%!{*#7ob5ZDRmOv}G|MkPo%Vy^}?cWUD2jUXeI<3QO{&K8`7iM@L8qM>dzN$;< z{~P&noCN#{)GGWRq_fip-beihL%5%WKJPg->Tn2CYL%)G>)Y0i4`*s6dI*cnK|i-; O_MINW2v~X;5_k>O3 zGL!!L&Zufzwd(7%W%}pvOiomPKGXN+@5S){XI}{rAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!Cun3p`qD(_HeNF49}NPA};uJ*T_$lwQ+g`b_s}Vh9i*K!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly lK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfWY4iyZ|A&C$azl literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..9c2728d424ce833363b359cf4e0d790cab338377 GIT binary patch literal 4096 zcmeIuOA5j;5C&kk-a$ln?xIH!bRlse)C){9LkZ?llBx9g#)4p_Cy>b|fz0FQTOMzh zhVqm0#-^YQkjFl@3W33TC`C08(WF81Zc^|_>|Inyo?2ik>Qp-n6w{fJ4D3?;inf|GcnAhTUB~M;cb!$o)NP#~W8Xh7 d%?mjqAOa#F0wN#+A|L`HAOa#F0wVCI0xtnrWrP3# literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..f4c8cfc8ce12dd8c7d3138da29fdfd38746215ff GIT binary patch literal 8 McmZQz00BlG000&M4gdfE literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..ae494197337e7613fa74806ac6352f9fe880ca17 GIT binary patch literal 8 McmZQz0D%Sv00BqOmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> IWMIUK09gZWQI8*k;Q&n&JQ{~-Qd7wRFlZFz2;~a9 z0>th&`k$G+FIAr65FpS>U{aFHXZ_JC77-vo;En>*l6*Dq%^kn+Gywtw7Z{i1HQU9& z8O$d@fB*pk1PBly&rWa$3AV7cs0RjXF5FkK+009C72oNAZfItU=mp3Zc*<2n{iVprOHVXb7Uf!NoQQdqD`oBFxo>hIABL zk}M;hq(Ukm^`W9n3*URyGNUBy>iUCj2GCz4y+kB%oR+b6zDo@&p2+w<)M z?T+@-W65m0w7od#(d3pJ#@O;rvZ6hFr03e_zD}NRXTMBdYj6KN+1z430cs(qwg+wOlSd8u91?rc}?sf!^%fB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ lfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+0D=D`@Gq1t=v4p! literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..a3b25390668a103d0e4ffe418e486a640a029717 GIT binary patch literal 4096 zcmeHHU5^qm6!pQF_~NtiTNjN!xTA@G02weW!!7~VO?)w>y$%g+FKIgj{=F@f4IK-+ z@p*U|l6!i3d(OS*QM$2!Y1AHqY^J! zxa(T+b&m`1iy8-84UnAi{pr>i%1RLJnc~E#v9xlofm%0oNu6)`CL1|J!D+$OB6gU8 zvAUwR(p;4cT=WJzG8b3|)qT-BvA#q)9_PM|?^q*2t zuIrkoJ4C3}<|(TA2#FnVDmVe$k}kzInWp=H0~^Q2ALohL7>CTfJ!2pY^hwB#<`#6E zroqPrGH`*|L1i@xaU_2NDkm7<6O&x98Fi54ngoU+suJ&@3ETGMe8>Jo literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..ae4d3fca102917b923e7124f626e00a5d459e0fc GIT binary patch literal 8 McmZQz00H*h007Yd!vFvP literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..75a15fe067ac93e8e5bb00b9267dc361bb3c5d66 GIT binary patch literal 8 McmZQz0D;CE00H6wS^xk5 literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..7b1138afa87d918c16610625860cb6aa0f074409 GIT binary patch literal 18673 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 bBA)GhWHz7waUQLh{p!elZDic0u!8tsbBpCb literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..8a98cc2dd02f95c08d2e704abea89648d5c38639 GIT binary patch literal 32768 zcmeI*Ye-XJ7zgkN43RFl#AJ}jx}gx_J|qfONTaYoGl&p_GKi4MGH4`yh}S4vVjvM} z-Y~i#i8cI?8eOy`C5l-vP(jo_%#bv@fP#rV5#kWXZs)e0zh69i&-*@?-+A4c6O}S3 zg7_m!5S0xi{yW461R&r+pji-2RwbPFa2mr9fB*y(6DTYts>wfb~MC5W~ix^u;S%>B58&yT*pu-Sbql#VO8 z{yp?)XDHQ-TD=Px`MSQkI%DuQvzX^~Y>cn+HV^0j3)uL6@iRC39Xuc)hk%{;*W<)Z zb8^H+Ob9>#0ub;nFfE8yIn%~G%@lmT-;z_|>AY6PEBSs>{=L0UEA^lb2)GMG@%}VM zEUa-K!!ZQ3A}}lX{hy59L9Nt-Iv@Z62tWV=5C~s^TtO6l*)b8m9ilS`KmY>T63FED zBdk3QBigD8)yO4a5=03LR@vTvs^R?g7aF!S{~8hfTl@x(|70SG_<0=g7P z=lf1+XRA|d&G&O%e?B>8e6C9nwXC~s^?AO;6N|at@$0WoNE{a7AfTv#k@xYfOYP%| zCe>iFbix0hVXNbS21`RpVJOhWUw1CDc>TW-{k$)y242|1kN_=7DA2_F=}l#IlY}8x z4AsYZJ~moDuXqxJstFhb(QxVq{QO$sD^SSp-)_8psc_n$(-m;tcef;-4?2*-0Zjb- z^E}lwq;OiK(}_T);J<^^wnO#j(GIR-x@B#>PT2i!vzeawK!3ksp0M4j8rXDolb`B%y6~w zo8fABtxn`}MsNAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;& z%`ULi-IsF6!|C&M`FHn`k*fLhX1YK9l3rZvp50P4_|^S7olZ}VR=r*AzL$Rf**&tg z>RLLN9{bV#GJW^G`{=f+N9o=4O1he!OXs#%O{K5W(e%Vv)rW8057Ni!_;}Tw^lExJ zeV?99&+n+(mp)BbzIGqnS@kBpojy$0(i`dguBr>^QaYWU**>ry)oi+$9#0QVR!ye2(oci#LHZ)y?ElvJ2oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N X0t5&UAV7cs0RjXF5FkL{{{;R3CPAjx literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..6e9870be293196fc1228b95aa7e1681732a43713 GIT binary patch literal 32768 zcmeI#!EO^V5XNy{2rM3fHbrWch^i@6;(&10Lu##e9oF6|eS2n;MQMTF>>kiRmuwHs zr}=s8@mljGhOv`m?&8pz^VnzU^WEUH@3$t8IS$^2WSTh0+cxIldy|I7bXFhcznj>Z zjg{a={TJ!SE}3&XxZB5_yleBf(g}0wWtL8VzNz%{R}bCVcDpc@@V!#TT5J%f0r!;x z?(U^O3$baZwMaFBe)u5iG3i>EkNS8c*2$njxpYNNQXa-8kApU*lP1`~W*_@x*0y(> zxYy87I&^L|CqcG0>n2&)Y&SMlX^LRGjk9KX_|j^mQZ>`YS$L*;(#SgcqIm_7Cu+ZQd3-r&RTdnX_s+xm}9|KRTx|YGmX#y2L zI-jO|jlH;Ok>-+$&+Ox+<8r!nEPdy*7F2uyy*LXN^K_`u6n};4)|$p^@x40-Eq%%t zd%XfC9j%%ZOP>*Q&dTO{>2!cM>C;Z;Nv?TarMyn>Kwhgki?Kb;zMqxTmeRW^ab!TQS_0Any^V*pkA+Rpgk3^^>7rg5<`-cpqGN$ovaA$k_yQ+ zq~Fv_kNF4rA^9U2T1;$m*Xy_!TjG54&^*4Gh&%$8f$B^kl`88DrRto3(p(!5<`L72 zFDv?JZs!~Tirn1>)1@~HHbUI3&4JMs7$kEfJPul<| z$-!*&lDC6%$;Fzld*aDNVseG%`>==VsAk26Cx3-+9I^fmY;plj!kTIc4Rl zfcs6-58k(!-#-FFFLZ+Rx?rYNnu6AT>YZ%Jcu^_%p~=q#bXAzw#80|YJQaLBmNL*rRjH{IA~Q(wM>2z5rK2em z*<7xV%^x>ape5si#{W~V`{mBIcK?(zs|qN|z88QiYz777*xNdKBDZrrl$FQ^>l9Y@ z2Q=36LaEOTn==i^CUE!mbK>_&!OD5YqU8MFvFUoj1VYNiOHc~Vd4lR!6;qh=-Zd&_ zCJ%X@gPIy!1x#NqxT!LTcX!=W>`z$e7Rr^`P=SfSLSpLoT0O!Vc`tL8nUH1yipGbn zIysmgD^eT+o7`$hrdc)rU`RaJ~*7 zXk35lep5qrY25VKtt;=QJP<@88jKrlc zan?hxIt>7q>Yy!l$Q@77wZ&k4z6s-6P5&f5%^;WJ0Amxaa88h#X74}MG;aqia}nZL zo^iNG{Qg2Q7+ykjs-a(PDf)h}H!fomiR08qrH91dSB;<nGMRCx)Yoo+Z$_SkF123+(cxjsT6ev@4H11{(#z^z|^TQuMU*pDLAmKsF6E< zBaORz%#bHbq`y=@U4h$@VM3g}Ln)VzM<{7Lpb}(Yi*ju8J!!npY{)yr=l-iVw!LYk z_;~#GaH^%GU~4I&UZssJPZaLp)Z7X$wk^gVC? z4+4%0Ts9($a_KvcGdLUH==DEY=$dpEfZzxqfPiBH%|_(&aQa$QVy86E=!@~`sN{)S zj^}!PYFdsq&z7rQ*Ei;3%Vt~WcrXQGJt7bLPD}-JI;KJ(*aC5VetOS*Z1Xy0rxCfm zW1z5BjY_62?#k@wp>3ic~UtKuGY+WKvx zH(IHpm!@B@)1R*DP0>q6qA&>@*ZXkS(pyi%H1kZe9?~3_dWLFeTH_c3wgi&;{jHe4 z+hVI8br3)R0owv!jYw7=G}*38Jp>T2FYw8TJbTm0dpY)LsfYjq2q1s}0s#|9=T9jf4Ab`aaCLK#3FUw0?2#>2)Qx zvFuTxN40diAJK=Dx5&0(>R7i?+RQ*oI&jlqHzg#V0@EU*&~oVf3o}T>`XCv zhRe&iWJc}vok1ywQr2yq)=c~CpUH{Ro^IOSWZl`JRfdFF4#^zZCcavS?XR literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..c2d0b7ddb4291538af1d053b9966ed3885cef3df GIT binary patch literal 8 LcmZQz0E2e`0QLay literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..3e822dd800c530e797c2ef209ce7ee551c547e37 GIT binary patch literal 8 McmZQz0D%S%00B?{$p8QV literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.at b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..a5f03ad0c9ca512eaeb7b464e3a90c33e4a9909d GIT binary patch literal 647 zcmaKqOK-w35QP0d+C$Wr+KaigQZGGJgg~l55dnJM*sEa0@kV|~&|lx6hC@)4v%j64 zne~J%5G2}YgMzG#60*@6ty9jU@e6Q=B{X}`0dr3lN>uDlP|XWKErTgJnov7F1uM6w z26>)l``IQML+0OE{4fTrv(Ih1+AZJNO%JQcYh`#Igh1y8-x5$dSp2w}?3?Vn>r{6} z9TTPToZ^=~4=uhRe1m1sV9)r|C>Se?qV4VUGK%G=x*)AYrc5=z>bJ93k;FFpmn=jK zbU!55AxknPwao2k2XE|kNJFB=5R}P%v_K6xeu0X2SURSPUKta2R(&kF0;{ RE>7yP{!#ugZFiMzKYxip?BM_a literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..dce89dcd2596ee1aef7bf842a746c0a08e610e0e GIT binary patch literal 32768 zcmeIuuS$ba90uSQW^iF*65EW!WHcyv69$uYyMiH>(-yT1+0q7rVD&z{0lU%VHH}Lj z8BTm009C72oNAZfB*pk1PBlyu!q1|N!|x{<2_21>>yHm`s2G s0RjXF5FkK+009DB7C0`+&-!ZF<&3fsAV7cs0RjXF5FkK+!2b#S0;|6lXaE2J literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab new file mode 100644 index 0000000000000000000000000000000000000000..fc1ae04109d165676819fb90bb8c96f330b4c806 GIT binary patch literal 65536 zcmeIuF-`(O7>3~=VnSo!0-iuRYZE$R!5y@M!V6eZU}NPO>^K35-oeTXSWo|Sy{%>*m{cYghTnw{(_n(uZ`JKBsr- zdwP@Z)5~-`s5<<#cAb8u^K_T4(rx;hzNEYKG5t;#>BX>Wn&vZx009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ ffB*pk1PBlyK!5-N0t5&UAV7cs0RjXFoQ=RQz1=}d literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..43ccbea46f7b9af9c2da784a6973915c825d1891 GIT binary patch literal 4096 zcmeIv&q~BF5C(AHV=tm2ddbNbkj+*q-BsFMJ*UYKL(|NXKd^m!yAThBlDjau&X+I4 zFB^#?>jhYqoMzzC7}!>Lb)3#{SD3M`ZoYQyZ7K5h(eQ^-;Inx>)`!#nWf2-MTH}}k z3tB`7?0_vu^s2(-)b1kT91S{FzQjcoy$HZ_&2o|aMjc`NHt}aWzoXGlo3+j^NeLmW z&MIMS@~~vc;6M2NkmwwG4OgG|g)U$_cCxQ18B2VGhhw&+l1PmyyRzMHrEIkL z)eg6CbCT-VGB>LG(Cb1ay39fB*pk1PBlyK!5-N0t7k;tfq*| z&7Z{%+k^@9MPMUEJXOw$eL2h_1PBlyK!5-N0t5&UXd|$nBJOJC>o!}22*h0DJ$bLz zUQiGqK!5-N0tALlU_C|rZhapP+g#=$K!Cug2rQ(C`rgICsLX3l0t5&UXckyX5ryLG zNAs#X0t5&UAV44sf!P#MUE7(@qPCg@2oNAZfB*pk1PBlyK%kYtOo}-9O3$t0)(H?G zu$&^s%g28t2oNC9wLofoXIxFKbe)&;go(ynyM>Z}bLRXxX^#K_0t5&UAV7cs0Rp`W zlvBj%eZACczB~d12oNAZfB*pk1PBlyK!5-N0$B=dr-<|0hnp;WP@4b&0t5&Qn!r(t S__7~+Fl6|AV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!CtT z7x*v?!=)Z_wSC{dZ5OAKSM8Jbc{?|qJZo>YPus8UhqjsU)J)0bEZ?*^8&+WeU^p0e2`=;H~&hJdd?frJ9ogF9B?X~vT?_v1V{%B9k zCEwc@?YDOSuH;L*(f_UU5gfO*uRQEo#>caO)`g9*`vi(-2A^Bjni>mQK-nBkC+p8EF)#>~&{oMFY zZL~NuD8*2&AwvqR3I{Q9T(w8Wqyg$``zmb^2(4-+`3L}lvK_~0`sMfkS z8^0^5rgrM7-$MJ6vYjbqX=A$FEY5hZP|TjMIPuDpL!+iqITrGio^-kS7z4N`g3Et$ZwnW70D|z!Czm+(+dHT+2)4n#FW@@9= zH|kU{w>MoB>&J|^;Z1QR;y*c;3UFlwL$Li>2 zjx2FU^;1J` z@Tw1ZQ=`2YV)EU;xv=s@9LImus&Ce-LOhg3_4#$$thHz-`=R2DF9Z-k009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ c1Q0*~0R#|0009ILKmY**5I_I{1paSh($ literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..b3155f95730bcd91e447627020d273d6a58689c7 GIT binary patch literal 8 McmZQz0D(pa00Bw>!TS|UJKW_S b_j$lW9`TqbJmneBS@D9Gyy7))c+0yV#1s{< literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..ea2332f0e9865c3fc5ad466893faddb853d24bc9 GIT binary patch literal 32768 zcmeI&&r8#B9LMoDim*#C!oz|B(~2cT78ENgGBgYXqb69Fii)}=MZbjNV6gd46f$yG9o7nJ=3n{CpQ8JAmEz7b0hL)G<_{9xzA~y@fVXbQOOgv z9Cdnq8rqMxmCE&5kFU?gmXtcq^T8B&tk><~z===6+>Wgf2)01Vi1eNL*y(l4L9M^N zW2nJv{e0_EdVgTNajav$ef&Cqw-NdGyHM}feC8s6fPH~sBl3RRk%Ils(dzh8owj_R z>WfyY=%s1W_u0Qa^&6v?j6`7)=r$rdYi~Ub)6TQ)+OIh-_l`8qc8uo`uq7~RM2h*l z?Y8>S2LS{Suq}|(&zD(w&}zFc{SZLFzCg@~JbTm4|8nfp(h&g!5I_I{1Og_o-H23Q zINuVmwL-T}oqpdNyfX77bc?ev0tg_000IagfB*tM3N#s!s|O}l`nUq45hyFrW<;9b zP982>NWp>#6!m&6N;UskkYPR!$!pHs&GcR$S73Aq1rF-#=4br%+7Pbp%gPD$+Isy| z)|cT7MF0V-0>_QWtJZxJR-4ic0R#|0009ILKw!=Szl_M(vVjkCZcygLxb`pZIlZP# z8HYUzd{fUAsr#!umPf8EsrgrDMjk~j7=aK#009ILa7ZAg|KCmQ?_B3lWTIA3V9JPG z{CcUXf+H%@`kn4QlDq&ZEU6EOOEI-BV_3~$yV(9n>|z_+P&ol+DCjhL%&7G`(wI@|a|&q`Dx*~>j8f?c#9nOT z@%%HAaR|m-Z?W#R*83ITT$2}`j)uh+(1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72>km3FOy94nz!3^ z#P>yQN+Ek!)=rwcFZr?e_NB_hd(Vy&bi0 zza=}{d+n}v)b4H!TUSJb;gtckW4hdE?T?_1CC}XjSW=TvXIY@6m%F&i)L*Gp7DURXf z1IeG{FB`Zfw3N>7sN-bMt~j0DQpzqDisc&fW`WxW^aCvmCtTA{fQ@-zKLpC=kyCFj zIM!z$lPfN+O&R1thdvwmL;BEj@h+O2IulSX+V_rwSs{5l$WPk6o-N4}OG-P}(Z{|# z0sK&6ean=DumdPl6D;MDhOP`r(qXCdn6NmG*(@>I74L=n3}C0`o@Q}|EF1^0R^rS> zBA0uqe3sahQrSYX|@ zqhrn;deLH)hDM9MWzB}e_z=_z;A!gYc?>IyW> zdyjjL<~FgFbu5qpAWt66yW9Sb^5C_m(dj_{VprW^z-koiG>Z9fl*FA^}N6UK^aP>xJZ|j?SS9j`g){kXWck8(B)k%F@r}bSus{8f09@LY1SPcOJ1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly hK!5-N0t5&UAV7cs0RjXF5FkK+009C72>jmye*t2XCm#R+ literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab new file mode 100644 index 0000000000000000000000000000000000000000..65cfa61e89f6292c22eff3b9b48629bfad6fc532 GIT binary patch literal 65536 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 b1ww&PAQT7%LV-{q6bJ=Efl%PDRp9>tzPX1! literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..11ca7a41b038a01f289b82de55663dc9c2b376f7 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..c59a802042d39e4d864c05d6444f1490915782be GIT binary patch literal 8 McmZQz00CnM006E4bN~PV literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..8b704bc421781284a1b22aa53f94aa035acfc741 GIT binary patch literal 8 McmZQz0D;X800FK5^Z)<= literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.at b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..5e04b8e4fd0a8dd86beaa17f0d61e638f7b01719 GIT binary patch literal 11033 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 literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..be464ad444c81fa96235384c8f7bdba94471baa8 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i.len b/core-kotlin/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/core-kotlin/build/kotlin/compileKotlin/data-container-format-version.txt b/core-kotlin/build/kotlin/compileKotlin/data-container-format-version.txt new file mode 100644 index 0000000000..b01b80f991 --- /dev/null +++ b/core-kotlin/build/kotlin/compileKotlin/data-container-format-version.txt @@ -0,0 +1 @@ +2011001 \ No newline at end of file diff --git a/core-kotlin/build/kotlin/compileKotlin/format-version.txt b/core-kotlin/build/kotlin/compileKotlin/format-version.txt new file mode 100644 index 0000000000..2408adbb9f --- /dev/null +++ b/core-kotlin/build/kotlin/compileKotlin/format-version.txt @@ -0,0 +1 @@ +8011001 \ No newline at end of file diff --git a/core-kotlin/build/kotlin/compileKotlin/gradle-format-version.txt b/core-kotlin/build/kotlin/compileKotlin/gradle-format-version.txt new file mode 100644 index 0000000000..7289c6bdc4 --- /dev/null +++ b/core-kotlin/build/kotlin/compileKotlin/gradle-format-version.txt @@ -0,0 +1 @@ +4011001 \ No newline at end of file diff --git a/core-kotlin/build/kotlin/compileKotlin/last-build.bin b/core-kotlin/build/kotlin/compileKotlin/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..baf638a29b8c82e55dfbf2bbe5906ade6154ba63 GIT binary patch literal 81 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

<5G2M1WZP5 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