diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4a01c9476f..b40eabe9f2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -6483,9 +6483,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -6495,7 +6495,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -7131,9 +7131,9 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -7318,9 +7318,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8303,9 +8303,9 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -9330,36 +9330,36 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -9368,6 +9368,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -9542,12 +9546,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -13844,9 +13848,12 @@ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -14133,9 +14140,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -14647,9 +14654,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -16365,11 +16372,11 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -17956,9 +17963,9 @@ } }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "bin": { "rollup": "dist/bin/rollup" }, @@ -18259,9 +18266,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -18294,6 +18301,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -18378,14 +18393,14 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -25861,9 +25876,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -25873,7 +25888,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -26344,9 +26359,9 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" }, "cookie-signature": { "version": "1.0.6", @@ -26470,9 +26485,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -27157,9 +27172,9 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" }, "enhanced-resolve": { "version": "5.17.1", @@ -27908,36 +27923,36 @@ } }, "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -28089,12 +28104,12 @@ } }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -31157,9 +31172,9 @@ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" }, "merge-stream": { "version": "2.0.0", @@ -31355,9 +31370,9 @@ } }, "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" }, "natural-compare": { "version": "1.4.0", @@ -31715,9 +31730,9 @@ } }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "path-type": { "version": "4.0.0", @@ -32737,11 +32752,11 @@ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "querystringify": { @@ -33823,9 +33838,9 @@ } }, "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "requires": { "fsevents": "~2.3.2" } @@ -34014,9 +34029,9 @@ } }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "requires": { "debug": "2.6.9", "depd": "2.0.0", @@ -34048,6 +34063,11 @@ } } }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -34124,14 +34144,14 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" } }, "set-function-length": { diff --git a/frontend/src/FrontDesk.jsx b/frontend/src/FrontDesk.jsx index 828b832dd9..b08fefd8bc 100644 --- a/frontend/src/FrontDesk.jsx +++ b/frontend/src/FrontDesk.jsx @@ -15,8 +15,10 @@ import { sessionCountdownTime, } from "./constants/sessionWarning"; import useGetSiteSettings from "./models/useGetSiteSettings"; +import useDocumentTitle from "./hooks/useDocumentTitle"; export default function FrontDesk() { + useDocumentTitle(); const [isLoggedIn, setIsLoggedIn] = useState(false); const [collaborationTitle, setCollaborationTitle] = useState(); const [collaborationData, setCollaborationData] = useState([]); diff --git a/frontend/src/hooks/useDocumentTitle.js b/frontend/src/hooks/useDocumentTitle.js index b1a2192f8c..a11c8e8053 100644 --- a/frontend/src/hooks/useDocumentTitle.js +++ b/frontend/src/hooks/useDocumentTitle.js @@ -3,10 +3,36 @@ import useGetSiteSettings from "../models/useGetSiteSettings"; export default function useDocumentTitle() { const { data: siteSettings } = useGetSiteSettings(); + document.title = siteSettings?.siteName || "wildbook"; useEffect(() => { + if (!siteSettings) return; let iconURL = siteSettings?.siteFavicon; let link = document.querySelector("link[rel*='icon']"); + const metaDescription = document.querySelector("meta[name='description']"); + const metaKeywords = document.querySelector("meta[name='keywords']"); + const metaAuthor = document.querySelector("meta[name='author']"); + + if (!metaDescription) { + const meta = document.createElement("meta"); + meta.name = "description"; + meta.content = siteSettings?.siteDescription; + document.getElementsByTagName("head")[0].appendChild(meta); + } + + if (!metaKeywords) { + const meta = document.createElement("meta"); + meta.name = "keywords"; + meta.content = siteSettings?.siteKeywords; + document.getElementsByTagName("head")[0].appendChild(meta); + } + + if (!metaAuthor) { + const meta = document.createElement("meta"); + meta.name = "author"; + meta.content = siteSettings?.siteAuthor; + document.getElementsByTagName("head")[0].appendChild(meta); + } if (link) { link.href = iconURL; diff --git a/pom.xml b/pom.xml index 0b38baacda..b25fdff89a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.ecocean wildbook - 10.5.2 + 10.5.3 war diff --git a/src/main/java/org/ecocean/Base.java b/src/main/java/org/ecocean/Base.java index ff94170d5d..8313503d1c 100644 --- a/src/main/java/org/ecocean/Base.java +++ b/src/main/java/org/ecocean/Base.java @@ -106,9 +106,12 @@ public JSONObject opensearchMapping() { public void opensearchIndex() throws IOException { + long startT = System.currentTimeMillis(); OpenSearch opensearch = new OpenSearch(); opensearch.index(this.opensearchIndexName(), this); + long endT = System.currentTimeMillis(); + System.out.println("opensearchIndex(): " + (endT - startT) + "ms indexing " + this); } // this will index "related" objects as needed diff --git a/src/main/java/org/ecocean/Encounter.java b/src/main/java/org/ecocean/Encounter.java index 584e9d70cf..16a2aa8b45 100644 --- a/src/main/java/org/ecocean/Encounter.java +++ b/src/main/java/org/ecocean/Encounter.java @@ -4705,35 +4705,4 @@ public void sendCreationEmails(Shepherd myShepherd, String langCode) { } } - public void opensearchIndexDeep() - throws IOException { - final String encId = this.getId(); - final Encounter origEnc = this; - ExecutorService executor = Executors.newFixedThreadPool(4); - Runnable rn = new Runnable() { - public void run() { - Shepherd bgShepherd = new Shepherd("context0"); - bgShepherd.setAction("Encounter.opensearchIndexDeep_" + encId); - bgShepherd.beginDBTransaction(); - try { - Encounter enc = bgShepherd.getEncounter(encId); - if (enc == null) { - // we use origEnc if we can (especially necessary on initial creation of Encounter) - if (origEnc != null) origEnc.opensearchIndex(); - bgShepherd.rollbackAndClose(); - executor.shutdown(); - return; - } - enc.opensearchIndex(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - bgShepherd.rollbackAndClose(); - } - executor.shutdown(); - } - }; - - executor.execute(rn); - } } diff --git a/src/main/java/org/ecocean/EncounterQueryProcessor.java b/src/main/java/org/ecocean/EncounterQueryProcessor.java index 5b020bd3b2..a1ed1a38ba 100644 --- a/src/main/java/org/ecocean/EncounterQueryProcessor.java +++ b/src/main/java/org/ecocean/EncounterQueryProcessor.java @@ -48,218 +48,153 @@ public static String queryStringBuilder(HttpServletRequest request, StringBuffer context = ServletUtilities.getContext(request); Shepherd myShepherd = new Shepherd(context); myShepherd.setAction("EncounterQueryProcessor.class"); - - String searchQueryId = request.getParameter("searchQueryId"); - // hack to build a ridiculous query string from an OpenSearch query - if (searchQueryId != null) { - String failed = filter + " 1 == 0"; - List encIds = new ArrayList(); - User user = myShepherd.getUser(request); - if (user == null) return failed; - JSONObject searchQuery = OpenSearch.queryLoad(searchQueryId); - if (searchQuery == null) return failed; - String indexName = searchQuery.optString("indexName", null); - if (indexName == null) return failed; - searchQuery = OpenSearch.queryScrubStored(searchQuery); - JSONObject sanitized = null; - try { - sanitized = OpenSearch.querySanitize(searchQuery, user, myShepherd); - } catch (IOException ex) { - ex.printStackTrace(); - // this should be unlikely, so fail hard - throw new RuntimeException("query failed"); - } - OpenSearch os = new OpenSearch(); - String sort = request.getParameter("sort"); - String sortOrder = request.getParameter("sortOrder"); - int numFrom = 0; - // for historical code reasons, this needs to be "all" encounters, - // so we hope this does the job if background indexing set correctly - int pageSize = 10000; - try { - pageSize = os.getSettings(indexName).optInt("max_result_window", 10000); - } catch (Exception ex) {} - try { - os.deletePit(indexName); - JSONObject queryRes = os.queryPit(indexName, sanitized, numFrom, pageSize, sort, - sortOrder); - JSONObject outerHits = queryRes.optJSONObject("hits"); - if (outerHits == null) { - System.out.println("could not find (outer) hits"); - return failed; - } - JSONArray hits = outerHits.optJSONArray("hits"); - if (hits == null) { - System.out.println("could not find hits"); - return failed; + myShepherd.beginDBTransaction(); + // wrap all myShepherd use in try/catch block + try { + String searchQueryId = request.getParameter("searchQueryId"); + // hack to build a ridiculous query string from an OpenSearch query + if (searchQueryId != null) { + String failed = filter + " 1 == 0"; + List encIds = new ArrayList(); + User user = myShepherd.getUser(request); + if (user == null) return failed; + JSONObject searchQuery = OpenSearch.queryLoad(searchQueryId); + if (searchQuery == null) return failed; + String indexName = searchQuery.optString("indexName", null); + if (indexName == null) return failed; + searchQuery = OpenSearch.queryScrubStored(searchQuery); + JSONObject sanitized = null; + try { + sanitized = OpenSearch.querySanitize(searchQuery, user, myShepherd); + } catch (IOException ex) { + ex.printStackTrace(); + // this should be unlikely, so fail hard + throw new RuntimeException("query failed"); } - for (int i = 0; i < hits.length(); i++) { - JSONObject h = hits.optJSONObject(i); - if (h == null) { - System.out.println("failed to parse hits[" + i + "]"); + OpenSearch os = new OpenSearch(); + String sort = request.getParameter("sort"); + String sortOrder = request.getParameter("sortOrder"); + int numFrom = 0; + // for historical code reasons, this needs to be "all" encounters, + // so we hope this does the job if background indexing set correctly + int pageSize = 10000; + try { + pageSize = os.getSettings(indexName).optInt("max_result_window", 10000); + } catch (Exception ex) {} + try { + os.deletePit(indexName); + JSONObject queryRes = os.queryPit(indexName, sanitized, numFrom, pageSize, sort, + sortOrder); + JSONObject outerHits = queryRes.optJSONObject("hits"); + if (outerHits == null) { + System.out.println("could not find (outer) hits"); return failed; } - String hId = h.optString("_id", null); - if (hId == null) { - System.out.println("failed to parse _id from hits[" + i + "]"); + JSONArray hits = outerHits.optJSONArray("hits"); + if (hits == null) { + System.out.println("could not find hits"); return failed; } - // Encounter enc = myShepherd.getEncounter(hId); - boolean hasAccess = Encounter.opensearchAccess(h.optJSONObject("_source"), user, - myShepherd); - if (hasAccess) encIds.add(hId); - } - } catch (Exception ex) { - ex.printStackTrace(); - return failed; - } - filter += " (catalogNumber == \"" + String.join("\") || (catalogNumber == \"", - encIds) + "\")"; - System.out.println("queryStringBuilder: searchQueryId=" + searchQueryId + " yielded " + - encIds.size() + " matching encounters"); - return filter; - } - // filter for location------------------------------------------ - if ((request.getParameter("locationField") != null) && - (!request.getParameter("locationField").equals(""))) { - String locString = request.getParameter("locationField").toLowerCase().replaceAll("%20", - " ").trim(); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "(verbatimLocality.toLowerCase().indexOf('" + locString + "') != -1)"; - } else { - filter += " && (verbatimLocality.toLowerCase().indexOf('" + locString + "') != -1)"; - } - prettyPrint.append("locationField contains \"" + locString + "\".
"); - } - // end location filter-------------------------------------------------------------------------------------- - // filter for organization------------------- - if ((request.getParameter("organizationId") != null) && - (!request.getParameter("organizationId").equals("")) && - Util.isUUID(request.getParameter("organizationId"))) { - String orgId = request.getParameter("organizationId"); - filter = - "SELECT FROM org.ecocean.Encounter WHERE user.username == this.submitterID && org.members.contains(user) && org.id == '" - + orgId + "'"; - String variables_statement = - " VARIABLES org.ecocean.User user; org.ecocean.Organization org"; - jdoqlVariableDeclaration = addOrgVars(variables_statement, filter); - } else {} - // end filter for organization------------------ - // filter for projectName------------------- - if (Util.isUUID(request.getParameter("projectId"))) { - filter = SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE + - " proj.encounters.contains(this) && "; - String[] projectIds = request.getParameterValues("projectId"); - if ((projectIds != null) && (!projectIds[0].equals("None"))) { - prettyPrint.append("Assigned to one of the following projects: "); - int numProjIds = projectIds.length; - String projIdFilter = "("; - for (int i = 0; i < numProjIds; i++) { - String currentProjId = projectIds[i].toLowerCase().replaceAll("%20", - " ").trim(); - if (!currentProjId.equals("")) { - if (projIdFilter.equals("(")) { - projIdFilter += " proj.id == \"" + currentProjId + "\""; - } else { - projIdFilter += " || proj.id == \"" + currentProjId + "\""; + for (int i = 0; i < hits.length(); i++) { + JSONObject h = hits.optJSONObject(i); + if (h == null) { + System.out.println("failed to parse hits[" + i + "]"); + return failed; } + String hId = h.optString("_id", null); + if (hId == null) { + System.out.println("failed to parse _id from hits[" + i + "]"); + return failed; + } + // Encounter enc = myShepherd.getEncounter(hId); + boolean hasAccess = Encounter.opensearchAccess(h.optJSONObject("_source"), + user, myShepherd); + if (hasAccess) encIds.add(hId); } + } catch (Exception ex) { + ex.printStackTrace(); + return failed; } - projIdFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE + - " proj.encounters.contains(this) && ")) { - filter += projIdFilter; + filter += " (catalogNumber == \"" + String.join("\") || (catalogNumber == \"", + encIds) + "\")"; + System.out.println("queryStringBuilder: searchQueryId=" + searchQueryId + + " yielded " + encIds.size() + " matching encounters"); + return filter; + } + // filter for location------------------------------------------ + if ((request.getParameter("locationField") != null) && + (!request.getParameter("locationField").equals(""))) { + String locString = request.getParameter("locationField").toLowerCase().replaceAll( + "%20", " ").trim(); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "(verbatimLocality.toLowerCase().indexOf('" + locString + "') != -1)"; } else { - filter += (" && " + projIdFilter); + filter += " && (verbatimLocality.toLowerCase().indexOf('" + locString + + "') != -1)"; } - prettyPrint.append(filter); - prettyPrint.append("
"); - } - String variables_statement = " VARIABLES org.ecocean.Project proj"; - jdoqlVariableDeclaration = addOrgVars(variables_statement, filter); - } else {} - // end filter for projectName------------------ - // username filters------------------------------------------------- - String[] usernames = request.getParameterValues("username"); - if ((usernames != null) && (!usernames[0].equals("None"))) { - prettyPrint.append("Assigned to one of the following usernames: "); - int kwLength = usernames.length; - String locIDFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = usernames[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (locIDFilter.equals("(")) { - locIDFilter += " submitterID == \"" + kwParam + "\""; - } else { - locIDFilter += " || submitterID == \"" + kwParam + "\""; + prettyPrint.append("locationField contains \"" + locString + "\".
"); + } + // end location filter-------------------------------------------------------------------------------------- + // filter for organization------------------- + if ((request.getParameter("organizationId") != null) && + (!request.getParameter("organizationId").equals("")) && + Util.isUUID(request.getParameter("organizationId"))) { + String orgId = request.getParameter("organizationId"); + filter = + "SELECT FROM org.ecocean.Encounter WHERE user.username == this.submitterID && org.members.contains(user) && org.id == '" + + orgId + "'"; + String variables_statement = + " VARIABLES org.ecocean.User user; org.ecocean.Organization org"; + jdoqlVariableDeclaration = addOrgVars(variables_statement, filter); + } else {} + // end filter for organization------------------ + // filter for projectName------------------- + if (Util.isUUID(request.getParameter("projectId"))) { + filter = SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE + + " proj.encounters.contains(this) && "; + String[] projectIds = request.getParameterValues("projectId"); + if ((projectIds != null) && (!projectIds[0].equals("None"))) { + prettyPrint.append("Assigned to one of the following projects: "); + int numProjIds = projectIds.length; + String projIdFilter = "("; + for (int i = 0; i < numProjIds; i++) { + String currentProjId = projectIds[i].toLowerCase().replaceAll("%20", + " ").trim(); + if (!currentProjId.equals("")) { + if (projIdFilter.equals("(")) { + projIdFilter += " proj.id == \"" + currentProjId + "\""; + } else { + projIdFilter += " || proj.id == \"" + currentProjId + "\""; + } + } } - prettyPrint.append(kwParam + " "); - } - } - locIDFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += locIDFilter; - } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); - } - // end username filters----------------------------------------------- - // filter for resighted encounter------------------------------------------ - if (request.getParameter("resightOnly") != null) { - // String locString=request.getParameter("locationField").toLowerCase().replaceAll("%20", " ").trim(); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "(individual != null)"; - } else { filter += " && (individual != null)"; } - prettyPrint.append("Identified and resighted.
"); - } - // end resighted filter-------------------------------------------------------------------------------------- - // filter for unassigned encounters------------------------------------------ - if (request.getParameter("unassigned") != null) { - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "(individual == null)"; - } else { filter += " && (individual == null)"; } - prettyPrint.append("Unidentified.
"); - } - // end unassigned filter-------------------------------------------------------------------------------------- - // locationID filters------------------------------------------------- - String[] locCodes = request.getParameterValues("locationCodeField"); - if ((locCodes != null) && (!locCodes[0].equals(""))) { - prettyPrint.append("locationCodeField is one of the following: "); - int kwLength = locCodes.length; - String locIDFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = locCodes[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (locIDFilter.equals("(")) { - locIDFilter += " locationID == \"" + kwParam + "\""; + projIdFilter += " )"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE + + " proj.encounters.contains(this) && ")) { + filter += projIdFilter; } else { - locIDFilter += " || locationID == \"" + kwParam + "\""; + filter += (" && " + projIdFilter); } - prettyPrint.append(kwParam + " "); + prettyPrint.append(filter); + prettyPrint.append("
"); } - } - locIDFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += locIDFilter; - } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); - } - // end locationID filters----------------------------------------------- - // annotation viewpoint and class filters------------------------------------------------- - String[] hasViewpoint = request.getParameterValues("hasViewpoint"); - String[] hasIAClass = request.getParameterValues("hasIAClass"); - if (((hasViewpoint != null) && (!hasViewpoint[0].equals(""))) || - ((hasIAClass != null) && (!hasIAClass[0].equals("")))) { - if ((hasViewpoint != null) && (!hasViewpoint[0].equals(""))) { - prettyPrint.append("Viewpoint is one of the following: "); - int kwLength = hasViewpoint.length; + String variables_statement = " VARIABLES org.ecocean.Project proj"; + jdoqlVariableDeclaration = addOrgVars(variables_statement, filter); + } else {} + // end filter for projectName------------------ + // username filters------------------------------------------------- + String[] usernames = request.getParameterValues("username"); + if ((usernames != null) && (!usernames[0].equals("None"))) { + prettyPrint.append("Assigned to one of the following usernames: "); + int kwLength = usernames.length; String locIDFilter = "("; for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = hasViewpoint[kwIter].trim(); + String kwParam = usernames[kwIter].replaceAll("%20", " ").trim(); if (!kwParam.equals("")) { if (locIDFilter.equals("(")) { - locIDFilter += " annot46.viewpoint == \"" + kwParam + "\""; + locIDFilter += " submitterID == \"" + kwParam + "\""; } else { - locIDFilter += " || annot46.viewpoint == \"" + kwParam + "\""; + locIDFilter += " || submitterID == \"" + kwParam + "\""; } prettyPrint.append(kwParam + " "); } @@ -268,19 +203,39 @@ public static String queryStringBuilder(HttpServletRequest request, StringBuffer if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { filter += locIDFilter; } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); + prettyPrint.append("
"); } - if ((hasIAClass != null) && (!hasIAClass[0].equals(""))) { - prettyPrint.append("IA class is one of the following: "); - int kwLength = hasIAClass.length; + // end username filters----------------------------------------------- + // filter for resighted encounter------------------------------------------ + if (request.getParameter("resightOnly") != null) { + // String locString=request.getParameter("locationField").toLowerCase().replaceAll("%20", " ").trim(); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "(individual != null)"; + } else { filter += " && (individual != null)"; } + prettyPrint.append("Identified and resighted.
"); + } + // end resighted filter-------------------------------------------------------------------------------------- + // filter for unassigned encounters------------------------------------------ + if (request.getParameter("unassigned") != null) { + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "(individual == null)"; + } else { filter += " && (individual == null)"; } + prettyPrint.append("Unidentified.
"); + } + // end unassigned filter-------------------------------------------------------------------------------------- + // locationID filters------------------------------------------------- + String[] locCodes = request.getParameterValues("locationCodeField"); + if ((locCodes != null) && (!locCodes[0].equals(""))) { + prettyPrint.append("locationCodeField is one of the following: "); + int kwLength = locCodes.length; String locIDFilter = "("; for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = hasIAClass[kwIter].trim(); + String kwParam = locCodes[kwIter].replaceAll("%20", " ").trim(); if (!kwParam.equals("")) { if (locIDFilter.equals("(")) { - locIDFilter += " annot46.iaClass == \"" + kwParam + "\""; + locIDFilter += " locationID == \"" + kwParam + "\""; } else { - locIDFilter += " || annot46.iaClass == \"" + kwParam + "\""; + locIDFilter += " || locationID == \"" + kwParam + "\""; } prettyPrint.append(kwParam + " "); } @@ -291,1240 +246,1317 @@ public static String queryStringBuilder(HttpServletRequest request, StringBuffer } else { filter += (" && " + locIDFilter); } prettyPrint.append("
"); } - // set the jdoql variable used by both - filter += (" && annotations.contains(annot46)"); - if (jdoqlVariableDeclaration.length() > 0) { - jdoqlVariableDeclaration += ";org.ecocean.Annotation annot46;"; - } else { - jdoqlVariableDeclaration = " VARIABLES org.ecocean.Annotation annot46"; - } - } - // end viewpoint and class filters----------------------------------------------- - // state filters------------------------------------------------- - String[] states = request.getParameterValues("state"); - if ((states != null) && (!states[0].equals("None"))) { - prettyPrint.append("State is one of the following: "); - int kwLength = states.length; - String locIDFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = states[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (locIDFilter.equals("(")) { - locIDFilter += " state == \"" + kwParam + "\""; - } else { - locIDFilter += " || state == \"" + kwParam + "\""; + // end locationID filters----------------------------------------------- + // annotation viewpoint and class filters------------------------------------------------- + String[] hasViewpoint = request.getParameterValues("hasViewpoint"); + String[] hasIAClass = request.getParameterValues("hasIAClass"); + if (((hasViewpoint != null) && (!hasViewpoint[0].equals(""))) || + ((hasIAClass != null) && (!hasIAClass[0].equals("")))) { + if ((hasViewpoint != null) && (!hasViewpoint[0].equals(""))) { + prettyPrint.append("Viewpoint is one of the following: "); + int kwLength = hasViewpoint.length; + String locIDFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = hasViewpoint[kwIter].trim(); + if (!kwParam.equals("")) { + if (locIDFilter.equals("(")) { + locIDFilter += " annot46.viewpoint == \"" + kwParam + "\""; + } else { + locIDFilter += " || annot46.viewpoint == \"" + kwParam + "\""; + } + prettyPrint.append(kwParam + " "); + } } - prettyPrint.append(kwParam + " "); + locIDFilter += " )"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += locIDFilter; + } else { filter += (" && " + locIDFilter); } + prettyPrint.append("
"); } - } - locIDFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += locIDFilter; - } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); - } - // end state filters----------------------------------------------- - // individualID filters------------------------------------------------- - // supports multiple individualID parameters as well as comma-separated lists of individualIDs within them - String individualID = request.getParameter("individualID"); - if ((individualID != null) && (!individualID.equals("None")) && - (!individualID.trim().equals(""))) { - prettyPrint.append("Individual ID contains the following: "); - - String locIDFilter = " (individual.individualID == \"" + individualID + - "\" || individual.names.valuesAsString.toLowerCase().indexOf(\"" + - individualID.toLowerCase() + "\") != -1) "; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += locIDFilter; - } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); - } - // end individualID filters----------------------------------------------- - // occurrenceID filters------------------------------------------------- - String occurrenceID = request.getParameter("occurrenceID"); - if ((occurrenceID != null) && (!occurrenceID.equals("None")) && - (!occurrenceID.trim().equals(""))) { - prettyPrint.append("occurrence ID contains the following: "); - - String locIDFilter = " occurrenceID == \"" + occurrenceID + "\""; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += locIDFilter; - } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); - } - // end occurrenceID filters----------------------------------------------- - // individualIDExact filters------------------------------------------------- - // supports one individualID parameter as well as comma-separated lists of individualIDs within them - String individualIDExact = request.getParameter("individualIDExact"); - if ((individualIDExact != null) && (!individualIDExact.trim().equals(""))) { - prettyPrint.append("Individual ID is exactly the following: "); - - String locIDFilter = " individual.individualID == \"" + individualIDExact.trim() + - "\" "; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += locIDFilter; - } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); - } - // end individualID filters----------------------------------------------- - // socialunit filters------------------------------------------------------------------ - // community search - /* - * to filter Encounnter based on community firstly we need to get the social units associated with the communities and get the individualIDs - * from the social units and then use these individualIDs to filter the Encounters - */ - if (request.getParameterValues("community") != null) { - String[] communities = request.getParameterValues("community"); - int numCommunities = communities.length; - prettyPrint.append("Social unit is one of the following: "); - - Set individualsIdsSet = new HashSet(); - for (int i = 0; i < numCommunities; i++) { - prettyPrint.append(communities[i] + " "); - - SocialUnit su = myShepherd.getSocialUnit(communities[i]); - if (su == null) continue; - for (Membership member : su.getAllMembers()) { - if (member.getMarkedIndividual() != null) { - individualsIdsSet.add(member.getMarkedIndividual().getId()); + if ((hasIAClass != null) && (!hasIAClass[0].equals(""))) { + prettyPrint.append("IA class is one of the following: "); + int kwLength = hasIAClass.length; + String locIDFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = hasIAClass[kwIter].trim(); + if (!kwParam.equals("")) { + if (locIDFilter.equals("(")) { + locIDFilter += " annot46.iaClass == \"" + kwParam + "\""; + } else { + locIDFilter += " || annot46.iaClass == \"" + kwParam + "\""; + } + prettyPrint.append(kwParam + " "); + } } + locIDFilter += " )"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += locIDFilter; + } else { filter += (" && " + locIDFilter); } + prettyPrint.append("
"); + } + // set the jdoql variable used by both + filter += (" && annotations.contains(annot46)"); + if (jdoqlVariableDeclaration.length() > 0) { + jdoqlVariableDeclaration += ";org.ecocean.Annotation annot46;"; + } else { + jdoqlVariableDeclaration = " VARIABLES org.ecocean.Annotation annot46"; } } - List individualsIds = new ArrayList(individualsIdsSet); - if (individualsIds.size() > 0) { - String locIDFilter = " ( individual.individualID == \"" + individualsIds.get(0) + - "\" "; - for (int j = 1; j < individualsIds.size(); j++) { - locIDFilter += " || individual.individualID == \"" + individualsIds.get(j) + - "\" "; + // end viewpoint and class filters----------------------------------------------- + // state filters------------------------------------------------- + String[] states = request.getParameterValues("state"); + if ((states != null) && (!states[0].equals("None"))) { + prettyPrint.append("State is one of the following: "); + int kwLength = states.length; + String locIDFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = states[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (locIDFilter.equals("(")) { + locIDFilter += " state == \"" + kwParam + "\""; + } else { + locIDFilter += " || state == \"" + kwParam + "\""; + } + prettyPrint.append(kwParam + " "); + } } - locIDFilter = locIDFilter + " ) "; + locIDFilter += " )"; if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { filter += locIDFilter; } else { filter += (" && " + locIDFilter); } + prettyPrint.append("
"); } - prettyPrint.append("
"); - } - // role search - /* - * to filter Encounnter based on role fetch all the MarkedIndividuals for each MarkedIndividuals gets all roles then check if requested role - * is not present remove that MarkedIndividuals finally use these individualIDs to filter the Encounters - */ - if (request.getParameterValues("role") != null) { - boolean orRoles = true; - Iterator allSharks = myShepherd.getAllMarkedIndividuals(); - Vector rIndividuals = new Vector(); - if (allSharks != null) { - while (allSharks.hasNext()) { - MarkedIndividual temp_shark = allSharks.next(); - rIndividuals.add(temp_shark); - } - } - if (request.getParameter("andRoles") != null) { orRoles = false; } - String[] roles = request.getParameterValues("role"); - int numRoles = roles.length; - if (!orRoles) { - prettyPrint.append("Social roles include all of the following: "); - } else { - prettyPrint.append("Social roles is one of the following: "); - } - for (int h = 0; h < numRoles; h++) { - prettyPrint.append(roles[h] + " "); + // end state filters----------------------------------------------- + // individualID filters------------------------------------------------- + // supports multiple individualID parameters as well as comma-separated lists of individualIDs within them + String individualID = request.getParameter("individualID"); + if ((individualID != null) && (!individualID.equals("None")) && + (!individualID.trim().equals(""))) { + prettyPrint.append("Individual ID contains the following: "); + + String locIDFilter = " (individual.individualID == \"" + individualID + + "\" || individual.names.valuesAsString.toLowerCase().indexOf(\"" + + individualID.toLowerCase() + "\") != -1) "; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += locIDFilter; + } else { filter += (" && " + locIDFilter); } + prettyPrint.append("
"); } - // logical OR the roles - for (int q = 0; q < rIndividuals.size(); q++) { - MarkedIndividual tShark = (MarkedIndividual)rIndividuals.get(q); - List myRoles = myShepherd.getAllRoleNamesForMarkedIndividual( - tShark.getIndividualID()); - if (orRoles) { - // logical OR the role - boolean hasRole = false; - int f = 0; - while (!hasRole && (f < numRoles)) { - if (myRoles.contains(roles[f])) { hasRole = true; } - f++; - } - if (!hasRole) { - rIndividuals.remove(q); - q--; - } - } else { - // logical AND the roles - boolean hasRole = true; - int f = 0; - while (hasRole && (f < numRoles)) { - if (!myRoles.contains(roles[f])) { hasRole = false; } - f++; - } - if (!hasRole) { - rIndividuals.remove(q); - q--; - } - } + // end individualID filters----------------------------------------------- + // occurrenceID filters------------------------------------------------- + String occurrenceID = request.getParameter("occurrenceID"); + if ((occurrenceID != null) && (!occurrenceID.equals("None")) && + (!occurrenceID.trim().equals(""))) { + prettyPrint.append("occurrence ID contains the following: "); + + String locIDFilter = " occurrenceID == \"" + occurrenceID + "\""; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += locIDFilter; + } else { filter += (" && " + locIDFilter); } + prettyPrint.append("
"); } - if (rIndividuals.size() > 0) { - String locIDFilter = " ( individual.individualID == \"" + - rIndividuals.get(0).getId() + "\" "; - for (int j = 1; j < rIndividuals.size(); j++) { - locIDFilter += " || individual.individualID == \"" + - rIndividuals.get(j).getId() + "\" "; - } - locIDFilter = locIDFilter + " ) "; + // end occurrenceID filters----------------------------------------------- + // individualIDExact filters------------------------------------------------- + // supports one individualID parameter as well as comma-separated lists of individualIDs within them + String individualIDExact = request.getParameter("individualIDExact"); + if ((individualIDExact != null) && (!individualIDExact.trim().equals(""))) { + prettyPrint.append("Individual ID is exactly the following: "); + + String locIDFilter = " individual.individualID == \"" + individualIDExact.trim() + + "\" "; if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { filter += locIDFilter; } else { filter += (" && " + locIDFilter); } + prettyPrint.append("
"); } - prettyPrint.append("
"); - } - // patterningCode filters------------------------------------------------- - String[] patterningCodes = request.getParameterValues("patterningCodeField"); - if ((patterningCodes != null) && (!patterningCodes[0].equals("None"))) { - prettyPrint.append("Patterning code is one of the following: "); - int kwLength = patterningCodes.length; - String patterningCodeFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = patterningCodes[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (patterningCodeFilter.equals("(")) { - patterningCodeFilter += " patterningCode == \"" + kwParam + "\""; - } else { - patterningCodeFilter += " || patterningCode == \"" + kwParam + "\""; + // end individualID filters----------------------------------------------- + // socialunit filters------------------------------------------------------------------ + // community search + /* + * to filter Encounnter based on community firstly we need to get the social units associated with the communities and get the individualIDs + * from the social units and then use these individualIDs to filter the Encounters + */ + if (request.getParameterValues("community") != null) { + String[] communities = request.getParameterValues("community"); + int numCommunities = communities.length; + prettyPrint.append("Social unit is one of the following: "); + + Set individualsIdsSet = new HashSet(); + for (int i = 0; i < numCommunities; i++) { + prettyPrint.append(communities[i] + " "); + + SocialUnit su = myShepherd.getSocialUnit(communities[i]); + if (su == null) continue; + for (Membership member : su.getAllMembers()) { + if (member.getMarkedIndividual() != null) { + individualsIdsSet.add(member.getMarkedIndividual().getId()); + } } - prettyPrint.append(kwParam + " "); } - } - patterningCodeFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += patterningCodeFilter; - } else { filter += (" && " + patterningCodeFilter); } - prettyPrint.append("
"); - } - // end patterningCode filters----------------------------------------------- - // behavior filters------------------------------------------------- - String[] behaviors = request.getParameterValues("behaviorField"); - if ((behaviors != null) && (!behaviors[0].equals("None"))) { - prettyPrint.append("behaviorField is one of the following: "); - int kwLength = behaviors.length; - String locIDFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = behaviors[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (locIDFilter.equals("(")) { - locIDFilter += " behavior == \"" + kwParam + "\""; - } else { - locIDFilter += " || behavior == \"" + kwParam + "\""; + List individualsIds = new ArrayList(individualsIdsSet); + if (individualsIds.size() > 0) { + String locIDFilter = " ( individual.individualID == \"" + + individualsIds.get(0) + "\" "; + for (int j = 1; j < individualsIds.size(); j++) { + locIDFilter += " || individual.individualID == \"" + individualsIds.get(j) + + "\" "; } - prettyPrint.append(kwParam + " "); + locIDFilter = locIDFilter + " ) "; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += locIDFilter; + } else { filter += (" && " + locIDFilter); } } + prettyPrint.append("
"); } - locIDFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += locIDFilter; - } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); - } - // end behavior filters----------------------------------------------- - // begin observation filters ----------------------------------------- - boolean hasValue = false; - if (request.getParameter("numSearchedObs") != null) { - if (request.getParameter("observationKey1") != null && - !request.getParameter("observationKey1").equals("")) { - hasValue = true; - } - } - Enumeration allParams = request.getParameterNames(); - if (allParams != null && hasValue) { - String keyID = "observationKey"; - String valID = "observationValue"; - HashMap obKeys = new HashMap<>(); - HashMap obVals = new HashMap<>(); - StringBuilder obQuery = new StringBuilder(); - int numObsSearched = 0; - while (allParams.hasMoreElements()) { - String thisParam = allParams.nextElement(); - if (thisParam != null && thisParam.startsWith(keyID)) { - numObsSearched++; - System.out.println("Num Obs Searched? " + numObsSearched); - String keyParam = request.getParameter(thisParam); - String keyNum = thisParam.replace(keyID, ""); - if (keyParam != null && !keyParam.equals("")) { - obKeys.put(keyNum, keyParam); + // role search + /* + * to filter Encounnter based on role fetch all the MarkedIndividuals for each MarkedIndividuals gets all roles then check if requested role + * is not present remove that MarkedIndividuals finally use these individualIDs to filter the Encounters + */ + if (request.getParameterValues("role") != null) { + boolean orRoles = true; + Iterator allSharks = myShepherd.getAllMarkedIndividuals(); + Vector rIndividuals = new Vector(); + if (allSharks != null) { + while (allSharks.hasNext()) { + MarkedIndividual temp_shark = allSharks.next(); + rIndividuals.add(temp_shark); } } - if (thisParam != null && thisParam.startsWith(valID)) { - String valParam = request.getParameter(thisParam); - String valNum = thisParam.replace(valID, ""); - if (valParam != null && !valParam.equals("")) { - obVals.put(valNum, valParam); - } + if (request.getParameter("andRoles") != null) { orRoles = false; } + String[] roles = request.getParameterValues("role"); + int numRoles = roles.length; + if (!orRoles) { + prettyPrint.append("Social roles include all of the following: "); + } else { + prettyPrint.append("Social roles is one of the following: "); } - } - for (int i = 1; i <= numObsSearched; i++) { - String num = String.valueOf(i); - if (Util.basicSanitize(obKeys.get(num)) != null) { - String thisKey = Util.basicSanitize(obKeys.get(num)); - prettyPrint.append("observation "); - prettyPrint.append(thisKey); - prettyPrint.append("
"); - String qAsString = obQuery.toString().trim(); - System.out.println("Query As String" + qAsString); - if (qAsString.length() >= 2 && - !qAsString.substring(qAsString.length() - 2).equals("&&")) { - obQuery.append("&&"); - } - obQuery.append("(observations.contains(observation" + num + ") && "); - obQuery.append("observation" + num + ".name == " + Util.quote(thisKey.trim())); - if (obVals.get(num) != null && !obVals.get(num).trim().equals("")) { - String thisVal = Util.basicSanitize(obVals.get(num)); - prettyPrint.append(" is "); - prettyPrint.append(thisVal); - obQuery.append(" && observation" + num + ".value == " + - Util.quote(thisVal.trim())); - } - obQuery.append(")"); + for (int h = 0; h < numRoles; h++) { + prettyPrint.append(roles[h] + " "); } - if (obQuery.length() > 0) { - if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += " && "; + // logical OR the roles + for (int q = 0; q < rIndividuals.size(); q++) { + MarkedIndividual tShark = (MarkedIndividual)rIndividuals.get(q); + List myRoles = myShepherd.getAllRoleNamesForMarkedIndividual( + tShark.getIndividualID()); + if (orRoles) { + // logical OR the role + boolean hasRole = false; + int f = 0; + while (!hasRole && (f < numRoles)) { + if (myRoles.contains(roles[f])) { hasRole = true; } + f++; + } + if (!hasRole) { + rIndividuals.remove(q); + q--; + } + } else { + // logical AND the roles + boolean hasRole = true; + int f = 0; + while (hasRole && (f < numRoles)) { + if (!myRoles.contains(roles[f])) { hasRole = false; } + f++; + } + if (!hasRole) { + rIndividuals.remove(q); + q--; + } } - filter += obQuery.toString(); - for (int j = 0; j < numObsSearched; j++) { - QueryProcessor.updateJdoqlVariableDeclaration(jdoqlVariableDeclaration, - "org.ecocean.Observation observation" + j); + } + if (rIndividuals.size() > 0) { + String locIDFilter = " ( individual.individualID == \"" + + rIndividuals.get(0).getId() + "\" "; + for (int j = 1; j < rIndividuals.size(); j++) { + locIDFilter += " || individual.individualID == \"" + + rIndividuals.get(j).getId() + "\" "; } - System.out.println("ObQuery: " + obQuery); - System.out.println("Filter? " + filter); + locIDFilter = locIDFilter + " ) "; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += locIDFilter; + } else { filter += (" && " + locIDFilter); } } + prettyPrint.append("
"); } - } - // Tag Filters-------------------------------------------------------- - - StringBuilder metalTagFilter = new StringBuilder(); - Enumeration parameterNames = request.getParameterNames(); - int metalTagsInQuery = 0; - while (parameterNames.hasMoreElements()) { - String parameterName = parameterNames.nextElement(); - final String metalTagPrefix = "metalTag("; - if (parameterName.startsWith(metalTagPrefix)) { - String metalTagLocation = parameterName.substring(metalTagPrefix.length(), - parameterName.lastIndexOf(')')); - String value = request.getParameter(parameterName); - if (value != null && value.trim().length() > 0) { - prettyPrint.append("metal tag "); - prettyPrint.append(metalTagLocation); - prettyPrint.append(" is "); - prettyPrint.append(value); - prettyPrint.append("
"); - String metalTagVar = "metalTag" + metalTagsInQuery++; - metalTagFilter.append("(metalTags.contains(" + metalTagVar + ") && "); - metalTagFilter.append(metalTagVar + ".location == " + - Util.quote(metalTagLocation)); - String jdoParam = "tagNumber" + metalTagsInQuery; - metalTagFilter.append(" && " + metalTagVar + ".tagNumber == " + jdoParam + ")"); - paramMap.put(jdoParam, value); - parameterDeclaration = updateParametersDeclaration(parameterDeclaration, - "String " + jdoParam); + // patterningCode filters------------------------------------------------- + String[] patterningCodes = request.getParameterValues("patterningCodeField"); + if ((patterningCodes != null) && (!patterningCodes[0].equals("None"))) { + prettyPrint.append("Patterning code is one of the following: "); + int kwLength = patterningCodes.length; + String patterningCodeFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = patterningCodes[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (patterningCodeFilter.equals("(")) { + patterningCodeFilter += " patterningCode == \"" + kwParam + "\""; + } else { + patterningCodeFilter += " || patterningCode == \"" + kwParam + "\""; + } + prettyPrint.append(kwParam + " "); + } } + patterningCodeFilter += " )"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += patterningCodeFilter; + } else { filter += (" && " + patterningCodeFilter); } + prettyPrint.append("
"); } - } - if (metalTagFilter.length() > 0) { - if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += " && "; - } - filter += metalTagFilter.toString(); - for (int i = 0; i < metalTagsInQuery; i++) { - QueryProcessor.updateJdoqlVariableDeclaration(jdoqlVariableDeclaration, - "org.ecocean.tag.MetalTag metalTag" + i); - } - } - // We don't do metal tags (above) in processTagFilters because of the dependency on jdoqlVariableDeclaration - String tagFilters = processTagFilters(request, prettyPrint); - if (tagFilters.length() > 0) { - if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += " && "; - } - filter += tagFilters.toString(); - } - // end tag filters---------------------------------------------------- - // lifeStage filters------------------------------------------------- - String[] stages = request.getParameterValues("lifeStageField"); - if ((stages != null) && (!stages[0].equals("None")) && (!stages[0].equals(""))) { - prettyPrint.append("lifeStage is one of the following: "); - int kwLength = stages.length; - String stageFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = stages[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (stageFilter.equals("(")) { - stageFilter += " lifeStage == \"" + kwParam + "\""; - } else { - stageFilter += " || lifeStage == \"" + kwParam + "\""; + // end patterningCode filters----------------------------------------------- + // behavior filters------------------------------------------------- + String[] behaviors = request.getParameterValues("behaviorField"); + if ((behaviors != null) && (!behaviors[0].equals("None"))) { + prettyPrint.append("behaviorField is one of the following: "); + int kwLength = behaviors.length; + String locIDFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = behaviors[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (locIDFilter.equals("(")) { + locIDFilter += " behavior == \"" + kwParam + "\""; + } else { + locIDFilter += " || behavior == \"" + kwParam + "\""; + } + prettyPrint.append(kwParam + " "); } - prettyPrint.append(kwParam + " "); } + locIDFilter += " )"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += locIDFilter; + } else { filter += (" && " + locIDFilter); } + prettyPrint.append("
"); } - stageFilter += " ) "; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += stageFilter; - } else { filter += (" && " + stageFilter); } - prettyPrint.append("
"); - } - // end lifeStage filters - // country filters------------------------------------------------- - String[] countries = request.getParameterValues("country"); - if ((countries != null) && (!countries[0].equals("None")) && (!countries[0].equals(""))) { - prettyPrint.append("Country is one of the following: "); - int kwLength = countries.length; - String stageFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = countries[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (stageFilter.equals("(")) { - stageFilter += " country == \"" + kwParam + "\""; - } else { - stageFilter += " || country == \"" + kwParam + "\""; - } - prettyPrint.append(kwParam + " "); + // end behavior filters----------------------------------------------- + // begin observation filters ----------------------------------------- + boolean hasValue = false; + if (request.getParameter("numSearchedObs") != null) { + if (request.getParameter("observationKey1") != null && + !request.getParameter("observationKey1").equals("")) { + hasValue = true; } } - stageFilter += " ) "; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += stageFilter; - } else { filter += (" && " + stageFilter); } - prettyPrint.append("
"); - } - // end country filters - // Measurement filters----------------------------------------------- - List measurementDescs = Util.findMeasurementDescs("en", context); - String measurementPrefix = "measurement"; - StringBuilder measurementFilter = new StringBuilder(); // "( collectedData.contains(measurement) && ("); - boolean atLeastOneMeasurement = false; - int measurementsInQuery = 0; - for (MeasurementDesc measurementDesc : measurementDescs) { - String valueParamName = measurementPrefix + measurementDesc.getType() + "(value)"; - String value = request.getParameter(valueParamName); - if (value != null) { - value = value.trim(); - if (value.length() > 0) { - String operatorParamName = measurementPrefix + measurementDesc.getType() + - "(operator)"; - String operatorParamValue = request.getParameter(operatorParamName); - if (operatorParamValue == null) { - operatorParamValue = ""; + Enumeration allParams = request.getParameterNames(); + if (allParams != null && hasValue) { + String keyID = "observationKey"; + String valID = "observationValue"; + HashMap obKeys = new HashMap<>(); + HashMap obVals = new HashMap<>(); + StringBuilder obQuery = new StringBuilder(); + int numObsSearched = 0; + while (allParams.hasMoreElements()) { + String thisParam = allParams.nextElement(); + if (thisParam != null && thisParam.startsWith(keyID)) { + numObsSearched++; + System.out.println("Num Obs Searched? " + numObsSearched); + String keyParam = request.getParameter(thisParam); + String keyNum = thisParam.replace(keyID, ""); + if (keyParam != null && !keyParam.equals("")) { + obKeys.put(keyNum, keyParam); + } } - String operator = null; - if ("gt".equals(operatorParamValue)) { - operator = ">"; - } else if ("lt".equals(operatorParamValue)) { - operator = "<"; - } else if ("eq".equals(operatorParamValue)) { - operator = "=="; - } else if ("gteq".equals(operatorParamValue)) { - operator = ">="; - } else if ("lteq".equals(operatorParamValue)) { - operator = "<="; + if (thisParam != null && thisParam.startsWith(valID)) { + String valParam = request.getParameter(thisParam); + String valNum = thisParam.replace(valID, ""); + if (valParam != null && !valParam.equals("")) { + obVals.put(valNum, valParam); + } } - if (operator != null) { - prettyPrint.append(measurementDesc.getUnitsLabel()); - prettyPrint.append(" is "); - prettyPrint.append(operator); - prettyPrint.append(value); + } + for (int i = 1; i <= numObsSearched; i++) { + String num = String.valueOf(i); + if (Util.basicSanitize(obKeys.get(num)) != null) { + String thisKey = Util.basicSanitize(obKeys.get(num)); + prettyPrint.append("observation "); + prettyPrint.append(thisKey); prettyPrint.append("
"); - if (atLeastOneMeasurement) { - measurementFilter.append("&&"); + String qAsString = obQuery.toString().trim(); + System.out.println("Query As String" + qAsString); + if (qAsString.length() >= 2 && + !qAsString.substring(qAsString.length() - 2).equals("&&")) { + obQuery.append("&&"); } - String measurementVar = "measurement" + measurementsInQuery++; - measurementFilter.append("measurements.contains(" + measurementVar + - ") && "); - measurementFilter.append("(" + measurementVar + ".value " + operator + " " + - value + ")"); - measurementFilter.append(" && (" + measurementVar + ".type == "); - measurementFilter.append("\"" + measurementDesc.getType() + "\")"); - atLeastOneMeasurement = true; + obQuery.append("(observations.contains(observation" + num + ") && "); + obQuery.append("observation" + num + ".name == " + + Util.quote(thisKey.trim())); + if (obVals.get(num) != null && !obVals.get(num).trim().equals("")) { + String thisVal = Util.basicSanitize(obVals.get(num)); + prettyPrint.append(" is "); + prettyPrint.append(thisVal); + obQuery.append(" && observation" + num + ".value == " + + Util.quote(thisVal.trim())); + } + obQuery.append(")"); + } + if (obQuery.length() > 0) { + if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += " && "; + } + filter += obQuery.toString(); + for (int j = 0; j < numObsSearched; j++) { + QueryProcessor.updateJdoqlVariableDeclaration(jdoqlVariableDeclaration, + "org.ecocean.Observation observation" + j); + } + System.out.println("ObQuery: " + obQuery); + System.out.println("Filter? " + filter); } } } - } - if (atLeastOneMeasurement) { - if (jdoqlVariableDeclaration.length() > 0) { - jdoqlVariableDeclaration += ";"; - } else { - jdoqlVariableDeclaration = " VARIABLES "; - } - for (int i = 0; i < measurementsInQuery; i++) { - if (i > 0) { - jdoqlVariableDeclaration += "; "; - } - jdoqlVariableDeclaration += " org.ecocean.Measurement measurement" + i; - } - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += measurementFilter.toString(); - } else { - filter += (" && " + measurementFilter.toString()); - } - } - // end measurement filters - // BiologicalMeasurement filters----------------------------------------------- - List bioMeasurementDescs = Util.findBiologicalMeasurementDescs("en", - context); - String bioMeasurementPrefix = "biomeasurement"; - StringBuilder bioMeasurementFilter = new StringBuilder(); - bioMeasurementFilter.append("tissueSamples.contains(dce322) "); - boolean bioAtLeastOneMeasurement = false; - int bioMeasurementsInQuery = 0; - for (MeasurementDesc measurementDesc : bioMeasurementDescs) { - String valueParamName = bioMeasurementPrefix + measurementDesc.getType() + "(value)"; - String value = request.getParameter(valueParamName); - if (value != null) { - value = value.trim(); - if (value.length() > 0) { - String operatorParamName = bioMeasurementPrefix + measurementDesc.getType() + - "(operator)"; - String operatorParamValue = request.getParameter(operatorParamName); - if (operatorParamValue == null) { - operatorParamValue = ""; - } - String operator = null; - if ("gt".equals(operatorParamValue)) { - operator = ">"; - } else if ("lt".equals(operatorParamValue)) { - operator = "<"; - } else if ("eq".equals(operatorParamValue)) { - operator = "=="; - } else if ("gteq".equals(operatorParamValue)) { - operator = ">="; - } else if ("lteq".equals(operatorParamValue)) { - operator = "<="; - } - if (operator != null) { - prettyPrint.append("Biological/chemical measurement " + - measurementDesc.getType()); + // Tag Filters-------------------------------------------------------- + + StringBuilder metalTagFilter = new StringBuilder(); + Enumeration parameterNames = request.getParameterNames(); + int metalTagsInQuery = 0; + while (parameterNames.hasMoreElements()) { + String parameterName = parameterNames.nextElement(); + final String metalTagPrefix = "metalTag("; + if (parameterName.startsWith(metalTagPrefix)) { + String metalTagLocation = parameterName.substring(metalTagPrefix.length(), + parameterName.lastIndexOf(')')); + String value = request.getParameter(parameterName); + if (value != null && value.trim().length() > 0) { + prettyPrint.append("metal tag "); + prettyPrint.append(metalTagLocation); prettyPrint.append(" is "); - prettyPrint.append(operator); prettyPrint.append(value); prettyPrint.append("
"); - if (bioAtLeastOneMeasurement) { - bioMeasurementFilter.append("&&"); - } - String measurementVar = "biomeasurement" + bioMeasurementsInQuery++; - bioMeasurementFilter.append(" & dce322.analyses.contains(" + - measurementVar + ") "); - bioMeasurementFilter.append(" && ( " + measurementVar + ".value " + - operator + " " + value + " )"); - bioMeasurementFilter.append(" && ( " + measurementVar + - ".measurementType == "); - bioMeasurementFilter.append("\"" + measurementDesc.getType() + "\" )"); - bioAtLeastOneMeasurement = true; + String metalTagVar = "metalTag" + metalTagsInQuery++; + metalTagFilter.append("(metalTags.contains(" + metalTagVar + ") && "); + metalTagFilter.append(metalTagVar + ".location == " + + Util.quote(metalTagLocation)); + String jdoParam = "tagNumber" + metalTagsInQuery; + metalTagFilter.append(" && " + metalTagVar + ".tagNumber == " + jdoParam + + ")"); + paramMap.put(jdoParam, value); + parameterDeclaration = updateParametersDeclaration(parameterDeclaration, + "String " + jdoParam); } } } - } - if (bioAtLeastOneMeasurement) { - if (jdoqlVariableDeclaration.length() > 0) { - jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce322;"; - } else { - jdoqlVariableDeclaration = " VARIABLES org.ecocean.genetics.TissueSample dce322;"; - } - for (int i = 0; i < bioMeasurementsInQuery; i++) { - if (i > 0) { - jdoqlVariableDeclaration += "; "; + if (metalTagFilter.length() > 0) { + if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += " && "; + } + filter += metalTagFilter.toString(); + for (int i = 0; i < metalTagsInQuery; i++) { + QueryProcessor.updateJdoqlVariableDeclaration(jdoqlVariableDeclaration, + "org.ecocean.tag.MetalTag metalTag" + i); } - jdoqlVariableDeclaration += - "org.ecocean.genetics.BiologicalMeasurement biomeasurement" + i; } - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += bioMeasurementFilter.toString(); - } else { - filter += (" && " + bioMeasurementFilter.toString()); + // We don't do metal tags (above) in processTagFilters because of the dependency on jdoqlVariableDeclaration + String tagFilters = processTagFilters(request, prettyPrint); + if (tagFilters.length() > 0) { + if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += " && "; + } + filter += tagFilters.toString(); + } + // end tag filters---------------------------------------------------- + // lifeStage filters------------------------------------------------- + String[] stages = request.getParameterValues("lifeStageField"); + if ((stages != null) && (!stages[0].equals("None")) && (!stages[0].equals(""))) { + prettyPrint.append("lifeStage is one of the following: "); + int kwLength = stages.length; + String stageFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = stages[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (stageFilter.equals("(")) { + stageFilter += " lifeStage == \"" + kwParam + "\""; + } else { + stageFilter += " || lifeStage == \"" + kwParam + "\""; + } + prettyPrint.append(kwParam + " "); + } + } + stageFilter += " ) "; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += stageFilter; + } else { filter += (" && " + stageFilter); } + prettyPrint.append("
"); } - } - // end BiologicalMeasurement filters - // verbatimEventDate filters------------------------------------------------- - String[] verbatimEventDates = request.getParameterValues("verbatimEventDateField"); - if ((verbatimEventDates != null) && (!verbatimEventDates[0].equals("None"))) { - prettyPrint.append("verbatimEventDateField is one of the following: "); - int kwLength = verbatimEventDates.length; - String locIDFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = verbatimEventDates[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (locIDFilter.equals("(")) { - locIDFilter += " verbatimEventDate == \"" + kwParam + "\""; - } else { - locIDFilter += " || verbatimEventDate == \"" + kwParam + "\""; + // end lifeStage filters + // country filters------------------------------------------------- + String[] countries = request.getParameterValues("country"); + if ((countries != null) && (!countries[0].equals("None")) && + (!countries[0].equals(""))) { + prettyPrint.append("Country is one of the following: "); + int kwLength = countries.length; + String stageFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = countries[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (stageFilter.equals("(")) { + stageFilter += " country == \"" + kwParam + "\""; + } else { + stageFilter += " || country == \"" + kwParam + "\""; + } + prettyPrint.append(kwParam + " "); } - prettyPrint.append(kwParam + " "); } + stageFilter += " ) "; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += stageFilter; + } else { filter += (" && " + stageFilter); } + prettyPrint.append("
"); } - locIDFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += locIDFilter; - } else { filter += (" && " + locIDFilter); } - prettyPrint.append("
"); - } - // end verbatimEventDate filters----------------------------------------------- - // hasTissueSample filters------------------------------------------------- - if (request.getParameter("hasTissueSample") != null) { - prettyPrint.append("Has tissue sample."); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "tissueSamples.contains(dce)"; - } else if (filter.indexOf("tissueSamples.contains(dce)") == -1) { - filter += (" && tissueSamples.contains(dce) "); + // end country filters + // Measurement filters----------------------------------------------- + List measurementDescs = Util.findMeasurementDescs("en", context); + String measurementPrefix = "measurement"; + StringBuilder measurementFilter = new StringBuilder(); // "( collectedData.contains(measurement) && ("); + boolean atLeastOneMeasurement = false; + int measurementsInQuery = 0; + for (MeasurementDesc measurementDesc : measurementDescs) { + String valueParamName = measurementPrefix + measurementDesc.getType() + "(value)"; + String value = request.getParameter(valueParamName); + if (value != null) { + value = value.trim(); + if (value.length() > 0) { + String operatorParamName = measurementPrefix + measurementDesc.getType() + + "(operator)"; + String operatorParamValue = request.getParameter(operatorParamName); + if (operatorParamValue == null) { + operatorParamValue = ""; + } + String operator = null; + if ("gt".equals(operatorParamValue)) { + operator = ">"; + } else if ("lt".equals(operatorParamValue)) { + operator = "<"; + } else if ("eq".equals(operatorParamValue)) { + operator = "=="; + } else if ("gteq".equals(operatorParamValue)) { + operator = ">="; + } else if ("lteq".equals(operatorParamValue)) { + operator = "<="; + } + if (operator != null) { + prettyPrint.append(measurementDesc.getUnitsLabel()); + prettyPrint.append(" is "); + prettyPrint.append(operator); + prettyPrint.append(value); + prettyPrint.append("
"); + if (atLeastOneMeasurement) { + measurementFilter.append("&&"); + } + String measurementVar = "measurement" + measurementsInQuery++; + measurementFilter.append("measurements.contains(" + measurementVar + + ") && "); + measurementFilter.append("(" + measurementVar + ".value " + operator + + " " + value + ")"); + measurementFilter.append(" && (" + measurementVar + ".type == "); + measurementFilter.append("\"" + measurementDesc.getType() + "\")"); + atLeastOneMeasurement = true; + } + } + } } - prettyPrint.append("
"); - if (jdoqlVariableDeclaration.equals("")) { - jdoqlVariableDeclaration = " VARIABLES org.ecocean.genetics.TissueSample dce"; - } else if (!jdoqlVariableDeclaration.contains( - "org.ecocean.genetics.TissueSample dce")) { - jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce"; - } - } - // end hasTissueSample filters----------------------------------------------- - // TissueSample sampleID filters------------------------------------------------- - if ((request.getParameter("tissueSampleID") != null) && - (!request.getParameter("tissueSampleID").trim().equals(""))) { - prettyPrint.append("Has biological sample with ID: " + - request.getParameter("tissueSampleID")); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += - "tissueSamples.contains(dce123) && (dce123.sampleID.toLowerCase().indexOf('" + - request.getParameter("tissueSampleID").trim().toLowerCase() + "') != -1)"; - } else if (filter.indexOf("tissueSamples.contains(dce)") == -1) { - filter += - ( - " && tissueSamples.contains(dce123) && (dce123.sampleID.toLowerCase().indexOf('" - + request.getParameter("tissueSampleID").trim().toLowerCase() + "') != -1) "); - } - prettyPrint.append("
"); - if (jdoqlVariableDeclaration.equals("")) { - jdoqlVariableDeclaration = " VARIABLES org.ecocean.genetics.TissueSample dce123"; - } else if (!jdoqlVariableDeclaration.contains( - "org.ecocean.genetics.TissueSample dce123")) { - jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce123"; - } - } - // end hasTissueSample filters----------------------------------------------- - // hasPhoto filters------------------------------------------------- - if (request.getParameter("hasPhoto") != null) { - prettyPrint.append("Has at least one MediaAsset."); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += - "annotations.contains(dce15) && dce15.features.contains(feat15) && feat15.asset != null"; - } else if (filter.indexOf("annotations.contains(dce15)") == -1) { - filter += - ( - " && annotations.contains(dce15) && dce15.features.contains(feat15) && feat15.asset != null"); - } - prettyPrint.append("
"); - if (jdoqlVariableDeclaration.equals("")) { - jdoqlVariableDeclaration = " VARIABLES org.ecocean.Annotation dce15"; - } else if (!jdoqlVariableDeclaration.contains("org.ecocean.Annotation dce15")) { - jdoqlVariableDeclaration += ";org.ecocean.Annotation dce15"; - } - if (jdoqlVariableDeclaration.equals("")) { - jdoqlVariableDeclaration = " VARIABLES org.ecocean.media.Feature feat15"; - } else if (!jdoqlVariableDeclaration.contains("org.ecocean.media.Feature feat15")) { - jdoqlVariableDeclaration += ";org.ecocean.media.Feature feat15"; + if (atLeastOneMeasurement) { + if (jdoqlVariableDeclaration.length() > 0) { + jdoqlVariableDeclaration += ";"; + } else { + jdoqlVariableDeclaration = " VARIABLES "; + } + for (int i = 0; i < measurementsInQuery; i++) { + if (i > 0) { + jdoqlVariableDeclaration += "; "; + } + jdoqlVariableDeclaration += " org.ecocean.Measurement measurement" + i; + } + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += measurementFilter.toString(); + } else { + filter += (" && " + measurementFilter.toString()); + } } - } - // end hasPhoto filters----------------------------------------------- - // hasSpots filters------------------------------------------------- - if (request.getParameter("hasSpots") != null) { - prettyPrint.append("Has patterning points."); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "spots != null "; - } else if (filter.indexOf("spots != null") == -1) { filter += (" && spots !=null "); } - prettyPrint.append("
"); - } - // end hasSpots filters----------------------------------------------- - // has no Spots filters------------------------------------------------- - if (request.getParameter("hasNoSpots") != null) { - prettyPrint.append("Has no patterning points."); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "spots == null "; - } else if (filter.indexOf("spots == null") == -1) { filter += (" && spots == null "); } - prettyPrint.append("
"); - } - // end has no Spots filters----------------------------------------------- - // filter for encounters of MarkedIndividuals that have been resighted------------------------------------------ - if ((request.getParameter("resightOnly") != null) && - (request.getParameter("numResights") != null)) { - int numResights = 1; - - try { - numResights = (new Integer(request.getParameter("numResights"))).intValue(); - prettyPrint.append("numResights for related Marked Individual is >= " + - numResights + ".
"); - } catch (NumberFormatException nfe) { nfe.printStackTrace(); } - String localFilter = - "markedindy.encounters.contains(this) && markedindy.encounters.size() >= " + - numResights + " "; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += localFilter; - } else { filter += (" && " + localFilter); } - if (jdoqlVariableDeclaration.equals("")) { - jdoqlVariableDeclaration = " VARIABLES org.ecocean.MarkedIndividual markedindy"; - } else { jdoqlVariableDeclaration += ";org.ecocean.MarkedIndividual markedindy"; } - } - // end if resightOnly-------------------------------------------------------------------------------------- - // keyword filters------------------------------------------------- - - // shared var between keywords and labeledKeywords - int nUnlabeledKeywords = 0; - - myShepherd.beginDBTransaction(); - String[] keywords = request.getParameterValues("keyword"); - String photoKeywordOperator = "&&"; - if ((request.getParameter("photoKeywordOperator") != null) && - (request.getParameter("photoKeywordOperator").equals("_OR_"))) { - photoKeywordOperator = "||"; - } - if ((keywords != null) && (!keywords[0].equals("None"))) { - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { filter += "("; } else { - filter += " && ("; + // end measurement filters + // BiologicalMeasurement filters----------------------------------------------- + List bioMeasurementDescs = Util.findBiologicalMeasurementDescs("en", + context); + String bioMeasurementPrefix = "biomeasurement"; + StringBuilder bioMeasurementFilter = new StringBuilder(); + bioMeasurementFilter.append("tissueSamples.contains(dce322) "); + boolean bioAtLeastOneMeasurement = false; + int bioMeasurementsInQuery = 0; + for (MeasurementDesc measurementDesc : bioMeasurementDescs) { + String valueParamName = bioMeasurementPrefix + measurementDesc.getType() + + "(value)"; + String value = request.getParameter(valueParamName); + if (value != null) { + value = value.trim(); + if (value.length() > 0) { + String operatorParamName = bioMeasurementPrefix + + measurementDesc.getType() + "(operator)"; + String operatorParamValue = request.getParameter(operatorParamName); + if (operatorParamValue == null) { + operatorParamValue = ""; + } + String operator = null; + if ("gt".equals(operatorParamValue)) { + operator = ">"; + } else if ("lt".equals(operatorParamValue)) { + operator = "<"; + } else if ("eq".equals(operatorParamValue)) { + operator = "=="; + } else if ("gteq".equals(operatorParamValue)) { + operator = ">="; + } else if ("lteq".equals(operatorParamValue)) { + operator = "<="; + } + if (operator != null) { + prettyPrint.append("Biological/chemical measurement " + + measurementDesc.getType()); + prettyPrint.append(" is "); + prettyPrint.append(operator); + prettyPrint.append(value); + prettyPrint.append("
"); + if (bioAtLeastOneMeasurement) { + bioMeasurementFilter.append("&&"); + } + String measurementVar = "biomeasurement" + bioMeasurementsInQuery++; + bioMeasurementFilter.append(" & dce322.analyses.contains(" + + measurementVar + ") "); + bioMeasurementFilter.append(" && ( " + measurementVar + ".value " + + operator + " " + value + " )"); + bioMeasurementFilter.append(" && ( " + measurementVar + + ".measurementType == "); + bioMeasurementFilter.append("\"" + measurementDesc.getType() + "\" )"); + bioAtLeastOneMeasurement = true; + } + } + } } - if ((request.getParameter("photoKeywordOperator") != null) && - (request.getParameter("photoKeywordOperator").equals("_OR_"))) { - prettyPrint.append("MediaAsset keyword is any one of the following: "); - } else { - prettyPrint.append("All of these MediaAsset keywords are applied: "); + if (bioAtLeastOneMeasurement) { + if (jdoqlVariableDeclaration.length() > 0) { + jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce322;"; + } else { + jdoqlVariableDeclaration = + " VARIABLES org.ecocean.genetics.TissueSample dce322;"; + } + for (int i = 0; i < bioMeasurementsInQuery; i++) { + if (i > 0) { + jdoqlVariableDeclaration += "; "; + } + jdoqlVariableDeclaration += + "org.ecocean.genetics.BiologicalMeasurement biomeasurement" + i; + } + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += bioMeasurementFilter.toString(); + } else { + filter += (" && " + bioMeasurementFilter.toString()); + } } - int kwLength = keywords.length; - nUnlabeledKeywords += kwLength; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { + // end BiologicalMeasurement filters + // verbatimEventDate filters------------------------------------------------- + String[] verbatimEventDates = request.getParameterValues("verbatimEventDateField"); + if ((verbatimEventDates != null) && (!verbatimEventDates[0].equals("None"))) { + prettyPrint.append("verbatimEventDateField is one of the following: "); + int kwLength = verbatimEventDates.length; String locIDFilter = "("; - String kwParam = keywords[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (locIDFilter.equals("(")) { - locIDFilter += " word" + kwIter + ".indexname == \"" + kwParam + "\" "; - } else { - locIDFilter += " " + photoKeywordOperator + " word" + kwIter + - ".indexname == \"" + kwParam + "\" "; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = verbatimEventDates[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (locIDFilter.equals("(")) { + locIDFilter += " verbatimEventDate == \"" + kwParam + "\""; + } else { + locIDFilter += " || verbatimEventDate == \"" + kwParam + "\""; + } + prettyPrint.append(kwParam + " "); } - Keyword kw = myShepherd.getKeyword(kwParam.trim()); - prettyPrint.append("\"" + kw.getReadableName() + "\" "); } locIDFilter += " )"; - if (filter.indexOf("annotations.contains(photo" + kwIter + ")") == -1) { - if (kwIter > 0) { filter += " " + photoKeywordOperator + " "; } - filter += " ( annotations.contains(photo" + kwIter + ")"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += locIDFilter; + } else { filter += (" && " + locIDFilter); } + prettyPrint.append("
"); + } + // end verbatimEventDate filters----------------------------------------------- + // hasTissueSample filters------------------------------------------------- + if (request.getParameter("hasTissueSample") != null) { + prettyPrint.append("Has tissue sample."); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "tissueSamples.contains(dce)"; + } else if (filter.indexOf("tissueSamples.contains(dce)") == -1) { + filter += (" && tissueSamples.contains(dce) "); } - if (filter.indexOf("photo" + kwIter + ".features.contains(feat" + kwIter + ")") == - -1) { - filter += " && photo" + kwIter + ".features.contains(feat" + kwIter + ")"; + prettyPrint.append("
"); + if (jdoqlVariableDeclaration.equals("")) { + jdoqlVariableDeclaration = " VARIABLES org.ecocean.genetics.TissueSample dce"; + } else if (!jdoqlVariableDeclaration.contains( + "org.ecocean.genetics.TissueSample dce")) { + jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce"; } - if (filter.indexOf("feat" + kwIter + ".asset.keywords.contains(word" + kwIter + - ")") == -1) { - filter += " && feat" + kwIter + ".asset.keywords.contains(word" + kwIter + ")"; + } + // end hasTissueSample filters----------------------------------------------- + // TissueSample sampleID filters------------------------------------------------- + if ((request.getParameter("tissueSampleID") != null) && + (!request.getParameter("tissueSampleID").trim().equals(""))) { + prettyPrint.append("Has biological sample with ID: " + + request.getParameter("tissueSampleID")); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += + "tissueSamples.contains(dce123) && (dce123.sampleID.toLowerCase().indexOf('" + + request.getParameter("tissueSampleID").trim().toLowerCase() + "') != -1)"; + } else if (filter.indexOf("tissueSamples.contains(dce)") == -1) { + filter += + ( + " && tissueSamples.contains(dce123) && (dce123.sampleID.toLowerCase().indexOf('" + + request.getParameter("tissueSampleID").trim().toLowerCase() + + "') != -1) "); } - filter += (" && " + locIDFilter + ")"); - if ((kwIter == 0) && (jdoqlVariableDeclaration.equals(""))) { - jdoqlVariableDeclaration = " VARIABLES "; + prettyPrint.append("
"); + if (jdoqlVariableDeclaration.equals("")) { + jdoqlVariableDeclaration = + " VARIABLES org.ecocean.genetics.TissueSample dce123"; + } else if (!jdoqlVariableDeclaration.contains( + "org.ecocean.genetics.TissueSample dce123")) { + jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce123"; } - if (kwIter > 0) { jdoqlVariableDeclaration += ";"; } - if (!jdoqlVariableDeclaration.contains("org.ecocean.Annotation photo" + kwIter)) { - jdoqlVariableDeclaration += "org.ecocean.Annotation photo" + kwIter; + } + // end hasTissueSample filters----------------------------------------------- + // hasPhoto filters------------------------------------------------- + if (request.getParameter("hasPhoto") != null) { + prettyPrint.append("Has at least one MediaAsset."); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += + "annotations.contains(dce15) && dce15.features.contains(feat15) && feat15.asset != null"; + } else if (filter.indexOf("annotations.contains(dce15)") == -1) { + filter += + ( + " && annotations.contains(dce15) && dce15.features.contains(feat15) && feat15.asset != null"); } - if (!jdoqlVariableDeclaration.contains("org.ecocean.Keyword word" + kwIter)) { - jdoqlVariableDeclaration += ";org.ecocean.Keyword word" + kwIter; + prettyPrint.append("
"); + if (jdoqlVariableDeclaration.equals("")) { + jdoqlVariableDeclaration = " VARIABLES org.ecocean.Annotation dce15"; + } else if (!jdoqlVariableDeclaration.contains("org.ecocean.Annotation dce15")) { + jdoqlVariableDeclaration += ";org.ecocean.Annotation dce15"; } - if (!jdoqlVariableDeclaration.contains("org.ecocean.media.Feature feat" + kwIter)) { - jdoqlVariableDeclaration += ";org.ecocean.media.Feature feat" + kwIter; + if (jdoqlVariableDeclaration.equals("")) { + jdoqlVariableDeclaration = " VARIABLES org.ecocean.media.Feature feat15"; + } else if (!jdoqlVariableDeclaration.contains("org.ecocean.media.Feature feat15")) { + jdoqlVariableDeclaration += ";org.ecocean.media.Feature feat15"; + } + } + // end hasPhoto filters----------------------------------------------- + // hasSpots filters------------------------------------------------- + if (request.getParameter("hasSpots") != null) { + prettyPrint.append("Has patterning points."); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "spots != null "; + } else if (filter.indexOf("spots != null") == -1) { + filter += (" && spots !=null "); + } + prettyPrint.append("
"); + } + // end hasSpots filters----------------------------------------------- + // has no Spots filters------------------------------------------------- + if (request.getParameter("hasNoSpots") != null) { + prettyPrint.append("Has no patterning points."); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "spots == null "; + } else if (filter.indexOf("spots == null") == -1) { + filter += (" && spots == null "); } + prettyPrint.append("
"); } - filter += " ) "; + // end has no Spots filters----------------------------------------------- + // filter for encounters of MarkedIndividuals that have been resighted------------------------------------------ + if ((request.getParameter("resightOnly") != null) && + (request.getParameter("numResights") != null)) { + int numResights = 1; - prettyPrint.append("
"); - } - myShepherd.rollbackDBTransaction(); - myShepherd.closeDBTransaction(); + try { + numResights = (new Integer(request.getParameter("numResights"))).intValue(); + prettyPrint.append("numResights for related Marked Individual is >= " + + numResights + ".
"); + } catch (NumberFormatException nfe) { nfe.printStackTrace(); } + String localFilter = + "markedindy.encounters.contains(this) && markedindy.encounters.size() >= " + + numResights + " "; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += localFilter; + } else { filter += (" && " + localFilter); } + if (jdoqlVariableDeclaration.equals("")) { + jdoqlVariableDeclaration = " VARIABLES org.ecocean.MarkedIndividual markedindy"; + } else { jdoqlVariableDeclaration += ";org.ecocean.MarkedIndividual markedindy"; } + } + // end if resightOnly-------------------------------------------------------------------------------------- + // keyword filters------------------------------------------------- - // end photo keyword filters----------------------------------------------- - // labeled keyword filters------------------------------------------------- - List labels = ServletUtilities.getIndexedParameters("label", request); - System.out.println("LKW filter got labels " + labels); - int index = 0; - boolean multipleLabels = labels.size() > 1; - String lkwFilter = "("; - for (int labelN = 0; labelN < labels.size(); labelN++) { - int kwNum = labelN + nUnlabeledKeywords; - int annotNum = nUnlabeledKeywords; // this way all labeledKeyword queries apply to the same annotation - String label = labels.get(labelN); - if (labelN == 0) { - prettyPrint.append("Encounter has a photo with the LabeledKeyword label \"" + - label + "\""); - } else { - prettyPrint.append(",
\t AND that photo has LabeledKeyword label \"" + label + - "\""); - lkwFilter += " && "; + // shared var between keywords and labeledKeywords + int nUnlabeledKeywords = 0; + String[] keywords = request.getParameterValues("keyword"); + String photoKeywordOperator = "&&"; + if ((request.getParameter("photoKeywordOperator") != null) && + (request.getParameter("photoKeywordOperator").equals("_OR_"))) { + photoKeywordOperator = "||"; } - // ------ start variables and declarations for this LKW - String annotVar = "photo" + annotNum; - // we only add the annotation the first time, so all subsequent keywords still apply to that first annotation - // bc if we search for "fluke photo, of quality 3-5" we are talking about one photo with two keywords, not two photos - if (labelN == 0) { - lkwFilter += "annotations.contains(" + annotVar + ")"; - jdoqlVariableDeclaration = QueryProcessor.updateJdoqlVariableDeclaration( - jdoqlVariableDeclaration, "org.ecocean.Annotation " + annotVar); + if ((keywords != null) && (!keywords[0].equals("None"))) { + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "("; + } else { + filter += " && ("; + } + if ((request.getParameter("photoKeywordOperator") != null) && + (request.getParameter("photoKeywordOperator").equals("_OR_"))) { + prettyPrint.append("MediaAsset keyword is any one of the following: "); + } else { + prettyPrint.append("All of these MediaAsset keywords are applied: "); + } + int kwLength = keywords.length; + nUnlabeledKeywords += kwLength; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String locIDFilter = "("; + String kwParam = keywords[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (locIDFilter.equals("(")) { + locIDFilter += " word" + kwIter + ".indexname == \"" + kwParam + "\" "; + } else { + locIDFilter += " " + photoKeywordOperator + " word" + kwIter + + ".indexname == \"" + kwParam + "\" "; + } + Keyword kw = myShepherd.getKeyword(kwParam.trim()); + prettyPrint.append("\"" + kw.getReadableName() + "\" "); + } + locIDFilter += " )"; + if (filter.indexOf("annotations.contains(photo" + kwIter + ")") == -1) { + if (kwIter > 0) { filter += " " + photoKeywordOperator + " "; } + filter += " ( annotations.contains(photo" + kwIter + ")"; + } + if (filter.indexOf("photo" + kwIter + ".features.contains(feat" + kwIter + + ")") == -1) { + filter += " && photo" + kwIter + ".features.contains(feat" + kwIter + ")"; + } + if (filter.indexOf("feat" + kwIter + ".asset.keywords.contains(word" + kwIter + + ")") == -1) { + filter += " && feat" + kwIter + ".asset.keywords.contains(word" + kwIter + + ")"; + } + filter += (" && " + locIDFilter + ")"); + if ((kwIter == 0) && (jdoqlVariableDeclaration.equals(""))) { + jdoqlVariableDeclaration = " VARIABLES "; + } + if (kwIter > 0) { jdoqlVariableDeclaration += ";"; } + if (!jdoqlVariableDeclaration.contains("org.ecocean.Annotation photo" + + kwIter)) { + jdoqlVariableDeclaration += "org.ecocean.Annotation photo" + kwIter; + } + if (!jdoqlVariableDeclaration.contains("org.ecocean.Keyword word" + kwIter)) { + jdoqlVariableDeclaration += ";org.ecocean.Keyword word" + kwIter; + } + if (!jdoqlVariableDeclaration.contains("org.ecocean.media.Feature feat" + + kwIter)) { + jdoqlVariableDeclaration += ";org.ecocean.media.Feature feat" + kwIter; + } + } + filter += " ) "; + + prettyPrint.append("
"); } - // only one feature per annotation, so only one feature for all keywords - String featVar = "feat" + annotNum; - if (labelN == 0) { - lkwFilter += " && "; - lkwFilter += annotVar + ".features.contains(" + featVar + ")"; + // myShepherd.rollbackDBTransaction(); + // myShepherd.closeDBTransaction(); + + // end photo keyword filters----------------------------------------------- + // labeled keyword filters------------------------------------------------- + List labels = ServletUtilities.getIndexedParameters("label", request); + System.out.println("LKW filter got labels " + labels); + int index = 0; + boolean multipleLabels = labels.size() > 1; + String lkwFilter = "("; + for (int labelN = 0; labelN < labels.size(); labelN++) { + int kwNum = labelN + nUnlabeledKeywords; + int annotNum = nUnlabeledKeywords; // this way all labeledKeyword queries apply to the same annotation + String label = labels.get(labelN); + if (labelN == 0) { + prettyPrint.append("Encounter has a photo with the LabeledKeyword label \"" + + label + "\""); + } else { + prettyPrint.append(",
\t AND that photo has LabeledKeyword label \"" + + label + "\""); + lkwFilter += " && "; + } + // ------ start variables and declarations for this LKW + String annotVar = "photo" + annotNum; + // we only add the annotation the first time, so all subsequent keywords still apply to that first annotation + // bc if we search for "fluke photo, of quality 3-5" we are talking about one photo with two keywords, not two photos + if (labelN == 0) { + lkwFilter += "annotations.contains(" + annotVar + ")"; + jdoqlVariableDeclaration = QueryProcessor.updateJdoqlVariableDeclaration( + jdoqlVariableDeclaration, "org.ecocean.Annotation " + annotVar); + } + // only one feature per annotation, so only one feature for all keywords + String featVar = "feat" + annotNum; + if (labelN == 0) { + lkwFilter += " && "; + lkwFilter += annotVar + ".features.contains(" + featVar + ")"; + jdoqlVariableDeclaration = QueryProcessor.updateJdoqlVariableDeclaration( + jdoqlVariableDeclaration, "org.ecocean.media.Feature " + featVar); + } + String wordVar = "word" + kwNum; + if (labelN == 0) lkwFilter += " && "; + lkwFilter += featVar + ".asset.keywords.contains(" + wordVar + ")"; jdoqlVariableDeclaration = QueryProcessor.updateJdoqlVariableDeclaration( - jdoqlVariableDeclaration, "org.ecocean.media.Feature " + featVar); - } - String wordVar = "word" + kwNum; - if (labelN == 0) lkwFilter += " && "; - lkwFilter += featVar + ".asset.keywords.contains(" + wordVar + ")"; - jdoqlVariableDeclaration = QueryProcessor.updateJdoqlVariableDeclaration( - jdoqlVariableDeclaration, "org.ecocean.LabeledKeyword " + wordVar); - // ------ done with variables and declarations for this LKW + jdoqlVariableDeclaration, "org.ecocean.LabeledKeyword " + wordVar); + // ------ done with variables and declarations for this LKW - lkwFilter += " && " + wordVar + ".label == " + Util.quote(label); - // the filter is now done if we don't have any values defined --- so we're querying for an enc with this label on a keyword. + lkwFilter += " && " + wordVar + ".label == " + Util.quote(label); + // the filter is now done if we don't have any values defined --- so we're querying for an enc with this label on a keyword. - String valueKey = "label" + labelN + ".values"; - String[] values = request.getParameterValues(valueKey); - if (values != null) { - System.out.println("EQP got valueKey " + valueKey + " and values " + - String.join(", ", values)); - String valueFilter = "("; - for (int valueN = 0; valueN < values.length; valueN++) { - if (valueN > 0) valueFilter += " || "; - valueFilter += wordVar + ".readableName == " + Util.quote(values[valueN]); - } - valueFilter += ")"; - if (!valueFilter.equals("()")) lkwFilter += " && " + valueFilter; - if (values.length == 1) { - prettyPrint.append(" with value \"" + values[0] + "\""); - } else if (values.length > 1) { - String allVals = String.join("\", OR \"", values); - allVals = "\"" + allVals + "\""; - prettyPrint.append(" with value (" + allVals + ")"); - } - } else { - System.out.println("EQP got null values for valueKey " + valueKey); + String valueKey = "label" + labelN + ".values"; + String[] values = request.getParameterValues(valueKey); + if (values != null) { + System.out.println("EQP got valueKey " + valueKey + " and values " + + String.join(", ", values)); + String valueFilter = "("; + for (int valueN = 0; valueN < values.length; valueN++) { + if (valueN > 0) valueFilter += " || "; + valueFilter += wordVar + ".readableName == " + Util.quote(values[valueN]); + } + valueFilter += ")"; + if (!valueFilter.equals("()")) lkwFilter += " && " + valueFilter; + if (values.length == 1) { + prettyPrint.append(" with value \"" + values[0] + "\""); + } else if (values.length > 1) { + String allVals = String.join("\", OR \"", values); + allVals = "\"" + allVals + "\""; + prettyPrint.append(" with value (" + allVals + ")"); + } + } else { + System.out.println("EQP got null values for valueKey " + valueKey); + } } - } - lkwFilter += ")"; + lkwFilter += ")"; - System.out.println("EQP got lkwFilter " + lkwFilter); - if (!lkwFilter.equals("()")) { - filter = filterWithCondition(filter, lkwFilter); - prettyPrint.append("
"); - } - // end labeled keyword filters - // ms markers filters------------------------------------------------- - myShepherd.beginDBTransaction(); - List markers = myShepherd.getAllLoci(); - int numMarkers = markers.size(); - String theseMarkers = ""; - boolean hasMarkers = false; - for (int h = 0; h < numMarkers; h++) { - String marker = markers.get(h); - if (request.getParameter(marker) != null) { - hasMarkers = true; - String locIDFilter = "("; - locIDFilter += " " + marker.replaceAll("-", "") + ".name == \"" + marker + "\" "; - locIDFilter += " )"; + System.out.println("EQP got lkwFilter " + lkwFilter); + if (!lkwFilter.equals("()")) { + filter = filterWithCondition(filter, lkwFilter); + prettyPrint.append("
"); + } + // end labeled keyword filters + // ms markers filters------------------------------------------------- + // myShepherd.beginDBTransaction(); + List markers = myShepherd.getAllLoci(); + int numMarkers = markers.size(); + String theseMarkers = ""; + boolean hasMarkers = false; + for (int h = 0; h < numMarkers; h++) { + String marker = markers.get(h); + if (request.getParameter(marker) != null) { + hasMarkers = true; + String locIDFilter = "("; + locIDFilter += " " + marker.replaceAll("-", + "") + ".name == \"" + marker + "\" "; + locIDFilter += " )"; - int alleleNum = 0; - boolean hasMoreAlleles = true; - while (hasMoreAlleles) { - if (request.getParameter((marker + "_alleleValue" + alleleNum)) != null) { - try { - Integer thisInt = new Integer(request.getParameter((marker + - "_alleleValue" + alleleNum))); - Integer relaxValue = new Integer(request.getParameter( - "alleleRelaxValue")); - Integer upperValue = thisInt + relaxValue; - Integer lowerValue = thisInt - relaxValue; - locIDFilter += (" && (" + marker.replaceAll("-", - "") + ".allele" + alleleNum + " >= " + lowerValue + ")" + " && (" + - marker.replaceAll("-", - "") + ".allele" + alleleNum + " <= " + upperValue + ")"); - } catch (Exception e) { + int alleleNum = 0; + boolean hasMoreAlleles = true; + while (hasMoreAlleles) { + if (request.getParameter((marker + "_alleleValue" + alleleNum)) != null) { + try { + Integer thisInt = new Integer(request.getParameter((marker + + "_alleleValue" + alleleNum))); + Integer relaxValue = new Integer(request.getParameter( + "alleleRelaxValue")); + Integer upperValue = thisInt + relaxValue; + Integer lowerValue = thisInt - relaxValue; + locIDFilter += (" && (" + marker.replaceAll("-", + "") + ".allele" + alleleNum + " >= " + lowerValue + ")" + + " && (" + marker.replaceAll("-", + "") + ".allele" + alleleNum + " <= " + upperValue + ")"); + } catch (Exception e) { + hasMoreAlleles = false; + } + } else { hasMoreAlleles = false; } + alleleNum++; + } + theseMarkers += (marker + " "); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += + "tissueSamples.contains(dce) && dce.analyses.contains(msanalysis) && msanalysis.loci.contains(" + + marker.replaceAll("-", "") + ") && " + locIDFilter; } else { - hasMoreAlleles = false; + if (filter.indexOf("tissueSamples.contains(dce)") == -1) { + filter += " && tissueSamples.contains(dce)"; + } + if (filter.indexOf("dce.analyses.contains(msanalysis)") == -1) { + filter += " && dce.analyses.contains(msanalysis)"; + } + if (filter.indexOf("msanalysis.loci.contains(" + marker.replaceAll("-", + "") + ")") == -1) { + filter += " && msanalysis.loci.contains(" + marker.replaceAll("-", + "") + ")"; + } + filter += (" && " + locIDFilter); + } + if (jdoqlVariableDeclaration.equals("")) { + jdoqlVariableDeclaration = + " VARIABLES org.ecocean.genetics.TissueSample dce;org.ecocean.genetics.MicrosatelliteMarkersAnalysis msanalysis;org.ecocean.genetics.Locus " + + marker.replaceAll("-", ""); + } else { + if (!jdoqlVariableDeclaration.contains( + "org.ecocean.genetics.TissueSample dce")) { + jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce"; + } + if (!jdoqlVariableDeclaration.contains( + "org.ecocean.genetics.MicrosatelliteMarkersAnalysis msanalysis")) { + jdoqlVariableDeclaration += + ";org.ecocean.genetics.MicrosatelliteMarkersAnalysis msanalysis"; + } + if (!jdoqlVariableDeclaration.contains("org.ecocean.genetics.Locus " + + marker.replaceAll("-", ""))) { + jdoqlVariableDeclaration += ";org.ecocean.genetics.Locus " + + marker.replaceAll("-", ""); + } } - alleleNum++; } - theseMarkers += (marker + " "); + } + if (hasMarkers) { + prettyPrint.append("Microsatellite marker is one of the following: "); + theseMarkers += "
"; + prettyPrint.append(theseMarkers); + } + // myShepherd.rollbackDBTransaction(); + // myShepherd.closeDBTransaction(); + // end ms markers filters----------------------------------------------- + // filter for alternate ID------------------------------------------ + if ((request.getParameter("alternateIDField") != null) && + (!request.getParameter("alternateIDField").equals(""))) { + String altID = request.getParameter("alternateIDField").replaceAll("%20", + " ").trim().toLowerCase(); if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += - "tissueSamples.contains(dce) && dce.analyses.contains(msanalysis) && msanalysis.loci.contains(" - + marker.replaceAll("-", "") + ") && " + locIDFilter; + filter += "otherCatalogNumbers.toLowerCase().indexOf('" + altID + "') != -1"; + } else { + filter += " && otherCatalogNumbers.toLowerCase().indexOf('" + altID + + "') != -1"; + } + prettyPrint.append("alternateID field contains \"" + altID + "\".
"); + } + // haplotype filters------------------------------------------------- + String[] haplotypes = request.getParameterValues("haplotypeField"); + if ((haplotypes != null) && (!haplotypes[0].equals("None"))) { + prettyPrint.append("Haplotype is one of the following: "); + int kwLength = haplotypes.length; + String locIDFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = haplotypes[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (locIDFilter.equals("(")) { + locIDFilter += " analysis.haplotype == \"" + kwParam + "\" "; + } else { + locIDFilter += " || analysis.haplotype == \"" + kwParam + "\" "; + } + prettyPrint.append(kwParam + " "); + } + } + locIDFilter += " )"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "tissueSamples.contains(dce) && dce.analyses.contains(analysis) && " + + locIDFilter; } else { if (filter.indexOf("tissueSamples.contains(dce)") == -1) { filter += " && tissueSamples.contains(dce)"; } - if (filter.indexOf("dce.analyses.contains(msanalysis)") == -1) { - filter += " && dce.analyses.contains(msanalysis)"; - } - if (filter.indexOf("msanalysis.loci.contains(" + marker.replaceAll("-", - "") + ")") == -1) { - filter += " && msanalysis.loci.contains(" + marker.replaceAll("-", - "") + ")"; + if (filter.indexOf("dce.analyses.contains(analysis)") == -1) { + filter += " && dce.analyses.contains(analysis)"; } filter += (" && " + locIDFilter); } + prettyPrint.append("
"); if (jdoqlVariableDeclaration.equals("")) { jdoqlVariableDeclaration = - " VARIABLES org.ecocean.genetics.TissueSample dce;org.ecocean.genetics.MicrosatelliteMarkersAnalysis msanalysis;org.ecocean.genetics.Locus " - + marker.replaceAll("-", ""); + " VARIABLES org.ecocean.genetics.TissueSample dce;org.ecocean.genetics.MitochondrialDNAAnalysis analysis"; } else { if (!jdoqlVariableDeclaration.contains( "org.ecocean.genetics.TissueSample dce")) { jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce"; } if (!jdoqlVariableDeclaration.contains( - "org.ecocean.genetics.MicrosatelliteMarkersAnalysis msanalysis")) { + "org.ecocean.genetics.MitochondrialDNAAnalysis analysis")) { jdoqlVariableDeclaration += - ";org.ecocean.genetics.MicrosatelliteMarkersAnalysis msanalysis"; - } - if (!jdoqlVariableDeclaration.contains("org.ecocean.genetics.Locus " + - marker.replaceAll("-", ""))) { - jdoqlVariableDeclaration += ";org.ecocean.genetics.Locus " + - marker.replaceAll("-", ""); + ";org.ecocean.genetics.MitochondrialDNAAnalysis analysis"; } } } - } - if (hasMarkers) { - prettyPrint.append("Microsatellite marker is one of the following: "); - theseMarkers += "
"; - prettyPrint.append(theseMarkers); - } - myShepherd.rollbackDBTransaction(); - myShepherd.closeDBTransaction(); - // end ms markers filters----------------------------------------------- - // filter for alternate ID------------------------------------------ - if ((request.getParameter("alternateIDField") != null) && - (!request.getParameter("alternateIDField").equals(""))) { - String altID = request.getParameter("alternateIDField").replaceAll("%20", - " ").trim().toLowerCase(); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "otherCatalogNumbers.toLowerCase().indexOf('" + altID + "') != -1"; - } else { - filter += " && otherCatalogNumbers.toLowerCase().indexOf('" + altID + "') != -1"; - } - prettyPrint.append("alternateID field contains \"" + altID + "\".
"); - } - // haplotype filters------------------------------------------------- - String[] haplotypes = request.getParameterValues("haplotypeField"); - if ((haplotypes != null) && (!haplotypes[0].equals("None"))) { - prettyPrint.append("Haplotype is one of the following: "); - int kwLength = haplotypes.length; - String locIDFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = haplotypes[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (locIDFilter.equals("(")) { - locIDFilter += " analysis.haplotype == \"" + kwParam + "\" "; - } else { - locIDFilter += " || analysis.haplotype == \"" + kwParam + "\" "; + // end haplotype filters----------------------------------------------- + // genetic sex filters------------------------------------------------- + String[] genSexes = request.getParameterValues("geneticSexField"); + if ((genSexes != null) && (!genSexes[0].equals("None"))) { + prettyPrint.append("Genetic determination of sex is one of the following: "); + int kwLength = genSexes.length; + String locIDFilter = "("; + for (int kwIter = 0; kwIter < kwLength; kwIter++) { + String kwParam = genSexes[kwIter].replaceAll("%20", " ").trim(); + if (!kwParam.equals("")) { + if (locIDFilter.equals("(")) { + locIDFilter += " sexanalysis.sex == \"" + kwParam + "\" "; + } else { + locIDFilter += " || sexanalysis.sex == \"" + kwParam + "\" "; + } + prettyPrint.append(kwParam + " "); } - prettyPrint.append(kwParam + " "); - } - } - locIDFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "tissueSamples.contains(dce) && dce.analyses.contains(analysis) && " + - locIDFilter; - } else { - if (filter.indexOf("tissueSamples.contains(dce)") == -1) { - filter += " && tissueSamples.contains(dce)"; - } - if (filter.indexOf("dce.analyses.contains(analysis)") == -1) { - filter += " && dce.analyses.contains(analysis)"; - } - filter += (" && " + locIDFilter); - } - prettyPrint.append("
"); - if (jdoqlVariableDeclaration.equals("")) { - jdoqlVariableDeclaration = - " VARIABLES org.ecocean.genetics.TissueSample dce;org.ecocean.genetics.MitochondrialDNAAnalysis analysis"; - } else { - if (!jdoqlVariableDeclaration.contains("org.ecocean.genetics.TissueSample dce")) { - jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce"; } - if (!jdoqlVariableDeclaration.contains( - "org.ecocean.genetics.MitochondrialDNAAnalysis analysis")) { - jdoqlVariableDeclaration += - ";org.ecocean.genetics.MitochondrialDNAAnalysis analysis"; - } - } - } - // end haplotype filters----------------------------------------------- - // genetic sex filters------------------------------------------------- - String[] genSexes = request.getParameterValues("geneticSexField"); - if ((genSexes != null) && (!genSexes[0].equals("None"))) { - prettyPrint.append("Genetic determination of sex is one of the following: "); - int kwLength = genSexes.length; - String locIDFilter = "("; - for (int kwIter = 0; kwIter < kwLength; kwIter++) { - String kwParam = genSexes[kwIter].replaceAll("%20", " ").trim(); - if (!kwParam.equals("")) { - if (locIDFilter.equals("(")) { - locIDFilter += " sexanalysis.sex == \"" + kwParam + "\" "; - } else { - locIDFilter += " || sexanalysis.sex == \"" + kwParam + "\" "; + locIDFilter += " )"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += + "tissueSamples.contains(dce9) && dce9.analyses.contains(sexanalysis) && " + + locIDFilter; + } else { + if (filter.indexOf("tissueSamples.contains(dce9)") == -1) { + filter += " && tissueSamples.contains(dce9)"; } - prettyPrint.append(kwParam + " "); - } - } - locIDFilter += " )"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += - "tissueSamples.contains(dce9) && dce9.analyses.contains(sexanalysis) && " + - locIDFilter; - } else { - if (filter.indexOf("tissueSamples.contains(dce9)") == -1) { - filter += " && tissueSamples.contains(dce9)"; - } - if (filter.indexOf("dce9.analyses.contains(sexanalysis)") == -1) { - filter += " && dce9.analyses.contains(sexanalysis)"; + if (filter.indexOf("dce9.analyses.contains(sexanalysis)") == -1) { + filter += " && dce9.analyses.contains(sexanalysis)"; + } + filter += (" && " + locIDFilter); } - filter += (" && " + locIDFilter); - } - prettyPrint.append("
"); - if (jdoqlVariableDeclaration.equals("")) { - jdoqlVariableDeclaration = - " VARIABLES org.ecocean.genetics.TissueSample dce9;org.ecocean.genetics.SexAnalysis sexanalysis"; - } else { - if (!jdoqlVariableDeclaration.contains("org.ecocean.genetics.TissueSample dce9")) { - jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce9"; - } - if (!jdoqlVariableDeclaration.contains( - "org.ecocean.genetics.SexAnalysis sexanalysis")) { - jdoqlVariableDeclaration += ";org.ecocean.genetics.SexAnalysis sexanalysis"; + prettyPrint.append("
"); + if (jdoqlVariableDeclaration.equals("")) { + jdoqlVariableDeclaration = + " VARIABLES org.ecocean.genetics.TissueSample dce9;org.ecocean.genetics.SexAnalysis sexanalysis"; + } else { + if (!jdoqlVariableDeclaration.contains( + "org.ecocean.genetics.TissueSample dce9")) { + jdoqlVariableDeclaration += ";org.ecocean.genetics.TissueSample dce9"; + } + if (!jdoqlVariableDeclaration.contains( + "org.ecocean.genetics.SexAnalysis sexanalysis")) { + jdoqlVariableDeclaration += ";org.ecocean.genetics.SexAnalysis sexanalysis"; + } } } - } - // end genetic sex filters----------------------------------------------- + // end genetic sex filters----------------------------------------------- // end photo filename filtering - // filter for genus------------------------------------------ - if ((request.getParameter("genusField") != null) && - (!request.getParameter("genusField").equals(""))) { - String genusSpecies = request.getParameter("genusField").replaceAll("%20", " ").trim(); - String genus = ""; - String specificEpithet = ""; + // filter for genus------------------------------------------ + if ((request.getParameter("genusField") != null) && + (!request.getParameter("genusField").equals(""))) { + String genusSpecies = request.getParameter("genusField").replaceAll("%20", + " ").trim(); + String genus = ""; + String specificEpithet = ""; - // now we have to break apart genus species - StringTokenizer tokenizer = new StringTokenizer(genusSpecies, " "); - if (tokenizer.countTokens() == 2) { - genus = tokenizer.nextToken(); - specificEpithet = tokenizer.nextToken(); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "genus == '" + genus + "' "; - } else { filter += " && genus == '" + genus + "' "; } - filter += " && specificEpithet == '" + specificEpithet + "' "; + // now we have to break apart genus species + StringTokenizer tokenizer = new StringTokenizer(genusSpecies, " "); + if (tokenizer.countTokens() == 2) { + genus = tokenizer.nextToken(); + specificEpithet = tokenizer.nextToken(); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "genus == '" + genus + "' "; + } else { filter += " && genus == '" + genus + "' "; } + filter += " && specificEpithet == '" + specificEpithet + "' "; - prettyPrint.append("genus and species are \"" + genusSpecies + "\".
"); - } - } - // filter for identificationRemarks------------------------------------------ - if ((request.getParameter("identificationRemarksField") != null) && - (!request.getParameter("identificationRemarksField").equals(""))) { - String idRemarks = request.getParameter("identificationRemarksField").trim(); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "identificationRemarks.startsWith('" + idRemarks + "')"; - } else { filter += " && identificationRemarks.startsWith('" + idRemarks + "')"; } - prettyPrint.append("identificationRemarks starts with \"" + idRemarks + "\".
"); - } - // end identification remarks filter - // filter gpsOnly - return only Encounters with a defined location. This is mostly used for mapping JSP pages - if (request.getAttribute("gpsOnly") != null) { - filter = filterWithGpsBox("decimalLatitude", "decimalLongitude", filter, request); - } - // end filter gpsOnly - // filter by alive/dead status------------------------------------------ - if ((request.getParameter("alive") != null) || (request.getParameter("dead") != null)) { - if (request.getParameter("alive") == null) { - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "!livingStatus.startsWith('alive')"; - } else { filter += " && !livingStatus.startsWith('alive')"; } - prettyPrint.append("Not alive.
"); + prettyPrint.append("genus and species are \"" + genusSpecies + "\".
"); + } } - if (request.getParameter("dead") == null) { + // filter for identificationRemarks------------------------------------------ + if ((request.getParameter("identificationRemarksField") != null) && + (!request.getParameter("identificationRemarksField").equals(""))) { + String idRemarks = request.getParameter("identificationRemarksField").trim(); if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "!livingStatus.startsWith('dead')"; - } else { filter += " && !livingStatus.startsWith('dead')"; } - prettyPrint.append("Not dead.
"); - } - } - // filter by alive/dead status-------------------------------------------------------------------------------------- - // submitter or photographer name filter------------------------------------------ - if ((request.getParameter("nameField") != null) && - (!request.getParameter("nameField").equals(""))) { - String nameString = request.getParameter("nameField").replaceAll("%20", - " ").toLowerCase().trim(); - String filterString = "" + "(" + - "(submitters.contains(submitter) && ((submitter.fullName.toLowerCase().indexOf('" + - nameString + "') != -1)||(submitter.emailAddress.toLowerCase().indexOf('" + - nameString + "') != -1))) || " + - "(photographers.contains(photographer) && ((photographer.fullName.toLowerCase().indexOf('" - + nameString + "') != -1)||(photographer.emailAddress.toLowerCase().indexOf('" + - nameString + "') != -1))) " + - "||(informOthers.contains(other) && ((other.fullName.toLowerCase().indexOf('" + - nameString + "') != -1)||(other.emailAddress.toLowerCase().indexOf('" + nameString + - "') != -1)))" + ")"; - if (jdoqlVariableDeclaration.equals("")) { - jdoqlVariableDeclaration = - " VARIABLES org.ecocean.User submitter;org.ecocean.User photographer;org.ecocean.User other"; - } else { - if (!jdoqlVariableDeclaration.contains("org.ecocean.User submitter")) { - jdoqlVariableDeclaration += ";org.ecocean.User submitter"; - } - if (!jdoqlVariableDeclaration.contains("org.ecocean.User photographer")) { - jdoqlVariableDeclaration += ";org.ecocean.User photographer"; - } - if (!jdoqlVariableDeclaration.contains("org.ecocean.User other")) { - jdoqlVariableDeclaration += ";org.ecocean.User other"; + filter += "identificationRemarks.startsWith('" + idRemarks + "')"; + } else { filter += " && identificationRemarks.startsWith('" + idRemarks + "')"; } + prettyPrint.append("identificationRemarks starts with \"" + idRemarks + + "\".
"); + } + // end identification remarks filter + // filter gpsOnly - return only Encounters with a defined location. This is mostly used for mapping JSP pages + if (request.getAttribute("gpsOnly") != null) { + filter = filterWithGpsBox("decimalLatitude", "decimalLongitude", filter, request); + } + // end filter gpsOnly + // filter by alive/dead status------------------------------------------ + if ((request.getParameter("alive") != null) || (request.getParameter("dead") != null)) { + if (request.getParameter("alive") == null) { + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "!livingStatus.startsWith('alive')"; + } else { filter += " && !livingStatus.startsWith('alive')"; } + prettyPrint.append("Not alive.
"); + } + if (request.getParameter("dead") == null) { + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "!livingStatus.startsWith('dead')"; + } else { filter += " && !livingStatus.startsWith('dead')"; } + prettyPrint.append("Not dead.
"); } } - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += filterString; - } else { filter += (" && " + filterString); } - prettyPrint.append("Related fullName or emailAddress contains: \"" + nameString + - "\"
"); - } - // end name and email filter-------------------------------------------------------------------------------------- - // additional comments filter------------------------------------------ - if ((request.getParameter("additionalCommentsField") != null) && - (!request.getParameter("additionalCommentsField").equals(""))) { - String nameString = request.getParameter("additionalCommentsField").replaceAll("%20", - " ").toLowerCase().trim(); - String filterString = "(occurrenceRemarks.toLowerCase().indexOf('" + nameString + - "') != -1)"; - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += filterString; - } else { filter += (" && " + filterString); } - prettyPrint.append("Remarks contains: \"" + nameString + "\"
"); - } - // end additional comments filter-------------------------------------------------------------------------------------- - // start date filter---------------------------- - if ((request.getParameter("datepicker1") != null) && - (!request.getParameter("datepicker1").trim().equals("")) && - (request.getParameter("datepicker2") != null) && - (!request.getParameter("datepicker2").trim().equals(""))) { - try { - DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser(); - DateTime date1 = parser.parseDateTime(request.getParameter("datepicker1")); - DateTime date2 = parser.parseDateTime(request.getParameter("datepicker2")); - long date1Millis = date1.getMillis(); - long date2Millis = date2.getMillis(); - // if same dateTime is set by both pickers, then add a full day of milliseconds to picker2 to cover the entire day - date2Millis += (24 * 60 * 60 * 1000 - 1); - - prettyPrint.append("Dates between: " + date1.toString(ISODateTimeFormat.date()) + - " and " + date2.toString(ISODateTimeFormat.date()) + "
"); - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "((dateInMilliseconds >= " + date1Millis + - ") && (dateInMilliseconds <= " + date2Millis + "))"; + // filter by alive/dead status-------------------------------------------------------------------------------------- + // submitter or photographer name filter------------------------------------------ + if ((request.getParameter("nameField") != null) && + (!request.getParameter("nameField").equals(""))) { + String nameString = request.getParameter("nameField").replaceAll("%20", + " ").toLowerCase().trim(); + String filterString = "" + "(" + + "(submitters.contains(submitter) && ((submitter.fullName.toLowerCase().indexOf('" + + nameString + "') != -1)||(submitter.emailAddress.toLowerCase().indexOf('" + + nameString + "') != -1))) || " + + "(photographers.contains(photographer) && ((photographer.fullName.toLowerCase().indexOf('" + + nameString + "') != -1)||(photographer.emailAddress.toLowerCase().indexOf('" + + nameString + "') != -1))) " + + "||(informOthers.contains(other) && ((other.fullName.toLowerCase().indexOf('" + + nameString + "') != -1)||(other.emailAddress.toLowerCase().indexOf('" + + nameString + "') != -1)))" + ")"; + if (jdoqlVariableDeclaration.equals("")) { + jdoqlVariableDeclaration = + " VARIABLES org.ecocean.User submitter;org.ecocean.User photographer;org.ecocean.User other"; } else { - filter += " && ((dateInMilliseconds >= " + date1Millis + - ") && (dateInMilliseconds <= " + date2Millis + "))"; + if (!jdoqlVariableDeclaration.contains("org.ecocean.User submitter")) { + jdoqlVariableDeclaration += ";org.ecocean.User submitter"; + } + if (!jdoqlVariableDeclaration.contains("org.ecocean.User photographer")) { + jdoqlVariableDeclaration += ";org.ecocean.User photographer"; + } + if (!jdoqlVariableDeclaration.contains("org.ecocean.User other")) { + jdoqlVariableDeclaration += ";org.ecocean.User other"; + } } - } catch (Exception e) { e.printStackTrace(); } - } - // end date filter------------------------------------------ - // start date added filter---------------------------- - if ((request.getParameter("dateaddedpicker1") != null) && - (!request.getParameter("dateaddedpicker1").trim().equals("")) && - (request.getParameter("dateaddedpicker2") != null) && - (!request.getParameter("dateaddedpicker2").trim().equals(""))) { - try { - DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser(); - DateTime date1 = parser.parseDateTime(request.getParameter("dateaddedpicker1")); - DateTime date2 = parser.parseDateTime(request.getParameter("dateaddedpicker2")); - - prettyPrint.append("Encounter creation dates between: " + - date1.toString(ISODateTimeFormat.date()) + " and " + - date2.toString(ISODateTimeFormat.date()) + "
"); if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += "((dwcDateAddedLong >= " + date1.getMillis() + - ") && (dwcDateAddedLong <= " + date2.getMillis() + "))"; - } else { - filter += " && ((dwcDateAddedLong >= " + date1.getMillis() + - ") && (dwcDateAddedLong <= " + date2.getMillis() + "))"; + filter += filterString; + } else { filter += (" && " + filterString); } + prettyPrint.append("Related fullName or emailAddress contains: \"" + nameString + + "\"
"); + } + // end name and email filter-------------------------------------------------------------------------------------- + // additional comments filter------------------------------------------ + if ((request.getParameter("additionalCommentsField") != null) && + (!request.getParameter("additionalCommentsField").equals(""))) { + String nameString = request.getParameter("additionalCommentsField").replaceAll( + "%20", " ").toLowerCase().trim(); + String filterString = "(occurrenceRemarks.toLowerCase().indexOf('" + nameString + + "') != -1)"; + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += filterString; + } else { filter += (" && " + filterString); } + prettyPrint.append("Remarks contains: \"" + nameString + "\"
"); + } + // end additional comments filter-------------------------------------------------------------------------------------- + // start date filter---------------------------- + if ((request.getParameter("datepicker1") != null) && + (!request.getParameter("datepicker1").trim().equals("")) && + (request.getParameter("datepicker2") != null) && + (!request.getParameter("datepicker2").trim().equals(""))) { + try { + DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser(); + DateTime date1 = parser.parseDateTime(request.getParameter("datepicker1")); + DateTime date2 = parser.parseDateTime(request.getParameter("datepicker2")); + long date1Millis = date1.getMillis(); + long date2Millis = date2.getMillis(); + // if same dateTime is set by both pickers, then add a full day of milliseconds to picker2 to cover the entire day + date2Millis += (24 * 60 * 60 * 1000 - 1); + + prettyPrint.append("Dates between: " + + date1.toString(ISODateTimeFormat.date()) + " and " + + date2.toString(ISODateTimeFormat.date()) + "
"); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "((dateInMilliseconds >= " + date1Millis + + ") && (dateInMilliseconds <= " + date2Millis + "))"; + } else { + filter += " && ((dateInMilliseconds >= " + date1Millis + + ") && (dateInMilliseconds <= " + date2Millis + "))"; + } + } catch (Exception e) { e.printStackTrace(); } + } + // end date filter------------------------------------------ + // start date added filter---------------------------- + if ((request.getParameter("dateaddedpicker1") != null) && + (!request.getParameter("dateaddedpicker1").trim().equals("")) && + (request.getParameter("dateaddedpicker2") != null) && + (!request.getParameter("dateaddedpicker2").trim().equals(""))) { + try { + DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser(); + DateTime date1 = parser.parseDateTime(request.getParameter("dateaddedpicker1")); + DateTime date2 = parser.parseDateTime(request.getParameter("dateaddedpicker2")); + + prettyPrint.append("Encounter creation dates between: " + + date1.toString(ISODateTimeFormat.date()) + " and " + + date2.toString(ISODateTimeFormat.date()) + "
"); + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += "((dwcDateAddedLong >= " + date1.getMillis() + + ") && (dwcDateAddedLong <= " + date2.getMillis() + "))"; + } else { + filter += " && ((dwcDateAddedLong >= " + date1.getMillis() + + ") && (dwcDateAddedLong <= " + date2.getMillis() + "))"; + } + } catch (NumberFormatException nfe) { + // do nothing, just skip on + nfe.printStackTrace(); } - } catch (NumberFormatException nfe) { - // do nothing, just skip on - nfe.printStackTrace(); - } - } - // end date added filter------------------------------------------ - // filter for sex------------------------------------------ - if ((request.getParameter("male") != null) || (request.getParameter("female") != null) || - (request.getParameter("unknown") != null)) { - System.out.println("Filter at beginning of sex filtering: " + filter); - if (request.getParameter("male") == null) { - filter = filterWithCondition(filter, "!sex.startsWith('male')"); - prettyPrint.append("Sex is not male.
"); } - if (request.getParameter("female") == null) { - filter = filterWithCondition(filter, "!sex.startsWith('female')"); - prettyPrint.append("Sex is not female.
"); - } - if (request.getParameter("unknown") == null) { - filter = filterWithCondition(filter, "!sex.startsWith('unknown') && sex != null"); - prettyPrint.append("Sex is not unknown.
"); - } - System.out.println("Filter at end of sex filtering: " + filter); - } - // filter by sex-------------------------------------------------------------------------------------- - String releaseDateFromStr = request.getParameter("releaseDateFrom"); - String releaseDateToStr = request.getParameter("releaseDateTo"); - String pattern = CommonConfiguration.getProperty("releaseDateFormat", context); - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); - if (releaseDateFromStr != null && releaseDateFromStr.trim().length() > 0) { - try { - Date releaseDateFrom = simpleDateFormat.parse(releaseDateFromStr); - if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += " && "; + // end date added filter------------------------------------------ + // filter for sex------------------------------------------ + if ((request.getParameter("male") != null) || + (request.getParameter("female") != null) || + (request.getParameter("unknown") != null)) { + System.out.println("Filter at beginning of sex filtering: " + filter); + if (request.getParameter("male") == null) { + filter = filterWithCondition(filter, "!sex.startsWith('male')"); + prettyPrint.append("Sex is not male.
"); + } + if (request.getParameter("female") == null) { + filter = filterWithCondition(filter, "!sex.startsWith('female')"); + prettyPrint.append("Sex is not female.
"); + } + if (request.getParameter("unknown") == null) { + filter = filterWithCondition(filter, + "!sex.startsWith('unknown') && sex != null"); + prettyPrint.append("Sex is not unknown.
"); + } + System.out.println("Filter at end of sex filtering: " + filter); + } + // filter by sex-------------------------------------------------------------------------------------- + String releaseDateFromStr = request.getParameter("releaseDateFrom"); + String releaseDateToStr = request.getParameter("releaseDateTo"); + String pattern = CommonConfiguration.getProperty("releaseDateFormat", context); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); + if (releaseDateFromStr != null && releaseDateFromStr.trim().length() > 0) { + try { + Date releaseDateFrom = simpleDateFormat.parse(releaseDateFromStr); + if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += " && "; + } + filter += "(releaseDate >= releaseDateFrom)"; + parameterDeclaration = updateParametersDeclaration(parameterDeclaration, + "java.util.Date releaseDateFrom"); + paramMap.put("releaseDateFrom", releaseDateFrom); + prettyPrint.append("release date >= " + + simpleDateFormat.format(releaseDateFrom)); + } catch (Exception e) { + e.printStackTrace(); } - filter += "(releaseDate >= releaseDateFrom)"; - parameterDeclaration = updateParametersDeclaration(parameterDeclaration, - "java.util.Date releaseDateFrom"); - paramMap.put("releaseDateFrom", releaseDateFrom); - prettyPrint.append("release date >= " + simpleDateFormat.format(releaseDateFrom)); - } catch (Exception e) { - e.printStackTrace(); } - } - if (releaseDateToStr != null && releaseDateToStr.trim().length() > 0) { - try { - Date releaseDateTo = simpleDateFormat.parse(releaseDateToStr); - if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter += " && "; + if (releaseDateToStr != null && releaseDateToStr.trim().length() > 0) { + try { + Date releaseDateTo = simpleDateFormat.parse(releaseDateToStr); + if (!filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter += " && "; + } + filter += "(releaseDate <= releaseDateTo)"; + parameterDeclaration = updateParametersDeclaration(parameterDeclaration, + "java.util.Date releaseDateTo"); + paramMap.put("releaseDateTo", releaseDateTo); + prettyPrint.append("releaseDate <= " + simpleDateFormat.format(releaseDateTo)); + } catch (Exception e) { + e.printStackTrace(); } - filter += "(releaseDate <= releaseDateTo)"; - parameterDeclaration = updateParametersDeclaration(parameterDeclaration, - "java.util.Date releaseDateTo"); - paramMap.put("releaseDateTo", releaseDateTo); - prettyPrint.append("releaseDate <= " + simpleDateFormat.format(releaseDateTo)); - } catch (Exception e) { - e.printStackTrace(); } - } - for (String fieldName : SIMPLE_STRING_FIELDS) - filter = QueryProcessor.filterWithBasicStringField(filter, fieldName, request, - prettyPrint); - filter = filterWithGpsBox("decimalLatitude", "decimalLongitude", filter, request); - // end GPS filters----------------------------------------------- - if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { - filter = "SELECT FROM org.ecocean.Encounter WHERE catalogNumber != null"; - } - filter += jdoqlVariableDeclaration; - - filter += parameterDeclaration; - System.out.println("EncounterQueryProcessor filter: " + filter); + for (String fieldName : SIMPLE_STRING_FIELDS) + filter = QueryProcessor.filterWithBasicStringField(filter, fieldName, request, + prettyPrint); + filter = filterWithGpsBox("decimalLatitude", "decimalLongitude", filter, request); + // end GPS filters----------------------------------------------- + if (filter.equals(SELECT_FROM_ORG_ECOCEAN_ENCOUNTER_WHERE)) { + filter = "SELECT FROM org.ecocean.Encounter WHERE catalogNumber != null"; + } + filter += jdoqlVariableDeclaration; + filter += parameterDeclaration; + System.out.println("EncounterQueryProcessor filter: " + filter); + } catch (Exception ex) { + System.out.println("Shepherd usage caught: " + ex); + ex.printStackTrace(); + } finally { + myShepherd.rollbackAndClose(); + } return filter; } diff --git a/src/main/java/org/ecocean/Occurrence.java b/src/main/java/org/ecocean/Occurrence.java index 1f4cce4a65..f267d6cb54 100644 --- a/src/main/java/org/ecocean/Occurrence.java +++ b/src/main/java/org/ecocean/Occurrence.java @@ -1370,7 +1370,7 @@ public void run() { try { Occurrence occur = bgShepherd.getOccurrence(occurId); if ((occur == null) || (occur.getEncounters() == null)) { - bgShepherd.rollbackAndClose(); + // rollbackAndClose handled by finally executor.shutdown(); return; } diff --git a/src/main/java/org/ecocean/api/SiteSettings.java b/src/main/java/org/ecocean/api/SiteSettings.java index 898e612eb5..696208dac2 100644 --- a/src/main/java/org/ecocean/api/SiteSettings.java +++ b/src/main/java/org/ecocean/api/SiteSettings.java @@ -47,6 +47,9 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) // note: there is a CommonConfiguration property: htmlShortcutIcon=images/favicon.ico?v=2 settings.put("siteFavicon", "/images/favicon.ico"); settings.put("siteName", CommonConfiguration.getHTMLTitle(context)); + settings.put("siteDescription", CommonConfiguration.getHTMLDescription(context)); + settings.put("siteKeywords", CommonConfiguration.getHTMLKeywords(context)); + settings.put("siteAuthor", CommonConfiguration.getHTMLAuthor(context)); settings.put("locationData", LocationID.getLocationIDStructure()); settings.put("mapCenterLat", CommonConfiguration.getCenterLat(context)); diff --git a/src/main/java/org/ecocean/servlet/IndividualRemoveEncounter.java b/src/main/java/org/ecocean/servlet/IndividualRemoveEncounter.java index d3a1cd8167..b9a8630b1a 100644 --- a/src/main/java/org/ecocean/servlet/IndividualRemoveEncounter.java +++ b/src/main/java/org/ecocean/servlet/IndividualRemoveEncounter.java @@ -107,7 +107,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) } if (!locked) { myShepherd.commitDBTransaction(); - if (enc2remove != null) enc2remove.opensearchIndexDeep(); + //if (enc2remove != null) enc2remove.opensearchIndexDeep(); out.println(ServletUtilities.getHeader(request)); response.setStatus(HttpServletResponse.SC_OK); out.println("Success: Encounter #" + diff --git a/src/main/java/org/ecocean/servlet/OccurrenceRemoveEncounter.java b/src/main/java/org/ecocean/servlet/OccurrenceRemoveEncounter.java index b6dc7c135e..97d8c18853 100644 --- a/src/main/java/org/ecocean/servlet/OccurrenceRemoveEncounter.java +++ b/src/main/java/org/ecocean/servlet/OccurrenceRemoveEncounter.java @@ -83,7 +83,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) if (!locked) { myShepherd.commitDBTransaction(); // out.println(ServletUtilities.getHeader(request)); - if (enc2remove != null) enc2remove.opensearchIndexDeep(); + //if (enc2remove != null) enc2remove.opensearchIndexDeep(); out.println("Success: Encounter " + request.getParameter("number") + " was successfully removed from occurrence " + old_name + "."); diff --git a/src/main/java/org/ecocean/servlet/SubmitSpotsAndImage.java b/src/main/java/org/ecocean/servlet/SubmitSpotsAndImage.java index 2965eafea8..c83dc2d505 100644 --- a/src/main/java/org/ecocean/servlet/SubmitSpotsAndImage.java +++ b/src/main/java/org/ecocean/servlet/SubmitSpotsAndImage.java @@ -50,132 +50,133 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) myShepherd.setAction("SubmitSpotsAndImage.class"); myShepherd.beginDBTransaction(); - JSONObject json = ServletUtilities.jsonFromHttpServletRequest(request); - int maId = json.optInt("mediaAssetId", -1); - if (maId < 0) { - myShepherd.rollbackDBTransaction(); - myShepherd.closeDBTransaction(); - throw new IOException("invalid mediaAssetId"); - } - String encId = json.optString("encId", null); - if (encId == null) { - myShepherd.rollbackDBTransaction(); - myShepherd.closeDBTransaction(); - throw new IOException("invalid encId"); - } - Encounter enc = myShepherd.getEncounter(encId); - if (enc == null) { - myShepherd.rollbackDBTransaction(); - myShepherd.closeDBTransaction(); - throw new IOException("invalid encId"); - } - boolean rightSide = json.optBoolean("rightSide", false); - ArrayList spots = parseSpots(json.optJSONArray("spots")); - if (spots == null) { - myShepherd.rollbackDBTransaction(); - myShepherd.closeDBTransaction(); - throw new IOException("invalid spots"); - } - ArrayList refSpots = parseSpots(json.optJSONArray("refSpots")); - if (refSpots == null) { - myShepherd.rollbackDBTransaction(); - myShepherd.closeDBTransaction(); - throw new IOException("invalid refSpots"); - } - AssetStore store = AssetStore.getDefault(myShepherd); - // this should put it in the same old (pre-MediaAsset) location to maintain url pattern - - // setup data dir - String rootWebappPath = getServletContext().getRealPath("/"); - File webappsDir = new File(rootWebappPath).getParentFile(); - File shepherdDataDir = new File(webappsDir, - CommonConfiguration.getDataDirectoryName(context)); - // if(!shepherdDataDir.exists()){shepherdDataDir.mkdirs();} - // File encountersDir=new File(shepherdDataDir.getAbsolutePath()+"/encounters"); - // if(!encountersDir.exists()){encountersDir.mkdirs();} - String thisEncDirString = Encounter.dir(shepherdDataDir, encId); - File thisEncounterDir = new File(thisEncDirString); - if (!thisEncounterDir.exists()) { - thisEncounterDir.mkdirs(); - System.out.println("I am making the encDir: " + thisEncDirString); - } - // now persist - JSONObject params = store.createParameters(new File("encounters/" + - Encounter.subdir(encId) + "/extract" + (rightSide ? "Right" : "") + encId + ".jpg")); - System.out.println("====> params = " + params); - MediaAsset crMa = store.create(params); - crMa.copyInBase64(json.optString("imageData", null)); - crMa.addLabel("_spot" + (rightSide ? "Right" : "")); // we are sticking with "legacy" '_spot' for left - // crMa.setParentId(maId); - crMa.addDerivationMethod("spotTool", json.optJSONObject("imageToolValues")); - // ma.updateMinimalMetadata(); + + try{ + JSONObject json = ServletUtilities.jsonFromHttpServletRequest(request); + int maId = json.optInt("mediaAssetId", -1); + if (maId < 0) { + throw new IOException("invalid mediaAssetId"); + } + String encId = json.optString("encId", null); + if (encId == null) { + throw new IOException("invalid encId"); + } + Encounter enc = myShepherd.getEncounter(encId); + if (enc == null) { + throw new IOException("invalid encId"); + } + boolean rightSide = json.optBoolean("rightSide", false); + ArrayList spots = parseSpots(json.optJSONArray("spots")); + if (spots == null) { + throw new IOException("invalid spots"); + } + ArrayList refSpots = parseSpots(json.optJSONArray("refSpots")); + if (refSpots == null) { + throw new IOException("invalid refSpots"); + } + AssetStore store = AssetStore.getDefault(myShepherd); + // this should put it in the same old (pre-MediaAsset) location to maintain url pattern + + // setup data dir + String rootWebappPath = getServletContext().getRealPath("/"); + File webappsDir = new File(rootWebappPath).getParentFile(); + File shepherdDataDir = new File(webappsDir, + CommonConfiguration.getDataDirectoryName(context)); + // if(!shepherdDataDir.exists()){shepherdDataDir.mkdirs();} + // File encountersDir=new File(shepherdDataDir.getAbsolutePath()+"/encounters"); + // if(!encountersDir.exists()){encountersDir.mkdirs();} + String thisEncDirString = Encounter.dir(shepherdDataDir, encId); + File thisEncounterDir = new File(thisEncDirString); + if (!thisEncounterDir.exists()) { + thisEncounterDir.mkdirs(); + System.out.println("I am making the encDir: " + thisEncDirString); + } + // now persist + JSONObject params = store.createParameters(new File("encounters/" + + Encounter.subdir(encId) + "/extract" + (rightSide ? "Right" : "") + encId + ".jpg")); + System.out.println("====> params = " + params); + MediaAsset crMa = store.create(params); + crMa.copyInBase64(json.optString("imageData", null)); + crMa.addLabel("_spot" + (rightSide ? "Right" : "")); // we are sticking with "legacy" '_spot' for left + // crMa.setParentId(maId); + crMa.addDerivationMethod("spotTool", json.optJSONObject("imageToolValues")); + // ma.updateMinimalMetadata(); + + Keyword crKeyword = myShepherd.getOrCreateKeyword("CR Image"); + String crParentId = request.getParameter("dataCollectionEventID"); + // crMa.addDerivationMethod("crParentId", crParentId); + // crMa.addLabel("CR"); + crMa.addKeyword(crKeyword); + crMa.updateMinimalMetadata(); + crMa.setDetectionStatus("complete"); + System.out.println(" + updated made media asset"); + MediaAssetFactory.save(crMa, myShepherd); + System.out.println(" + saved media asset " + crMa.toString()); + myShepherd.updateDBTransaction(); + System.out.println(" + updated transaction, about to make children"); + crMa.updateStandardChildren(myShepherd); + crMa.updateMetadata(); + System.out.println(" + updated children for asset " + crMa.toString() + + "; hasFamily = " + crMa.hasFamily(myShepherd)); + String speciesString = enc.getTaxonomyString(); + Annotation ann = new Annotation(speciesString, crMa); + ann.setMatchAgainst(true); + String iaClass = "whalesharkCR"; // should we change this? + ann.setIAClass(iaClass); + if (rightSide) { ann.setViewpoint("right"); } else { ann.setViewpoint("left"); } + enc.addAnnotation(ann); + System.out.println(" + made annotation " + ann.toString()); - Keyword crKeyword = myShepherd.getOrCreateKeyword("CR Image"); - String crParentId = request.getParameter("dataCollectionEventID"); - // crMa.addDerivationMethod("crParentId", crParentId); - // crMa.addLabel("CR"); - crMa.addKeyword(crKeyword); - crMa.updateMinimalMetadata(); - crMa.setDetectionStatus("complete"); - System.out.println(" + updated made media asset"); - MediaAssetFactory.save(crMa, myShepherd); - System.out.println(" + saved media asset " + crMa.toString()); - myShepherd.updateDBTransaction(); - System.out.println(" + updated transaction, about to make children"); - crMa.updateStandardChildren(myShepherd); - crMa.updateMetadata(); - System.out.println(" + updated children for asset " + crMa.toString() + - "; hasFamily = " + crMa.hasFamily(myShepherd)); - String speciesString = enc.getTaxonomyString(); - Annotation ann = new Annotation(speciesString, crMa); - ann.setMatchAgainst(true); - String iaClass = "whalesharkCR"; // should we change this? - ann.setIAClass(iaClass); - if (rightSide) { ann.setViewpoint("right"); } else { ann.setViewpoint("left"); } - enc.addAnnotation(ann); - System.out.println(" + made annotation " + ann.toString()); - myShepherd.getPM().makePersistent(ann); - System.out.println(" + saved annotation"); - // we need to intake mediaassets so they get acmIds and are matchable - ArrayList maList = new ArrayList(); - maList.add(crMa); - ArrayList annList = new ArrayList(); - annList.add(ann); - try { - System.out.println(" + sending asset to IA"); - IBEISIA.sendMediaAssetsNew(maList, context); - myShepherd.updateDBTransaction(); - System.out.println(" + asset sent, sending annot"); - IBEISIA.sendAnnotationsNew(annList, context, myShepherd); - myShepherd.updateDBTransaction(); - System.out.println(" + annot sent."); - } catch (Exception e) { - e.printStackTrace(); - System.out.println("hit above exception while trying to send CR ma & annot to IA"); + myShepherd.getPM().makePersistent(ann); + System.out.println(" + saved annotation"); + + // we need to intake mediaassets so they get acmIds and are matchable + ArrayList maList = new ArrayList(); + maList.add(crMa); + ArrayList annList = new ArrayList(); + annList.add(ann); + try { + System.out.println(" + sending asset to IA"); + IBEISIA.sendMediaAssetsNew(maList, context); + myShepherd.updateDBTransaction(); + System.out.println(" + asset sent, sending annot"); + IBEISIA.sendAnnotationsNew(annList, context, myShepherd); + myShepherd.updateDBTransaction(); + System.out.println(" + annot sent."); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("hit above exception while trying to send CR ma & annot to IA"); + } + System.out.println(" + done processing new CR annot"); + if (rightSide) { + enc.setRightSpots(spots); + enc.setRightReferenceSpots(refSpots); + } else { + enc.setSpots(spots); + enc.setLeftReferenceSpots(refSpots); + } + // reset the entry in the GridManager graph + GridManager gm = GridManagerFactory.getGridManager(); + gm.addMatchGraphEntry(encId, new EncounterLite(enc)); + + myShepherd.commitDBTransaction(); + myShepherd.closeDBTransaction(); + + JSONObject rtn = new JSONObject("{\"success\": true}"); + rtn.put("spotAssetId", crMa.getId()); + rtn.put("spotAssetUrl", crMa.webURL()); + response.setContentType("text/plain"); + PrintWriter out = response.getWriter(); + out.println(rtn.toString()); + out.close(); } - System.out.println(" + done processing new CR annot"); - if (rightSide) { - enc.setRightSpots(spots); - enc.setRightReferenceSpots(refSpots); - } else { - enc.setSpots(spots); - enc.setLeftReferenceSpots(refSpots); + catch(Exception e) { + e.printStackTrace(); + } + finally { + myShepherd.rollbackAndClose(); } - // reset the entry in the GridManager graph - GridManager gm = GridManagerFactory.getGridManager(); - gm.addMatchGraphEntry(encId, new EncounterLite(enc)); - - myShepherd.commitDBTransaction(); - myShepherd.closeDBTransaction(); - - JSONObject rtn = new JSONObject("{\"success\": true}"); - rtn.put("spotAssetId", crMa.getId()); - rtn.put("spotAssetUrl", crMa.webURL()); - response.setContentType("text/plain"); - PrintWriter out = response.getWriter(); - out.println(rtn.toString()); - out.close(); } private ArrayList parseSpots(JSONArray arr) {