diff --git a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/adapter.controller.js b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/adapter.controller.js index 30df3762d..19e6191c5 100644 --- a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/adapter.controller.js +++ b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/adapter.controller.js @@ -1,73 +1,84 @@ (function () { 'use strict'; // -- register conroller with angular -- // angular.module('shrine-tools') .controller('AdapterController', AdapterController); /** * * @type {string[]} */ AdapterController.$inject = ['$app', '$log']; function AdapterController ($app, $log) { var vm = this; init(); function init () { $app.model.getAdapter() .then(setAdapter, handleFailure) .then($app.model.getI2B2) .then(setI2B2, handleFailure); $app.model.getSummary() .then(setSummary, handleFailure); } function handleFailure(failure) { // TODO: HANDLE FAILURE $log.error(JSON.stringify(failure)); } function setSummary (summary) { vm.adapter = { term: summary.ontologyTerm, //config.networkStatusQuery, success: summary.queryResult.response.problemDigest === undefined }; if (summary.queryResult.response.problemDigest !== undefined) { vm.adapter.errorData = summary.queryResult.response.problemDigest; } else { //TODO FIGURE OUT THE CORRECT FIELDS FOR SUCCESSFUL QUERY RESULT vm.adapter.description = summary.queryResult.response.singleNodeResult.setSize; vm.adapter.description += ' '; vm.adapter.description += summary.queryResult.response.singleNodeResult.resultType .i2b2Options.description; } } + + function formatDate(maybeEpoch) { + if (!(maybeEpoch && isFinite(maybeEpoch))) { + return 'UNKNOWN'; + } else { + var d = new Date(maybeEpoch); + return d.toUTCString(); + } + } + function setAdapter (adapter) { vm.mappings = { - mappingsFilename: adapter.adapterMappingsFilename + mappingsFilename: adapter.adapterMappingsFilename, + mappingsDate: formatDate(adapter.adapterMappingsDate) }; vm.configuration = { crcEndpointURL: adapter.crcEndpointUrl, crcProjectId: "", //config.hiveCredentials.crcProjectId, domain: "", //config.hiveCredentials.domain, username: "", //config.hiveCredentials.username, password: "REDACTED", //config.hiveCredentials.password, lockoutThreshold: adapter.adapterLockoutAttemptsThreshold }; } function setI2B2 (i2b2) { vm.configuration.crcProjectId = i2b2.crcProject; vm.configuration.domain = i2b2.i2b2Domain; vm.configuration.username = i2b2.username; } } })(); diff --git a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/adapter.tpl.html b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/adapter.tpl.html index 88cec6157..538372485 100644 --- a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/adapter.tpl.html +++ b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/adapter.tpl.html @@ -1,155 +1,163 @@ <div> <table class="table table-striped"> <thead> <tr> <td colspan="2"> Adapter Configuration </td> </tr> <tr> <td colspan="2"> <i>These are the parameters that the SHRINE Adapter will use for querying the i2b2 CRC.</i> </td> </tr> </thead> <tbody> <tr> <td> CRC URL </td> <td> {{vm.configuration.crcEndpointURL}} </td> </tr> <tr> <td> CRC Project </td> <td> {{vm.configuration.crcProjectId}} </td> </tr> <tr> <td> Domain </td> <td> {{vm.configuration.domain}} </td> </tr> <tr> <td> Adapter User </td> <td> {{vm.configuration.username}} </td> </tr> <tr> <td> Adapter Password </td> <td> {{vm.configuration.password}} </td> </tr> <tr> <td> Lockout Threshold </td> <td> {{vm.configuration.lockoutThreshold}} </td> </tr> </tbody> </table> <table class="table table-striped"> <thead> <tr> <td colspan="2"> Adapter Query Test </td> </tr> </thead> <tbody> <tr> <td> SHRINE Query Term </td> <td> {{vm.adapter.term}} </td> </tr> <tr> <td> Status </td> <td ng-if="vm.adapter.success" style="color:green"> Success </td> <td ng-if="!vm.adapter.success" style="color:red"> Failed </td> </tr> <tr ng-if="vm.adapter.success"> <td> Details </td> <td ng-if="vm.adapter.success"> {{vm.adapter.description}} </td> </tr> <tr ng-if="!vm.adapter.success"> <td> Error Details </td> <td ng-if="!vm.adapter.success"> <div><b>Summary:</b></div> <div>{{vm.adapter.errorData.summary }}</div><br/> <div><b>Description:</b></div> <div>{{vm.adapter.errorData.description }}</div><br/> <div><i>For information on troubleshooting and resolution, check <a href="https://open.med.harvard.edu/wiki/display/SHRINE/{{vm.adapter.errorData.codec}}" target="_blank">the SHRINE Error Codex</a>.</i> </div> <br/> <div><b><i>Copy the text below and paste it in an email to your site administrator for a faster response.</i></b></div> <br/> <div><b>Technical Details:</b></div><pre style="margin-top:0">{{vm.adapter.errorData.description}}</pre><br/> <div><b>Codec:</b></div><pre style="margin-top:0">{{vm.adapter.errorData.codec }}</pre><br/> <div><b>Stamp:</b></div><pre style="margin-top:0">{{vm.adapter.errorData.stampText}}</pre><br/> <div><b>Stack Trace Name:</b></div><pre style="margin-top:0">{{vm.adapter.errorData.detailsXml.details.exception.name }}</pre><br/> <div><b>Stack Trace Message:</b></div><pre style="margin-top:0">{{vm.adapter.errorData.detailsXml.details.exception.message}}</pre><br/> </td> </tr> </tbody> </table> <table class="table table-striped"> <thead> <tr> <td colspan="2"> Mappings File </td> </tr> </thead> <tbody> <tr> <td> Filename </td> <td> {{vm.mappings.mappingsFilename}} </td> </tr> + <tr> + <td> + Last Modified + </td> + <td> + {{vm.mappings.mappingsDate}} + </td> + </tr> </tbody> </table> </div> \ No newline at end of file diff --git a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/summary.tpl.html b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/summary.tpl.html index 07c69c2b0..5b3546338 100644 --- a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/summary.tpl.html +++ b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/summary.tpl.html @@ -1,111 +1,111 @@ <div> <table class="table table-striped" ng-show="vm.summary"> <thead> <tr> <td colspan="2"> Version Info </td> </tr> </thead> <tbody> <tr> <td colspan="2"> This site is running SHRINE <span style="color:green">{{vm.summary.shrineVersion}}</span> built on <label>{{vm.summary.shrineBuildDate}}</label> </td> </tr> <tr> <td colspan="2"> - This site is currently using <label>{{vm.ontProject}}</label> ontology version <label>{{vm.summary.ontologyVersion}}</label> - <!--(based on concept term <label>{{vm.summary.ontologyTerm}}</label>)--> + This site is currently using <label>{{vm.ontProject}}</label> ontology version <label>{{vm.summary.ontologyVersion}}</label><br> + Based on concept term: <label>{{vm.summary.ontologyVersionTerm}}</label> </td> </tr> <tr> <td colspan="2"> This site is currently using <label>{{vm.summary.adapterMappingsFileName}}</label> for mappings, last edited on <label>{{vm.formatDate(vm.summary.adapterMappingsDate)}}</label> </td> </tr> </tbody> </table> <table class="table table-striped" ng-show="vm.summary"> <thead> <tr> <td colspan="2"> <label>System Health</label> </td> </tr> </thead> <tbody> <tr> <td> <label>Keystore:</label> </td> <td ng-if="vm.summary.keystoreOk !== true" class="error"> Error: <a ui-sref="diagnostic.keystore">click here for more details.</a> </td> <td ng-if="vm.summary.keystoreOk === true" class="ok"> OK </td> </tr> <tr> <td> <label>QEP:</label> </td> <td ng-if="vm.summary.qepOk !== true" class="error"> Error: <a ui-sref="diagnostic.qep">click here for more details.</a> </td> <td ng-if="vm.summary.qepOk === true" class="ok"> OK </td> </tr> <tr ng-if="vm.summary.isHub"> <td> <label>Hub:</label> </td> <td ng-if="vm.summary.hubOk !== true" class="error"> Error: <a ui-sref="diagnostic.hub">click here for more details.</a> </td> <td ng-if="vm.summary.hubOk === true" class="ok"> OK </td> </tr> <tr> <td> <label>Adapter:</label> </td> <td ng-if="vm.summary.adapterOk !== true" class="error"> Error: <a ui-sref="diagnostic.adapter">click here for more details.</a> </td> <td ng-if="vm.summary.adapterOk === true" class="ok"> OK </td> </tr> </tbody> </table> <table class="table table-striped" ng-show="vm.trustedHtml"> <thead> <tr> <td colspan="2" class="error"> Fatal SHRINE Error </td> </tr> </thead> <tbody> <tr> <td> <label>Technical Details:</label> </td> <td ng-bind-html="vm.trustedHtml"> </td> </tr> </tbody> </table> </div> \ No newline at end of file diff --git a/apps/dashboard-app/src/main/js/test/admin/status/summary.json b/apps/dashboard-app/src/main/js/test/admin/status/summary.json index 6d14ec6e6..72cbc6cdb 100644 --- a/apps/dashboard-app/src/main/js/test/admin/status/summary.json +++ b/apps/dashboard-app/src/main/js/test/admin/status/summary.json @@ -1,276 +1,277 @@ { "isHub": true, "shrineVersion": "1.22.2.0-SNAPSHOT", - "shrineBuildDate": "2016-09-27 15:43:25", - "ontologyVersion": "UNKNOWN", + "shrineBuildDate": "2016-10-13 14:25:07", + "ontologyVersion": "Unavailable due to: java.net.SocketTimeoutException: connect timed out", + "ontologyVersionTerm": "\\\\SHRINE\\SHRINE\\ONTOLOGYVERSION", "ontologyTerm": "\\\\SHRINE\\SHRINE\\Diagnoses\\Mental Illness\\Disorders usually diagnosed in infancy, childhood, or adolescence\\Pervasive developmental disorders\\Infantile autism, current or active state\\", "queryResult": { "elapsed": { - "length": 2162, + "length": 2561, "unit": {} }, "response": { "errorMessage": "An unanticipated problem encountered.", "problemDigest": { "codec": "net.shrine.problem.ProblemNotYetEncoded", - "stampText": "Mon Oct 03 15:51:14 EDT 2016 on TecRef-LT-7832AA Unknown", + "stampText": "Thu Oct 13 15:21:48 EDT 2016 on TecRef-LT-7832AA Unknown", "summary": "An unanticipated problem encountered.", "description": "This problem is not yet classified in Shrine source code. Please report the details to the Shrine dev team.", "detailsXml": { "details": { "exception": { "name": "java.lang.IllegalStateException", "message": "An unanticipated problem encountered.", "stacktrace": { - "line": "net.shrine.problem.ProblemNotYetEncoded.<init>(Problem.scala:204)", - "line": "net.shrine.problem.ProblemNotYetEncoded$.apply(Problem.scala:222)", + "line": "net.shrine.problem.ProblemNotYetEncoded.<init>(Problem.scala:211)", + "line": "net.shrine.problem.ProblemNotYetEncoded$.apply(Problem.scala:229)", "line": "net.shrine.adapter.Adapter.perform(Adapter.scala:48)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "line": "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:70)", "line": "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:78)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:32)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:31)", "line": "scala.Option.map(Option.scala:146)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "line": "scala.Option.orElse(Option.scala:289)", "line": "net.shrine.adapter.service.AdapterService.handleRequest(AdapterService.scala:29)", - "line": "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", - "line": "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", + "line": "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", "line": "scala.util.Try$.apply(Try.scala:192)", - "line": "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:349)", - "line": "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:339)", "line": "scala.Option.map(Option.scala:146)", - "line": "net.shrine.status.Summary$.apply(StatusJaxrs.scala:344)", - "line": "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:64)", + "line": "net.shrine.status.Summary$.apply(StatusJaxrs.scala:339)", + "line": "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:66)", "line": "net.shrine.status.StatusJaxrsTest.testSummary(StatusJaxrsTest.scala:50)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "line": "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "line": "java.lang.reflect.Method.invoke(Method.java:498)", "line": "org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)", "line": "org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)", "line": "org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)", "line": "org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)", "line": "org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)", "line": "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)", "line": "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)", "line": "org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)", "line": "org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)", "line": "org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)", "line": "org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)", "line": "org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)", "line": "org.junit.runners.ParentRunner.run(ParentRunner.java:363)", "line": "org.junit.runner.JUnitCore.run(JUnitCore.java:137)", "line": "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)", "line": "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)", "line": "com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)", "line": "com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "line": "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "line": "java.lang.reflect.Method.invoke(Method.java:498)", "line": "com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)", "exception": { "name": "org.squeryl.SquerylSQLException", - "message": "Exception while executing statement : Table \"SHRINE_QUERY\" not found; SQL statement:\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?)) [42102-191]\nerrorCode: 42102, sqlState: 42S02\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?))\njdbcParams:[ConstantStatementParam('ConstantTypedExpression:happy),ConstantStatementParam('ConstantTypedExpression:happy),ConstantStatementParam('ConstantTypedExpression:2016-10-03 15:50:14.221)]", + "message": "Exception while executing statement : Table \"SHRINE_QUERY\" not found; SQL statement:\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?)) [42102-191]\nerrorCode: 42102, sqlState: 42S02\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?))\njdbcParams:[ConstantStatementParam('ConstantTypedExpression:happy),ConstantStatementParam('ConstantTypedExpression:happy),ConstantStatementParam('ConstantTypedExpression:2016-10-13 15:20:48.169)]", "stacktrace": { "line": "org.squeryl.SquerylSQLException$.apply(KeyedEntity.scala:118)", "line": "org.squeryl.internals.DatabaseAdapter$class._exec(DatabaseAdapter.scala:361)", "line": "org.squeryl.internals.DatabaseAdapter$class.exec(DatabaseAdapter.scala:412)", "line": "org.squeryl.adapters.MySQLAdapter.exec(MySQLAdapter.scala:25)", "line": "org.squeryl.internals.DatabaseAdapter$class.executeQuery(DatabaseAdapter.scala:421)", "line": "org.squeryl.adapters.MySQLAdapter.executeQuery(MySQLAdapter.scala:25)", "line": "org.squeryl.dsl.AbstractQuery$$anon$1.<init>(AbstractQuery.scala:193)", "line": "org.squeryl.dsl.AbstractQuery.iterator(AbstractQuery.scala:187)", "line": "org.squeryl.Query$class.headOption(Query.scala:69)", "line": "org.squeryl.dsl.AbstractQuery.headOption(AbstractQuery.scala:27)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply$mcV$sp(SquerylAdapterDao.scala:240)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply(SquerylAdapterDao.scala:237)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply(SquerylAdapterDao.scala:237)", "line": "org.squeryl.AbstractSession$class.using(Session.scala:182)", "line": "org.squeryl.Session.using(Session.scala:101)", "line": "org.squeryl.Session.withinTransaction(Session.scala:128)", "line": "org.squeryl.dsl.QueryDsl$class.inTransaction(QueryDsl.scala:126)", "line": "net.shrine.dao.squeryl.SquerylEntryPoint$.inTransaction(SquerylEntryPoint.scala:12)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao.inTransaction(SquerylAdapterDao.scala:32)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1.apply(SquerylAdapterDao.scala:237)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1.apply(SquerylAdapterDao.scala:237)", "line": "scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)", "line": "scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao.checkIfBot(SquerylAdapterDao.scala:237)", "line": "net.shrine.adapter.RunQueryAdapter.processRequest(RunQueryAdapter.scala:67)", "line": "net.shrine.adapter.RunQueryAdapter.processRequest(RunQueryAdapter.scala:32)", "line": "net.shrine.adapter.Adapter.perform(Adapter.scala:33)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "line": "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:70)", "line": "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:78)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:32)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:31)", "line": "scala.Option.map(Option.scala:146)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "line": "scala.Option.orElse(Option.scala:289)", "line": "net.shrine.adapter.service.AdapterService.handleRequest(AdapterService.scala:29)", - "line": "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", - "line": "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", + "line": "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", "line": "scala.util.Try$.apply(Try.scala:192)", - "line": "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:349)", - "line": "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:339)", "line": "scala.Option.map(Option.scala:146)", - "line": "net.shrine.status.Summary$.apply(StatusJaxrs.scala:344)", - "line": "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:64)", + "line": "net.shrine.status.Summary$.apply(StatusJaxrs.scala:339)", + "line": "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:66)", "line": "net.shrine.status.StatusJaxrsTest.testSummary(StatusJaxrsTest.scala:50)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "line": "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "line": "java.lang.reflect.Method.invoke(Method.java:498)", "line": "org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)", "line": "org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)", "line": "org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)", "line": "org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)", "line": "org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)", "line": "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)", "line": "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)", "line": "org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)", "line": "org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)", "line": "org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)", "line": "org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)", "line": "org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)", "line": "org.junit.runners.ParentRunner.run(ParentRunner.java:363)", "line": "org.junit.runner.JUnitCore.run(JUnitCore.java:137)", "line": "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)", "line": "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)", "line": "com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)", "line": "com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "line": "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "line": "java.lang.reflect.Method.invoke(Method.java:498)", "line": "com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)", "exception": { "name": "org.h2.jdbc.JdbcSQLException", "message": "Table \"SHRINE_QUERY\" not found; SQL statement:\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?)) [42102-191]", "stacktrace": { "line": [ "org.h2.message.DbException.getJdbcSQLException(DbException.java:345)", "org.h2.message.DbException.get(DbException.java:179)", "org.h2.message.DbException.get(DbException.java:155)", "org.h2.command.Parser.readTableOrView(Parser.java:5349)", "org.h2.command.Parser.readTableFilter(Parser.java:1245)", "org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1884)", "org.h2.command.Parser.parseSelectSimple(Parser.java:2032)", "org.h2.command.Parser.parseSelectSub(Parser.java:1878)", "org.h2.command.Parser.parseSelectUnion(Parser.java:1699)", "org.h2.command.Parser.parseSelect(Parser.java:1687)", "org.h2.command.Parser.parsePrepared(Parser.java:443)", "org.h2.command.Parser.parse(Parser.java:315)", "org.h2.command.Parser.parse(Parser.java:287)", "org.h2.command.Parser.prepareCommand(Parser.java:252)", "org.h2.engine.Session.prepareLocal(Session.java:560)", "org.h2.engine.Session.prepareCommand(Session.java:501)", "org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)", "org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73)", "org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:276)", "org.squeryl.internals.DatabaseAdapter$class.prepareStatement(DatabaseAdapter.scala:416)", "org.squeryl.adapters.MySQLAdapter.prepareStatement(MySQLAdapter.scala:25)", "org.squeryl.internals.DatabaseAdapter$$anonfun$executeQuery$1.apply(DatabaseAdapter.scala:422)", "org.squeryl.internals.DatabaseAdapter$$anonfun$executeQuery$1.apply(DatabaseAdapter.scala:421)", "org.squeryl.internals.DatabaseAdapter$class._exec(DatabaseAdapter.scala:357)", "org.squeryl.internals.DatabaseAdapter$class.exec(DatabaseAdapter.scala:412)", "org.squeryl.adapters.MySQLAdapter.exec(MySQLAdapter.scala:25)", "org.squeryl.internals.DatabaseAdapter$class.executeQuery(DatabaseAdapter.scala:421)", "org.squeryl.adapters.MySQLAdapter.executeQuery(MySQLAdapter.scala:25)", "org.squeryl.dsl.AbstractQuery$$anon$1.<init>(AbstractQuery.scala:193)", "org.squeryl.dsl.AbstractQuery.iterator(AbstractQuery.scala:187)", "org.squeryl.Query$class.headOption(Query.scala:69)", "org.squeryl.dsl.AbstractQuery.headOption(AbstractQuery.scala:27)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply$mcV$sp(SquerylAdapterDao.scala:240)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply(SquerylAdapterDao.scala:237)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply(SquerylAdapterDao.scala:237)", "org.squeryl.AbstractSession$class.using(Session.scala:182)", "org.squeryl.Session.using(Session.scala:101)", "org.squeryl.Session.withinTransaction(Session.scala:128)", "org.squeryl.dsl.QueryDsl$class.inTransaction(QueryDsl.scala:126)", "net.shrine.dao.squeryl.SquerylEntryPoint$.inTransaction(SquerylEntryPoint.scala:12)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao.inTransaction(SquerylAdapterDao.scala:32)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1.apply(SquerylAdapterDao.scala:237)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1.apply(SquerylAdapterDao.scala:237)", "scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)", "scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao.checkIfBot(SquerylAdapterDao.scala:237)", "net.shrine.adapter.RunQueryAdapter.processRequest(RunQueryAdapter.scala:67)", "net.shrine.adapter.RunQueryAdapter.processRequest(RunQueryAdapter.scala:32)", "net.shrine.adapter.Adapter.perform(Adapter.scala:33)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:70)", "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:78)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:32)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:31)", "scala.Option.map(Option.scala:146)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "scala.Option.orElse(Option.scala:289)", "net.shrine.adapter.service.AdapterService.handleRequest(AdapterService.scala:29)", - "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", - "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", + "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", + "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", "scala.util.Try$.apply(Try.scala:192)", - "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:349)", - "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:344)", + "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:344)", + "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:339)", "scala.Option.map(Option.scala:146)", - "net.shrine.status.Summary$.apply(StatusJaxrs.scala:344)", - "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:64)", + "net.shrine.status.Summary$.apply(StatusJaxrs.scala:339)", + "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:66)", "net.shrine.status.StatusJaxrsTest.testSummary(StatusJaxrsTest.scala:50)", "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "java.lang.reflect.Method.invoke(Method.java:498)", "org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)", "org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)", "org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)", "org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)", "org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)", "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)", "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)", "org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)", "org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)", "org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)", "org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)", "org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)", "org.junit.runners.ParentRunner.run(ParentRunner.java:363)", "org.junit.runner.JUnitCore.run(JUnitCore.java:137)", "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)", "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)", "com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)", "com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)", "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "java.lang.reflect.Method.invoke(Method.java:498)", "com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)" ] } } } } } } } }, - "epoch": 1475524274253 + "epoch": 1476386508204 } }, "origin": { "name": "SHRINE Cell" } }, "adapterMappingsFileName": "AdapterMappings.xml", - "adapterMappingsDate": 1469822568000, + "adapterMappingsDate": 1476383131000, "adapterOk": true, "keystoreOk": true, "hubOk": false, "qepOk": true -} \ No newline at end of file +} diff --git a/apps/dashboard-app/src/test/resources/teststatus/summary b/apps/dashboard-app/src/test/resources/teststatus/summary index 6d14ec6e6..72cbc6cdb 100644 --- a/apps/dashboard-app/src/test/resources/teststatus/summary +++ b/apps/dashboard-app/src/test/resources/teststatus/summary @@ -1,276 +1,277 @@ { "isHub": true, "shrineVersion": "1.22.2.0-SNAPSHOT", - "shrineBuildDate": "2016-09-27 15:43:25", - "ontologyVersion": "UNKNOWN", + "shrineBuildDate": "2016-10-13 14:25:07", + "ontologyVersion": "Unavailable due to: java.net.SocketTimeoutException: connect timed out", + "ontologyVersionTerm": "\\\\SHRINE\\SHRINE\\ONTOLOGYVERSION", "ontologyTerm": "\\\\SHRINE\\SHRINE\\Diagnoses\\Mental Illness\\Disorders usually diagnosed in infancy, childhood, or adolescence\\Pervasive developmental disorders\\Infantile autism, current or active state\\", "queryResult": { "elapsed": { - "length": 2162, + "length": 2561, "unit": {} }, "response": { "errorMessage": "An unanticipated problem encountered.", "problemDigest": { "codec": "net.shrine.problem.ProblemNotYetEncoded", - "stampText": "Mon Oct 03 15:51:14 EDT 2016 on TecRef-LT-7832AA Unknown", + "stampText": "Thu Oct 13 15:21:48 EDT 2016 on TecRef-LT-7832AA Unknown", "summary": "An unanticipated problem encountered.", "description": "This problem is not yet classified in Shrine source code. Please report the details to the Shrine dev team.", "detailsXml": { "details": { "exception": { "name": "java.lang.IllegalStateException", "message": "An unanticipated problem encountered.", "stacktrace": { - "line": "net.shrine.problem.ProblemNotYetEncoded.<init>(Problem.scala:204)", - "line": "net.shrine.problem.ProblemNotYetEncoded$.apply(Problem.scala:222)", + "line": "net.shrine.problem.ProblemNotYetEncoded.<init>(Problem.scala:211)", + "line": "net.shrine.problem.ProblemNotYetEncoded$.apply(Problem.scala:229)", "line": "net.shrine.adapter.Adapter.perform(Adapter.scala:48)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "line": "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:70)", "line": "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:78)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:32)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:31)", "line": "scala.Option.map(Option.scala:146)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "line": "scala.Option.orElse(Option.scala:289)", "line": "net.shrine.adapter.service.AdapterService.handleRequest(AdapterService.scala:29)", - "line": "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", - "line": "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", + "line": "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", "line": "scala.util.Try$.apply(Try.scala:192)", - "line": "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:349)", - "line": "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:339)", "line": "scala.Option.map(Option.scala:146)", - "line": "net.shrine.status.Summary$.apply(StatusJaxrs.scala:344)", - "line": "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:64)", + "line": "net.shrine.status.Summary$.apply(StatusJaxrs.scala:339)", + "line": "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:66)", "line": "net.shrine.status.StatusJaxrsTest.testSummary(StatusJaxrsTest.scala:50)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "line": "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "line": "java.lang.reflect.Method.invoke(Method.java:498)", "line": "org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)", "line": "org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)", "line": "org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)", "line": "org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)", "line": "org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)", "line": "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)", "line": "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)", "line": "org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)", "line": "org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)", "line": "org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)", "line": "org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)", "line": "org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)", "line": "org.junit.runners.ParentRunner.run(ParentRunner.java:363)", "line": "org.junit.runner.JUnitCore.run(JUnitCore.java:137)", "line": "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)", "line": "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)", "line": "com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)", "line": "com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "line": "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "line": "java.lang.reflect.Method.invoke(Method.java:498)", "line": "com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)", "exception": { "name": "org.squeryl.SquerylSQLException", - "message": "Exception while executing statement : Table \"SHRINE_QUERY\" not found; SQL statement:\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?)) [42102-191]\nerrorCode: 42102, sqlState: 42S02\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?))\njdbcParams:[ConstantStatementParam('ConstantTypedExpression:happy),ConstantStatementParam('ConstantTypedExpression:happy),ConstantStatementParam('ConstantTypedExpression:2016-10-03 15:50:14.221)]", + "message": "Exception while executing statement : Table \"SHRINE_QUERY\" not found; SQL statement:\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?)) [42102-191]\nerrorCode: 42102, sqlState: 42S02\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?))\njdbcParams:[ConstantStatementParam('ConstantTypedExpression:happy),ConstantStatementParam('ConstantTypedExpression:happy),ConstantStatementParam('ConstantTypedExpression:2016-10-13 15:20:48.169)]", "stacktrace": { "line": "org.squeryl.SquerylSQLException$.apply(KeyedEntity.scala:118)", "line": "org.squeryl.internals.DatabaseAdapter$class._exec(DatabaseAdapter.scala:361)", "line": "org.squeryl.internals.DatabaseAdapter$class.exec(DatabaseAdapter.scala:412)", "line": "org.squeryl.adapters.MySQLAdapter.exec(MySQLAdapter.scala:25)", "line": "org.squeryl.internals.DatabaseAdapter$class.executeQuery(DatabaseAdapter.scala:421)", "line": "org.squeryl.adapters.MySQLAdapter.executeQuery(MySQLAdapter.scala:25)", "line": "org.squeryl.dsl.AbstractQuery$$anon$1.<init>(AbstractQuery.scala:193)", "line": "org.squeryl.dsl.AbstractQuery.iterator(AbstractQuery.scala:187)", "line": "org.squeryl.Query$class.headOption(Query.scala:69)", "line": "org.squeryl.dsl.AbstractQuery.headOption(AbstractQuery.scala:27)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply$mcV$sp(SquerylAdapterDao.scala:240)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply(SquerylAdapterDao.scala:237)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply(SquerylAdapterDao.scala:237)", "line": "org.squeryl.AbstractSession$class.using(Session.scala:182)", "line": "org.squeryl.Session.using(Session.scala:101)", "line": "org.squeryl.Session.withinTransaction(Session.scala:128)", "line": "org.squeryl.dsl.QueryDsl$class.inTransaction(QueryDsl.scala:126)", "line": "net.shrine.dao.squeryl.SquerylEntryPoint$.inTransaction(SquerylEntryPoint.scala:12)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao.inTransaction(SquerylAdapterDao.scala:32)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1.apply(SquerylAdapterDao.scala:237)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1.apply(SquerylAdapterDao.scala:237)", "line": "scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)", "line": "scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)", "line": "net.shrine.adapter.dao.squeryl.SquerylAdapterDao.checkIfBot(SquerylAdapterDao.scala:237)", "line": "net.shrine.adapter.RunQueryAdapter.processRequest(RunQueryAdapter.scala:67)", "line": "net.shrine.adapter.RunQueryAdapter.processRequest(RunQueryAdapter.scala:32)", "line": "net.shrine.adapter.Adapter.perform(Adapter.scala:33)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "line": "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:70)", "line": "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:78)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:32)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:31)", "line": "scala.Option.map(Option.scala:146)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "line": "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "line": "scala.Option.orElse(Option.scala:289)", "line": "net.shrine.adapter.service.AdapterService.handleRequest(AdapterService.scala:29)", - "line": "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", - "line": "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", + "line": "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", "line": "scala.util.Try$.apply(Try.scala:192)", - "line": "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:349)", - "line": "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:344)", + "line": "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:339)", "line": "scala.Option.map(Option.scala:146)", - "line": "net.shrine.status.Summary$.apply(StatusJaxrs.scala:344)", - "line": "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:64)", + "line": "net.shrine.status.Summary$.apply(StatusJaxrs.scala:339)", + "line": "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:66)", "line": "net.shrine.status.StatusJaxrsTest.testSummary(StatusJaxrsTest.scala:50)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "line": "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "line": "java.lang.reflect.Method.invoke(Method.java:498)", "line": "org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)", "line": "org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)", "line": "org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)", "line": "org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)", "line": "org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)", "line": "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)", "line": "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)", "line": "org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)", "line": "org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)", "line": "org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)", "line": "org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)", "line": "org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)", "line": "org.junit.runners.ParentRunner.run(ParentRunner.java:363)", "line": "org.junit.runner.JUnitCore.run(JUnitCore.java:137)", "line": "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)", "line": "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)", "line": "com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)", "line": "com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "line": "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "line": "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "line": "java.lang.reflect.Method.invoke(Method.java:498)", "line": "com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)", "exception": { "name": "org.h2.jdbc.JdbcSQLException", "message": "Table \"SHRINE_QUERY\" not found; SQL statement:\nSelect\n count(*) as c0\nFrom\n SHRINE_QUERY SHRINE_QUERY1\nWhere\n (((SHRINE_QUERY1.DOMAIN = ?) and (SHRINE_QUERY1.USERNAME = ?)) and (SHRINE_QUERY1.DATE_CREATED >= ?)) [42102-191]", "stacktrace": { "line": [ "org.h2.message.DbException.getJdbcSQLException(DbException.java:345)", "org.h2.message.DbException.get(DbException.java:179)", "org.h2.message.DbException.get(DbException.java:155)", "org.h2.command.Parser.readTableOrView(Parser.java:5349)", "org.h2.command.Parser.readTableFilter(Parser.java:1245)", "org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1884)", "org.h2.command.Parser.parseSelectSimple(Parser.java:2032)", "org.h2.command.Parser.parseSelectSub(Parser.java:1878)", "org.h2.command.Parser.parseSelectUnion(Parser.java:1699)", "org.h2.command.Parser.parseSelect(Parser.java:1687)", "org.h2.command.Parser.parsePrepared(Parser.java:443)", "org.h2.command.Parser.parse(Parser.java:315)", "org.h2.command.Parser.parse(Parser.java:287)", "org.h2.command.Parser.prepareCommand(Parser.java:252)", "org.h2.engine.Session.prepareLocal(Session.java:560)", "org.h2.engine.Session.prepareCommand(Session.java:501)", "org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)", "org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73)", "org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:276)", "org.squeryl.internals.DatabaseAdapter$class.prepareStatement(DatabaseAdapter.scala:416)", "org.squeryl.adapters.MySQLAdapter.prepareStatement(MySQLAdapter.scala:25)", "org.squeryl.internals.DatabaseAdapter$$anonfun$executeQuery$1.apply(DatabaseAdapter.scala:422)", "org.squeryl.internals.DatabaseAdapter$$anonfun$executeQuery$1.apply(DatabaseAdapter.scala:421)", "org.squeryl.internals.DatabaseAdapter$class._exec(DatabaseAdapter.scala:357)", "org.squeryl.internals.DatabaseAdapter$class.exec(DatabaseAdapter.scala:412)", "org.squeryl.adapters.MySQLAdapter.exec(MySQLAdapter.scala:25)", "org.squeryl.internals.DatabaseAdapter$class.executeQuery(DatabaseAdapter.scala:421)", "org.squeryl.adapters.MySQLAdapter.executeQuery(MySQLAdapter.scala:25)", "org.squeryl.dsl.AbstractQuery$$anon$1.<init>(AbstractQuery.scala:193)", "org.squeryl.dsl.AbstractQuery.iterator(AbstractQuery.scala:187)", "org.squeryl.Query$class.headOption(Query.scala:69)", "org.squeryl.dsl.AbstractQuery.headOption(AbstractQuery.scala:27)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply$mcV$sp(SquerylAdapterDao.scala:240)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply(SquerylAdapterDao.scala:237)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1$$anonfun$apply$2.apply(SquerylAdapterDao.scala:237)", "org.squeryl.AbstractSession$class.using(Session.scala:182)", "org.squeryl.Session.using(Session.scala:101)", "org.squeryl.Session.withinTransaction(Session.scala:128)", "org.squeryl.dsl.QueryDsl$class.inTransaction(QueryDsl.scala:126)", "net.shrine.dao.squeryl.SquerylEntryPoint$.inTransaction(SquerylEntryPoint.scala:12)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao.inTransaction(SquerylAdapterDao.scala:32)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1.apply(SquerylAdapterDao.scala:237)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao$$anonfun$checkIfBot$1.apply(SquerylAdapterDao.scala:237)", "scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)", "scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)", "net.shrine.adapter.dao.squeryl.SquerylAdapterDao.checkIfBot(SquerylAdapterDao.scala:237)", "net.shrine.adapter.RunQueryAdapter.processRequest(RunQueryAdapter.scala:67)", "net.shrine.adapter.RunQueryAdapter.processRequest(RunQueryAdapter.scala:32)", "net.shrine.adapter.Adapter.perform(Adapter.scala:33)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1$$anonfun$apply$2.apply(AdapterService.scala:33)", "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:70)", "net.shrine.adapter.service.AdapterService$.time(AdapterService.scala:78)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:32)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1$$anonfun$apply$1.apply(AdapterService.scala:31)", "scala.Option.map(Option.scala:146)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "net.shrine.adapter.service.AdapterService$$anonfun$handleRequest$1.apply(AdapterService.scala:31)", "scala.Option.orElse(Option.scala:289)", "net.shrine.adapter.service.AdapterService.handleRequest(AdapterService.scala:29)", - "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", - "net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:349)", + "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", + "net.shrine.status.Summary$$anonfun$19$$anonfun$20.apply(StatusJaxrs.scala:344)", "scala.util.Try$.apply(Try.scala:192)", - "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:349)", - "net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:344)", + "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:344)", + "net.shrine.status.Summary$$anonfun$19.apply(StatusJaxrs.scala:339)", "scala.Option.map(Option.scala:146)", - "net.shrine.status.Summary$.apply(StatusJaxrs.scala:344)", - "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:64)", + "net.shrine.status.Summary$.apply(StatusJaxrs.scala:339)", + "net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:66)", "net.shrine.status.StatusJaxrsTest.testSummary(StatusJaxrsTest.scala:50)", "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "java.lang.reflect.Method.invoke(Method.java:498)", "org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)", "org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)", "org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)", "org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)", "org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)", "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)", "org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)", "org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)", "org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)", "org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)", "org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)", "org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)", "org.junit.runners.ParentRunner.run(ParentRunner.java:363)", "org.junit.runner.JUnitCore.run(JUnitCore.java:137)", "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)", "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)", "com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)", "com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)", "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)", "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)", "java.lang.reflect.Method.invoke(Method.java:498)", "com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)" ] } } } } } } } }, - "epoch": 1475524274253 + "epoch": 1476386508204 } }, "origin": { "name": "SHRINE Cell" } }, "adapterMappingsFileName": "AdapterMappings.xml", - "adapterMappingsDate": 1469822568000, + "adapterMappingsDate": 1476383131000, "adapterOk": true, "keystoreOk": true, "hubOk": false, "qepOk": true -} \ No newline at end of file +} diff --git a/apps/shrine-app/src/main/scala/net/shrine/status/StatusJaxrs.scala b/apps/shrine-app/src/main/scala/net/shrine/status/StatusJaxrs.scala index ca4a1e798..37abfe0ff 100644 --- a/apps/shrine-app/src/main/scala/net/shrine/status/StatusJaxrs.scala +++ b/apps/shrine-app/src/main/scala/net/shrine/status/StatusJaxrs.scala @@ -1,445 +1,448 @@ package net.shrine.status import java.io.File import java.net.URL import java.security.MessageDigest import java.security.cert.X509Certificate import java.util.Date import javax.ws.rs.{GET, Path, Produces, WebApplicationException} import javax.ws.rs.core.{MediaType, Response} import com.sun.jersey.spi.container.{ContainerRequest, ContainerRequestFilter} import com.typesafe.config.{Config => TsConfig} import net.shrine.adapter.AdapterComponents import net.shrine.authorization.{QueryAuthorizationService, StewardQueryAuthorizationService} import net.shrine.broadcaster._ import net.shrine.client.PosterOntClient import net.shrine.wiring.ShrineOrchestrator import org.json4s.{DefaultFormats, Formats} import org.json4s.native.Serialization import net.shrine.log.{Log, Loggable} import scala.collection.JavaConverters._ import scala.collection.immutable.{Map, Seq, Set} import net.shrine.config.ConfigExtensions import net.shrine.crypto.{KeyStoreCertCollection, KeyStoreDescriptor, SigningCertStrategy} +import net.shrine.ont.data.OntClientOntologyMetadata import net.shrine.protocol.query.{OccuranceLimited, QueryDefinition, Term} import net.shrine.protocol._ import net.shrine.serialization.NodeSeqSerializer import net.shrine.util.Versions import scala.concurrent.Await import scala.util.{Success, Try} import scala.util.control.NonFatal /** * A subservice that shares internal state of the shrine servlet. * * @author david * @since 12/2/15 */ @Path("/internalstatus") @Produces(Array(MediaType.APPLICATION_JSON)) case class StatusJaxrs(shrineConfig:TsConfig) extends Loggable { implicit def json4sFormats: Formats = DefaultFormats + new NodeSeqSerializer @GET @Path("version") def version: String = { val version = Version("changeMe") val versionString = Serialization.write(version) versionString } @GET @Path("config") def config: String = { //todo probably better to reach out and grab the config from ManuallyWiredShrineJaxrsResources once it is a singleton Serialization.write(Json4sConfig(shrineConfig)) } @GET @Path("summary") def summary: String = { val summary = Summary() Serialization.write(summary) } @GET @Path("i2b2") def i2b2: String = { val i2b2 = I2b2() Serialization.write(i2b2) } @GET @Path("optionalParts") def optionalParts: String = { val optionalParts = OptionalParts() Serialization.write(optionalParts) } @GET @Path("hub") def hub: String = { val hub = Hub() Serialization.write(hub) } @GET @Path("adapter") def adapter: String = { val adapter = Adapter() Serialization.write(adapter) } @GET @Path("qep") def qep: String = { val qep = Qep() Serialization.write(qep) } @GET @Path("keystore") def keystore: String = { Serialization.write(KeyStoreReport()) } } /* todo fill in later when you take the time to get the right parts in place SHRINE-1529 case class KeyStoreEntryReport( alias:String, commonName:String, md5Signature:String ) */ case class KeyStoreReport( fileName:String, password:String = "REDACTED", privateKeyAlias:Option[String], owner:Option[String], issuer:Option[String], expires:Option[Date], signature:Option[String], caTrustedAlias:Option[String], caTrustedSignature:Option[String] // keyStoreContents:List[KeyStoreEntryReport] //todo SHRINE-1529 ) //todo build new API for the dashboard to use to check signatures object KeyStoreReport { def apply(): KeyStoreReport = { val keystoreDescriptor: KeyStoreDescriptor = ShrineOrchestrator.keyStoreDescriptor val certCollection: KeyStoreCertCollection = ShrineOrchestrator.certCollection def toMd5(cert:X509Certificate): String = { val md5 = MessageDigest.getInstance("MD5") def toHex(buf: Array[Byte]): String = buf.map("%02X".format(_)).mkString(":") toHex(md5.digest(cert.getEncoded)) } new KeyStoreReport( fileName = keystoreDescriptor.file, privateKeyAlias = keystoreDescriptor.privateKeyAlias, owner = certCollection.myCert.map(cert => cert.getSubjectDN.getName), issuer = certCollection.myCert.map(cert => cert.getIssuerDN.getName), expires = certCollection.myCert.map(cert => cert.getNotAfter), signature = certCollection.myCert.map(cert => toMd5(cert)), //todo sha1 signature if needed caTrustedAlias = certCollection.caCertAliases.headOption, caTrustedSignature = certCollection.headOption.map(cert => toMd5(cert)) // keyStoreContents = certCollection.caCerts.zipWithIndex.map((cert: ((Principal, X509Certificate), Int)) => KeyStoreEntryReport(keystoreDescriptor.caCertAliases(cert._2),cert._1._1.getName,toMd5(cert._1._2))).to[List] ) } } case class I2b2(pmUrl:String, crcUrl:Option[String], ontUrl:String, i2b2Domain:String, username:String, crcProject:String, ontProject:String) object I2b2 { def apply(): I2b2 = new I2b2( pmUrl = ShrineOrchestrator.pmPoster.url, crcUrl = ShrineOrchestrator.adapterComponents.map(_.i2b2AdminService.crcUrl), ontUrl = "", //todo i2b2Domain = ShrineOrchestrator.crcHiveCredentials.domain, username = ShrineOrchestrator.crcHiveCredentials.username, crcProject = ShrineOrchestrator.crcHiveCredentials.projectId, ontProject = ShrineOrchestrator.ontologyMetadata.client match { case client: PosterOntClient => client.hiveCredentials.projectId case _ => "" } ) } case class DownstreamNode(name:String, url:String) // Replaces StewardQueryAuthorizationService so that we never transmit a password case class Steward(stewardBaseUrl: String, qepUsername: String, password:String = "REDACTED") case class Qep( maxQueryWaitTimeMillis:Long, create:Boolean, attachSigningCert:Boolean, authorizationType:String, includeAggregateResults:Boolean, authenticationType:String, steward:Option[Steward], broadcasterUrl:Option[String] ) object Qep{ val key = "shrine.queryEntryPoint." import ShrineOrchestrator.queryEntryPointComponents def apply():Qep = new Qep( maxQueryWaitTimeMillis = queryEntryPointComponents.fold(0L)(_.i2b2Service.queryTimeout.toMicros), create = queryEntryPointComponents.isDefined, attachSigningCert = queryEntryPointComponents.fold(false)(_.i2b2Service.broadcastAndAggregationService.attachSigningCert), authorizationType = queryEntryPointComponents.fold("")(_.i2b2Service.authorizationService.getClass.getSimpleName), includeAggregateResults = queryEntryPointComponents.fold(false)(_.i2b2Service.includeAggregateResult), authenticationType = queryEntryPointComponents.fold("")(_.i2b2Service.authenticator.getClass.getSimpleName), steward = queryEntryPointComponents.flatMap(qec => checkStewardAuthorization(qec.shrineService.authorizationService)), broadcasterUrl = queryEntryPointComponents.flatMap(qec => checkBroadcasterUrl(qec.i2b2Service.broadcastAndAggregationService))) def checkStewardAuthorization(auth: QueryAuthorizationService): Option[Steward] = auth match { case sa:StewardQueryAuthorizationService => Some(Steward(sa.stewardBaseUrl.toString, sa.qepUserName)) case _ => None } //TODO: Double check with Dave that this is the right url def checkBroadcasterUrl(broadcaster: BroadcastAndAggregationService): Option[String] = broadcaster match { case a:HubBroadcastAndAggregationService => a.broadcasterClient match { case PosterBroadcasterClient(poster, _) => Some(poster.url) case _ => None } case _ => None } } object DownstreamNodes { def get():Seq[DownstreamNode] = { ShrineOrchestrator.hubComponents.fold(Seq.empty[DownstreamNode])(_.broadcastDestinations.map(DownstreamNode(_)).to[Seq]) } } object DownstreamNode { def apply(nodeHandle: NodeHandle): DownstreamNode = new DownstreamNode( nodeHandle.nodeId.name, nodeHandle.client.url.map(_.toString).getOrElse("not applicable")) } case class Adapter(crcEndpointUrl:String, setSizeObfuscation:Boolean, adapterLockoutAttemptsThreshold:Int, adapterMappingsFilename:Option[String], adapterMappingsDate:Option[Long] ) object Adapter{ def apply():Adapter = { val crcEndpointUrl = ShrineOrchestrator.adapterComponents.fold("")(_.i2b2AdminService.crcUrl) val setSizeObfuscation = ShrineOrchestrator.adapterComponents.fold(false)(_.i2b2AdminService.obfuscate) val adapterLockoutAttemptsThreshold = ShrineOrchestrator.adapterComponents.fold(0)(_.i2b2AdminService.adapterLockoutAttemptsThreshold) val adapterMappingsFileName = mappingFileInfo.map(_._1) val adapterMappingsFileDate = mappingFileInfo.map(_._2) Adapter(crcEndpointUrl, setSizeObfuscation, adapterLockoutAttemptsThreshold, adapterMappingsFileName, adapterMappingsFileDate) } def mappingFileInfo: Option[(String, Long, String)] = ShrineOrchestrator.adapterComponents.map(ac => (ac.adapterMappings.source, ac.lastModified, ac.adapterMappings.version)) } case class Hub(shouldQuerySelf:Boolean, //todo don't use this field any more. Drop it when possible create:Boolean, downstreamNodes:Seq[DownstreamNode]) object Hub{ def apply():Hub = { val shouldQuerySelf = false val create = ShrineOrchestrator.hubComponents.isDefined val downstreamNodes = DownstreamNodes.get() Hub(shouldQuerySelf, create, downstreamNodes) } } case class OptionalParts(isHub:Boolean, stewardEnabled:Boolean, shouldQuerySelf:Boolean, //todo don't use this field any more. Drop it when possible downstreamNodes:Seq[DownstreamNode]) object OptionalParts { def apply(): OptionalParts = { OptionalParts( ShrineOrchestrator.hubComponents.isDefined, ShrineOrchestrator.queryEntryPointComponents.fold(false)(_.shrineService.authorizationService.isInstanceOf[StewardQueryAuthorizationService]), shouldQuerySelf = false, DownstreamNodes.get() ) } } case class Summary( isHub:Boolean, shrineVersion:String, shrineBuildDate:String, ontologyVersion:String, + ontologyVersionTerm:String, ontologyTerm:String, queryResult: Option[SingleNodeResult], adapterMappingsFileName:Option[String], adapterMappingsDate:Option[Long], adapterOk:Boolean, keystoreOk:Boolean, hubOk:Boolean, qepOk:Boolean ) object Summary { val term = Term(ShrineOrchestrator.shrineConfig.getString("networkStatusQuery")) def runQueryRequest: BroadcastMessage = { val domain = "happy" val username = "happy" val networkAuthn = AuthenticationInfo(domain, username, Credential("", isToken = false)) val queryDefinition = QueryDefinition("TestQuery", OccuranceLimited(1, term)) import scala.concurrent.duration._ val req = RunQueryRequest( "happyProject", 3.minutes, networkAuthn, None, None, Set(ResultOutputType.PATIENT_COUNT_XML), queryDefinition) ShrineOrchestrator.signerVerifier.sign(BroadcastMessage(req.networkQueryId, networkAuthn, req), SigningCertStrategy.Attach) } def apply(): Summary = { val message = runQueryRequest val queryResult: Option[SingleNodeResult] = ShrineOrchestrator.adapterService.map{ adapterService => import scala.concurrent.duration._ val start = System.currentTimeMillis val resultAttempt: Try[Result] = Try(adapterService.handleRequest(message)) val end = System.currentTimeMillis val elapsed = (end - start).milliseconds resultAttempt match { case scala.util.Success(result) => result case scala.util.Failure(throwable) => FailureResult(NodeId("Local"), throwable) } } val adapterOk = queryResult.fold(true) { case r:Result => true case f:FailureResult => false } val hubOk = ShrineOrchestrator.hubComponents.fold(true){ hubComponents => val maxQueryWaitTime = hubComponents.broadcasterMultiplexerService.maxQueryWaitTime val broadcaster: Broadcaster = hubComponents.broadcasterMultiplexerService.broadcaster val message = runQueryRequest val triedMultiplexer = Try(broadcaster.broadcast(message)) //todo just use fold()() in scala 2.12 triedMultiplexer.toOption.fold(false) { multiplexer => val responses = Await.result(multiplexer.responses, maxQueryWaitTime).toSeq val failures = responses.collect { case f: FailureResult => f } val timeouts = responses.collect { case t: Timeout => t } val validResults = responses.collect { case r: Result => r } failures.isEmpty && timeouts.isEmpty && (validResults.size == broadcaster.destinations.size) } } val adapterMappingInfo = Adapter.mappingFileInfo val ontologyVersion = try { ShrineOrchestrator.ontologyMetadata.ontologyVersion } catch { case NonFatal(x) => Log.info("Problem while getting ontology version",x) s"Unavailable due to: ${x.getMessage}" } Summary( isHub = ShrineOrchestrator.hubComponents.isDefined, shrineVersion = Versions.version, shrineBuildDate = Versions.buildDate, //todo in scala 2.12, do better ontologyVersion = ontologyVersion, + ontologyVersionTerm = OntClientOntologyMetadata.versionContainerTerm, ontologyTerm = term.value, queryResult = queryResult, adapterMappingsFileName = adapterMappingInfo.map(_._1), adapterMappingsDate = adapterMappingInfo.map(_._2), adapterOk = adapterOk, keystoreOk = true, //todo something for this hubOk = hubOk, qepOk = true //todo something for this ) } } case class Version(version:String) //todo SortedMap when possible case class Json4sConfig(keyValues:Map[String,String]) object Json4sConfig{ def isPassword(key:String):Boolean = { if(key.toLowerCase.contains("password")) true else false } def apply(config:TsConfig):Json4sConfig = { val entries: Set[(String, String)] = config.entrySet.asScala.to[Set].map(x => (x.getKey,x.getValue.render())).filterNot(x => isPassword(x._1)) val sortedMap: Map[String, String] = entries.toMap Json4sConfig(sortedMap) } } class PermittedHostOnly extends ContainerRequestFilter { //todo generalize for happy, too //todo for tomcat 8 see https://jersey.java.net/documentation/latest/filters-and-interceptors.html for a cleaner version //shell code from http://stackoverflow.com/questions/17143514/how-to-add-custom-response-and-abort-request-in-jersey-1-11-filters //how to apply in http://stackoverflow.com/questions/4358213/how-does-one-intercept-a-request-during-the-jersey-lifecycle override def filter(requestContext: ContainerRequest): ContainerRequest = { val hostOfOrigin = requestContext.getBaseUri.getHost val shrineConfig:TsConfig = ShrineOrchestrator.config val permittedHostOfOrigin:String = shrineConfig.getOption("shrine.status.permittedHostOfOrigin",_.getString).getOrElse("localhost") val path = requestContext.getPath //happy and internalstatus API calls must come from the same host as tomcat is running on (hopefully the dashboard servlet). // todo access to the happy service permitted for SHRINE 1.21 per SHRINE-1366 // restrict access to happy service when database work resumes as part of SHRINE- // if ((path.contains("happy") || path.contains("internalstatus")) && (hostOfOrigin != permittedHostOfOrigin)) { if (path.contains("internalstatus") && (hostOfOrigin != permittedHostOfOrigin)) { val response = Response.status(Response.Status.UNAUTHORIZED).entity(s"Only available from $permittedHostOfOrigin, not $hostOfOrigin, controlled by shrine.status.permittedHostOfOrigin in shrine.conf").build() throw new WebApplicationException(response) } else requestContext } } \ No newline at end of file diff --git a/apps/shrine-app/src/test/scala/net/shrine/status/StatusJaxrsTest.scala b/apps/shrine-app/src/test/scala/net/shrine/status/StatusJaxrsTest.scala index c6faf178b..88c5ae834 100644 --- a/apps/shrine-app/src/test/scala/net/shrine/status/StatusJaxrsTest.scala +++ b/apps/shrine-app/src/test/scala/net/shrine/status/StatusJaxrsTest.scala @@ -1,131 +1,132 @@ package net.shrine.status import java.io.File import com.typesafe.config.ConfigFactory import net.shrine.util.ShouldMatchersForJUnit import org.json4s.{DefaultFormats, Formats} import org.junit.Test import org.json4s.native.Serialization import scala.collection.immutable.Map /** * Tests for StatusJaxrs * * @author david * @since 12/2/15 */ class StatusJaxrsTest extends ShouldMatchersForJUnit { implicit def json4sFormats: Formats = DefaultFormats val expectedConfig = ConfigFactory.load("shrine") //new File("/Users/ty/shrine/apps/shrine-app/src/test/resources/shrine.conf")) val statusJaxrs = StatusJaxrs(expectedConfig) @Test def testVersion() = { val versionString = statusJaxrs.version val version = Serialization.read[Version](versionString) version should equal(Version("changeMe")) } @Test def testConfig() = { val expectedJson4sConfig = Json4sConfig(expectedConfig) val configString = statusJaxrs.config val config = Serialization.read[Json4sConfig](configString) config should equal(expectedJson4sConfig) val passwordKeys = config.keyValues.filter(x => Json4sConfig.isPassword(x._1)) passwordKeys should equal(Map.empty[String,String]) } @Test def testSummary() = { val summaryString = statusJaxrs.summary + println(summaryString) val summary = Serialization.read[Summary](summaryString) summary.isHub should be (true) summary.adapterMappingsFileName.isDefined should be (true) summary.adapterMappingsDate.isEmpty should be (false) summary.adapterOk should be (true) summary.keystoreOk should be (true) summary.hubOk should be (false) summary.qepOk should be (true) } @Test def testI2b2() = { val i2b2String = statusJaxrs.i2b2 val i2b2 = Serialization.read[I2b2](i2b2String) i2b2.crcUrl.isDefined should be (true) } @Test def testOptionalParts() = { val string = statusJaxrs.optionalParts val actual = Serialization.read[OptionalParts](string) actual.isHub should be (true) actual.stewardEnabled should be (true) actual.shouldQuerySelf should be (false) actual.downstreamNodes.size should be (4) } @Test def testHub() = { val string = statusJaxrs.hub val actual = Serialization.read[Hub](string) actual.create should be (true) actual.shouldQuerySelf should be (false) actual.downstreamNodes.size should be (4) } @Test def testQep() = { val string = statusJaxrs.qep val actual = Serialization.read[Qep](string) actual.create should be (true) actual.attachSigningCert should be (true) actual.authenticationType should be ("PmAuthenticator") actual.authorizationType should be ("StewardQueryAuthorizationService") actual.includeAggregateResults should be (false) actual.maxQueryWaitTimeMillis should be (300000000L) } @Test def testAdapter() = { val string = statusJaxrs.adapter val actual = Serialization.read[Adapter](string) actual.adapterLockoutAttemptsThreshold should be (10) } @Test def testKeyStore() = { val string = statusJaxrs.keystore val actual = Serialization.read[KeyStoreReport](string) } }