diff --git a/adapter/adapter-service/src/main/scala/net/shrine/adapter/Adapter.scala b/adapter/adapter-service/src/main/scala/net/shrine/adapter/Adapter.scala index 186c65200..c799f9db0 100644 --- a/adapter/adapter-service/src/main/scala/net/shrine/adapter/Adapter.scala +++ b/adapter/adapter-service/src/main/scala/net/shrine/adapter/Adapter.scala @@ -1,101 +1,101 @@ package net.shrine.adapter import java.sql.SQLException import java.util.Date import net.shrine.adapter.dao.BotDetectedException import net.shrine.log.Loggable import net.shrine.problem.{AbstractProblem, LoggingProblemHandler, Problem, ProblemNotYetEncoded, ProblemSources} import net.shrine.protocol.{AuthenticationInfo, BaseShrineResponse, BroadcastMessage, ErrorResponse, ShrineRequest} import scala.util.control.NonFatal /** * @author Bill Simons * @since 4/8/11 * @see http://cbmi.med.harvard.edu * @see http://chip.org *

* NOTICE: This software comes with NO guarantees whatsoever and is * licensed as Lgpl Open Source * @see http://www.gnu.org/licenses/lgpl.html */ abstract class Adapter extends Loggable { //noinspection RedundantBlock final def perform(message: BroadcastMessage): BaseShrineResponse = { def problemToErrorResponse(problem:Problem):ErrorResponse = { - LoggingProblemHandler.handleProblem(problem) + //TODO: Is this needed? LoggingProblemHandler.handleProblem(problem) ErrorResponse(problem) } val shrineResponse = try { processRequest(message) } catch { case e: AdapterLockoutException => problemToErrorResponse(AdapterLockout(message.request.authn,e)) case e: BotDetectedException => problemToErrorResponse(BotDetected(e)) case e @ CrcInvocationException(invokedCrcUrl, request, cause) => problemToErrorResponse(CrcCouldNotBeInvoked(invokedCrcUrl,request,e)) case e: AdapterMappingException => problemToErrorResponse(AdapterMappingProblem(e)) case e: SQLException => problemToErrorResponse(AdapterDatabaseProblem(e)) case NonFatal(e) => { val summary = if(message == null) "Unknown problem in Adapter.perform with null BroadcastMessage" else s"Unexpected exception in Adapter" problemToErrorResponse(ProblemNotYetEncoded(summary,e)) } } shrineResponse } protected[adapter] def processRequest(message: BroadcastMessage): BaseShrineResponse //NOOP, may be overridden by subclasses def shutdown(): Unit = () } case class AdapterLockout(authn:AuthenticationInfo,x:AdapterLockoutException) extends AbstractProblem(ProblemSources.Adapter) { override val throwable = Some(x) override val summary: String = s"User '${authn.domain}:${authn.username}' locked out." override val description:String = s"User '${authn.domain}:${authn.username}' has run too many queries that produce the same result at ${x.url} ." } case class CrcCouldNotBeInvoked(crcUrl:String,request:ShrineRequest,x:CrcInvocationException) extends AbstractProblem(ProblemSources.Adapter) { override val throwable = Some(x) override val summary: String = s"Error communicating with I2B2 CRC." override val description: String = s"Error invoking the CRC at '$crcUrl' with a ${request.getClass.getSimpleName} due to ${throwable.get}." override val detailsXml =

Request is {request} {throwableDetail.getOrElse("")}
} case class AdapterMappingProblem(x:AdapterMappingException) extends AbstractProblem(ProblemSources.Adapter) { override val throwable = Some(x) override val summary: String = "Could not map query term(s)." override val description = s"The Shrine Adapter on ${stamp.host.getHostName} cannot map this query to its local terms." override val detailsXml =
Query Defitiontion is {x.runQueryRequest.queryDefinition} RunQueryRequest is ${x.runQueryRequest.elideAuthenticationInfo} {throwableDetail.getOrElse("")}
} case class AdapterDatabaseProblem(x:SQLException) extends AbstractProblem(ProblemSources.Adapter) { override val throwable = Some(x) override val summary: String = "Problem using the Adapter database." override val description = "The Shrine Adapter encountered a problem using a database." } case class BotDetected(bdx:BotDetectedException) extends AbstractProblem(ProblemSources.Adapter) { override val throwable = Some(bdx) override val summary: String = s"A user has run so many queries in a period of time that the adapter suspects a bot." override val description: String = s"${bdx.domain}:${bdx.username} has run ${bdx.detectedCount} queries since ${new Date(bdx.sinceMs)}, more than the limit of ${bdx.limit} allowed in this time frame." } \ No newline at end of file diff --git a/adapter/adapter-service/src/main/scala/net/shrine/adapter/RunQueryAdapter.scala b/adapter/adapter-service/src/main/scala/net/shrine/adapter/RunQueryAdapter.scala index c3cbcea48..c1775fd82 100644 --- a/adapter/adapter-service/src/main/scala/net/shrine/adapter/RunQueryAdapter.scala +++ b/adapter/adapter-service/src/main/scala/net/shrine/adapter/RunQueryAdapter.scala @@ -1,284 +1,284 @@ package net.shrine.adapter import net.shrine.adapter.audit.AdapterAuditDb import scala.util.Failure import scala.util.Success import scala.util.Try import scala.xml.NodeSeq import net.shrine.adapter.dao.AdapterDao import net.shrine.adapter.translators.QueryDefinitionTranslator import net.shrine.protocol.{AuthenticationInfo, BroadcastMessage, Credential, ErrorFromCrcException, ErrorResponse, HiveCredentials, I2b2ResultEnvelope, MissingCrCXmlResultException, QueryResult, RawCrcRunQueryResponse, ReadResultRequest, ReadResultResponse, ResultOutputType, RunQueryRequest, RunQueryResponse, ShrineResponse} import net.shrine.client.Poster import net.shrine.problem.{AbstractProblem, LoggingProblemHandler, Problem, ProblemNotYetEncoded, ProblemSources} import scala.util.control.NonFatal import net.shrine.util.XmlDateHelper import scala.concurrent.duration.Duration import scala.xml.XML /** * @author Bill Simons * @author clint * @since 4/15/11 * @see http://cbmi.med.harvard.edu * @see http://chip.org *

* NOTICE: This software comes with NO guarantees whatsoever and is * licensed as Lgpl Open Source * @see http://www.gnu.org/licenses/lgpl.html */ final case class RunQueryAdapter( poster: Poster, dao: AdapterDao, override val hiveCredentials: HiveCredentials, conceptTranslator: QueryDefinitionTranslator, adapterLockoutAttemptsThreshold: Int, //Set to 0 to disable lockout. todo remove in SHRINE 1.24 doObfuscation: Boolean, runQueriesImmediately: Boolean, breakdownTypes: Set[ResultOutputType], collectAdapterAudit:Boolean, botCountTimeThresholds:Seq[(Long,Duration)], obfuscator: Obfuscator ) extends CrcAdapter[RunQueryRequest, RunQueryResponse](poster, hiveCredentials) { logStartup() import RunQueryAdapter._ override protected[adapter] def parseShrineResponse(xml: NodeSeq) = RawCrcRunQueryResponse.fromI2b2(breakdownTypes)(xml).get //TODO: Avoid .get call override protected[adapter] def translateNetworkToLocal(request: RunQueryRequest): RunQueryRequest = { try { request.mapQueryDefinition(conceptTranslator.translate) } catch { case NonFatal(e) => throw new AdapterMappingException(request,s"Error mapping query terms from network to local forms.", e) } } override protected[adapter] def processRequest(message: BroadcastMessage): ShrineResponse = { if (collectAdapterAudit) AdapterAuditDb.db.insertQueryReceived(message) if (isLockedOut(message.networkAuthn)) { throw new AdapterLockoutException(message.networkAuthn,poster.url) } dao.checkIfBot(message.networkAuthn,botCountTimeThresholds) val runQueryReq = message.request.asInstanceOf[RunQueryRequest] //We need to use the network identity from the BroadcastMessage, since that will have the network username //(ie, ecommons) of the querying user. Using the AuthenticationInfo from the incoming request breaks the fetching //of previous queries on deployed systems where the credentials in the identity param to this method and the authn //field of the incoming request are different, like the HMS Shrine deployment. //NB: Credential field is wiped out to preserve old behavior -Clint 14 Nov, 2013 val authnToUse = message.networkAuthn.copy(credential = Credential("", isToken = false)) if (!runQueriesImmediately) { debug(s"Queueing query from user ${message.networkAuthn.domain}:${message.networkAuthn.username}") storeQuery(authnToUse, message, runQueryReq) } else { debug(s"Performing query from user ${message.networkAuthn.domain}:${message.networkAuthn.username}") val result: ShrineResponse = runQuery(authnToUse, message.copy(request = runQueryReq.withAuthn(authnToUse)), runQueryReq.withAuthn(authnToUse)) if (collectAdapterAudit) AdapterAuditDb.db.insertResultSent(runQueryReq.networkQueryId,result) result } } private def storeQuery(authnToUse: AuthenticationInfo, message: BroadcastMessage, request: RunQueryRequest): RunQueryResponse = { //Use dummy ids for what we would have received from the CRC val masterId: Long = -1L val queryInstanceId: Long = -1L val resultId: Long = -1L //TODO: is this right?? Or maybe it's project id? val groupId = authnToUse.domain val invalidSetSize = -1L val now = XmlDateHelper.now val queryResult = QueryResult(resultId, queryInstanceId, Some(ResultOutputType.PATIENT_COUNT_XML), invalidSetSize, Some(now), Some(now), Some("Query enqueued for later processing"), QueryResult.StatusType.Held, Some("Query enqueued for later processing")) dao.inTransaction { val insertedQueryId = dao.insertQuery(masterId.toString, request.networkQueryId, authnToUse, request.queryDefinition, isFlagged = false, hasBeenRun = false, flagMessage = None) val insertedQueryResultIds = dao.insertQueryResults(insertedQueryId, Seq(queryResult)) //NB: We need to insert dummy QueryResult and Count records so that calls to StoredQueries.retrieve() in //AbstractReadQueryResultAdapter, called when retrieving results for previously-queued-or-incomplete //queries, will work. val countQueryResultId = insertedQueryResultIds(ResultOutputType.PATIENT_COUNT_XML).head dao.insertCountResult(countQueryResultId, -1L, -1L) } RunQueryResponse(masterId, XmlDateHelper.now, authnToUse.username, groupId, request.queryDefinition, queryInstanceId, queryResult) } private def runQuery(authnToUse: AuthenticationInfo, message: BroadcastMessage, request: RunQueryRequest): ShrineResponse = { if (collectAdapterAudit) AdapterAuditDb.db.insertExecutionStarted(request) //NB: Pass through ErrorResponses received from the CRC. //See: https://open.med.harvard.edu/jira/browse/SHRINE-794 val result = super.processRequest(message) match { case e: ErrorResponse => e case rawRunQueryResponse: RawCrcRunQueryResponse => processRawCrcRunQueryResponse(authnToUse, request, rawRunQueryResponse) } if (collectAdapterAudit) AdapterAuditDb.db.insertExecutionCompletedShrineResponse(request,result) result } private[adapter] def processRawCrcRunQueryResponse(authnToUse: AuthenticationInfo, request: RunQueryRequest, rawRunQueryResponse: RawCrcRunQueryResponse): RunQueryResponse = { def isBreakdown(result: QueryResult) = result.resultType.exists(_.isBreakdown) val originalResults: Seq[QueryResult] = rawRunQueryResponse.results val (originalBreakdownResults, originalNonBreakDownResults): (Seq[QueryResult],Seq[QueryResult]) = originalResults.partition(isBreakdown) val originalBreakdownCountAttempts: Seq[(QueryResult, Try[QueryResult])] = attemptToRetrieveBreakdowns(request, originalBreakdownResults) val (successfulBreakdownCountAttempts, failedBreakdownCountAttempts) = originalBreakdownCountAttempts.partition { case (_, t) => t.isSuccess } val failedBreakdownCountAttemptsWithProblems = failedBreakdownCountAttempts.map { attempt => val originalResult: QueryResult = attempt._1 val queryResult:QueryResult = if (originalResult.problemDigest.isDefined) originalResult else { attempt._2 match { case Success(_) => originalResult case Failure(x) => //noinspection RedundantBlock { val problem:Problem = x match { case e: ErrorFromCrcException => ErrorFromCrcBreakdown(e) case e: MissingCrCXmlResultException => CannotInterpretCrcBreakdownXml(e) case NonFatal(e) => { val summary = s"Unexpected exception while interpreting breakdown response" ProblemNotYetEncoded(summary, e) } } - LoggingProblemHandler.handleProblem(problem) + //TODO: is this needed? LoggingProblemHandler.handleProblem(problem) originalResult.copy(problemDigest = Some(problem.toDigest)) } } } (queryResult,attempt._2) } logBreakdownFailures(rawRunQueryResponse, failedBreakdownCountAttemptsWithProblems) val originalMergedBreakdowns: Map[ResultOutputType, I2b2ResultEnvelope] = { val withBreakdownCounts = successfulBreakdownCountAttempts.collect { case (_, Success(queryResultWithBreakdowns)) => queryResultWithBreakdowns } withBreakdownCounts.map(_.breakdowns).fold(Map.empty)(_ ++ _) } val obfuscatedQueryResults = originalResults.map(obfuscator.obfuscate) val obfuscatedNonBreakdownQueryResults = obfuscatedQueryResults.filterNot(isBreakdown) val obfuscatedMergedBreakdowns = originalMergedBreakdowns.mapValues(_.mapValues(obfuscator.obfuscate)) val failedBreakdownTypes = failedBreakdownCountAttemptsWithProblems.flatMap { case (qr, _) => qr.resultType } dao.storeResults( authn = authnToUse, masterId = rawRunQueryResponse.queryId.toString, networkQueryId = request.networkQueryId, queryDefinition = request.queryDefinition, rawQueryResults = originalResults, obfuscatedQueryResults = obfuscatedQueryResults, failedBreakdownTypes = failedBreakdownTypes, mergedBreakdowns = originalMergedBreakdowns, obfuscatedBreakdowns = obfuscatedMergedBreakdowns) // at this point the queryResult could be a mix of successes and failures. // SHRINE reports only the successes. See SHRINE-1567 for details val queryResults: Seq[QueryResult] = if (doObfuscation) obfuscatedNonBreakdownQueryResults else originalNonBreakDownResults val breakdownsToReturn: Map[ResultOutputType, I2b2ResultEnvelope] = if (doObfuscation) obfuscatedMergedBreakdowns else originalMergedBreakdowns //TODO: Will fail in the case of NO non-breakdown QueryResults. Can this ever happen, and is it worth protecting against here? //can failedBreakdownCountAttempts be mixed back in here? val resultWithBreakdowns: QueryResult = queryResults.head.withBreakdowns(breakdownsToReturn) if(debugEnabled) { def justBreakdowns(breakdowns: Map[ResultOutputType, I2b2ResultEnvelope]) = breakdowns.mapValues(_.data) val obfuscationMessage = s"obfuscation is ${if(doObfuscation) "ON" else "OFF"}" debug(s"Returning QueryResult with count ${resultWithBreakdowns.setSize} (original count: ${originalNonBreakDownResults.headOption.map(_.setSize)} ; $obfuscationMessage)") debug(s"Returning QueryResult with breakdowns ${justBreakdowns(resultWithBreakdowns.breakdowns)} (original breakdowns: ${justBreakdowns(originalMergedBreakdowns)} ; $obfuscationMessage)") debug(s"Full QueryResult: $resultWithBreakdowns") } //if any results had problems, this commented out code can turn it into an error QueryResult //See SHRINE-1619 //val problem: Option[ProblemDigest] = failedBreakdownCountAttemptsWithProblems.headOption.flatMap(x => x._1.problemDigest) //val queryResult = problem.fold(resultWithBreakdowns)(pd => QueryResult.errorResult(Some(pd.description),"Error with CRC",pd)) rawRunQueryResponse.toRunQueryResponse.withResult(resultWithBreakdowns) } private def getResultFromCrc(parentRequest: RunQueryRequest, networkResultId: Long): Try[ReadResultResponse] = { def readResultRequest(runQueryReq: RunQueryRequest, networkResultId: Long) = ReadResultRequest(hiveCredentials.projectId, runQueryReq.waitTime, hiveCredentials.toAuthenticationInfo, networkResultId.toString) Try(XML.loadString(callCrc(readResultRequest(parentRequest, networkResultId)))).flatMap(ReadResultResponse.fromI2b2(breakdownTypes)) } private[adapter] def attemptToRetrieveCount(runQueryReq: RunQueryRequest, originalCountQueryResult: QueryResult): (QueryResult, Try[QueryResult]) = { originalCountQueryResult -> (for { countData <- getResultFromCrc(runQueryReq, originalCountQueryResult.resultId) } yield originalCountQueryResult.withSetSize(countData.metadata.setSize)) } private[adapter] def attemptToRetrieveBreakdowns(runQueryReq: RunQueryRequest, breakdownResults: Seq[QueryResult]): Seq[(QueryResult, Try[QueryResult])] = { breakdownResults.map { origBreakdownResult => origBreakdownResult -> (for { breakdownData <- getResultFromCrc(runQueryReq, origBreakdownResult.resultId).map(_.data) } yield origBreakdownResult.withBreakdown(breakdownData)) } } private[adapter] def logBreakdownFailures(response: RawCrcRunQueryResponse, failures: Seq[(QueryResult, Try[QueryResult])]) { for { (origQueryResult, Failure(e)) <- failures } { error(s"Couldn't load breakdown for QueryResult with masterId: ${response.queryId}, instanceId: ${origQueryResult.instanceId}, resultId: ${origQueryResult.resultId}. Asked for result type: ${origQueryResult.resultType}", e) } } private def isLockedOut(authn: AuthenticationInfo): Boolean = { adapterLockoutAttemptsThreshold match { case 0 => false case _ => dao.isUserLockedOut(authn, adapterLockoutAttemptsThreshold) } } private def logStartup(): Unit = { val message = { if (runQueriesImmediately) { s"${getClass.getSimpleName} will run queries immediately" } else { s"${getClass.getSimpleName} will queue queries for later execution" } } info(message) } } case class ErrorFromCrcBreakdown(x:ErrorFromCrcException) extends AbstractProblem(ProblemSources.Adapter) { override val throwable = Some(x) override val summary: String = "The CRC reported an error." override val description = "The CRC reported an internal error." } case class CannotInterpretCrcBreakdownXml(x:MissingCrCXmlResultException) extends AbstractProblem(ProblemSources.Adapter) { override val throwable = Some(x) override val summary: String = "SHRINE cannot interpret the CRC response." override val description = "The CRC responded, but SHRINE could not interpret that response." } \ No newline at end of file diff --git a/adapter/adapter-service/src/test/resources/shrine.conf b/adapter/adapter-service/src/test/resources/shrine.conf index 5cde0c66f..5d72918ef 100644 --- a/adapter/adapter-service/src/test/resources/shrine.conf +++ b/adapter/adapter-service/src/test/resources/shrine.conf @@ -1,23 +1,23 @@ shrine { problem { - problemHandler = "net.shrine.problem.LoggingProblemHandler$" + problemHandler = "net.shrine.problem.NoOpProblemHandler$" } adapter { create = true audit { collectQepAudit = false database { slickProfileClassName = "slick.driver.H2Driver$" createTablesOnStart = true //for testing with H2 in memory, when not running unit tests. Set to false normally dataSourceFrom = "testDataSource" //Can be JNDI or testDataSource . Use testDataSource for tests, JNDI everywhere else testDataSource { driverClassName = "org.h2.Driver" url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" //H2 embedded in-memory for unit tests ;TRACE_LEVEL_SYSTEM_OUT=2 for H2's trace } } } } } \ No newline at end of file diff --git a/apps/dashboard-app/src/main/js/src/app/diagnostic/diagnostic.model.js b/apps/dashboard-app/src/main/js/src/app/diagnostic/diagnostic.model.js index d91d73f1e..0719b80d0 100644 --- a/apps/dashboard-app/src/main/js/src/app/diagnostic/diagnostic.model.js +++ b/apps/dashboard-app/src/main/js/src/app/diagnostic/diagnostic.model.js @@ -1,254 +1,279 @@ (function (){ 'use strict'; // -- angular module -- // angular.module('shrine-tools') .factory('DiagnosticModel', DiagnosticModel) DiagnosticModel.$inject = ['$http', '$q', 'UrlGetter', 'XMLService', '$log']; function DiagnosticModel (h, q, urlGetter, xmlService, $log) { var cache = {}; // -- private const -- // var Config = { AdapterEndpoint: 'admin/status/adapter', ConfigEndpoint: 'admin/status/config', HubEndpoint: 'admin/status/hub', I2B2Endpoint: 'admin/status/i2b2', KeystoreEndpoint: 'admin/status/keystore', OptionsEndpoint: 'admin/status/optionalParts', ProblemEndpoint: 'admin/status/problems', QepEndpoint: 'admin/status/qep', SummaryEndpoint: 'admin/status/summary', HappyAllEndpoint: 'admin/happy/all' }; // -- public -- // return { - getAdapter: getJsonMaker(Config.AdapterEndpoint), - getConfig: getConfig, - getHub: getJsonMaker(Config.HubEndpoint), - getI2B2: getJsonMaker(Config.I2B2Endpoint), - getKeystore: getJsonMaker(Config.KeystoreEndpoint), - getOptions: getOptions, + getAdapter: getJsonMaker(Config.AdapterEndpoint, 'adapter'), + getConfig: getJsonMaker(Config.ConfigEndpoint, 'config', parseConfig), + getHub: getJsonMaker(Config.HubEndpoint, 'hub'), + getI2B2: getJsonMaker(Config.I2B2Endpoint, 'i2b2'), + getKeystore: getJsonMaker(Config.KeystoreEndpoint, 'keystore'), + getOptions: getJsonMaker(Config.OptionsEndpoint, 'options'), getProblems: getProblemsMaker(), - getQep: getJsonMaker(Config.QepEndpoint), - getSummary: getJsonMaker(Config.SummaryEndpoint), + getQep: getJsonMaker(Config.QepEndpoint, 'qep'), + getSummary: getJsonMaker(Config.SummaryEndpoint, 'summary'), getHappyAll: getHappyAll, cache: cache }; /** * Method for Handling a failed rest call. * @param failedResult * @returns {*} */ function onFail(failedResult) { return failedResult; } /*** * Method for handling a successful rest call. * @param result + * @param cacheKey * @returns {*} */ - function parseJsonResult(result) { + function parseJsonResult(result, cacheKey) { + cache[cacheKey] = result.data; return result.data; } /** * * @param result * @returns {*} */ function parseHappyAllResult(result) { var happyObj = {}; if(isQEPError(result.data)) { return $q.reject(result.data); } // -- append all -- // happyObj.all = xmlService.xmlStringToJson(result.data).all; // -- parse and append summary -- // happyObj.summary = parseSummaryFromAll(happyObj.all); return happyObj; } /** * * @param all * @returns {{}} */ function parseSummaryFromAll (all) { // var summary = {}; summary.isHub = !Boolean("" == all.notAHub); summary.shrineVersion = all.versionInfo.shrineVersion; summary.shrineBuildDate = all.versionInfo.buildDate; summary.ontologyVersion = all.versionInfo.ontologyVersion; summary.ontologyTerm = ""; //to be implemented in config. summary.adapterOk = all.adapter.result.response.errorResponse === undefined; summary.keystoreOk = true; summary.qepOk = true; // -- verify hub is operating, if necessary -- // if(!summary.isHub) { summary.hubOk = true; } else if(all.net !== undefined) { var hasFailures = Number(all.net.failureCount) > 0; var hasInvalidResults = Number(all.net.validResultCount) != Number(all.net.expectedResultCount); var hasTimeouts = Number(all.net.timeoutCount) > 0; summary.hubOk = !hasFailures && !hasInvalidResults && !hasTimeouts; } return summary; } /** * Parses the json config map and turns it into a nested json object * @param json the flat config map */ - function parseConfig (json) { + function parseConfig (json, cacheKey) { var configMap = json.data.configMap; - return preProcessJson(configMap); + var processed = preProcessJson(configMap); + cache[cacheKey] = processed; + return processed; } // IE11 doesn't support string includes function stringIncludes(haystack, needle) { var arr = haystack.split(""); for (var i = 0; i < arr.length; i++) { if (arr[i] == needle) { return true; } } return false; } // "explodes" the flag config map. // e.g., {"key.foo": 10, "key.baz": 5} -> {"key": {"foo": 10, "baz": 5}} function preProcessJson (object) { var result = {}; for (var key in object) { if (object.hasOwnProperty(key)) { if (!stringIncludes(key, ".")) { result[key] = object[key] } else { var split = key.split("."); var prev = result; for (var i = 0; i < split.length; i++) { var cur = split[i]; if (!(cur in prev)) { prev[cur] = {} } if (i == split.length - 1) { prev[cur] = object[key]; } else { prev = prev[cur] } } } } } return result; } /** * Get View Options, initial call from diagnostic. * @param verb * @returns {*} */ function getOptions() { var url = urlGetter(Config.OptionsEndpoint); return h.get(url) .then(parseJsonResult, onFail); } /** * Returns the Shrine Configuration object. * @returns {*} */ function getConfig () { var url = urlGetter(Config.ConfigEndpoint); return h.get(url) .then(parseConfig, onFail); } - function getJsonMaker(endpoint) { + /** + * There's a lot going on here. Essentially, this is a function factory that allows one to + * define backend calls just through the path. It also implements a simple caching strategy. + * Essentially the get function only needs to be called once, and from then on it will spit + * back a cached promise. This lets you write the code and not care whether it's cached or not, + * but also get the caching performance anyways. For this function to work, the resolver + * function has to take in the http response and the cache key to set, and make sure + * that it caches what it returns (see parseJsonResult or parseConfig). + * @param endpoint + * @param cacheKey + * @param resolverDefault + * @returns {Function} + */ + function getJsonMaker(endpoint, cacheKey, resolverDefault) { + var resolver = (typeof resolver !== 'undefined')? + function (response) { return resolver(response, cacheKey) }: + function (response) { return parseJsonResult(response, cacheKey); }; return function() { - var url = urlGetter(endpoint); - return h.get(url) - .then(parseJsonResult, onFail) + var cachedValue = cache[cacheKey]; + if (cachedValue === undefined) { + var url = urlGetter(endpoint); + return h.get(url) + .then(resolver, onFail) + } else { + return q(function(resolver) { resolver(cachedValue)}); + } } } function getProblemsMaker() { var prevOffset = 0; var prevN = 20; /** * ProblemEndpoint: 'admin/status/problems', * @returns {*} */ return function(offset, n, epoch) { if (offset != null) { prevOffset = offset; } else { offset = prevOffset; } if (n != null) { prevN = n; } else { n = prevN; } var epochString = epoch && isFinite(epoch) ? '&epoch=' + epoch : ''; var url = urlGetter( Config.ProblemEndpoint + '?offset=' + offset + '&n=' + n + epochString); return h.get(url) .then(parseJsonResult, onFail); } } /** * * @returns {*} */ function getHappyAll() { var url = urlGetter(Config.HappyAllEndpoint, '.xml'); return h.get(url) .then(parseHappyAllResult, onFail); } /** * * @param resultXML * @returns {boolean} */ function isQEPError(resultXML) { var result = resultXML.indexOf('') + resultXML.indexOf(''); return result == -2 } } })(); 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 d02c3f79a..715ce7edb 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,67 +1,73 @@ (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(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)); } - //TODO: figure out what this wants to accomplish - function setAdapter (adapter) { + function setSummary (summary) { vm.adapter = { - term: "TODO: NETWORK STATUS QUERY", //config.networkStatusQuery, - success: "TODO: ADAPTER RESULT SUCCESS" //config.adapter.result.response.errorResponse === undefined + term: summary.ontologyTerm, //config.networkStatusQuery, + success: summary.queryResult.response.problemDigest === undefined }; - // if (all.adapter.result.response.errorResponse) { - // vm.adapter.errorData = all.adapter.result.response.errorResponse.problem; - // } - // else { - // vm.adapter.description = all.adapter.result.response.runQueryResponse.queryResults. - // queryResult.setSize; - // vm.adapter.description += ' ' + all.adapter.result.response.runQueryResponse.queryResults. - // queryResult.resultType.description; - // } - setConfiguration(adapter); + 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.runQueryResponse.queryResults. + queryResult.setSize; + vm.adapter.description += ' ' + summary.queryResult.result.response.runQueryResponse.queryResults. + queryResult.resultType.description; + } } - function setConfiguration (adapter) { + function setAdapter (adapter) { + vm.mappings = { + mappingsFilename: adapter.adapterMappingsFilename + }; + vm.configuration = { crcEndpointURL: adapter.crcEndpointUrl, - crcProjectId: "TODO: CRC ID", //config.hiveCredentials.crcProjectId, - domain: "TODO: HIVE CREDENTIALS DOMAIN", //config.hiveCredentials.domain, - username: "TODO: HIVE CREDENTIALS USERNAME", //config.hiveCredentials.username, + crcProjectId: "", //config.hiveCredentials.crcProjectId, + domain: "", //config.hiveCredentials.domain, + username: "", //config.hiveCredentials.username, password: "REDACTED", //config.hiveCredentials.password, lockoutThreshold: adapter.adapterLockoutAttemptsThreshold }; - setMappings(adapter); } - function setMappings (adapter) { - vm.mappings = { - mappingsFilename: adapter.adapterMappingsFilename - }; + 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 980833c8f..88cec6157 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,155 @@

Adapter Configuration
These are the parameters that the SHRINE Adapter will use for querying the i2b2 CRC.
CRC URL {{vm.configuration.crcEndpointURL}}
CRC Project {{vm.configuration.crcProjectId}}
Domain {{vm.configuration.domain}}
Adapter User {{vm.configuration.username}}
Adapter Password {{vm.configuration.password}}
Lockout Threshold {{vm.configuration.lockoutThreshold}}
Adapter Query Test
SHRINE Query Term {{vm.adapter.term}}
Status Success Failed
Details {{vm.adapter.description}}
Error Details
Summary:
{{vm.adapter.errorData.summary }}

Description:
{{vm.adapter.errorData.description }}

For information on troubleshooting and resolution, check the SHRINE Error Codex.

Copy the text below and paste it in an email to your site administrator for a faster response.

Technical Details:
{{vm.adapter.errorData.description}}

Codec:
{{vm.adapter.errorData.codec }}

-
Stamp:
{{vm.adapter.errorData.stamp}}

-
Stack Trace Name:
{{vm.adapter.errorData.details.exception.name }}

-
Stack Trace Message:
{{vm.adapter.errorData.details.exception.message}}

+
Stamp:
{{vm.adapter.errorData.stampText}}

+
Stack Trace Name:
{{vm.adapter.errorData.detailsXml.details.exception.name }}

+
Stack Trace Message:
{{vm.adapter.errorData.detailsXml.details.exception.message}}

Mappings File
Filename {{vm.mappings.mappingsFilename}}
\ No newline at end of file diff --git a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/hub.controller.js b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/hub.controller.js index 67a51f554..d9b801c5e 100644 --- a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/hub.controller.js +++ b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/hub.controller.js @@ -1,54 +1,49 @@ (function () { 'use strict'; // -- register controller with angular -- // angular.module('shrine-tools') .controller('HubController', HubController); /** * * @type {string[]} */ - HubController.$inject = ['$app']; - function HubController ($app) { + HubController.$inject = ['$app', '$log']; + function HubController ($app, $log) { var vm = this; init(); /** * */ function init () { - var config = $app.model.cache['config']; - setDownstreamNodes(config); + $app.model.getHub() + .then(setDownstreamNodes, handleFailure); } + function handleFailure (failure) { + //TODO: HANDLE FAILURE + $log.error(JSON.stringify(failure)); + } /** * - * @param config + * @param hub */ - function setDownstreamNodes (conf) { - var config = angular.copy(conf); - - vm.shouldQuerySelf = config.shrine.hub.shouldQuerySelf; + function setDownstreamNodes (hub) { + vm.shouldQuerySelf = hub.shouldQuerySelf; - var nodes = config.shrine.hub.downstreamNodes; - vm.downstreamNodes = []; - - for (var key in nodes) { - if (nodes.hasOwnProperty(key)) { - vm.downstreamNodes.push({name: key, url: nodes[key]}) - } - } + vm.downstreamNodes = hub.downstreamNodes; if(vm.shouldQuerySelf === true) { vm.downstreamNodes.unshift({ name: 'self', url: 'not applicable' }); } } } })(); diff --git a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/i2b2-connections.controller.js b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/i2b2-connections.controller.js index c2b69ea81..fa9da52e5 100644 --- a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/i2b2-connections.controller.js +++ b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/i2b2-connections.controller.js @@ -1,51 +1,50 @@ (function () { 'use strict'; // -- register controller with angular -- // angular.module('shrine-tools') .controller('I2B2ConnectionsController', I2B2ConnectionsController); /** * */ //todo: delete LOG - I2B2ConnectionsController.$inject = ['$app', '$log']; - function I2B2ConnectionsController($app, $log) { + I2B2ConnectionsController.$inject = ['$app']; + function I2B2ConnectionsController($app) { var vm = this; init(); /** * */ function init () { $app.model.getI2B2() .then(setConnections, handleFailure); } function handleFailure(failure) { //TODO: HANDLE FAILURE BETTER $log.error(JSON.stringify(failure)); } /** * */ function setConnections (i2b2) { // @todo: make sure config existes in cache if so cull from cached config, if not make rest call to endpoint, - vm.connections = { pmEndpointUrl: i2b2.pmUrl, crcEndpointUrl: i2b2.crcUrl, ontEndpointUrl: i2b2.ontUrl, i2b2Domain: i2b2.i2b2Domain, username: i2b2.username, crcProject: i2b2.crcProject, ontProject: i2b2.ontProject } } } })(); diff --git a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/qep.controller.js b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/qep.controller.js index 5221738ba..28ebafa1a 100644 --- a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/qep.controller.js +++ b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/qep.controller.js @@ -1,82 +1,46 @@ (function () { 'use strict'; // -- register with angular -- // angular.module('shrine-tools') .controller('QEPController', QEPController); /** * * @type {string[]} */ - QEPController.$inject = ['$app']; - function QEPController ($app) { + QEPController.$inject = ['$app', '$log']; + function QEPController ($app, $log) { var vm = this; init(); function init () { - $app.model.getQep() + + $app.model.getOptions() + .then(setOptions, handleFailure) + .then($app.model.getQep, handleFailure) .then(setQep, handleFailure); - setIsDownstream(config); - setStewardEnabled(config); - setBroadcasterUrl(config); - setSteward(config); } function handleFailure(failure) { //TODO: HANDLE FAILURE - $app.error(JSON.stringify(failure)); - } - - function setQep(qep) { - vm.isStewardEnabled = ; - vm.steward = ; - vm.isDownstream = ; - vm.broadcasterUrl = ; - } - - - /** - * - * @param config - */ - function setIsDownstream (config) { - vm.isDownstream = config.isHub === false; + $log.error(JSON.stringify(failure)); } + function setOptions(options) { + vm.isStewardEnabled = options.stewardEnabled; + vm.isDownstream = !options.isHub; - /** - * - * @param config - */ - function setStewardEnabled (config) { - vm.isStewardEnabled = config.queryEntryPoint.shrineSteward !== undefined; } - - /** - * - */ - function setBroadcasterUrl (config) { - vm.broadcasterUrl = (vm.isDownstream === true && config.queryEntryPoint.broadcasterServiceEndpointUrl !== undefined)? - config.queryEntryPoint.broadcasterServiceEndpointUrl : "UNKNOWN"; + function setQep(qep) { + vm.steward = qep.steward; + vm.broadcasterUrl = (vm.isDownstream && qep.broadcasterUrl !== undefined)? + qep.broadcasterUrl: + 'Unknown'; } - - /** - * - */ - function setSteward (config) { - if(vm.isStewardEnabled === true && vm.isStewardEnabled === true) { - vm.steward = { - qepUsername: config.queryEntryPoint.shrineSteward.qepUserName, - stewardBaseUrl: config.queryEntryPoint.shrineSteward.stewardBaseUrl, - password: "REDACTED" - } - } - - } } })(); diff --git a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/summary.controller.js b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/summary.controller.js index f554c2c67..79027fa26 100644 --- a/apps/dashboard-app/src/main/js/src/app/diagnostic/views/summary.controller.js +++ b/apps/dashboard-app/src/main/js/src/app/diagnostic/views/summary.controller.js @@ -1,84 +1,54 @@ (function () { 'use strict'; // -- register controller with shrine-tools module angular.module('shrine-tools') .controller('SummaryController', SummaryController); /** * Summary Controller. * */ SummaryController.$inject = ['$app', '$sce', '$log'] function SummaryController ($app, $sce, $log) { var vm = this; init(); /** * */ function init() { $app.model.getSummary() - .then(setSummary, onHappyFail); + .then(setSummary, handleFailure); - // $app.model.getConfig() - // .then(setConfig, onConfigFail); + $app.model.getI2B2() + .then(setI2B2, handleFailure); + } + + function handleFailure(failure) { + //TODO: HANDLE FAILURE + $log.error(JSON.stringify(failure)); } /** * * @param summary */ function setSummary(summary) { // -- set viewmodel -- // vm.summary = summary; + if (vm.adapterMappingsFileName === undefined) { + vm.adapterMappingsFileName = 'UNKNOWN' + } return this; } - - /** - * - * @returns {*} - */ - function getConfig() { - return $app.model.getConfig(); - } - - - /** - * - * @param config - */ - function setConfig(config) { - - // -- cache the config -- - $app.model.cache['config'] = config; - vm.config = config; - return this; - } - - - - - /** - * - * @param data - */ - function onHappyFail(data) { - vm.trustedHtml = $sce.trustAsHtml(data); - } - - - /** - * - * @param data - */ - function onConfigFail (data) { - vm.trustedHtml = $sce.trustAsHtml(data); + function setI2B2(i2b2) { + vm.ontProject = i2b2.ontProject; } } })(); 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 6a4d8f970..ad80b10bc 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 @@
Version Info
This site is running SHRINE {{vm.summary.shrineVersion}} built on
- This site is currently using ontology version + This site is currently using ontology version
- This site is currently using for mappings. + This site is currently using for mappings.
Error: click here for more details. OK
Error: click here for more details. OK
Error: click here for more details. OK
Error: click here for more details. OK
Fatal SHRINE Error
\ No newline at end of file diff --git a/apps/dashboard-app/src/main/js/test/admin/status/optionalParts.json b/apps/dashboard-app/src/main/js/test/admin/status/optionalParts.json index 6979e324a..ae6a9f975 100644 --- a/apps/dashboard-app/src/main/js/test/admin/status/optionalParts.json +++ b/apps/dashboard-app/src/main/js/test/admin/status/optionalParts.json @@ -1,2 +1 @@ -{"maxQueryWaitTimeMillis":300000000,"create":true,"attachSigningCert":true,"authorizationType":"StewardQueryAuthorizationService","includeAggregateResults":false,"authenticationType":"PmAuthenticator"} - +{"isHub":true,"stewardEnabled":true,"shouldQuerySelf":false,"downstreamNodes":[{"name":"some hospital","url":"http://example.com/foo/requests"},{"name":"PHS","url":"http://example.com/phs/requests"},{"name":"CHB","url":"http://example.com/chb/requests"},{"name":"SHRINE Cell","url":"not applicable"}]} \ No newline at end of file diff --git a/apps/dashboard-app/src/main/js/test/admin/status/qep.json b/apps/dashboard-app/src/main/js/test/admin/status/qep.json index 69c1bf7da..a4e33b458 100644 --- a/apps/dashboard-app/src/main/js/test/admin/status/qep.json +++ b/apps/dashboard-app/src/main/js/test/admin/status/qep.json @@ -1,3 +1 @@ -{"maxQueryWaitTimeMillis":300000000,"create":true,"attachSigningCert":true,"authorizationType":"StewardQueryAuthorizationService", - "includeAggregateResults":false,"authenticationType":"PmAuthenticator"} - +{"maxQueryWaitTimeMillis":300000000,"create":true,"attachSigningCert":true,"authorizationType":"StewardQueryAuthorizationService","includeAggregateResults":false,"authenticationType":"PmAuthenticator","steward":{"stewardBaseUrl":"https://localhost:6443","qepUsername":"qep","password":"REDACTED"}} \ 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 f905270bd..044916e98 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 +1,275 @@ -{"isHub":true,"shrineVersion":"1.22.2.0-SNAPSHOT","shrineBuildDate":"2016-09-27 15:43:25","ontologyVersion":"java.net.SocketTimeoutException: connect timed out","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":2109,"unit":{}},"response":{"errorMessage":"An unanticipated problem encountered.","problemDigest":{"codec":"net.shrine.problem.ProblemNotYetEncoded","stampText":"Fri Sep 30 09:43:45 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.(Problem.scala:197)","line":"net.shrine.problem.ProblemNotYetEncoded$.apply(Problem.scala:215)","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:327)","line":"net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:327)","line":"scala.util.Try$.apply(Try.scala:192)","line":"net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:327)","line":"net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:322)","line":"scala.Option.map(Option.scala:146)","line":"net.shrine.status.Summary$.apply(StatusJaxrs.scala:322)","line":"net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:63)","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-09-30 09:42:45.133)]","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.(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:327)","line":"net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:327)","line":"scala.util.Try$.apply(Try.scala:192)","line":"net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:327)","line":"net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:322)","line":"scala.Option.map(Option.scala:146)","line":"net.shrine.status.Summary$.apply(StatusJaxrs.scala:322)","line":"net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:63)","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.(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.(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:327)","net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:327)","scala.util.Try$.apply(Try.scala:192)","net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:327)","net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:322)","scala.Option.map(Option.scala:146)","net.shrine.status.Summary$.apply(StatusJaxrs.scala:322)","net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:63)","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":1475243025159}},"origin":{"name":"SHRINE Cell"}},"adapterMappingsFileName":"AdapterMappings.xml","adapterOk":true,"keystoreOk":true,"hubOk":false,"qepOk":true} +{ + "isHub": true, + "shrineVersion": "1.22.2.0-SNAPSHOT", + "shrineBuildDate": "2016-09-27 15:43:25", + "ontologyVersion": "UNKNOWN", + "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, + "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", + "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.(Problem.scala:204)", + "line": "net.shrine.problem.ProblemNotYetEncoded$.apply(Problem.scala:222)", + "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": "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": "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.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)]", + "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.(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": "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": "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.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.(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.(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)", + "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)", + "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.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 + } + }, + "origin": { + "name": "SHRINE Cell" + } + }, + "adapterMappingsFileName": "AdapterMappings.xml", + "adapterOk": true, + "keystoreOk": true, + "hubOk": false, + "qepOk": true +} \ No newline at end of file diff --git a/apps/dashboard-app/src/test/resources/teststatus/optionalParts b/apps/dashboard-app/src/test/resources/teststatus/optionalParts index ab07fbb96..ae6a9f975 100644 --- a/apps/dashboard-app/src/test/resources/teststatus/optionalParts +++ b/apps/dashboard-app/src/test/resources/teststatus/optionalParts @@ -1 +1 @@ -{"isHub":true,"stewardEnabled":true,"shouldQuerySelf":false,"downstreamNodes":[{"name":"shrine-dev2","url":"https://shrine-dev2.catalyst:6443/shrine/rest/adapter/requests"},{"name":"shrine-dev1","url":"not applicable"}]} \ No newline at end of file +{"isHub":true,"stewardEnabled":true,"shouldQuerySelf":false,"downstreamNodes":[{"name":"some hospital","url":"http://example.com/foo/requests"},{"name":"PHS","url":"http://example.com/phs/requests"},{"name":"CHB","url":"http://example.com/chb/requests"},{"name":"SHRINE Cell","url":"not applicable"}]} \ No newline at end of file diff --git a/apps/dashboard-app/src/test/resources/teststatus/qep b/apps/dashboard-app/src/test/resources/teststatus/qep index 75ee86515..a4e33b458 100644 --- a/apps/dashboard-app/src/test/resources/teststatus/qep +++ b/apps/dashboard-app/src/test/resources/teststatus/qep @@ -1 +1 @@ -{"maxQueryWaitTimeMillis":300000000,"create":true,"attachSigningCert":true,"authorizationType":"StewardQueryAuthorizationService","includeAggregateResults":false,"authenticationType":"PmAuthenticator"} +{"maxQueryWaitTimeMillis":300000000,"create":true,"attachSigningCert":true,"authorizationType":"StewardQueryAuthorizationService","includeAggregateResults":false,"authenticationType":"PmAuthenticator","steward":{"stewardBaseUrl":"https://localhost:6443","qepUsername":"qep","password":"REDACTED"}} \ 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 f905270bd..43114f00d 100644 --- a/apps/dashboard-app/src/test/resources/teststatus/summary +++ b/apps/dashboard-app/src/test/resources/teststatus/summary @@ -1 +1 @@ -{"isHub":true,"shrineVersion":"1.22.2.0-SNAPSHOT","shrineBuildDate":"2016-09-27 15:43:25","ontologyVersion":"java.net.SocketTimeoutException: connect timed out","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":2109,"unit":{}},"response":{"errorMessage":"An unanticipated problem encountered.","problemDigest":{"codec":"net.shrine.problem.ProblemNotYetEncoded","stampText":"Fri Sep 30 09:43:45 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.(Problem.scala:197)","line":"net.shrine.problem.ProblemNotYetEncoded$.apply(Problem.scala:215)","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:327)","line":"net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:327)","line":"scala.util.Try$.apply(Try.scala:192)","line":"net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:327)","line":"net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:322)","line":"scala.Option.map(Option.scala:146)","line":"net.shrine.status.Summary$.apply(StatusJaxrs.scala:322)","line":"net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:63)","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-09-30 09:42:45.133)]","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.(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:327)","line":"net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:327)","line":"scala.util.Try$.apply(Try.scala:192)","line":"net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:327)","line":"net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:322)","line":"scala.Option.map(Option.scala:146)","line":"net.shrine.status.Summary$.apply(StatusJaxrs.scala:322)","line":"net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:63)","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.(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.(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:327)","net.shrine.status.Summary$$anonfun$21$$anonfun$22.apply(StatusJaxrs.scala:327)","scala.util.Try$.apply(Try.scala:192)","net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:327)","net.shrine.status.Summary$$anonfun$21.apply(StatusJaxrs.scala:322)","scala.Option.map(Option.scala:146)","net.shrine.status.Summary$.apply(StatusJaxrs.scala:322)","net.shrine.status.StatusJaxrs.summary(StatusJaxrs.scala:63)","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":1475243025159}},"origin":{"name":"SHRINE Cell"}},"adapterMappingsFileName":"AdapterMappings.xml","adapterOk":true,"keystoreOk":true,"hubOk":false,"qepOk":true} +{"isHub":true,"shrineVersion":"1.22.2.0-SNAPSHOT","shrineBuildDate":"2016-09-27 15:43:25","ontologyVersion":"UNKNOWN","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,"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","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.(Problem.scala:204)","line":"net.shrine.problem.ProblemNotYetEncoded$.apply(Problem.scala:222)","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":"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":"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.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)]","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.(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":"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":"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.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.(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.(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)","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)","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.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}},"origin":{"name":"SHRINE Cell"}},"adapterMappingsFileName":"AdapterMappings.xml","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 a30a07dc6..3c3dd3b1e 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,430 +1,452 @@ 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.authorization.StewardQueryAuthorizationService -import net.shrine.broadcaster.{Broadcaster, NodeHandle} +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.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 + authenticationType:String, + steward:Option[Steward], + broadcasterUrl:Option[String] ) object Qep{ val key = "shrine.queryEntryPoint." + import ShrineOrchestrator.queryEntryPointComponents def apply():Qep = new Qep( - maxQueryWaitTimeMillis = ShrineOrchestrator.queryEntryPointComponents.fold(0L)(_.i2b2Service.queryTimeout.toMicros), - create = ShrineOrchestrator.queryEntryPointComponents.isDefined, - attachSigningCert = ShrineOrchestrator.queryEntryPointComponents.fold(false)(_.i2b2Service.broadcastAndAggregationService.attachSigningCert), - authorizationType = ShrineOrchestrator.queryEntryPointComponents.fold("")(_.i2b2Service.authorizationService.getClass.getSimpleName), - includeAggregateResults = ShrineOrchestrator.queryEntryPointComponents.fold(false)(_.i2b2Service.includeAggregateResult), - authenticationType = ShrineOrchestrator.queryEntryPointComponents.fold("")(_.i2b2Service.authenticator.getClass.getSimpleName) - ) + 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 adapterMappingsFileInfo = mappingFileInfo Adapter(crcEndpointUrl, setSizeObfuscation, adapterLockoutAttemptsThreshold, adapterMappingsFileInfo._1, adapterMappingsFileInfo._2) } def mappingFileInfo: (Option[String], Option[Long], Option[String]) = { val adapterMappingsFileName = ShrineOrchestrator.adapterComponents.map(_.adapterMappings.source) val adapterMappingsVersion = ShrineOrchestrator.adapterComponents.map(_.adapterMappings.version) //todo use this? val noDate:Option[Long] = None val adapterMappingsDate:Option[Long] = adapterMappingsFileName.fold(noDate){ fileName => val file:File = new File(fileName) if(file.exists) Some(file.lastModified()) else None } (adapterMappingsFileName,adapterMappingsDate,adapterMappingsVersion) } } 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, 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) - x.getMessage + "UNKNOWN" //x.getMessage } Summary( isHub = ShrineOrchestrator.hubComponents.isDefined, shrineVersion = Versions.version, shrineBuildDate = Versions.buildDate, //todo in scala 2.12, do better ontologyVersion = ontologyVersion, ontologyTerm = term.value, queryResult = queryResult, adapterMappingsFileName = adapterMappingInfo._1, adapterMappingsDate = adapterMappingInfo._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/resources/shrine.conf b/apps/shrine-app/src/test/resources/shrine.conf index bcc02d9d9..1da78c34a 100644 --- a/apps/shrine-app/src/test/resources/shrine.conf +++ b/apps/shrine-app/src/test/resources/shrine.conf @@ -1,81 +1,81 @@ shrine { obvious = "OBVIOUS" problem { - problemHandler = "net.shrine.problem.LoggingProblemHandler$" + problemHandler = "net.shrine.problem.NoOpProblemHandler$" } keystore { file = "shrine.keystore" password = "chiptesting" privateKeyAlias = "test-cert" keyStoreType = "JKS" caCertAliases = [carra ca] } queryEntryPoint { audit { collectQepAudit = false database { slickProfileClassName = "slick.driver.H2Driver$" createTablesOnStart = true //for testing with H2 in memory, when not running unit tests. Set to false normally dataSourceFrom = "testDataSource" //Can be JNDI or testDataSource . Use testDataSource for tests, JNDI everywhere else testDataSource { driverClassName = "org.h2.Driver" url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" //H2 embedded in-memory for unit tests ;TRACE_LEVEL_SYSTEM_OUT=2 for H2's trace } } } authenticationType = "pm" //can be none, pm, or ecommons authorizationType = "shrine-steward" //can be none, shrine-steward, or hms-steward shrineSteward { qepUserName = "qep" qepPassword = "trustme" stewardBaseUrl = "https://localhost:6443" } } adapter { create = true audit { collectQepAudit = false database { slickProfileClassName = "slick.driver.H2Driver$" createTablesOnStart = true //for testing with H2 in memory, when not running unit tests. Set to false normally dataSourceFrom = "testDataSource" //Can be JNDI or testDataSource . Use testDataSource for tests, JNDI everywhere else testDataSource { driverClassName = "org.h2.Driver" url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" //H2 embedded in-memory for unit tests ;TRACE_LEVEL_SYSTEM_OUT=2 for H2's trace } } } } squerylDataSource { database { dataSourceFrom = "testDataSource" //Can be JNDI or testDataSource . Use testDataSource for tests, JNDI everywhere else testDataSource { driverClassName = "org.h2.Driver" url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" //H2 embedded in-memory for unit tests ;TRACE_LEVEL_SYSTEM_OUT=2 for H2's trace } } } // squerylDataSource { // database { // dataSourceFrom = "testDataSource" //Can be JNDI or testDataSource . Use testDataSource for tests, JNDI everywhere else // // testDataSource { // driverClassName = "org.h2.Driver" // url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" //H2 embedded in-memory for unit tests ;TRACE_LEVEL_SYSTEM_OUT=2 for H2's trace // } // } // } } \ 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 6baf45cb0..a324efb7d 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,133 +1,133 @@ 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 (true) 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) println(s"KeyStoreReport is $actual") } } diff --git a/apps/steward-app/src/test/resources/shrine.conf b/apps/steward-app/src/test/resources/shrine.conf index 2801f8b08..47382d0b4 100644 --- a/apps/steward-app/src/test/resources/shrine.conf +++ b/apps/steward-app/src/test/resources/shrine.conf @@ -1,34 +1,34 @@ shrine { steward { database { slickProfileClassName = "slick.driver.H2Driver$" createTablesOnStart = true //for testing with H2 in memory, when not running unit tests. Set to false normally dataSourceFrom = "testDataSource" //Can be JNDI or testDataSource . Use testDataSource for tests, JNDI everywhere else testDataSource { driverClassName = "org.h2.Driver" url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" //H2 embedded in-memory for unit tests ;TRACE_LEVEL_SYSTEM_OUT=2 for H2's trace } } } authenticate { usersource { //Bogus security for testing type = "ConfigUserSource" //Must be ConfigUserSource (for isolated testing) or PmUserSource (for everything else) researcher { username = "ben" password = "kapow" } steward { username = "dave" password = "kablam" } - qep{ + qep { username = "qep" password = "trustme" } } } } \ No newline at end of file diff --git a/commons/auth/src/main/scala/net/shrine/authorization/PmAuthorizerComponent.scala b/commons/auth/src/main/scala/net/shrine/authorization/PmAuthorizerComponent.scala index f1df2acca..c04d45a19 100644 --- a/commons/auth/src/main/scala/net/shrine/authorization/PmAuthorizerComponent.scala +++ b/commons/auth/src/main/scala/net/shrine/authorization/PmAuthorizerComponent.scala @@ -1,112 +1,112 @@ package net.shrine.authorization import net.shrine.log.Loggable import scala.util.{Failure, Success, Try} import net.shrine.client.HttpResponse import net.shrine.i2b2.protocol.pm.GetUserConfigurationRequest import net.shrine.i2b2.protocol.pm.User import net.shrine.problem._ import net.shrine.protocol.AuthenticationInfo import net.shrine.protocol.ErrorResponse import scala.util.control.NonFatal /** * @author clint * @since Apr 5, 2013 */ trait PmAuthorizerComponent { self: PmHttpClientComponent with Loggable => import PmAuthorizerComponent._ //noinspection RedundantBlock object Pm { def parsePmResult(authn: AuthenticationInfo)(httpResponse: HttpResponse): Try[Either[ErrorResponse, User]] = { User.fromI2b2(httpResponse.body).map(Right(_)).recoverWith { case NonFatal(e) => { debug(s"Couldn't extract a User from '$httpResponse'") Try(Left(ErrorResponse.fromI2b2(httpResponse.body))) } }.recover { case NonFatal(e) => { val problem = CouldNotInterpretResponseFromPmCell(pmPoster.url,authn,httpResponse,e) - LoggingProblemHandler.handleProblem(problem) + //TODO: Is this needed? LoggingProblemHandler.handleProblem(problem) Left(ErrorResponse(problem)) } } } def authorize(projectId: String, neededRoles: Set[String], authn: AuthenticationInfo): AuthorizationStatus = { val request = GetUserConfigurationRequest(authn) val responseAttempt: Try[HttpResponse] = Try { debug(s"Authorizing with PM cell at ${pmPoster.url}") pmPoster.post(request.toI2b2String) } val authStatusAttempt: Try[AuthorizationStatus with Product with Serializable] = responseAttempt.flatMap(parsePmResult(authn)).map { case Right(user) => { val managerUserOption = for { roles <- user.rolesByProject.get(projectId) if neededRoles.forall(roles.contains) } yield user managerUserOption.map(Authorized).getOrElse { NotAuthorized(MissingRequiredRoles(projectId,neededRoles,authn)) } } case Left(errorResponse) => { //todo remove when ErrorResponse gets its message info(s"ErrorResponse message '${errorResponse.errorMessage}' may not have carried through to the NotAuthorized object") NotAuthorized(errorResponse.problemDigest) } } authStatusAttempt match { case Success(s) => s case Failure(x) => NotAuthorized(CouldNotReachPmCell(pmPoster.url,authn,x)) } } } } object PmAuthorizerComponent { sealed trait AuthorizationStatus case class Authorized(user: User) extends AuthorizationStatus case class NotAuthorized(problemDigest: ProblemDigest) extends AuthorizationStatus { def toErrorResponse = ErrorResponse(problemDigest.summary,problemDigest) } object NotAuthorized { def apply(problem:Problem):NotAuthorized = NotAuthorized(problem.toDigest) } } case class MissingRequiredRoles(projectId: String, neededRoles: Set[String], authn: AuthenticationInfo) extends AbstractProblem(ProblemSources.Qep) { override val summary: String = s"User ${authn.domain}:${authn.username} is missing roles in project '$projectId'" override val description:String = s"User ${authn.domain}:${authn.username} does not have all the needed roles: ${neededRoles.map("'" + _ + "'").mkString(", ")} in the project '$projectId'" } case class CouldNotReachPmCell(pmUrl:String,authn: AuthenticationInfo,x:Throwable) extends AbstractProblem(ProblemSources.Qep) { override val throwable = Some(x) override val summary: String = s"Could not reach PM cell." override val description:String = s"Shrine encountered ${throwable.get} while attempting to reach the PM cell at $pmUrl for ${authn.domain}:${authn.username}." } case class CouldNotInterpretResponseFromPmCell(pmUrl:String,authn: AuthenticationInfo,httpResponse: HttpResponse,x:Throwable) extends AbstractProblem(ProblemSources.Qep) { override val throwable = Some(x) override def summary: String = s"Could not interpret response from PM cell." override def description: String = s"Shrine could not interpret the response from the PM cell at ${pmUrl} for ${authn.domain}:${authn.username}: due to ${throwable.get}" override val detailsXml =
Response is {httpResponse} {throwableDetail.getOrElse("")}
} \ No newline at end of file diff --git a/commons/auth/src/test/resources/shrine.conf b/commons/auth/src/test/resources/shrine.conf index fce79054a..718fc09a3 100644 --- a/commons/auth/src/test/resources/shrine.conf +++ b/commons/auth/src/test/resources/shrine.conf @@ -1,28 +1,28 @@ shrine { authenticate { usersource { //Bogus security for testing type = "ConfigUserSource" //Must be ConfigUserSource (for isolated testing) or PmUserSource (for everything else) researcher { username = "ben" password = "kapow" } steward { username = "dave" password = "kablam" } qep{ username = "qep" password = "trustme" } admin{ username = "keith" password = "shh!" } } } problem { - problemHandler = "net.shrine.problem.LoggingProblemHandler$" + problemHandler = "net.shrine.problem.NoOpProblemHandler$" } } \ No newline at end of file diff --git a/commons/protocol/src/main/scala/net/shrine/protocol/ErrorResponse.scala b/commons/protocol/src/main/scala/net/shrine/protocol/ErrorResponse.scala index 5e7359e09..9f3eeb2e2 100644 --- a/commons/protocol/src/main/scala/net/shrine/protocol/ErrorResponse.scala +++ b/commons/protocol/src/main/scala/net/shrine/protocol/ErrorResponse.scala @@ -1,117 +1,117 @@ package net.shrine.protocol import net.shrine.log.Loggable import net.shrine.problem.{LoggingProblemHandler, Problem, ProblemDigest} import scala.xml.{NodeBuffer, NodeSeq} import net.shrine.util.XmlUtil import net.shrine.serialization.XmlUnmarshaller import net.shrine.serialization.I2b2Unmarshaller import net.shrine.util.NodeSeqEnrichments import scala.util.Try import scala.util.control.NonFatal /** * @author Bill Simons * @since 4/25/11 * @see http://cbmi.med.harvard.edu * @see http://chip.org *

* NOTICE: This software comes with NO guarantees whatsoever and is * licensed as Lgpl Open Source * @see http://www.gnu.org/licenses/lgpl.html * * NB: Now a case class for structural equality */ final case class ErrorResponse(errorMessage: String,problemDigest:ProblemDigest) extends ShrineResponse { override protected def status: NodeSeq = { val buffer = new NodeBuffer buffer += { errorMessage } buffer += problemDigest.toXml } override protected def i2b2MessageBody = null import ErrorResponse.rootTagName override def toXml = { XmlUtil.stripWhitespace { val xml = XmlUtil.renameRootTag(rootTagName) { { errorMessage } {problemDigest.toXml} } xml } } } object ErrorResponse extends XmlUnmarshaller[ErrorResponse] with I2b2Unmarshaller[ErrorResponse] with HasRootTagName with Loggable { val rootTagName = "errorResponse" def apply(problem:Problem) = { - LoggingProblemHandler.handleProblem(problem) //todo someday hook up to the proper problem handler hierarchy. + //Is this needed? LoggingProblemHandler.handleProblem(problem) //todo someday hook up to the proper problem handler hierarchy. new ErrorResponse(problem.summary,problem.toDigest) } override def fromXml(xml: NodeSeq): ErrorResponse = { val messageXml = xml \ "message" //NB: Fail fast require(messageXml.nonEmpty) val problemDigest = ProblemDigest.fromXml(xml) ErrorResponse(XmlUtil.trim(messageXml),problemDigest) } override def fromI2b2(xml: NodeSeq): ErrorResponse = { import NodeSeqEnrichments.Strictness._ //todo what determines parseFormatA vs parseFormatB when written? It looks like our ErrorResponses use A. def parseFormatA: Try[ErrorResponse] = { for { statusXml <- xml withChild "response_header" withChild "result_status" withChild "status" resultStatusXml <- xml withChild "response_header" withChild "result_status" typeText <- statusXml attribute "type" if typeText == "ERROR" //NB: Fail fast{ statusMessage = XmlUtil.trim(statusXml) problemDigest = ProblemDigest.fromXml(resultStatusXml) } yield { ErrorResponse(statusMessage,problemDigest) } } def parseFormatB: Try[ErrorResponse] = { for { conditionXml <- xml withChild "message_body" withChild "response" withChild "status" withChild "condition" typeText <- conditionXml attribute "type" if typeText == "ERROR" statusMessage = XmlUtil.trim(conditionXml) problemDigest = ErrorStatusFromCrc(Option(statusMessage),xml.text).toDigest//here's another place where an ERROR can have no ProblemDigest } yield { ErrorResponse(statusMessage,problemDigest) } } parseFormatA.recoverWith { case NonFatal(e) => { warn(s"Encountered a problem while parsing an error from I2B2 with 'format A', trying 'format B' ${xml.text}",e) parseFormatB } }.get } /** * * * * * * Query result instance id 3126 not found * * * * */ } \ No newline at end of file diff --git a/commons/protocol/src/test/resources/shrine.conf b/commons/protocol/src/test/resources/shrine.conf index e280c18e3..ff8cfb542 100644 --- a/commons/protocol/src/test/resources/shrine.conf +++ b/commons/protocol/src/test/resources/shrine.conf @@ -1,5 +1,5 @@ shrine { problem { - problemHandler = "net.shrine.problem.LoggingProblemHandler$" + problemHandler = "net.shrine.problem.NoOpProblemHandler$" } } \ No newline at end of file diff --git a/commons/util/src/main/scala/net/shrine/problem/Problem.scala b/commons/util/src/main/scala/net/shrine/problem/Problem.scala index 0a6928570..c2105d6d8 100644 --- a/commons/util/src/main/scala/net/shrine/problem/Problem.scala +++ b/commons/util/src/main/scala/net/shrine/problem/Problem.scala @@ -1,216 +1,223 @@ package net.shrine.problem import java.net.InetAddress import java.util.Date import java.util.concurrent.Executors import net.shrine.log.Loggable import net.shrine.serialization.{XmlMarshaller, XmlUnmarshaller} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.{ExecutionContext, Future, Promise} import scala.xml.{Elem, Node, NodeSeq} /** * Describes what information we have about a problem at the site in code where we discover it. * * @author david * @since 8/6/15 */ trait Problem { def summary:String def problemName = getClass.getName def throwable:Option[Throwable] = None def stamp:Stamp def description:String def exceptionXml(exception:Option[Throwable]): Option[Elem] = { exception.map{x => {x.getClass.getName} {x.getMessage} {x.getStackTrace.map(line => {line})}{exceptionXml(Option(x.getCause)).getOrElse("")} }} def throwableDetail: Option[Elem] = exceptionXml(throwable) def detailsXml: NodeSeq = NodeSeq.fromSeq(

{throwableDetail.getOrElse("")}
) def toDigest:ProblemDigest = ProblemDigest(problemName,stamp.pretty,summary,description,detailsXml,stamp.time) /** * Temporary replacement for onCreate, which will be released come Scala 2.13 * TODO: remove when Scala 2.13 releases */ def hackToHandleAfterInitialization(handler:ProblemHandler):Future[Unit] = { import scala.concurrent.blocking Future { var continue = true while (continue) { try { blocking(synchronized(handler.handleProblem(this))) continue = false } catch { case un:UninitializedFieldError => Thread.sleep(5) continue = true } } Unit } } } case class ProblemDigest(codec: String, stampText: String, summary: String, description: String, detailsXml: NodeSeq, epoch: Long) extends XmlMarshaller { override def toXml: Node = { {codec} {stampText} {summary} {description} {epoch} {detailsXml} } /** * Ignores detailXml. equals with scala.xml is impossible. See http://www.scala-lang.org/api/2.10.3/index.html#scala.xml.Equality$ */ override def equals(other: Any): Boolean = other match { case that: ProblemDigest => (that canEqual this) && codec == that.codec && stampText == that.stampText && summary == that.summary && description == that.description && epoch == that.epoch case _ => false } /** * Ignores detailXml */ override def hashCode: Int = { val prime = 67 codec.hashCode + prime * (stampText.hashCode + prime *(summary.hashCode + prime * (description.hashCode + prime * epoch.hashCode()))) } } object ProblemDigest extends XmlUnmarshaller[ProblemDigest] with Loggable { override def fromXml(xml: NodeSeq): ProblemDigest = { val problemNode = xml \ "problem" require(problemNode.nonEmpty,s"No problem tag in $xml") def extractText(tagName:String) = (problemNode \ tagName).text val codec = extractText("codec") val stampText = extractText("stamp") val summary = extractText("summary") val description = extractText("description") val detailsXml: NodeSeq = problemNode \ "details" val epoch = try { extractText("epoch").toLong } catch { case nx:NumberFormatException => error(s"While parsing xml representing a ProblemDigest, the epoch could not be parsed into a long", nx) 0 } ProblemDigest(codec,stampText,summary,description,detailsXml,epoch) } } case class Stamp(host:InetAddress,time:Long,source:ProblemSources.ProblemSource) { def pretty = s"${new Date(time)} on ${host.getHostName} ${source.pretty}" } object Stamp { //TODO: val dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")? //TODO: Currently the stamp text is locale specific, which can change depending on the jre/computer running it... def apply(source:ProblemSources.ProblemSource, timer: => Long): Stamp = Stamp(InetAddress.getLocalHost, timer, source) } abstract class AbstractProblem(source:ProblemSources.ProblemSource) extends Problem { def timer = System.currentTimeMillis override val stamp = Stamp(source, timer) private val config = ProblemConfigSource.config.getConfig("shrine.problem") hackToHandleAfterInitialization(ProblemConfigSource.getObject("problemHandler", config)) } trait ProblemHandler { def handleProblem(problem:Problem) } /** * An example problem handler */ object LoggingProblemHandler extends ProblemHandler with Loggable { override def handleProblem(problem: Problem): Unit = { - problem.throwable.fold(error(problem.toString))(throwable => error(problem.toString,throwable) ) } } object DatabaseProblemHandler extends ProblemHandler { override def handleProblem(problem: Problem): Unit = { Problems.DatabaseConnector.insertProblem(problem.toDigest) } } +/** + * Mainly for testing, when you don't want problems to print a bunch + * to stdout + */ +object NoOpProblemHandler extends ProblemHandler { + override def handleProblem(problem: Problem): Unit = Unit +} + object ProblemSources{ sealed trait ProblemSource { def pretty = getClass.getSimpleName.dropRight(1) } case object Adapter extends ProblemSource case object Hub extends ProblemSource case object Qep extends ProblemSource case object Dsa extends ProblemSource case object Unknown extends ProblemSource def problemSources = Set(Adapter,Hub,Qep,Dsa,Unknown) } case class ProblemNotYetEncoded(internalSummary:String,t:Option[Throwable] = None) extends AbstractProblem(ProblemSources.Unknown){ override val summary = "An unanticipated problem encountered." override val throwable = { val rx = t.fold(new IllegalStateException(s"$summary"))( new IllegalStateException(s"$summary",_) ) rx.fillInStackTrace() Some(rx) } val reportedAtStackTrace = new IllegalStateException("Capture reporting stack trace.") override val description = "This problem is not yet classified in Shrine source code. Please report the details to the Shrine dev team." override val detailsXml: NodeSeq = NodeSeq.fromSeq(
{internalSummary} {throwableDetail.getOrElse("")}
) } object ProblemNotYetEncoded { def apply(summary:String,x:Throwable):ProblemNotYetEncoded = ProblemNotYetEncoded(summary,Some(x)) } \ No newline at end of file diff --git a/hms-support/hms-core/src/test/resources/shrine.conf b/hms-support/hms-core/src/test/resources/shrine.conf index e280c18e3..ff8cfb542 100644 --- a/hms-support/hms-core/src/test/resources/shrine.conf +++ b/hms-support/hms-core/src/test/resources/shrine.conf @@ -1,5 +1,5 @@ shrine { problem { - problemHandler = "net.shrine.problem.LoggingProblemHandler$" + problemHandler = "net.shrine.problem.NoOpProblemHandler$" } } \ No newline at end of file diff --git a/hub/broadcaster-aggregator/src/main/scala/net/shrine/broadcaster/HubBroadcastAndAggregationService.scala b/hub/broadcaster-aggregator/src/main/scala/net/shrine/broadcaster/HubBroadcastAndAggregationService.scala index 3317e1b1b..587b4c6bc 100644 --- a/hub/broadcaster-aggregator/src/main/scala/net/shrine/broadcaster/HubBroadcastAndAggregationService.scala +++ b/hub/broadcaster-aggregator/src/main/scala/net/shrine/broadcaster/HubBroadcastAndAggregationService.scala @@ -1,26 +1,26 @@ package net.shrine.broadcaster import net.shrine.log.Loggable import scala.concurrent.Future import scala.concurrent.duration.Duration import net.shrine.aggregation.Aggregator import net.shrine.protocol.BroadcastMessage import net.shrine.protocol.ErrorResponse import net.shrine.protocol.FailureResult$ import net.shrine.protocol.Result import net.shrine.protocol.ShrineResponse import net.shrine.protocol.SingleNodeResult import net.shrine.protocol.Timeout import net.shrine.util.XmlDateHelper import net.shrine.crypto.Signer import net.shrine.protocol.BaseShrineResponse import net.shrine.broadcaster.dao.HubDao /** * @author clint * @date Nov 15, 2013 */ -final class HubBroadcastAndAggregationService(broadcasterClient: BroadcasterClient) extends AbstractBroadcastAndAggregationService(broadcasterClient) { +final case class HubBroadcastAndAggregationService(broadcasterClient: BroadcasterClient) extends AbstractBroadcastAndAggregationService(broadcasterClient) { override def attachSigningCert: Boolean = false } \ No newline at end of file diff --git a/hub/broadcaster-aggregator/src/test/resources/shrine.conf b/hub/broadcaster-aggregator/src/test/resources/shrine.conf index e280c18e3..ff8cfb542 100644 --- a/hub/broadcaster-aggregator/src/test/resources/shrine.conf +++ b/hub/broadcaster-aggregator/src/test/resources/shrine.conf @@ -1,5 +1,5 @@ shrine { problem { - problemHandler = "net.shrine.problem.LoggingProblemHandler$" + problemHandler = "net.shrine.problem.NoOpProblemHandler$" } } \ No newline at end of file diff --git a/qep/service/src/main/scala/net/shrine/qep/I2b2QepService.scala b/qep/service/src/main/scala/net/shrine/qep/I2b2QepService.scala index 23668cd0b..e7ec4e796 100644 --- a/qep/service/src/main/scala/net/shrine/qep/I2b2QepService.scala +++ b/qep/service/src/main/scala/net/shrine/qep/I2b2QepService.scala @@ -1,72 +1,73 @@ package net.shrine.qep import com.typesafe.config.Config import net.shrine.authentication.Authenticator import net.shrine.authorization.QueryAuthorizationService import net.shrine.broadcaster.BroadcastAndAggregationService import net.shrine.config.DurationConfigParser import net.shrine.protocol.{DeleteQueryRequest, FlagQueryRequest, I2b2RequestHandler, ReadApprovedQueryTopicsRequest, ReadInstanceResultsRequest, ReadPreviousQueriesRequest, ReadQueryDefinitionRequest, ReadQueryInstancesRequest, ReadResultOutputTypesRequest, RenameQueryRequest, ResultOutputType, RunQueryRequest, ShrineResponse, UnFlagQueryRequest} import net.shrine.qep.dao.AuditDao +import net.shrine.broadcaster.HubBroadcastAndAggregationService import scala.concurrent.duration.Duration /** * @author clint * @since Feb 19, 2014 */ final case class I2b2QepService( commonName:String, auditDao: AuditDao, authenticator: Authenticator, authorizationService: QueryAuthorizationService, includeAggregateResult: Boolean, broadcastAndAggregationService: BroadcastAndAggregationService, queryTimeout: Duration, breakdownTypes: Set[ResultOutputType], collectQepAudit:Boolean) extends AbstractQepService[ShrineResponse] with I2b2RequestHandler { override def readResultOutputTypes(request: ReadResultOutputTypesRequest): ShrineResponse = doReadResultOutputTypes(request) override def runQuery(request: RunQueryRequest, shouldBroadcast: Boolean): ShrineResponse = doRunQuery(request, shouldBroadcast) override def readQueryDefinition(request: ReadQueryDefinitionRequest, shouldBroadcast: Boolean) = doReadQueryDefinition(request, shouldBroadcast) override def readInstanceResults(request: ReadInstanceResultsRequest, shouldBroadcast: Boolean) = doReadInstanceResults(request, shouldBroadcast) override def readQueryInstances(request: ReadQueryInstancesRequest, shouldBroadcast: Boolean) = doReadQueryInstances(request, shouldBroadcast) override def readPreviousQueries(request: ReadPreviousQueriesRequest, shouldBroadcast: Boolean) = doReadPreviousQueries(request, shouldBroadcast) override def renameQuery(request: RenameQueryRequest, shouldBroadcast: Boolean) = doRenameQuery(request, shouldBroadcast) override def deleteQuery(request: DeleteQueryRequest, shouldBroadcast: Boolean) = doDeleteQuery(request, shouldBroadcast) override def readApprovedQueryTopics(request: ReadApprovedQueryTopicsRequest, shouldBroadcast: Boolean) = doReadApprovedQueryTopics(request, shouldBroadcast) override def flagQuery(request: FlagQueryRequest, shouldBroadcast: Boolean = true) = doFlagQuery(request, shouldBroadcast) override def unFlagQuery(request: UnFlagQueryRequest, shouldBroadcast: Boolean = true) = doUnFlagQuery(request, shouldBroadcast) } object I2b2QepService { def apply(qepConfig: Config, commonName: String, auditDao: AuditDao, authenticator: Authenticator, authorizationService: QueryAuthorizationService, broadcastService: BroadcastAndAggregationService, breakdownTypes: Set[ResultOutputType]): I2b2QepService = { I2b2QepService( commonName, auditDao, authenticator, authorizationService, qepConfig.getBoolean("includeAggregateResults"), broadcastService, DurationConfigParser(qepConfig.getConfig("maxQueryWaitTime")), breakdownTypes, qepConfig.getBoolean("audit.collectQepAudit") ) } } \ No newline at end of file