From 560f1ff34b2f76d536f033664a1c4130d0e433fa Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 6 Dec 2021 03:32:15 +0100 Subject: [PATCH] added ahCrawler and finished discovery endpoint --- mocks/.gitignore | 1 + mocks/auction-house/discoveryEndpoin2.js | 35 ++ mocks/auction-house/discoveryEndpoin3.js | 35 ++ mocks/auction-house/discoveryEndpoint.js | 35 ++ mocks/package.json | 5 + mocks/yarn.lock | 322 ++++++++++++++++++ .../tapas/TapasAuctionHouseApplication.java | 36 +- ...ctionHouseDiscoveryJsonRepresentation.java | 15 +- .../AuctionHouseDiscoveryWebController.java | 45 ++- .../web/AuctionHouseDiscoveryHttpAdapter.java | 4 +- .../port/in/AuctionHouseDiscoveryCommand.java | 40 --- .../port/in/AuctionHouseDiscoveryUseCase.java | 5 +- .../service/AuctionHouseDiscoveryService.java | 19 ++ .../domain/AuctionHouseDiscovery.java | 73 ++++ .../common/AuctionHouseResourceDirectory.java | 79 +++-- 15 files changed, 647 insertions(+), 102 deletions(-) create mode 100644 mocks/.gitignore create mode 100644 mocks/auction-house/discoveryEndpoin2.js create mode 100644 mocks/auction-house/discoveryEndpoin3.js create mode 100644 mocks/auction-house/discoveryEndpoint.js create mode 100644 mocks/package.json create mode 100644 mocks/yarn.lock delete mode 100644 tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/port/in/AuctionHouseDiscoveryCommand.java create mode 100644 tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/service/AuctionHouseDiscoveryService.java create mode 100644 tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java diff --git a/mocks/.gitignore b/mocks/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/mocks/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/mocks/auction-house/discoveryEndpoin2.js b/mocks/auction-house/discoveryEndpoin2.js new file mode 100644 index 0000000..c201942 --- /dev/null +++ b/mocks/auction-house/discoveryEndpoin2.js @@ -0,0 +1,35 @@ +// Require the framework and instantiate it +const fastify = require("fastify")({ logger: true }); + +// Declare a route +fastify.get("/discovery/", async (request, reply) => { + return { + auctionHouseInfo: [ + { + auctionHouseURI: "http://localhost:3501", + webSubURI: "http://example.org", + taskTypes: ["COMPUTATION", "RANDOMTEXT"], + timeStamp: "2021-12-24 12:00:00", + groupName: "Group3", + }, + { + auctionHouseURI: "http://localhost:3502", + webSubURI: "http://facemash.com", + taskTypes: ["BIGROBOT"], + timeStamp: "2021-12-24 12:00:00", + groupName: "Group2", + }, + ], + }; +}); + +// Run the server! +const start = async () => { + try { + await fastify.listen(3501); + } catch (err) { + fastify.log.error(err); + process.exit(1); + } +}; +start(); diff --git a/mocks/auction-house/discoveryEndpoin3.js b/mocks/auction-house/discoveryEndpoin3.js new file mode 100644 index 0000000..20ea367 --- /dev/null +++ b/mocks/auction-house/discoveryEndpoin3.js @@ -0,0 +1,35 @@ +// Require the framework and instantiate it +const fastify = require("fastify")({ logger: true }); + +// Declare a route +fastify.get("/discovery/", async (request, reply) => { + return { + auctionHouseInfo: [ + { + auctionHouseURI: "http://localhost:3502", + webSubURI: "http://example.org", + taskTypes: ["COMPUTATION", "RANDOMTEXT"], + timeStamp: "2021-12-24 12:00:00", + groupName: "Group3", + }, + { + auctionHouseURI: "http://localhost:3501", + webSubURI: "http://facemash.com", + taskTypes: ["BIGROBOT"], + timeStamp: "2021-12-26 12:00:00", + groupName: "GroupHAHAHA222", + }, + ], + }; +}); + +// Run the server! +const start = async () => { + try { + await fastify.listen(3502); + } catch (err) { + fastify.log.error(err); + process.exit(1); + } +}; +start(); diff --git a/mocks/auction-house/discoveryEndpoint.js b/mocks/auction-house/discoveryEndpoint.js new file mode 100644 index 0000000..c7c5b44 --- /dev/null +++ b/mocks/auction-house/discoveryEndpoint.js @@ -0,0 +1,35 @@ +// Require the framework and instantiate it +const fastify = require("fastify")({ logger: true }); + +// Declare a route +fastify.get("/discovery/", async (request, reply) => { + return { + auctionHouseInfo: [ + { + auctionHouseURI: "http://localhost:3500", + webSubURI: "http://example.org", + taskTypes: ["COMPUTATION", "RANDOMTEXT"], + timeStamp: "2021-12-24 12:00:00", + groupName: "Group3", + }, + { + auctionHouseURI: "http://localhost:3501", + webSubURI: "http://facemash.com", + taskTypes: ["BIGROBOT"], + timeStamp: "2021-12-24 12:00:00", + groupName: "Group2", + }, + ], + }; +}); + +// Run the server! +const start = async () => { + try { + await fastify.listen(3500); + } catch (err) { + fastify.log.error(err); + process.exit(1); + } +}; +start(); diff --git a/mocks/package.json b/mocks/package.json new file mode 100644 index 0000000..be8a94c --- /dev/null +++ b/mocks/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "fastify": "^3.24.1" + } +} diff --git a/mocks/yarn.lock b/mocks/yarn.lock new file mode 100644 index 0000000..8ba3100 --- /dev/null +++ b/mocks/yarn.lock @@ -0,0 +1,322 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@fastify/ajv-compiler@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz#5ce80b1fc8bebffc8c5ba428d5e392d0f9ed10a1" + integrity sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg== + dependencies: + ajv "^6.12.6" + +abstract-logging@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" + integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== + +ajv@^6.11.0, ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.1.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +avvio@^7.1.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/avvio/-/avvio-7.2.2.tgz#58e00e7968870026cd7b7d4f689d596db629e251" + integrity sha512-XW2CMCmZaCmCCsIaJaLKxAzPwF37fXi1KGxNOvedOpeisLdmxZnblGc3hpHWYnlP+KOUxZsazh43WXNHgXpbqw== + dependencies: + archy "^1.0.0" + debug "^4.0.0" + fastq "^1.6.1" + queue-microtask "^1.1.2" + +cookie@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +debug@^4.0.0: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-json-stringify@^2.5.2: + version "2.7.12" + resolved "https://registry.yarnpkg.com/fast-json-stringify/-/fast-json-stringify-2.7.12.tgz#5bb7941695b52f545191bc396396230633f43592" + integrity sha512-4hjwZDPmgj/ZUKXhEWovGPciE/5mWtAIQQxN+2VBDFun7DRTk2oOItbu9ZZp6kqj+eZ/u7z+dgBgM74cfGRnBQ== + dependencies: + ajv "^6.11.0" + deepmerge "^4.2.2" + rfdc "^1.2.0" + string-similarity "^4.0.1" + +fast-redact@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.2.tgz#c940ba7162dde3aeeefc522926ae8c5231412904" + integrity sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg== + +fast-safe-stringify@^2.0.8: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastify-error@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/fastify-error/-/fastify-error-0.3.1.tgz#8eb993e15e3cf57f0357fc452af9290f1c1278d2" + integrity sha512-oCfpcsDndgnDVgiI7bwFKAun2dO+4h84vBlkWsWnz/OUK9Reff5UFoFl241xTiLeHWX/vU9zkDVXqYUxjOwHcQ== + +fastify-warning@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/fastify-warning/-/fastify-warning-0.2.0.tgz#e717776026a4493dc9a2befa44db6d17f618008f" + integrity sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw== + +fastify@^3.24.1: + version "3.24.1" + resolved "https://registry.yarnpkg.com/fastify/-/fastify-3.24.1.tgz#979d34e096f40b7a90e90733efbbdae81623034e" + integrity sha512-ZL0V6u37d65tAY8lMwVMFtFvnEeJcG80QBNSdChqCm4i4x+is/38OU14gzJuRXhpenTL+pTJzNcu5Kn1ouzM3Q== + dependencies: + "@fastify/ajv-compiler" "^1.0.0" + abstract-logging "^2.0.0" + avvio "^7.1.2" + fast-json-stringify "^2.5.2" + fastify-error "^0.3.0" + fastify-warning "^0.2.0" + find-my-way "^4.1.0" + flatstr "^1.0.12" + light-my-request "^4.2.0" + pino "^6.13.0" + proxy-addr "^2.0.7" + rfdc "^1.1.4" + secure-json-parse "^2.0.0" + semver "^7.3.2" + tiny-lru "^7.0.0" + +fastq@^1.6.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +find-my-way@^4.1.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/find-my-way/-/find-my-way-4.4.0.tgz#e4a115031d1c5c538d028d06b666e2174462bc07" + integrity sha512-hpntHvK0iOHp3pqWRRUEzioar4tp8euBD8DkPG3VauOriZLgwGZLTNp6yZSrdctJ8RCDS7zhZSR2V+yOaBbNow== + dependencies: + fast-decode-uri-component "^1.0.1" + fast-deep-equal "^3.1.3" + safe-regex2 "^2.0.0" + semver-store "^0.3.0" + +flatstr@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" + integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +light-my-request@^4.2.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-4.7.0.tgz#5bacd17fa0eaf96fe5eed1682c5e0d361953cf46" + integrity sha512-LTa8YZp3K2AUpqUnwwKajoIHcsKOBnzwJNQSrk7unziPwo6CjOYjyO0F9wfkxFvP+nBsCGe3eMPnedVgIIgdAw== + dependencies: + ajv "^8.1.0" + cookie "^0.4.0" + fastify-warning "^0.2.0" + set-cookie-parser "^2.4.1" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +pino-std-serializers@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" + integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== + +pino@^6.13.0: + version "6.13.3" + resolved "https://registry.yarnpkg.com/pino/-/pino-6.13.3.tgz#60b93bcda1541f92fb37b3f2be0a25cf1d05b6fe" + integrity sha512-tJy6qVgkh9MwNgqX1/oYi3ehfl2Y9H0uHyEEMsBe74KinESIjdMrMQDWpcZPpPicg3VV35d/GLQZmo4QgU2Xkg== + dependencies: + fast-redact "^3.0.0" + fast-safe-stringify "^2.0.8" + fastify-warning "^0.2.0" + flatstr "^1.0.12" + pino-std-serializers "^3.1.0" + quick-format-unescaped "^4.0.3" + sonic-boom "^1.0.2" + +proxy-addr@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +queue-microtask@^1.1.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +ret@~0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" + integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.1.4, rfdc@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +safe-regex2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/safe-regex2/-/safe-regex2-2.0.0.tgz#b287524c397c7a2994470367e0185e1916b1f5b9" + integrity sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== + dependencies: + ret "~0.2.0" + +secure-json-parse@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.4.0.tgz#5aaeaaef85c7a417f76271a4f5b0cc3315ddca85" + integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg== + +semver-store@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/semver-store/-/semver-store-0.3.0.tgz#ce602ff07df37080ec9f4fb40b29576547befbe9" + integrity sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg== + +semver@^7.3.2: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +set-cookie-parser@^2.4.1: + version "2.4.8" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz#d0da0ed388bc8f24e706a391f9c9e252a13c58b2" + integrity sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg== + +sonic-boom@^1.0.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" + integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== + dependencies: + atomic-sleep "^1.0.0" + flatstr "^1.0.12" + +string-similarity@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" + integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== + +tiny-lru@^7.0.0: + version "7.0.6" + resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-7.0.6.tgz#b0c3cdede1e5882aa2d1ae21cb2ceccf2a331f24" + integrity sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java index ee66761..6aa001d 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java @@ -2,6 +2,7 @@ package ch.unisg.tapas; import ch.unisg.tapas.auctionhouse.adapter.common.clients.TapasMqttClient; import ch.unisg.tapas.auctionhouse.adapter.in.messaging.mqtt.AuctionEventsMqttDispatcher; +import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscovery; import ch.unisg.tapas.auctionhouse.adapter.common.clients.WebSubSubscriber; import ch.unisg.tapas.common.AuctionHouseResourceDirectory; import ch.unisg.tapas.common.ConfigProperties; @@ -16,6 +17,9 @@ import org.springframework.core.env.ConfigurableEnvironment; import java.net.URI; import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * Main TAPAS Auction House application. @@ -24,7 +28,7 @@ import java.util.List; public class TapasAuctionHouseApplication { private static final Logger LOGGER = LogManager.getLogger(TapasAuctionHouseApplication.class); - public static String RESOURCE_DIRECTORY = "https://api.interactions.ics.unisg.ch/auction-houses/"; + public static String RESOURCE_DIRECTORY = "http://localhost:3500"; public static String DEFAULT_MQTT_BROKER = "tcp://broker.hivemq.com:1883"; private static ConfigurableEnvironment ENVIRONMENT; @@ -36,20 +40,23 @@ public class TapasAuctionHouseApplication { // TODO Set start up of message services with config // We will use these bootstrap methods in Week 6: - // bootstrapMarketplaceWithWebSub(); + bootstrapMarketplaceWithWebSub(); bootstrapMarketplaceWithMqtt(); + + ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + executor.scheduleAtFixedRate(crawlerRunnable, 30, 30, TimeUnit.SECONDS); } /** * Discovers auction houses and subscribes to WebSub notifications */ private static void bootstrapMarketplaceWithWebSub() { - List auctionHouseEndpoints = discoverAuctionHouseEndpoints(); + discoverAuctionHouseEndpoints(); - WebSubSubscriber subscriber = new WebSubSubscriber(); + // WebSubSubscriber subscriber = new WebSubSubscriber(); - for (String endpoint : auctionHouseEndpoints) { - subscriber.subscribeToAuctionHouseEndpoint(URI.create(endpoint)); - } + // for (String endpoint : auctionHouseEndpoints) { + // subscriber.subscribeToAuctionHouseEndpoint(URI.create(endpoint)); + // } } /** @@ -74,11 +81,22 @@ public class TapasAuctionHouseApplication { } } - private static List discoverAuctionHouseEndpoints() { + private static void discoverAuctionHouseEndpoints() { AuctionHouseResourceDirectory rd = new AuctionHouseResourceDirectory( URI.create(RESOURCE_DIRECTORY) ); - return rd.retrieveAuctionHouseEndpoints(); + AuctionHouseDiscovery.getInstance().addAuctionHouseDiscoveryInformation(rd.retrieveAuctionHouseEndpoints()); } + + + private static Runnable crawlerRunnable = new Runnable() { + public void run() { + AuctionHouseResourceDirectory rd = new AuctionHouseResourceDirectory( + URI.create(RESOURCE_DIRECTORY) + ); + + AuctionHouseDiscovery.getInstance().addAuctionHouseDiscoveryInformation(rd.retrieveAuctionHouseEndpoints()); + } + }; } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/common/formats/AuctionHouseDiscoveryJsonRepresentation.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/common/formats/AuctionHouseDiscoveryJsonRepresentation.java index e417246..6daee90 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/common/formats/AuctionHouseDiscoveryJsonRepresentation.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/common/formats/AuctionHouseDiscoveryJsonRepresentation.java @@ -1,6 +1,9 @@ package ch.unisg.tapas.auctionhouse.adapter.common.formats; import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscoveryInformation; + +import java.util.List; + import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -8,7 +11,7 @@ import lombok.Getter; import lombok.Setter; public class AuctionHouseDiscoveryJsonRepresentation { - public static final String MEDIA_TYPE = "application/auctionhousediscovery + json"; + public static final String MEDIA_TYPE = "application/auctionhousediscovery+json"; @Getter @Setter private String auctionHouseUri; @@ -17,7 +20,7 @@ public class AuctionHouseDiscoveryJsonRepresentation { private String webSubUri; @Getter @Setter - private String taskTypes; + private List taskTypes; @Getter @Setter private String timeStamp; @@ -28,10 +31,10 @@ public class AuctionHouseDiscoveryJsonRepresentation { public AuctionHouseDiscoveryJsonRepresentation() {} public AuctionHouseDiscoveryJsonRepresentation(AuctionHouseDiscoveryInformation auctionHouseDiscoveryInformation){ - this.auctionHouseUri = auctionHouseDiscoveryInformation.getAuctionHouseUri().getValue(); - this.webSubUri = auctionHouseDiscoveryInformation.getWebSubUri().getValue(); - this.taskTypes = auctionHouseDiscoveryInformation.getTaskTypes().toString(); - this.timeStamp = auctionHouseDiscoveryInformation.getTimeStamp().getValue(); + this.auctionHouseUri = auctionHouseDiscoveryInformation.getAuctionHouseUri().getValue().toString(); + this.webSubUri = auctionHouseDiscoveryInformation.getWebSubUri().getValue().toString(); + this.taskTypes = auctionHouseDiscoveryInformation.getTaskTypes().getValue(); + this.timeStamp = auctionHouseDiscoveryInformation.getTimeStamp().getValue().toString(); this.groupName = auctionHouseDiscoveryInformation.getGroupName().getValue(); } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/web/AuctionHouseDiscoveryWebController.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/web/AuctionHouseDiscoveryWebController.java index cd766d1..22fbb09 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/web/AuctionHouseDiscoveryWebController.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/web/AuctionHouseDiscoveryWebController.java @@ -2,17 +2,21 @@ package ch.unisg.tapas.auctionhouse.adapter.in.web; import ch.unisg.tapas.auctionhouse.adapter.common.formats.AuctionHouseDiscoveryJsonRepresentation; import ch.unisg.tapas.auctionhouse.application.port.in.AuctionHouseDiscoveryUseCase; -import ch.unisg.tapas.auctionhouse.application.port.in.AuctionHouseDiscoveryCommand; import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscoveryInformation; + +import java.util.List; + import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.server.ResponseStatusException; - /** * Controller that handles HTTP requests for the auction house discovery. This controller implements @@ -27,30 +31,21 @@ public class AuctionHouseDiscoveryWebController { } @GetMapping(path="/discovery/", consumes = AuctionHouseDiscoveryJsonRepresentation.MEDIA_TYPE) - public ResponseEntity auctionHouseDiscovery(@RequestBody AuctionHouseDiscoveryJsonRepresentation payload) { - AuctionHouseDiscoveryInformation.GroupName groupName = (payload.getGroupName() == null) ? - null : new AuctionHouseDiscoveryInformation.GroupName(payload.getGroupName()); + public ResponseEntity auctionHouseDiscovery() { + List auctionHouseDiscoveryInformation = auctionHouseDiscoveryUseCase.auctionHouseDiscovery(); - AuctionHouseDiscoveryCommand command = new AuctionHouseDiscoveryCommand( - new AuctionHouseDiscoveryInformation.AuctionHouseUri(payload.getAuctionHouseUri()), - new AuctionHouseDiscoveryInformation.WebSubUri(payload.getAuctionHouseUri()), - new AuctionHouseDiscoveryInformation.TaskTypes(payload.getTaskTypes()), - new AuctionHouseDiscoveryInformation.TimeStamp(payload.getTimeStamp()), - groupName - ); + ObjectMapper mapper = new ObjectMapper(); + ObjectNode response = mapper.createObjectNode(); + ArrayNode array = response.putArray("auctionHouseInfo"); - AuctionHouseDiscoveryInformation auctionHouseDiscoveryInformation = auctionHouseDiscoveryUseCase.auctionHouseDiscovery(command); - try { - AuctionHouseDiscoveryJsonRepresentation representation = new AuctionHouseDiscoveryJsonRepresentation(auctionHouseDiscoveryInformation); - String auctionHouseDiscoveryJson = AuctionHouseDiscoveryJsonRepresentation.serialize(auctionHouseDiscoveryInformation); - - HttpHeaders responseHeaders = new HttpHeaders(); - responseHeaders.add(HttpHeaders.CONTENT_TYPE, AuctionHouseDiscoveryJsonRepresentation.MEDIA_TYPE); - - return new ResponseEntity<>(auctionHouseDiscoveryJson, responseHeaders, HttpStatus.OK); - } catch (JsonProcessingException e) { - throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR); + for (AuctionHouseDiscoveryInformation info : auctionHouseDiscoveryInformation) { + array.add(mapper.valueToTree(new AuctionHouseDiscoveryJsonRepresentation(info))); } + + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.add(HttpHeaders.CONTENT_TYPE, AuctionHouseDiscoveryJsonRepresentation.MEDIA_TYPE); + + return new ResponseEntity<>(response.toString(), responseHeaders, HttpStatus.OK); } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java index f026127..e37c989 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java @@ -13,7 +13,6 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.sql.Timestamp; -import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -22,6 +21,9 @@ public class AuctionHouseDiscoveryHttpAdapter implements AuctionHouseDiscoveryPo private static final Logger LOGGER = LogManager.getLogger(AuctionHouseDiscoveryHttpAdapter.class); public List fetchAuctionHouseInformation(URI auctionHouseURI){ + + System.out.println(auctionHouseURI); + try{ var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/port/in/AuctionHouseDiscoveryCommand.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/port/in/AuctionHouseDiscoveryCommand.java deleted file mode 100644 index a2cd62b..0000000 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/port/in/AuctionHouseDiscoveryCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package ch.unisg.tapas.auctionhouse.application.port.in; - -import ch.unisg.tapas.auctionhouse.domain.Auction; -import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscoveryInformation; -import ch.unisg.tapas.common.SelfValidating; -import lombok.Value; - -import javax.validation.constraints.NotNull; - -@Value -public class AuctionHouseDiscoveryCommand extends SelfValidating { - @NotNull - private final AuctionHouseDiscoveryInformation.AuctionHouseUri auctionHouseUri; - - @NotNull - private final AuctionHouseDiscoveryInformation.WebSubUri webSubUri; - - @NotNull - private final AuctionHouseDiscoveryInformation.TaskTypes taskTypes; - - @NotNull - private final AuctionHouseDiscoveryInformation.TimeStamp timeStamp; - - //Didn't put @NotNull here since the GroupName is not required - private final AuctionHouseDiscoveryInformation.GroupName groupName; - - public AuctionHouseDiscoveryCommand(AuctionHouseDiscoveryInformation.AuctionHouseUri auctionHouseUri, - AuctionHouseDiscoveryInformation.WebSubUri webSubUri, - AuctionHouseDiscoveryInformation.TaskTypes taskTypes, - AuctionHouseDiscoveryInformation.TimeStamp timeStamp, - AuctionHouseDiscoveryInformation.GroupName groupName) { - this.auctionHouseUri = auctionHouseUri; - this.webSubUri = webSubUri; - this.taskTypes = taskTypes; - this.timeStamp = timeStamp; - this.groupName = groupName; - - this.validateSelf(); - } -} diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/port/in/AuctionHouseDiscoveryUseCase.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/port/in/AuctionHouseDiscoveryUseCase.java index f148f17..c90b54b 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/port/in/AuctionHouseDiscoveryUseCase.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/port/in/AuctionHouseDiscoveryUseCase.java @@ -1,8 +1,9 @@ package ch.unisg.tapas.auctionhouse.application.port.in; +import java.util.List; + import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscoveryInformation; public interface AuctionHouseDiscoveryUseCase { - - AuctionHouseDiscoveryInformation auctionHouseDiscovery(AuctionHouseDiscoveryCommand command); + List auctionHouseDiscovery(); } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/service/AuctionHouseDiscoveryService.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/service/AuctionHouseDiscoveryService.java new file mode 100644 index 0000000..5fb2c94 --- /dev/null +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/service/AuctionHouseDiscoveryService.java @@ -0,0 +1,19 @@ +package ch.unisg.tapas.auctionhouse.application.service; + +import java.util.List; + +import org.springframework.stereotype.Component; + +import ch.unisg.tapas.auctionhouse.application.port.in.AuctionHouseDiscoveryUseCase; +import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscovery; +import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscoveryInformation; + +@Component +public class AuctionHouseDiscoveryService implements AuctionHouseDiscoveryUseCase { + + @Override + public List auctionHouseDiscovery() { + return AuctionHouseDiscovery.getInstance().getAuctionHouseDiscoveryList(); + } + +} diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java new file mode 100644 index 0000000..5088ff1 --- /dev/null +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java @@ -0,0 +1,73 @@ +package ch.unisg.tapas.auctionhouse.domain; + +import java.net.URI; +import java.net.URISyntaxException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import lombok.Getter; + +public class AuctionHouseDiscovery { + + private static final AuctionHouseDiscovery auctionHouseDiscovery = new AuctionHouseDiscovery(); + + private final List tasktypes = new ArrayList() { + { + add("computation"); + add("smallrobot"); + } + }; + + @Getter + private List auctionHouseDiscoveryList = new ArrayList<>() { + }; + + private AuctionHouseDiscovery() { + try { + // Add our information to list + auctionHouseDiscoveryList.add(new AuctionHouseDiscoveryInformation( + new AuctionHouseDiscoveryInformation.AuctionHouseUri(new URI("http://localhost:8086")), + new AuctionHouseDiscoveryInformation.WebSubUri(new URI("http://localhost:8086/websub")), + new AuctionHouseDiscoveryInformation.TaskTypes(tasktypes), + new AuctionHouseDiscoveryInformation.TimeStamp(new Timestamp(new Date().getTime())), + new AuctionHouseDiscoveryInformation.GroupName("Group 1") + )); + } catch (URISyntaxException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public static AuctionHouseDiscovery getInstance() { + return auctionHouseDiscovery; + } + + public List getAuctionHouseDiscoveryInformation() { + return auctionHouseDiscoveryList; + } + + public void addAuctionHouseDiscoveryInformation(List informations) { + + outerloop: + for (AuctionHouseDiscoveryInformation discovery : informations) { + for (AuctionHouseDiscoveryInformation endpoint : auctionHouseDiscoveryList) { + // Check if discovery is already in our discovery list + if (endpoint.getAuctionHouseUri().getValue().toString().equals(discovery.getAuctionHouseUri().getValue().toString())) { + // Check if the new discovery is more recent than the current + if (endpoint.getTimeStamp().getValue().before(discovery.getTimeStamp().getValue())) { + // Endpoint information is older. Remove and add the new discovery to the list + auctionHouseDiscoveryList.remove(endpoint); + break; + } else { + continue outerloop; + } + } + } + auctionHouseDiscoveryList.add(discovery); + } + + } + +} diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/common/AuctionHouseResourceDirectory.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/common/AuctionHouseResourceDirectory.java index c4809ef..e44690f 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/common/AuctionHouseResourceDirectory.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/common/AuctionHouseResourceDirectory.java @@ -3,8 +3,13 @@ package ch.unisg.tapas.common; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import ch.unisg.tapas.auctionhouse.adapter.out.web.AuctionHouseDiscoveryHttpAdapter; +import ch.unisg.tapas.auctionhouse.application.port.out.AuctionHouseDiscoveryPort; +import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscoveryInformation; + import java.io.IOException; import java.net.URI; +import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; @@ -26,32 +31,68 @@ public class AuctionHouseResourceDirectory { this.rdEndpoint = rdEndpoint; } + private AuctionHouseDiscoveryPort auctionHouseDiscoveryport = new AuctionHouseDiscoveryHttpAdapter(); + + private List auctionHouseEndpoints = new ArrayList<>(); + + // List to keep track of already fetched endpoints + private List fetchedEndpoints = new ArrayList<>(); + /** * Retrieves the endpoints of all auctions houses registered with this directory. * @return */ - public List retrieveAuctionHouseEndpoints() { - List auctionHouseEndpoints = new ArrayList<>(); + public List retrieveAuctionHouseEndpoints() { - try { - HttpRequest request = HttpRequest.newBuilder() - .uri(rdEndpoint).GET().build(); + fetchedEndpoints.clear(); + auctionHouseEndpoints.clear(); - HttpResponse response = HttpClient.newBuilder().build() - .send(request, HttpResponse.BodyHandlers.ofString()); - - // For simplicity, here we just hard code the current representation used by our - // resource directory for auction houses - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode payload = objectMapper.readTree(response.body()); - - for (JsonNode node : payload) { - auctionHouseEndpoints.add(node.get("endpoint").asText()); - } - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } + fetchedEndpoints.add(rdEndpoint); + // Start recusive fetching of auctionhouses + fetchEndpoints(getInformation(rdEndpoint)); return auctionHouseEndpoints; } + + // Recursive function to fetch all endpoints + private void fetchEndpoints(List auctionHouses) { + + for (AuctionHouseDiscoveryInformation ah : auctionHouses) { + if (!fetchedEndpoints.contains(ah.getAuctionHouseUri().getValue())) { + fetchedEndpoints.add(ah.getAuctionHouseUri().getValue()); + fetchEndpoints(getInformation(ah.getAuctionHouseUri().getValue())); + } + } + + } + + private List getInformation(URI uri) { + List discoveries; + try { + discoveries = auctionHouseDiscoveryport.fetchAuctionHouseInformation(new URI(uri.toString() + "/discovery/")); + outerloop: + for (AuctionHouseDiscoveryInformation discovery : discoveries) { + for (AuctionHouseDiscoveryInformation endpoint : auctionHouseEndpoints) { + // Check if discovery is already in our endpoint list + if (endpoint.getAuctionHouseUri().getValue().toString().equals(discovery.getAuctionHouseUri().getValue().toString())) { + // Check if the new discovery is more recent than the current + if (endpoint.getTimeStamp().getValue().before(discovery.getTimeStamp().getValue())) { + // Endpoint information is older. Remove and add the new discovery to the list + auctionHouseEndpoints.remove(endpoint); + break; + } else { + continue outerloop; + } + } + } + auctionHouseEndpoints.add(discovery); + } + return discoveries; + } catch (URISyntaxException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + // When an error happens return empty list + return new ArrayList(); + } }