play.api.libs.json.JsObject Scala Examples
The following examples show how to use play.api.libs.json.JsObject.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: PreferencesFrontendService.scala From pertax-frontend with Apache License 2.0 | 6 votes |
package services import com.kenshoo.play.metrics.Metrics import config.ConfigDecorator import controllers.auth.requests.UserRequest import com.google.inject.{Inject, Singleton} import metrics.HasMetrics import models.{ActivatePaperlessActivatedResponse, ActivatePaperlessNotAllowedResponse, ActivatePaperlessRequiresUserActionResponse, ActivatePaperlessResponse} import play.api.Mode.Mode import play.api.i18n.{I18nSupport, Messages, MessagesApi} import play.api.libs.json.{JsObject, Json} import play.api.{Configuration, Environment, Logger} import uk.gov.hmrc.play.bootstrap.http.DefaultHttpClient import uk.gov.hmrc.crypto.PlainText import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.filters.frontend.crypto.SessionCookieCrypto import uk.gov.hmrc.play.partials.HeaderCarrierForPartialsConverter import util.Tools import scala.concurrent.{ExecutionContext, Future} @Singleton class PreferencesFrontendService @Inject()( environment: Environment, runModeConfiguration: Configuration, val simpleHttp: DefaultHttpClient, val messagesApi: MessagesApi, val metrics: Metrics, val configDecorator: ConfigDecorator, val sessionCookieCrypto: SessionCookieCrypto, val tools: Tools, servicesConfig: ServicesConfig)(implicit ec: ExecutionContext) extends HeaderCarrierForPartialsConverter with HasMetrics with I18nSupport { val mode: Mode = environment.mode val preferencesFrontendUrl = servicesConfig.baseUrl("preferences-frontend") override def crypto: String => String = cookie => cookie def getPaperlessPreference()(implicit request: UserRequest[_]): Future[ActivatePaperlessResponse] = { def absoluteUrl = configDecorator.pertaxFrontendHost + request.uri def activatePaperless: Future[ActivatePaperlessResponse] = withMetricsTimer("get-activate-paperless") { timer => val url = s"$preferencesFrontendUrl/paperless/activate?returnUrl=${tools.encryptAndEncode(absoluteUrl)}&returnLinkText=${tools .encryptAndEncode(Messages("label.continue"))}" //TODO remove ref to Messages simpleHttp.PUT[JsObject, ActivatePaperlessResponse](url, Json.obj("active" -> true)) map { case ActivatePaperlessActivatedResponse => timer.completeTimerAndIncrementSuccessCounter() ActivatePaperlessActivatedResponse case response: ActivatePaperlessRequiresUserActionResponse => timer.completeTimerAndIncrementSuccessCounter() response case ActivatePaperlessNotAllowedResponse => timer.completeTimerAndIncrementFailedCounter() ActivatePaperlessNotAllowedResponse } recover { case e => timer.completeTimerAndIncrementFailedCounter() Logger.warn("Error getting paperless preference record from preferences-frontend-service", e) ActivatePaperlessNotAllowedResponse } } if (request.isGovernmentGateway) { activatePaperless } else { Future.successful(ActivatePaperlessNotAllowedResponse) } } }
Example 2
Source File: EnrolmentsConnectorSpec.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package connectors import models._ import org.joda.time.DateTime import org.mockito.Matchers.{any, eq => eqTo} import org.mockito.Mockito.when import org.scalatest.EitherValues import org.scalatest.Inspectors.forAll import org.scalatest.concurrent.ScalaFutures import org.scalatestplus.mockito.MockitoSugar import play.api.http.Status._ import play.api.libs.json.{JsObject, JsResultException, Json} import uk.gov.hmrc.http.{HttpException, HttpResponse} import uk.gov.hmrc.play.bootstrap.http.DefaultHttpClient import util.BaseSpec import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future class EnrolmentsConnectorSpec extends BaseSpec with MockitoSugar with ScalaFutures with EitherValues { val http = mock[DefaultHttpClient] val connector = new EnrolmentsConnector(http, config) val baseUrl = config.enrolmentStoreProxyUrl "getAssignedEnrolments" should { val utr = "1234500000" val url = s"$baseUrl/enrolment-store/enrolments/IR-SA~UTR~$utr/users" "Return the error message for a BAD_REQUEST response" in { when(http.GET[HttpResponse](eqTo(url))(any(), any(), any())) .thenReturn(Future.successful(HttpResponse(BAD_REQUEST))) connector.getUserIdsWithEnrolments(utr).futureValue.left.value should include(BAD_REQUEST.toString) } "NO_CONTENT response should return no enrolments" in { when(http.GET[HttpResponse](eqTo(url))(any(), any(), any())) .thenReturn(Future.successful(HttpResponse(NO_CONTENT))) connector.getUserIdsWithEnrolments(utr).futureValue.right.value shouldBe Seq.empty } "query users with no principal enrolment returns empty enrolments" in { val json = Json.parse(""" |{ | "principalUserIds": [], | "delegatedUserIds": [] |}""".stripMargin) when(http.GET[HttpResponse](eqTo(url))(any(), any(), any())) .thenReturn(Future.successful(HttpResponse(OK, Some(json)))) connector.getUserIdsWithEnrolments(utr).futureValue.right.value shouldBe Seq.empty } "query users with assigned enrolment return two principleIds" in { val json = Json.parse(""" |{ | "principalUserIds": [ | "ABCEDEFGI1234567", | "ABCEDEFGI1234568" | ], | "delegatedUserIds": [ | "dont care" | ] |}""".stripMargin) when(http.GET[HttpResponse](eqTo(url))(any(), any(), any())) .thenReturn(Future.successful(HttpResponse(OK, Some(json)))) val expected = Seq("ABCEDEFGI1234567", "ABCEDEFGI1234568") connector.getUserIdsWithEnrolments(utr).futureValue.right.value shouldBe expected } } }
Example 3
Source File: FilterTopFeaturesProcess.scala From incubator-s2graph with Apache License 2.0 | 5 votes |
package org.apache.s2graph.s2jobs.wal.process import org.apache.s2graph.s2jobs.task.TaskConf import org.apache.s2graph.s2jobs.wal.WalLogAgg import org.apache.s2graph.s2jobs.wal.transformer.{DefaultTransformer, Transformer} import org.apache.spark.broadcast.Broadcast import org.apache.spark.sql.functions.{col, udf} import org.apache.spark.sql.{DataFrame, Dataset, SparkSession} import play.api.libs.json.{JsObject, Json} object FilterTopFeaturesProcess { private var validFeatureHashKeys: Set[Long] = null def getValidFeatureHashKeys(validFeatureHashKeysBCast: Broadcast[Array[Long]]): Set[Long] = { if (validFeatureHashKeys == null) { validFeatureHashKeys = validFeatureHashKeysBCast.value.toSet } validFeatureHashKeys } def collectDistinctFeatureHashes(ss: SparkSession, filteredDict: DataFrame): Array[Long] = { import ss.implicits._ val featureHashUDF = udf((dim: String, value: String) => WalLogAgg.toFeatureHash(dim, value)) filteredDict.withColumn("featureHash", featureHashUDF(col("dim"), col("value"))) .select("featureHash") .distinct().as[Long].collect() } def filterTopKsPerDim(dict: DataFrame, maxRankPerDim: Broadcast[Map[String, Int]], defaultMaxRank: Int): DataFrame = { val filterUDF = udf((dim: String, rank: Long) => { rank < maxRankPerDim.value.getOrElse(dim, defaultMaxRank) }) dict.filter(filterUDF(col("dim"), col("rank"))) } def filterWalLogAgg(ss: SparkSession, walLogAgg: Dataset[WalLogAgg], transformers: Seq[Transformer], validFeatureHashKeysBCast: Broadcast[Array[Long]]) = { import ss.implicits._ walLogAgg.mapPartitions { iter => val validFeatureHashKeys = getValidFeatureHashKeys(validFeatureHashKeysBCast) iter.map { walLogAgg => WalLogAgg.filterProps(walLogAgg, transformers, validFeatureHashKeys) } } } } class FilterTopFeaturesProcess(taskConf: TaskConf) extends org.apache.s2graph.s2jobs.task.Process(taskConf) { import FilterTopFeaturesProcess._ override def execute(ss: SparkSession, inputMap: Map[String, DataFrame]): DataFrame = { import ss.implicits._ val maxRankPerDim = taskConf.options.get("maxRankPerDim").map { s => Json.parse(s).as[JsObject].fields.map { case (k, jsValue) => k -> jsValue.as[Int] }.toMap } val maxRankPerDimBCast = ss.sparkContext.broadcast(maxRankPerDim.getOrElse(Map.empty)) val defaultMaxRank = taskConf.options.get("defaultMaxRank").map(_.toInt) val featureDict = inputMap(taskConf.options("featureDict")) val walLogAgg = inputMap(taskConf.options("walLogAgg")).as[WalLogAgg] val transformers = TaskConf.parseTransformers(taskConf) val filteredDict = filterTopKsPerDim(featureDict, maxRankPerDimBCast, defaultMaxRank.getOrElse(Int.MaxValue)) val validFeatureHashKeys = collectDistinctFeatureHashes(ss, filteredDict) val validFeatureHashKeysBCast = ss.sparkContext.broadcast(validFeatureHashKeys) filterWalLogAgg(ss, walLogAgg, transformers, validFeatureHashKeysBCast).toDF() } override def mandatoryOptions: Set[String] = Set("featureDict", "walLogAgg") }
Example 4
Source File: ExtractServiceName.scala From incubator-s2graph with Apache License 2.0 | 5 votes |
package org.apache.s2graph.s2jobs.wal.transformer import org.apache.s2graph.core.JSONParser import org.apache.s2graph.s2jobs.task.TaskConf import org.apache.s2graph.s2jobs.wal.{DimVal, WalLog} import play.api.libs.json.{JsObject, Json} class ExtractServiceName(taskConf: TaskConf) extends Transformer(taskConf) { val serviceDims = Json.parse(taskConf.options.getOrElse("serviceDims", "[]")).as[Set[String]] val domainServiceMap = Json.parse(taskConf.options.getOrElse("domainServiceMap", "{}")).as[JsObject].fields.map { case (k, v) => k -> JSONParser.jsValueToString(v) }.toMap val serviceDimName = taskConf.options.getOrElse("serviceDimName", "serviceDimName") override def toDimValLs(walLog: WalLog, propertyKey: String, propertyValue: String): Seq[DimVal] = { if (!serviceDims(propertyKey)) Nil else { val serviceName = domainServiceMap.getOrElse(propertyValue, propertyValue) Seq(DimVal(serviceDimName, serviceName)) } } }
Example 5
Source File: S2StreamQueryWriter.scala From incubator-s2graph with Apache License 2.0 | 5 votes |
package org.apache.s2graph.spark.sql.streaming import com.typesafe.config.ConfigFactory import org.apache.s2graph.core.{GraphElement, JSONParser} import org.apache.s2graph.s2jobs.S2GraphHelper import org.apache.s2graph.spark.sql.streaming.S2SinkConfigs._ import org.apache.spark.TaskContext import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.encoders.{ExpressionEncoder, RowEncoder} import org.apache.spark.sql.types.StructType import play.api.libs.json.{JsObject, Json} import scala.collection.mutable.ListBuffer import scala.concurrent.Await import scala.concurrent.duration.Duration import scala.util.Try private [sql] class S2StreamQueryWriter( serializedConf:String, schema: StructType , commitProtocol: S2CommitProtocol ) extends Serializable with Logger { private val config = ConfigFactory.parseString(serializedConf) private val s2Graph = S2GraphHelper.getS2Graph(config) private val encoder: ExpressionEncoder[Row] = RowEncoder(schema).resolveAndBind() private val RESERVED_COLUMN = Set("timestamp", "from", "to", "label", "operation", "elem", "direction") def run(taskContext: TaskContext, iters: Iterator[InternalRow]): TaskCommit = { val taskId = s"stage-${taskContext.stageId()}, partition-${taskContext.partitionId()}, attempt-${taskContext.taskAttemptId()}" val partitionId= taskContext.partitionId() val groupedSize = getConfigString(config, S2_SINK_GROUPED_SIZE, DEFAULT_GROUPED_SIZE).toInt val waitTime = getConfigString(config, S2_SINK_WAIT_TIME, DEFAULT_WAIT_TIME_SECONDS).toInt commitProtocol.initTask() try { var list = new ListBuffer[(String, Int)]() val rst = iters.flatMap(rowToEdge).grouped(groupedSize).flatMap{ elements => logger.debug(s"[$taskId][elements] ${elements.size} (${elements.map(e => e.toLogString).mkString(",\n")})") elements.groupBy(_.serviceName).foreach{ case (service, elems) => list += ((service, elems.size)) } val mutateF = s2Graph.mutateElements(elements, true) Await.result(mutateF, Duration(waitTime, "seconds")) } val (success, fail) = rst.toSeq.partition(r => r.isSuccess) val counter = list.groupBy(_._1).map{ case (service, t) => val sum = t.toList.map(_._2).sum (service, sum) } logger.info(s"[$taskId] success : ${success.size}, fail : ${fail.size} ($counter)") commitProtocol.commitTask(TaskState(partitionId, success.size, fail.size, counter)) } catch { case t: Throwable => commitProtocol.abortTask(TaskState(partitionId)) throw t } } private def rowToEdge(internalRow:InternalRow): Option[GraphElement] = S2GraphHelper.sparkSqlRowToGraphElement(s2Graph, encoder.fromRow(internalRow), schema, RESERVED_COLUMN) }
Example 6
Source File: GraphOperation.scala From incubator-s2graph with Apache License 2.0 | 5 votes |
package org.apache.s2graph.counter.core.v2 import akka.actor.ActorSystem import akka.stream.ActorMaterializer import com.typesafe.config.Config import org.apache.http.HttpStatus import org.apache.s2graph.counter.config.S2CounterConfig import org.apache.s2graph.counter.core.v2.ExactStorageGraph._ import org.asynchttpclient.DefaultAsyncHttpClientConfig import org.slf4j.LoggerFactory import play.api.libs.json.{JsObject, JsValue, Json} import scala.concurrent.Await import scala.concurrent.duration._ class GraphOperation(config: Config) { // using play-ws without play app implicit val materializer = ActorMaterializer.create(ActorSystem(getClass.getSimpleName)) private val builder = new DefaultAsyncHttpClientConfig.Builder() private val wsClient = new play.api.libs.ws.ning.NingWSClient(builder.build) private val s2config = new S2CounterConfig(config) val s2graphUrl = s2config.GRAPH_URL private[counter] val log = LoggerFactory.getLogger(this.getClass) import scala.concurrent.ExecutionContext.Implicits.global def createLabel(json: JsValue): Boolean = { // fix counter label's schemaVersion val newJson = json.as[JsObject] ++ Json.obj("schemaVersion" -> "v2") val future = wsClient.url(s"$s2graphUrl/graphs/createLabel").post(newJson).map { resp => resp.status match { case HttpStatus.SC_OK => true case _ => throw new RuntimeException(s"failed createLabel. errCode: ${resp.status} body: ${resp.body} query: $json") } } Await.result(future, 10 second) } def deleteLabel(label: String): Boolean = { val future = wsClient.url(s"$s2graphUrl/graphs/deleteLabel/$label").put("").map { resp => resp.status match { case HttpStatus.SC_OK => true case _ => throw new RuntimeException(s"failed deleteLabel. errCode: ${resp.status} body: ${resp.body}") } } Await.result(future, 10 second) } }
Example 7
Source File: HttpError.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.api.http.entities import com.wavesplatform.dex.error.MatcherError import play.api.libs.json.{Format, JsObject, Json} case class HttpError(error: Int, message: String, template: String, params: Option[JsObject] = None, status: String, // @deprecated(message = "This field is unnecessary", since = "1.2.0") success: Boolean = false, ) object HttpError { implicit val httpErrorFormat: Format[HttpError] = Json.format def apply(error: Int, message: String, template: String, params: JsObject, status: String): HttpError = new HttpError( error = error, message = message, template = template, params = Some(params), status = status ) def from(x: MatcherError, status: String): HttpError = HttpError( error = x.code, message = x.message.text, template = x.message.template, params = if (x.message.params == JsObject.empty) None else Some(x.message.params), status = status ) }
Example 8
Source File: JwtUtils.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.auth import java.security import com.wavesplatform.dex.api.ws.protocol.WsAddressSubscribe.JwtPayload import com.wavesplatform.dex.domain.account.{AddressScheme, KeyPair, PublicKey} import com.wavesplatform.dex.domain.bytes.ByteStr import pdi.jwt.{JwtAlgorithm, JwtJson} import play.api.libs.json.{JsObject, Json} import scala.concurrent.duration.{DurationInt, FiniteDuration} trait JwtUtils { def mkJwt(authServiceKeyPair: security.KeyPair, payload: JwtPayload): String = mkJwt(authServiceKeyPair, Json.toJsObject(payload)) def mkJwt(authServiceKeyPrivateKey: security.PrivateKey, payload: JsObject): String = JwtJson.encode(payload, authServiceKeyPrivateKey, JwtAlgorithm.RS256) def mkJwt(authServiceKeyPair: security.KeyPair, payload: JsObject): String = JwtJson.encode(payload, authServiceKeyPair.getPrivate, JwtAlgorithm.RS256) def mkJwtSignedPayload(clientKeyPair: KeyPair, networkByte: Byte = AddressScheme.current.chainId, lifetime: FiniteDuration = 1.hour): JwtPayload = mkJwtNotSignedPayload(clientKeyPair, networkByte, lifetime).signed(clientKeyPair) def mkJwtNotSignedPayload(clientPublicKey: PublicKey, networkByte: Byte = AddressScheme.current.chainId, lifetime: FiniteDuration = 1.hour): JwtPayload = { val exp = System.currentTimeMillis() / 1000 + lifetime.toSeconds JwtPayload( signature = ByteStr(Array.emptyByteArray), publicKey = clientPublicKey, networkByte = networkByte.toChar.toString, clientId = "test", firstTokenExpirationInSeconds = exp, activeTokenExpirationInSeconds = exp, scope = List("general") ) } } object JwtUtils extends JwtUtils
Example 9
Source File: SemanticRepositorySpecs.scala From daf-semantics with Apache License 2.0 | 5 votes |
package specs import org.junit.runner.RunWith import scala.concurrent.{ Await, Future } import scala.concurrent.duration.Duration import play.api.test._ import play.api.http.Status import play.api.Application import play.api.inject.guice.GuiceApplicationBuilder import play.api.libs.ws.WSResponse import play.api.libs.ws.ahc.AhcWSClient import org.specs2.runner.JUnitRunner import org.specs2.mutable.Specification import play.api.libs.json.Json //import it.almawave.linkeddata.kb.utils.ConfigHelper import scala.collection.JavaConversions._ import scala.collection.JavaConverters._ import play.twirl.api.Content import play.api.test.Helpers._ import play.api.libs.json.JsObject import java.io.File import play.api.http.Writeable import akka.stream.scaladsl.Source import play.api.mvc.MultipartFormData import play.api.libs.Files.TemporaryFile import java.nio.file.Files import org.asynchttpclient.AsyncHttpClient import play.api.libs.ws.WS import akka.util.ByteString import play.api.mvc.MultipartFormData.DataPart import play.api.mvc.MultipartFormData.FilePart import akka.stream.scaladsl.FileIO import play.api.libs.ws.WSClient /* * TODO: REWRITE */ @RunWith(classOf[JUnitRunner]) class SemanticRepositorySpecs extends Specification { def application: Application = GuiceApplicationBuilder().build() "The semantic repository" should { "call kb/v1/contexts to obtain a list of contexts" in { new WithServer(app = application, port = 9999) { WsTestClient.withClient { implicit client => val response: WSResponse = Await.result[WSResponse]( client.url(s"http://localhost:${port}/kb/v1/contexts").execute, Duration.Inf) response.status must be equalTo Status.OK response.json.as[Seq[JsObject]].size must be equals 0 // response.json.as[Seq[JsObject]].size must be greaterThan 0 // if pre-loaded ontologies! } } } "call kb/v1/contexts ensuring all contexts have triples" in { new WithServer(app = application, port = 9999) { WsTestClient.withClient { implicit client => val response: WSResponse = Await.result[WSResponse]( client.url(s"http://localhost:${port}/kb/v1/contexts").execute, Duration.Inf) val json_list = response.json.as[Seq[JsObject]] forall(json_list)((_) must not beNull) forall(json_list)(_.keys must contain("context", "triples")) forall(json_list)(item => (item \ "triples").get.as[Int] > 0) } } } } }
Example 10
Source File: BackendConnector.scala From nisp-frontend with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.nisp.connectors import play.api.data.validation.ValidationError import play.api.libs.json.{Format, JsObject, JsPath} import uk.gov.hmrc.http.cache.client.SessionCache import uk.gov.hmrc.nisp.models.enums.APIType._ import uk.gov.hmrc.nisp.services.MetricsService import uk.gov.hmrc.nisp.utils.JsonDepersonaliser import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future import scala.util.{Failure, Success} import uk.gov.hmrc.http.{ HeaderCarrier, HttpGet, HttpResponse } trait BackendConnector { def http: HttpGet def serviceUrl: String def sessionCache: SessionCache val metricsService: MetricsService protected def retrieveFromCache[A](api: APIType, url: String)(implicit hc: HeaderCarrier, formats: Format[A]): Future[A] = { val keystoreTimerContext = metricsService.keystoreReadTimer.time() val sessionCacheF = sessionCache.fetchAndGetEntry[A](api.toString) sessionCacheF.onFailure { case _ => metricsService.keystoreReadFailed.inc() } sessionCacheF.flatMap { keystoreResult => keystoreTimerContext.stop() keystoreResult match { case Some(data) => metricsService.keystoreHitCounter.inc() Future.successful(data) case None => metricsService.keystoreMissCounter.inc() connectToMicroservice[A](url, api) map { data: A => cacheResult(data, api.toString) } } } } private def connectToMicroservice[A](urlToRead: String, apiType: APIType)(implicit hc: HeaderCarrier, formats: Format[A]): Future[A] = { val timerContext = metricsService.startTimer(apiType) val httpResponseF = http.GET[HttpResponse](urlToRead) httpResponseF onSuccess { case _ => timerContext.stop() } httpResponseF onFailure { case _ => metricsService.incrementFailedCounter(apiType) } httpResponseF.map { httpResponse => httpResponse.json.validate[A].fold( errs => { val json = JsonDepersonaliser.depersonalise(httpResponse.json) match { case Success(s) => s"Depersonalised JSON\n$s" case Failure(e) => s"JSON could not be depersonalised\n${e.toString()}" } throw new JsonValidationException(s"Unable to deserialise $apiType: ${formatJsonErrors(errs)}\n$json") }, valid => valid ) } } private def cacheResult[A](a:A,name: String)(implicit hc: HeaderCarrier, formats: Format[A]): A = { val timerContext = metricsService.keystoreWriteTimer.time() val cacheF = sessionCache.cache[A](name, a) cacheF.onSuccess { case _ => timerContext.stop() } cacheF.onFailure { case _ => metricsService.keystoreWriteFailed.inc() } a } private def formatJsonErrors(errors: Seq[(JsPath, Seq[ValidationError])]): String = { errors.map(p => p._1 + " - " + p._2.map(e => removeJson(e.message)).mkString(",")).mkString(" | ") } private def removeJson(message: String): String = { message.indexOf("{") match { case i if i != -1 => message.substring(0, i - 1) + " [JSON removed]" case _ => message } } private[connectors] class JsonValidationException(message: String) extends Exception(message) }
Example 11
Source File: GlobalPerformer.scala From incubator-retired-iota with Apache License 2.0 | 5 votes |
package org.apache.iota.fey import akka.actor.SupervisorStrategy.Restart import akka.actor.{Actor, ActorLogging, ActorRef, OneForOneStrategy, Props, Terminated} import akka.routing._ import play.api.libs.json.JsObject import scala.collection.mutable.HashMap import scala.concurrent.duration._ protected class GlobalPerformer(val orchestrationID: String, val orchestrationName: String, val globalPerformers: List[JsObject], val ensemblesSpec : List[JsObject]) extends Actor with ActorLogging{ val monitoring_actor = FEY_MONITOR.actorRef var global_metadata: Map[String, Performer] = Map.empty[String, Performer] override def receive: Receive = { case GlobalPerformer.PRINT_GLOBAL => context.actorSelection(s"*") ! FeyGenericActor.PRINT_PATH case Terminated(actor) => monitoring_actor ! Monitor.TERMINATE(actor.path.toString, Utils.getTimestamp) log.error(s"DEAD Global Performers ${actor.path.name}") context.children.foreach{ child => context.unwatch(child) context.stop(child) } throw new RestartGlobalPerformers(s"DEAD Global Performer ${actor.path.name}") case GetRoutees => //Discard case x => log.warning(s"Message $x not treated by Global Performers") } private def loadClazzFromJar(classPath: String, jarLocation: String, jarName: String):Class[FeyGenericActor] = { try { Utils.loadActorClassFromJar(jarLocation,classPath,jarName) }catch { case e: Exception => log.error(e,s"Could not load class $classPath from jar $jarLocation. Please, check the Jar repository path as well the jar name") throw e } } } object GlobalPerformer{ val activeGlobalPerformers:HashMap[String, Map[String, ActorRef]] = HashMap.empty[String, Map[String, ActorRef]] case object PRINT_GLOBAL }
Example 12
Source File: Bencharts.scala From collection-strawman with Apache License 2.0 | 5 votes |
package strawman.collection import javax.imageio.ImageIO import org.jfree.chart.JFreeChart import org.jfree.chart.axis.{LogAxis, LogarithmicAxis, NumberAxis} import org.jfree.chart.plot.XYPlot import org.jfree.chart.renderer.xy.XYErrorRenderer import org.jfree.data.xy.{YIntervalSeries, YIntervalSeriesCollection} import play.api.libs.json.{JsObject, Json} import sbt._ object Bencharts { def apply(jmhReport: File, yAxisTitle: String, targetDir: File): Unit = { val json = Json.parse(IO.read(jmhReport)) json.as[List[JsObject]] .groupBy { result => val name = (result \ "benchmark").as[String] val benchmark = name.reverse.takeWhile(_ != '.').reverse benchmark // Benchmark name (e.g. "cons", "foreach", "map") } .foreach { case (benchmark, results) => val seriess = results // group by concrete collection type .groupBy(result => (result \ "benchmark").as[String].stripSuffix(benchmark)) .map { case (collectionType, iterations) => val ySeries = new YIntervalSeries(collectionType) // each benchmark has been run with several collection sizes (8, 64, 512, etc.) // we add a point for each of these iterations for (iteration <- iterations) { ySeries.add( (iteration \ "params" \ "size").as[String].toDouble, (iteration \ "primaryMetric" \ "score").as[Double], (iteration \ "primaryMetric" \ "scoreConfidence").apply(0).as[Double], (iteration \ "primaryMetric" \ "scoreConfidence").apply(1).as[Double] ) } ySeries } val xAxis = new LogarithmicAxis("Size") xAxis.setAllowNegativesFlag(true) val yAxis = new LogarithmicAxis(yAxisTitle) yAxis.setAllowNegativesFlag(true) val col = new YIntervalSeriesCollection() val renderer = new XYErrorRenderer for ((series, i) <- seriess.zipWithIndex) { col.addSeries(series) renderer.setSeriesLinesVisible(i, true) } val plot = new XYPlot( col, xAxis, yAxis, renderer ) val chart = new JFreeChart( benchmark, JFreeChart.DEFAULT_TITLE_FONT, plot, true ) ImageIO.write( chart.createBufferedImage(800, 600), "png", targetDir / s"$benchmark.png" ) } } }
Example 13
Source File: ErrorWrapper.scala From vat-api with Apache License 2.0 | 5 votes |
package v1.models.errors import play.api.libs.json.{JsObject, JsValue, Json, Writes} import v1.models.audit.AuditError case class ErrorWrapper(correlationId: Option[String], error: MtdError, errors: Option[Seq[MtdError]] = None) { private def allErrors: Seq[MtdError] = errors match { case Some(seq) => seq case None => Seq(error) } def auditErrors: Seq[AuditError] = allErrors.map(error => AuditError(error.code)) } object ErrorWrapper { val allErrors: Seq[MtdError] => Seq[JsValue] = { case mtdError :: Nil => mtdErrors(mtdError) case mtdError :: rest => mtdErrors(mtdError) ++ allErrors(rest) } private val mtdErrors : MtdError => Seq[JsValue] = { case MtdError(_, _, Some(customJson)) => customJson.asOpt[MtdErrorWrapper] match { case Some(e) => mtdErrorWrapper(e) case _ => Seq(customJson) } case _@o => Seq(Json.toJson(o)) } private val mtdErrorWrapper: MtdErrorWrapper => Seq[JsValue]= wrapper => wrapper.errors match { case Some(errors) if errors.nonEmpty => errors.map(error => Json.toJson(error)) case _ => Seq(Json.toJson(wrapper)) } implicit val writes: Writes[ErrorWrapper] = (errorResponse: ErrorWrapper) => { val singleJson: JsObject = Json.toJson(errorResponse.error).as[JsObject] errorResponse.errors match { case Some(errors) if errors.nonEmpty => singleJson + ("errors" -> Json.toJson(allErrors(errors))) case _ => singleJson } } }
Example 14
Source File: VatReturnsOrchestrator.scala From vat-api with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.vatapi.orchestrators import javax.inject.Inject import org.joda.time.DateTime import play.api.Logger import play.api.libs.json.JsObject import uk.gov.hmrc.domain.Vrn import uk.gov.hmrc.http.HeaderCarrier import uk.gov.hmrc.vatapi.audit.AuditEvents import uk.gov.hmrc.vatapi.httpparsers.{EmptyNrsData, NRSData} import uk.gov.hmrc.vatapi.models.audit.AuditEvent import uk.gov.hmrc.vatapi.models.{ErrorResult, Errors, InternalServerErrorResult, NRSSubmission, VatReturnDeclaration} import uk.gov.hmrc.vatapi.resources.AuthRequest import uk.gov.hmrc.vatapi.resources.wrappers.VatReturnResponse import uk.gov.hmrc.vatapi.services.{AuditService, NRSService, VatReturnsService} import uk.gov.hmrc.vatapi.utils.ImplicitDateTimeFormatter import scala.concurrent.{ExecutionContext, Future} class VatReturnsOrchestrator @Inject()( nrsService: NRSService, vatReturnsService: VatReturnsService, auditService: AuditService )(implicit ec: ExecutionContext) extends ImplicitDateTimeFormatter { val logger: Logger = Logger(this.getClass) def submissionTimestamp: DateTime = DateTime.now() def submitVatReturn(vrn: Vrn, vatReturn: VatReturnDeclaration, arn: Option[String]) (implicit hc: HeaderCarrier, request: AuthRequest[_]): Future[Either[ErrorResult, VatReturnResponse]] = { logger.debug(s"[VatReturnsOrchestrator][submitVatReturn] - Orchestrating calls to NRS and Vat Returns") val submission = nrsService.convertToNrsSubmission(vrn, vatReturn) nrsService.submit(vrn, submission) flatMap { case Left(e) => logger.error(s"[VatReturnsOrchestrator][submitVatReturn] - Error retrieving data from NRS: $e") Future.successful(Left(InternalServerErrorResult(Errors.InternalServerError.message))) case Right(nrsData) => logger.debug(s"[VatReturnsOrchestrator][submitVatReturn] - Successfully retrieved data from NRS: $nrsData") val thisSubmissionTimestamp = submissionTimestamp nrsData match { case EmptyNrsData => auditService.audit(buildEmptyNrsAudit(vrn, submission, request)) vatReturnsService.submit(vrn, vatReturn.toDes(thisSubmissionTimestamp, arn)) map { response => Right(response withNrsData nrsData.copy(timestamp = thisSubmissionTimestamp.toIsoInstant)) } case _ => auditService.audit(buildNrsAudit(vrn, nrsData, request)) vatReturnsService.submit(vrn, vatReturn.toDes(thisSubmissionTimestamp, arn)) map { response => Right(response withNrsData nrsData.copy(timestamp = thisSubmissionTimestamp.toIsoInstant)) } } } } case class VatReturnOrchestratorResponse(nrs: NRSData, vatReturnResponse: VatReturnResponse) private def buildNrsAudit(vrn: Vrn, nrsData: NRSData, request: AuthRequest[_]): AuditEvent[Map[String, String]] = AuditEvents.nrsAudit(vrn, nrsData, request.headers.get("Authorization").getOrElse("")) private def buildEmptyNrsAudit(vrn: Vrn, submission: NRSSubmission, request: AuthRequest[_]): AuditEvent[JsObject] = AuditEvents.nrsEmptyAudit(vrn, submission, request.headers.get("Authorization").getOrElse("")) }
Example 15
Source File: AuditEvents.scala From vat-api with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.vatapi.audit import play.api.libs.json.{JsObject, Json} import uk.gov.hmrc.domain.Vrn import uk.gov.hmrc.vatapi.httpparsers.NRSData import uk.gov.hmrc.vatapi.models.NRSSubmission import uk.gov.hmrc.vatapi.models.audit.{AuditDetail, AuditEvent, AuditResponse} object AuditEvents { val agentRef: Option[String] => Map[String, String] = arn => arn.fold(Map.empty[String, String])(arn => Map("agentReferenceNumber" -> arn)) def nrsAudit(vrn: Vrn, nrsData: NRSData, authorization: String): AuditEvent[Map[String, String]] = AuditEvent( auditType = "submitToNonRepudiationStore", transactionName = "submit-vat-return", detail = Map( "vrn" -> vrn.vrn, "authorization" -> authorization, "nrSubmissionID" -> nrsData.nrSubmissionId, "correlationId" -> "" //this is meant to be empty and with an incorrect name - see Vat Api TxM assessment confluence page ) ) def nrsEmptyAudit(vrn: Vrn, submission: NRSSubmission, authorization: String): AuditEvent[JsObject] = AuditEvent( auditType = "submitToNonRepudiationStoreFailure", transactionName = "submit-vat-return", detail = Json.obj( "vrn" -> vrn.vrn, "authorization" -> authorization, "request" -> NRSSubmission.format.writes(submission), "correlationId" -> "" //this is meant to be empty and with an incorrect name - see Vat Api TxM assessment confluence page ) ) def submitVatReturn(correlationId: String, userType: String, nrSubmissionId: Option[String], clientId: String, arn: Option[String], response: AuditResponse): AuditEvent[AuditDetail] = { AuditEvent( auditType = "submitVatReturn", transactionName = "submit-vat-return", detail = AuditDetail(userType = userType, arn = arn, `X-CorrelationId` = correlationId, response, clientId, nrSubmissionId) ) } def retrieveVatObligationsAudit(correlationId: String, userType: String, arn: Option[String], clientId: String, response: AuditResponse): AuditEvent[AuditDetail] = { AuditEvent( auditType = "retrieveVatObligations", transactionName = "retrieve-vat-obligations", detail = AuditDetail(userType = userType, arn = arn, `X-CorrelationId` = correlationId, response, clientId) ) } def retrieveVatReturnsAudit(correlationId: String, userType: String, arn: Option[String], clientId: String, response: AuditResponse): AuditEvent[AuditDetail] = { AuditEvent( auditType = "retrieveVatReturns", transactionName = "retrieve-vat-returns", detail = AuditDetail(userType = userType, arn = arn, `X-CorrelationId` = correlationId, response, clientId) ) } def retrieveVatLiabilitiesAudit(correlationId: String, userType: String, arn: Option[String], clientId: String, response: AuditResponse): AuditEvent[AuditDetail] = { AuditEvent( auditType = "retrieveVatLiabilities", transactionName = "retrieve-vat-liabilities", detail = AuditDetail(userType = userType, arn = arn, `X-CorrelationId` = correlationId, response, clientId) ) } def retrieveVatPaymentsAudit(correlationId: String, userType: String, arn: Option[String], clientId: String, response: AuditResponse): AuditEvent[AuditDetail] = { AuditEvent( auditType = "retrieveVatPayments", transactionName = "retrieve-vat-payments", detail = AuditDetail(userType = userType, arn = arn, `X-CorrelationId` = correlationId, response, clientId) ) } }
Example 16
Source File: PaymentItemSpec.scala From vat-api with Apache License 2.0 | 5 votes |
package v1.models.response.payments import play.api.libs.json.{JsError, JsObject, JsValue, Json} import support.UnitSpec class PaymentItemSpec extends UnitSpec { val desJson: JsValue = Json.parse( """ |{ | "paymentAmount" : 100.2, | "clearingDate" : "2017-01-01" |} """.stripMargin ) val invalidDesJson: JsValue = Json.parse( """ |{ | "paymentAmount" : 100.2, | "clearingDate" : false |} """.stripMargin ) val mtdJson: JsValue = Json.parse( """ |{ | "amount" : 100.2, | "received" : "2017-01-01" |} """.stripMargin ) val paymentItemModel: PaymentItem = PaymentItem(amount = Some(100.2), received = Some("2017-01-01")) "PaymentItem" when { "read from valid JSON" should { "produce the expected PaymentItem object" in { desJson.as[PaymentItem] shouldBe paymentItemModel } "handle missing optional fields" in { JsObject.empty.as[PaymentItem] shouldBe PaymentItem.empty } "error on invalid json" in { invalidDesJson.validate[PaymentItem] shouldBe a[JsError] } } "written to JSON" should { "produce the expected Js Object" in { Json.toJson(paymentItemModel) shouldBe mtdJson } "not write empty fields" in { val emptyPaymentItemModel: PaymentItem = PaymentItem(amount = None, received = None) Json.toJson(emptyPaymentItemModel) shouldBe JsObject.empty } } } }
Example 17
Source File: VatReturnDeclarationFixture.scala From vat-api with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.vatapi import play.api.libs.json.{JsObject, Json} import uk.gov.hmrc.vatapi.models.VatReturnDeclaration object VatReturnDeclarationFixture { val vatReturnDeclaration = VatReturnDeclaration( periodKey = "#001", vatDueSales = 7000, vatDueAcquisitions = 3000, totalVatDue = 10000, vatReclaimedCurrPeriod = 1000, netVatDue = 9000, totalValueSalesExVAT = 1000, totalValuePurchasesExVAT = 200, totalValueGoodsSuppliedExVAT = 100, totalAcquisitionsExVAT = 540, finalised = true ) val vatReturnDeclarationJson: JsObject = { Json.obj( "periodKey" -> "#001", "vatDueSales" -> 7000, "vatDueAcquisitions" -> 3000, "totalVatDue" -> 10000, "vatReclaimedCurrPeriod" -> 1000, "netVatDue" -> 9000, "totalValueSalesExVAT" -> 1000, "totalValuePurchasesExVAT" -> 200, "totalValueGoodsSuppliedExVAT" -> 100, "totalAcquisitionsExVAT" -> 540, "finalised" -> true ) } }
Example 18
Source File: ElasticSearchAccess.scala From osstracker with Apache License 2.0 | 5 votes |
package com.netflix.oss.tools.osstrackerscraper import org.apache.http.client.methods._ import org.apache.http.entity.StringEntity import org.apache.http.impl.client._ import org.apache.http.util.EntityUtils import org.slf4j.LoggerFactory import play.api.libs.json.{Json, JsObject} class ElasticSearchAccess(esHost: String, esPort: Int) { val logger = LoggerFactory.getLogger(getClass) def indexDocInES(url: String, jsonDoc: String): Boolean = { val client = HttpClientBuilder.create().build() val req = new HttpPost(getFullUrl(url)) req.addHeader("Content-Type", "application/json") req.setEntity(new StringEntity(jsonDoc)) val resp = client.execute(req) resp.getStatusLine.getStatusCode match { case 201 => { true } case _ => { logger.error(s"error creating es document for url = $url") val respS = EntityUtils.toString(resp.getEntity) logger.error(s"return code = ${resp.getStatusLine} and doc = ${respS}") false } } } def getESDocForRepo(simpleDate: String, repoName: String): Option[JsObject] = { val client = HttpClientBuilder.create().build() val req = new HttpPost(getFullUrl("/osstracker/repo_stats/_search")) req.addHeader("Content-Type", "application/json") val jsonDoc = raw"""{"query":{"bool":{"must":[{"match":{"repo_name":"$repoName"}},{"match":{"asOfYYYYMMDD":"$simpleDate"}}]}}}""" req.setEntity(new StringEntity(jsonDoc)) val resp = client.execute(req) val resC = resp.getStatusLine.getStatusCode resp.getStatusLine.getStatusCode match { case 404 => None: Option[JsObject] case _ => val respS = EntityUtils.toString(resp.getEntity) val jsVal = Json.parse(respS) val hits = (jsVal \ "hits" \ "total").as[Int] hits match { case 0 => None: Option[JsObject] case _ => Some(((jsVal \ "hits" \ "hits")(0) \ "_source").get.asInstanceOf[JsObject]) } } } def getESDocForRepos(simpleDate: String): Option[JsObject] = { val client = HttpClientBuilder.create().build() val req = new HttpPost(getFullUrl("/osstracker/allrepos_stats/_search")) req.addHeader("Content-Type", "application/json") val jsonDoc = raw"""{"query":{"match":{"asOfYYYYMMDD":"$simpleDate"}}}""" req.setEntity(new StringEntity(jsonDoc)) val resp = client.execute(req) val resC = resp.getStatusLine.getStatusCode resp.getStatusLine.getStatusCode match { case 404 => None: Option[JsObject] case _ => val respS = EntityUtils.toString(resp.getEntity) val jsVal = Json.parse(respS) val hits = (jsVal \ "hits" \ "total").as[Int] hits match { case 0 => None: Option[JsObject] case _ => Some(((jsVal \ "hits" \ "hits")(0) \ "_source").get.asInstanceOf[JsObject]) } } } def getFullUrl(uri: String): String = { s"http://${esHost}:${esPort}${uri}" } }
Example 19
Source File: Worker.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.models import javax.inject.{Inject, Singleton} import org.elastic4play.models.JsonFormat.enumFormat import org.elastic4play.models.{AttributeDef, BaseEntity, ChildModelDef, EntityDef, HiveEnumeration, AttributeFormat ⇒ F, AttributeOption ⇒ O} import org.elastic4play.utils.Hasher import org.thp.cortex.models.JsonFormat.workerTypeFormat import play.api.libs.json.{JsObject, JsString, Json} import scala.concurrent.Future import scala.util.Try object RateUnit extends Enumeration with HiveEnumeration { type Type = Value val Second = Value(1) val Minute = Value(60) val Hour = Value(60 * 60) val Day = Value(60 * 60 * 24) val Month = Value(60 * 60 * 24 * 30) implicit val reads = enumFormat(this) } object WorkerType extends Enumeration with HiveEnumeration { type Type = Value val analyzer, responder = Value } trait WorkerAttributes { _: AttributeDef ⇒ val workerId = attribute("_id", F.stringFmt, "Worker id", O.model) val name = attribute("name", F.stringFmt, "Worker name") val vers = attribute("version", F.stringFmt, "Worker version", O.readonly) val workerDefinitionId = attribute("workerDefinitionId", F.stringFmt, "Worker definition id", O.readonly) val description = attribute("description", F.textFmt, "Worker description", O.readonly) val author = attribute("author", F.textFmt, "Worker author", O.readonly) val url = attribute("url", F.textFmt, "Worker url", O.readonly) val license = attribute("license", F.textFmt, "Worker license", O.readonly) val command = optionalAttribute("command", F.textFmt, "Worker command", O.readonly) val dockerImage = optionalAttribute("dockerImage", F.textFmt, "Worker docker image", O.readonly) val dataTypeList = multiAttribute("dataTypeList", F.stringFmt, "List of data type this worker can manage") val configuration = attribute("configuration", F.rawFmt, "Configuration of the worker", O.sensitive) val baseConfig = attribute("baseConfig", F.stringFmt, "Base configuration key", O.readonly) val rate = optionalAttribute("rate", F.numberFmt, "Number ") val rateUnit = optionalAttribute("rateUnit", F.enumFmt(RateUnit), "") val jobCache = optionalAttribute("jobCache", F.numberFmt, "") val jobTimeout = optionalAttribute("jobTimeout", F.numberFmt, "") val tpe = attribute("type", F.enumFmt(WorkerType), "", O.readonly) } @Singleton class WorkerModel @Inject()(organizationModel: OrganizationModel) extends ChildModelDef[WorkerModel, Worker, OrganizationModel, Organization](organizationModel, "worker", "Worker", "/worker") with WorkerAttributes with AuditedModel { override def creationHook(parent: Option[BaseEntity], attrs: JsObject): Future[JsObject] = { val hasher = Hasher("md5") val id = for { organizationId ← parent.map(_.id) name ← (attrs \ "name").asOpt[String] tpe ← (attrs \ "type").asOpt[String] } yield hasher.fromString(s"${organizationId}_${name}_$tpe").head.toString Future.successful(attrs + ("_id" → JsString(id.getOrElse("<null>")))) } } class Worker(model: WorkerModel, attributes: JsObject) extends EntityDef[WorkerModel, Worker](model, attributes) with WorkerAttributes { def config: JsObject = Try(Json.parse(configuration()).as[JsObject]).getOrElse(JsObject.empty) def organization = parentId.get }
Example 20
Source File: Artifact.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.models import javax.inject.{Inject, Singleton} import play.api.libs.json.JsObject import org.elastic4play.models.{AttributeDef, EntityDef, AttributeFormat ⇒ F, AttributeOption ⇒ O, ChildModelDef} trait ArtifactAttributes { _: AttributeDef ⇒ val dataType = attribute("dataType", F.stringFmt, "Type of the artifact", O.readonly) val data = optionalAttribute("data", F.rawFmt, "Content of the artifact", O.readonly) val attachment = optionalAttribute("attachment", F.attachmentFmt, "Artifact file content", O.readonly) val tlp = attribute("tlp", TlpAttributeFormat, "TLP level", 2L) val tags = multiAttribute("tags", F.stringFmt, "Artifact tags") val message = optionalAttribute("message", F.textFmt, "Message associated to the analysis") } @Singleton class ArtifactModel @Inject()(reportModel: ReportModel) extends ChildModelDef[ArtifactModel, Artifact, ReportModel, Report](reportModel, "artifact", "Artifact", "/artifact") with ArtifactAttributes {} class Artifact(model: ArtifactModel, attributes: JsObject) extends EntityDef[ArtifactModel, Artifact](model, attributes) with ArtifactAttributes
Example 21
Source File: User.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.models import scala.concurrent.Future import play.api.libs.json.{JsArray, JsBoolean, JsObject, JsString} import org.elastic4play.models.JsonFormat.enumFormat import org.elastic4play.models.{AttributeDef, BaseEntity, EntityDef, HiveEnumeration, ModelDef, AttributeFormat ⇒ F, AttributeOption ⇒ O} import org.elastic4play.services.{User ⇒ EUser} object UserStatus extends Enumeration with HiveEnumeration { type Type = Value val Ok, Locked = Value implicit val reads = enumFormat(this) } trait UserAttributes { _: AttributeDef ⇒ val login = attribute("login", F.userFmt, "Login of the user", O.form) val userId = attribute("_id", F.stringFmt, "User id (login)", O.model) val key = optionalAttribute("key", F.stringFmt, "API key", O.sensitive, O.unaudited) val userName = attribute("name", F.stringFmt, "Full name (Firstname Lastname)") val roles = multiAttribute("roles", RoleAttributeFormat, "Comma separated role list (READ, WRITE and ADMIN)") val status = attribute("status", F.enumFmt(UserStatus), "Status of the user", UserStatus.Ok) val password = optionalAttribute("password", F.stringFmt, "Password", O.sensitive, O.unaudited) val avatar = optionalAttribute("avatar", F.rawFmt, "Base64 representation of user avatar image", O.unaudited) val preferences = attribute("preferences", F.rawFmt, "User preferences", "{}", O.sensitive, O.unaudited) val organization = attribute("organization", F.stringFmt, "User organization") } class UserModel extends ModelDef[UserModel, User]("user", "User", "/user") with UserAttributes with AuditedModel { private def setUserId(attrs: JsObject) = (attrs \ "login").asOpt[JsString].fold(attrs) { login ⇒ attrs - "login" + ("_id" → login) } override def creationHook(parent: Option[BaseEntity], attrs: JsObject): Future[JsObject] = Future.successful(setUserId(attrs)) } class User(model: UserModel, attributes: JsObject) extends EntityDef[UserModel, User](model, attributes) with UserAttributes with EUser { override def getUserName = userName() override def getRoles = roles() override def toJson: JsObject = super.toJson + ("roles" → JsArray(roles().map(r ⇒ JsString(r.name.toLowerCase())))) + ("hasKey" → JsBoolean(key().isDefined)) + ("hasPassword" → JsBoolean(password().isDefined)) }
Example 22
Source File: Organization.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.models import javax.inject.{Inject, Provider, Singleton} import scala.concurrent.{ExecutionContext, Future} import play.api.Logger import play.api.libs.json.{JsNumber, JsObject, JsString, Json} import org.elastic4play.models.JsonFormat.enumFormat import org.elastic4play.models.{AttributeDef, BaseEntity, EntityDef, HiveEnumeration, ModelDef, AttributeFormat ⇒ F, AttributeOption ⇒ O} import org.elastic4play.services.FindSrv object OrganizationStatus extends Enumeration with HiveEnumeration { type Type = Value val Active, Locked = Value implicit val reads = enumFormat(this) } trait OrganizationAttributes { _: AttributeDef ⇒ val name = attribute("name", F.stringFmt, "Organization name", O.form) val _id = attribute("_id", F.stringFmt, "Organization name", O.model) val description = attribute("description", F.textFmt, "Organization description") val status = attribute("status", F.enumFmt(OrganizationStatus), "Status of the organization", OrganizationStatus.Active) } @Singleton class OrganizationModel @Inject()( findSrv: FindSrv, userModelProvider: Provider[UserModel], workerModelProvider: Provider[WorkerModel], implicit val ec: ExecutionContext ) extends ModelDef[OrganizationModel, Organization]("organization", "Organization", "/organization") with OrganizationAttributes with AuditedModel { private lazy val logger = Logger(getClass) lazy val userModel = userModelProvider.get lazy val workerModel = workerModelProvider.get override def removeAttribute = Json.obj("status" → "Locked") override def creationHook(parent: Option[BaseEntity], attrs: JsObject): Future[JsObject] = Future.successful { (attrs \ "name").asOpt[JsString].fold(attrs) { orgName ⇒ attrs - "name" + ("_id" → orgName) } } private def buildUserStats(organization: Organization): Future[JsObject] = { import org.elastic4play.services.QueryDSL._ findSrv(userModel, "organization" ~= organization.id, groupByField("status", selectCount)) .map { userStatsJson ⇒ val (userCount, userStats) = userStatsJson.value.foldLeft((0L, JsObject.empty)) { case ((total, s), (key, value)) ⇒ val count = (value \ "count").as[Long] (total + count, s + (key → JsNumber(count))) } Json.obj("users" → (userStats + ("total" → JsNumber(userCount)))) } } private def buildWorkerStats(organization: Organization): Future[JsObject] = { import org.elastic4play.services.QueryDSL._ findSrv(workerModel, withParent(organization), groupByField("status", selectCount)) .map { workerStatsJson ⇒ val (workerCount, workerStats) = workerStatsJson.value.foldLeft((0L, JsObject.empty)) { case ((total, s), (key, value)) ⇒ val count = (value \ "count").as[Long] (total + count, s + (key → JsNumber(count))) } Json.obj("workers" → (workerStats + ("total" → JsNumber(workerCount)))) } } override def getStats(entity: BaseEntity): Future[JsObject] = entity match { case organization: Organization ⇒ for { userStats ← buildUserStats(organization) workerStats ← buildWorkerStats(organization) } yield userStats ++ workerStats case other ⇒ logger.warn(s"Request caseStats from a non-case entity ?! ${other.getClass}:$other") Future.successful(Json.obj()) } } class Organization(model: OrganizationModel, attributes: JsObject) extends EntityDef[OrganizationModel, Organization](model, attributes) with OrganizationAttributes { override def toJson: JsObject = super.toJson + ("name" → JsString(id)) }
Example 23
Source File: WorkerConfig.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.models import javax.inject.{Inject, Singleton} import play.api.libs.json.{JsObject, Json} import org.elastic4play.models.{AttributeDef, ChildModelDef, EntityDef, AttributeFormat ⇒ F, AttributeOption ⇒ O} import org.thp.cortex.models.JsonFormat.workerTypeFormat trait WorkerConfigAttributes { _: AttributeDef ⇒ val name = attribute("name", F.stringFmt, "Worker name") val config = attribute("config", F.rawFmt, "Configuration of worker", O.sensitive) val tpe = attribute("type", F.enumFmt(WorkerType), "", O.readonly) } @Singleton class WorkerConfigModel @Inject()(organizationModel: OrganizationModel) extends ChildModelDef[WorkerConfigModel, WorkerConfig, OrganizationModel, Organization]( organizationModel, "workerConfig", "WorkerConfig", "/worker/config" ) with WorkerConfigAttributes {} class WorkerConfig(model: WorkerConfigModel, attributes: JsObject) extends EntityDef[WorkerConfigModel, WorkerConfig](model, attributes) with WorkerConfigAttributes { def organization = parentId.get def jsonConfig = Json.parse(config()).as[JsObject] }
Example 24
package org.thp.cortex.models import scala.util.Try import play.api.libs.json.{JsObject, JsString, Json} import javax.inject.{Inject, Singleton} import org.thp.cortex.models.JsonFormat.workerTypeFormat import org.elastic4play.models.JsonFormat.enumFormat import org.elastic4play.models.{AttributeDef, EntityDef, HiveEnumeration, ModelDef, AttributeFormat ⇒ F, AttributeOption ⇒ O} object JobStatus extends Enumeration with HiveEnumeration { type Type = Value val Waiting, InProgress, Success, Failure, Deleted = Value implicit val reads = enumFormat(this) } trait JobAttributes { _: AttributeDef ⇒ val workerDefinitionId = attribute("workerDefinitionId", F.stringFmt, "Worker definition id", O.readonly) val workerId = attribute("workerId", F.stringFmt, "Worker id", O.readonly) val workerName = attribute("workerName", F.stringFmt, "Worker name", O.readonly) val organization = attribute("organization", F.stringFmt, "Organization ID", O.readonly) val status = attribute("status", F.enumFmt(JobStatus), "Status of the job") val startDate = optionalAttribute("startDate", F.dateFmt, "Analysis start date") val endDate = optionalAttribute("endDate", F.dateFmt, "Analysis end date") val dataType = attribute("dataType", F.stringFmt, "Type of the artifact", O.readonly) val data = optionalAttribute("data", F.rawFmt, "Content of the artifact", O.readonly) val attachment = optionalAttribute("attachment", F.attachmentFmt, "Artifact file content", O.readonly) val tlp = attribute("tlp", TlpAttributeFormat, "TLP level", 2L) val pap = attribute("pap", TlpAttributeFormat, "PAP level", 2L) val message = optionalAttribute("message", F.textFmt, "Message associated to the analysis") val errorMessage = optionalAttribute("errorMessage", F.textFmt, "Message returned by the worker when it fails") val parameters = attribute("parameters", F.rawFmt, "Parameters for this job", "{}") val input = optionalAttribute("input", F.rawFmt, "Data sent to worker") val fromCache = optionalAttribute("fromCache", F.booleanFmt, "Indicates if cache is used", O.form) val tpe = attribute("type", F.enumFmt(WorkerType), "", O.readonly) val lbel = optionalAttribute("label", F.stringFmt, "Label of the job") val cacheTag = optionalAttribute("cacheTag", F.stringFmt, "hash of job discriminant, used for cache", O.readonly) } @Singleton class JobModel @Inject()() extends ModelDef[JobModel, Job]("job", "Job", "/job") with JobAttributes with AuditedModel { override val removeAttribute: JsObject = Json.obj("status" → JobStatus.Deleted) override def defaultSortBy: Seq[String] = Seq("-createdAt") } class Job(model: JobModel, attributes: JsObject) extends EntityDef[JobModel, Job](model, attributes) with JobAttributes { val params: JsObject = Try(Json.parse(parameters()).as[JsObject]).getOrElse(JsObject.empty) override def toJson: JsObject = { val output = input().fold(super.toJson)( i ⇒ super.toJson + ("input" → Json.parse(i)) ) + ("parameters" → params) + ("analyzerId" → JsString(workerId())) + ("analyzerName" → JsString(workerName())) + ("analyzerDefinitionId" → JsString(workerDefinitionId())) + ("date" → Json.toJson(createdAt)) data() match { case Some(d) if tpe() == WorkerType.responder ⇒ output + ("data" → Json.parse(d)) case _ ⇒ output } } }
Example 25
Source File: OrganizationSrv.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.services import javax.inject.{Inject, Singleton} import scala.concurrent.Future import scala.concurrent.duration.Duration import play.api.Configuration import play.api.cache.AsyncCacheApi import play.api.libs.json.JsObject import akka.NotUsed import akka.stream.scaladsl.Source import org.thp.cortex.models.{Organization, OrganizationModel} import org.elastic4play.controllers.Fields import org.elastic4play.database.ModifyConfig import org.elastic4play.services._ @Singleton class OrganizationSrv( cacheExpiration: Duration, organizationModel: OrganizationModel, getSrv: GetSrv, updateSrv: UpdateSrv, findSrv: FindSrv, deleteSrv: DeleteSrv, createSrv: CreateSrv, cache: AsyncCacheApi ) { @Inject() def this( config: Configuration, organizationModel: OrganizationModel, getSrv: GetSrv, updateSrv: UpdateSrv, findSrv: FindSrv, deleteSrv: DeleteSrv, createSrv: CreateSrv, cache: AsyncCacheApi ) = this(config.get[Duration]("cache.organization"), organizationModel, getSrv, updateSrv, findSrv, deleteSrv, createSrv, cache) def create(fields: Fields)(implicit authContext: AuthContext): Future[Organization] = createSrv[OrganizationModel, Organization](organizationModel, fields) def get(orgId: String): Future[Organization] = cache.getOrElseUpdate(s"org-$orgId", cacheExpiration) { getSrv[OrganizationModel, Organization](organizationModel, orgId) } def update(orgId: String, fields: Fields)(implicit Context: AuthContext): Future[Organization] = update(orgId, fields, ModifyConfig.default) def update(orgId: String, fields: Fields, modifyConfig: ModifyConfig)(implicit Context: AuthContext): Future[Organization] = { cache.remove(s"org-$orgId") updateSrv[OrganizationModel, Organization](organizationModel, orgId, fields, modifyConfig) } def update(organization: Organization, fields: Fields)(implicit Context: AuthContext): Future[Organization] = update(organization, fields, ModifyConfig.default) def update(organization: Organization, fields: Fields, modifyConfig: ModifyConfig)(implicit Context: AuthContext): Future[Organization] = { cache.remove(s"org-${organization.id}") updateSrv(organization, fields, modifyConfig) } def delete(orgId: String)(implicit Context: AuthContext): Future[Organization] = { cache.remove(s"org-$orgId") deleteSrv[OrganizationModel, Organization](organizationModel, orgId) } def find(queryDef: QueryDef, range: Option[String], sortBy: Seq[String]): (Source[Organization, NotUsed], Future[Long]) = findSrv[OrganizationModel, Organization](organizationModel, queryDef, range, sortBy) def stats(queryDef: QueryDef, aggs: Seq[Agg]): Future[JsObject] = findSrv(organizationModel, queryDef, aggs: _*) }
Example 26
Source File: AnalyzerConfigCtrl.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.controllers import javax.inject.{Inject, Singleton} import scala.concurrent.{ExecutionContext, Future} import play.api.libs.json.JsObject import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents} import org.thp.cortex.models.{BaseConfig, Roles} import org.thp.cortex.services.{AnalyzerConfigSrv, UserSrv} import org.elastic4play.BadRequestError import org.elastic4play.controllers.{Authenticated, Fields, FieldsBodyParser, Renderer} @Singleton class AnalyzerConfigCtrl @Inject()( analyzerConfigSrv: AnalyzerConfigSrv, userSrv: UserSrv, authenticated: Authenticated, fieldsBodyParser: FieldsBodyParser, renderer: Renderer, components: ControllerComponents, implicit val ec: ExecutionContext ) extends AbstractController(components) { def get(analyzerConfigName: String): Action[AnyContent] = authenticated(Roles.orgAdmin).async { request ⇒ analyzerConfigSrv .getForUser(request.userId, analyzerConfigName) .map(renderer.toOutput(OK, _)) } def list(): Action[AnyContent] = authenticated(Roles.orgAdmin).async { request ⇒ analyzerConfigSrv .listConfigForUser(request.userId) .map { bc ⇒ renderer.toOutput( OK, bc.sortWith { case (BaseConfig("global", _, _, _), _) ⇒ true case (_, BaseConfig("global", _, _, _)) ⇒ false case (BaseConfig(a, _, _, _), BaseConfig(b, _, _, _)) ⇒ a.compareTo(b) < 0 } ) } } def update(analyzerConfigName: String): Action[Fields] = authenticated(Roles.orgAdmin).async(fieldsBodyParser) { implicit request ⇒ request.body.getValue("config").flatMap(_.asOpt[JsObject]) match { case Some(config) ⇒ analyzerConfigSrv .updateOrCreate(request.userId, analyzerConfigName, config) .map(renderer.toOutput(OK, _)) case None ⇒ Future.failed(BadRequestError("attribute config has invalid format")) } } }
Example 27
Source File: AnalyzerCtrl.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.controllers import scala.concurrent.{ExecutionContext, Future} import play.api.libs.json.{JsObject, JsString, Json} import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents} import akka.stream.Materializer import javax.inject.{Inject, Singleton} import org.thp.cortex.models.{Roles, Worker} import org.thp.cortex.services.{UserSrv, WorkerSrv} import org.elastic4play.controllers.{Authenticated, Fields, FieldsBodyParser, Renderer} import org.elastic4play.services.JsonFormat.queryReads import org.elastic4play.services.{QueryDSL, QueryDef} @Singleton class AnalyzerCtrl @Inject()( workerSrv: WorkerSrv, userSrv: UserSrv, authenticated: Authenticated, fieldsBodyParser: FieldsBodyParser, renderer: Renderer, components: ControllerComponents, implicit val ec: ExecutionContext, implicit val mat: Materializer ) extends AbstractController(components) { def find: Action[Fields] = authenticated(Roles.read).async(fieldsBodyParser) { request ⇒ val query = request.body.getValue("query").fold[QueryDef](QueryDSL.any)(_.as[QueryDef]) val range = request.body.getString("range") val sort = request.body.getStrings("sort").getOrElse(Nil) val isAdmin = request.roles.contains(Roles.orgAdmin) val (analyzers, analyzerTotal) = workerSrv.findAnalyzersForUser(request.userId, query, range, sort) renderer.toOutput(OK, analyzers.map(analyzerJson(isAdmin)), analyzerTotal) } def get(analyzerId: String): Action[AnyContent] = authenticated(Roles.read).async { request ⇒ val isAdmin = request.roles.contains(Roles.orgAdmin) workerSrv .getForUser(request.userId, analyzerId) .map(a ⇒ renderer.toOutput(OK, analyzerJson(isAdmin)(a))) } private def analyzerJson(isAdmin: Boolean)(analyzer: Worker): JsObject = if (isAdmin) analyzer.toJson + ("configuration" → Json.parse(analyzer.configuration())) + ("analyzerDefinitionId" → JsString(analyzer.workerDefinitionId())) else analyzer.toJson + ("analyzerDefinitionId" → JsString(analyzer.workerDefinitionId())) def listForType(dataType: String): Action[AnyContent] = authenticated(Roles.read).async { request ⇒ import org.elastic4play.services.QueryDSL._ val (responderList, responderCount) = workerSrv.findAnalyzersForUser(request.userId, "dataTypeList" ~= dataType, Some("all"), Nil) renderer.toOutput(OK, responderList.map(analyzerJson(isAdmin = false)), responderCount) } def create(analyzerDefinitionId: String): Action[Fields] = authenticated(Roles.orgAdmin).async(fieldsBodyParser) { implicit request ⇒ for { organizationId ← userSrv.getOrganizationId(request.userId) workerDefinition ← Future.fromTry(workerSrv.getDefinition(analyzerDefinitionId)) analyzer ← workerSrv.create(organizationId, workerDefinition, request.body) } yield renderer.toOutput(CREATED, analyzerJson(isAdmin = false)(analyzer)) } def listDefinitions: Action[AnyContent] = authenticated(Roles.orgAdmin, Roles.superAdmin).async { _ ⇒ val (analyzers, analyzerTotal) = workerSrv.listAnalyzerDefinitions renderer.toOutput(OK, analyzers, analyzerTotal) } def scan: Action[AnyContent] = authenticated(Roles.orgAdmin, Roles.superAdmin) { _ ⇒ workerSrv.rescan() NoContent } def delete(analyzerId: String): Action[AnyContent] = authenticated(Roles.orgAdmin, Roles.superAdmin).async { implicit request ⇒ for { analyzer ← workerSrv.getForUser(request.userId, analyzerId) _ ← workerSrv.delete(analyzer) } yield NoContent } def update(analyzerId: String): Action[Fields] = authenticated(Roles.orgAdmin).async(fieldsBodyParser) { implicit request ⇒ for { analyzer ← workerSrv.getForUser(request.userId, analyzerId) updatedAnalyzer ← workerSrv.update(analyzer, request.body) } yield renderer.toOutput(OK, analyzerJson(isAdmin = true)(updatedAnalyzer)) } }
Example 28
Source File: MispCtrl.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.controllers import javax.inject.Inject import org.elastic4play.controllers.{Authenticated, Fields, FieldsBodyParser, Renderer} import org.thp.cortex.models.Roles import org.thp.cortex.services.{MispSrv, WorkerSrv} import play.api.Logger import play.api.libs.json.{JsObject, JsValue} import play.api.mvc._ import scala.concurrent.{ExecutionContext, Future} class MispCtrl @Inject()( mispSrv: MispSrv, analyzerSrv: WorkerSrv, authenticated: Authenticated, fieldsBodyParser: FieldsBodyParser, renderer: Renderer, components: ControllerComponents, implicit val ec: ExecutionContext ) extends AbstractController(components) { private[MispCtrl] lazy val logger = Logger(getClass) def modules: Action[Fields] = authenticated(Roles.read).async(fieldsBodyParser) { implicit request ⇒ val (analyzers, analyzerCount) = mispSrv.moduleList renderer.toOutput(OK, analyzers, analyzerCount) } def query: Action[JsValue] = authenticated(Roles.analyze)(parse.json).async { implicit request ⇒ (request.body \ "module") .asOpt[String] .fold(Future.successful(BadRequest("Module parameter is not present in request"))) { module ⇒ request .body .as[JsObject] .fields .collectFirst { case kv @ (k, _) if k != "module" ⇒ kv } .fold(Future.successful(BadRequest("Request doesn't contain data to analyze"))) { case (mispType, dataJson) ⇒ dataJson.asOpt[String].fold(Future.successful(BadRequest("Data has invalid type (expected string)"))) { data ⇒ mispSrv .query(module, mispType, data) .map(Ok(_)) } } } } }
Example 29
Source File: ResponderConfigCtrl.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.controllers import scala.concurrent.{ExecutionContext, Future} import play.api.libs.json.JsObject import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents} import javax.inject.{Inject, Singleton} import org.thp.cortex.models.{BaseConfig, Roles} import org.thp.cortex.services.{ResponderConfigSrv, UserSrv} import org.elastic4play.BadRequestError import org.elastic4play.controllers.{Authenticated, Fields, FieldsBodyParser, Renderer} @Singleton class ResponderConfigCtrl @Inject()( responderConfigSrv: ResponderConfigSrv, userSrv: UserSrv, authenticated: Authenticated, fieldsBodyParser: FieldsBodyParser, renderer: Renderer, components: ControllerComponents, implicit val ec: ExecutionContext ) extends AbstractController(components) { def get(analyzerConfigName: String): Action[AnyContent] = authenticated(Roles.orgAdmin).async { request ⇒ responderConfigSrv .getForUser(request.userId, analyzerConfigName) .map(renderer.toOutput(OK, _)) } def list(): Action[AnyContent] = authenticated(Roles.orgAdmin).async { request ⇒ responderConfigSrv .listConfigForUser(request.userId) .map { bc ⇒ renderer.toOutput( OK, bc.sortWith { case (BaseConfig("global", _, _, _), _) ⇒ true case (_, BaseConfig("global", _, _, _)) ⇒ false case (BaseConfig(a, _, _, _), BaseConfig(b, _, _, _)) ⇒ a.compareTo(b) < 0 } ) } } def update(analyzerConfigName: String): Action[Fields] = authenticated(Roles.orgAdmin).async(fieldsBodyParser) { implicit request ⇒ request.body.getValue("config").flatMap(_.asOpt[JsObject]) match { case Some(config) ⇒ responderConfigSrv .updateOrCreate(request.userId, analyzerConfigName, config) .map(renderer.toOutput(OK, _)) case None ⇒ Future.failed(BadRequestError("attribute config has invalid format")) } } }
Example 30
Source File: QueryComplexityFilter.scala From naptime with Apache License 2.0 | 5 votes |
package org.coursera.naptime.ari.graphql.controllers.filters import javax.inject.Inject import javax.inject.Singleton import com.typesafe.scalalogging.StrictLogging import org.coursera.naptime.ari.Response import org.coursera.naptime.ari.graphql.GraphqlSchemaProvider import org.coursera.naptime.ari.graphql.SangriaGraphQlContext import org.coursera.naptime.ari.graphql.controllers.GraphQLController import org.coursera.naptime.ari.graphql.marshaller.NaptimeMarshaller._ import org.coursera.naptime.ari.graphql.resolvers.NaptimeResolver import org.coursera.naptime.ari.graphql.resolvers.NoopResolver import play.api.libs.json.JsObject import play.api.libs.json.Json import play.api.mvc.Results import sangria.ast.Document import sangria.execution.ErrorWithResolver import sangria.execution.Executor import sangria.execution.QueryAnalysisError import sangria.execution.QueryReducer import scala.concurrent.ExecutionContext import scala.concurrent.Future @Singleton class QueryComplexityFilter @Inject()( graphqlSchemaProvider: GraphqlSchemaProvider, configuration: ComplexityFilterConfiguration)(implicit executionContext: ExecutionContext) extends Filter with Results with StrictLogging { val MAX_COMPLEXITY = configuration.maxComplexity def apply(nextFilter: FilterFn): FilterFn = { incoming => computeComplexity(incoming.document, incoming.variables) .flatMap { complexity => if (complexity > MAX_COMPLEXITY) { Future.successful( OutgoingQuery( response = Json.obj("error" -> "Query is too complex.", "complexity" -> complexity), ariResponse = None)) } else { nextFilter.apply(incoming) } } .recover { case error: QueryAnalysisError => OutgoingQuery(error.resolveError.as[JsObject], None) case error: ErrorWithResolver => OutgoingQuery(error.resolveError.as[JsObject], None) case error: Exception => OutgoingQuery(Json.obj("errors" -> Json.arr(error.getMessage)), None) } } private[graphql] def computeComplexity(queryAst: Document, variables: JsObject)( implicit executionContext: ExecutionContext): Future[Double] = { // TODO(bryan): is there a way around this var? var complexity = 0D val complReducer = QueryReducer.measureComplexity[SangriaGraphQlContext] { (c, ctx) => complexity = c ctx } val executorFut = Executor.execute( graphqlSchemaProvider.schema, queryAst, SangriaGraphQlContext(null, null, executionContext, debugMode = false), variables = variables, exceptionHandler = GraphQLController.exceptionHandler(logger), queryReducers = List(complReducer), deferredResolver = new NoopResolver()) executorFut.map { _ => complexity } } } case class ComplexityFilterConfiguration(maxComplexity: Int) object ComplexityFilterConfiguration { val DEFAULT = ComplexityFilterConfiguration(100000) }
Example 31
Source File: TestExecutorHelper.scala From naptime with Apache License 2.0 | 5 votes |
package org.coursera.naptime.ari.graphql.schema import com.linkedin.data.DataMap import org.coursera.naptime.ari.graphql.Models import org.coursera.naptime.ari.graphql.SangriaGraphQlContext import org.coursera.naptime.ari.graphql.SangriaGraphQlSchemaBuilder import org.coursera.naptime.ari.graphql.marshaller.NaptimeMarshaller._ import org.coursera.naptime.ari.graphql.models.RecordWithUnionTypes import org.coursera.naptime.ari.graphql.models.MergedCourse import org.coursera.naptime.ari.graphql.models.MergedInstructor import org.coursera.naptime.ari.graphql.models.MergedPartner import org.coursera.naptime.ari.graphql.resolvers.NaptimeResolver import play.api.libs.json.JsObject import sangria.execution.Executor import sangria.parser.QueryParser import sangria.schema.Schema import scala.concurrent.Await import scala.concurrent.ExecutionContext import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration class TestExecutorHelper { def executeQuery( queryString: String, resourceData: Map[String, Map[String, List[DataMap]]]): JsObject = { val schemaTypes = Map( "org.coursera.naptime.ari.graphql.models.MergedCourse" -> MergedCourse.SCHEMA, "org.coursera.naptime.ari.graphql.models.FakeModel" -> RecordWithUnionTypes.SCHEMA, "org.coursera.naptime.ari.graphql.models.MergedPartner" -> MergedPartner.SCHEMA, "org.coursera.naptime.ari.graphql.models.MergedInstructor" -> MergedInstructor.SCHEMA) val allResources = Set( Models.courseResource, Models.instructorResource, Models.partnersResource, Models.fakeModelResource) val builder = new SangriaGraphQlSchemaBuilder(allResources, schemaTypes) val schema = builder.generateSchema().data.asInstanceOf[Schema[SangriaGraphQlContext, Any]] val queryAst = QueryParser.parse(queryString).get val context = SangriaGraphQlContext( FakeFetcherApi(resourceData), null, ExecutionContext.global, debugMode = true) Await .result( Executor .execute( schema, queryAst, context, variables = JsObject(Map.empty[String, JsObject]), deferredResolver = new NaptimeResolver()), Duration.Inf) .asInstanceOf[JsObject] } }
Example 32
Source File: AttributesProvider.scala From naptime with Apache License 2.0 | 5 votes |
package org.coursera.naptime.router2 import com.typesafe.scalalogging.StrictLogging import org.coursera.courier.templates.DataTemplates.DataConversion import org.coursera.naptime.courier.CourierFormats import org.coursera.naptime.schema.Attribute import org.coursera.naptime.schema.JsValue import play.api.libs.json.JsError import play.api.libs.json.JsObject import play.api.libs.json.JsSuccess import play.api.libs.json.Json import scala.util.control.NonFatal object AttributesProvider extends StrictLogging { val SCALADOC_ATTRIBUTE_NAME = "scaladocs" lazy val scaladocs: Map[String, JsObject] = { val scaladocPath = "/naptime.scaladoc.json" (for { stream <- Option(getClass.getResourceAsStream(scaladocPath)) json <- try { Some(Json.parse(stream)) } catch { case NonFatal(exception) => logger.warn( s"Could not parse contents of file " + s"$scaladocPath as JSON") None } finally { stream.close() } scaladocCollection <- json.validate[Map[String, JsObject]] match { case JsSuccess(deserialized, _) => Some(deserialized) case JsError(_) => logger.warn( s"Could not deserialize contents of file " + s"$scaladocPath as `Map[String, JsObject]`") None } } yield { scaladocCollection }).getOrElse(Map.empty) } def getResourceAttributes(className: String): Seq[Attribute] = { scaladocs .get(className) .map(value => Attribute(SCALADOC_ATTRIBUTE_NAME, Some(jsObjToJsValue(value)))) .toList } def getMethodAttributes(className: String, methodName: String): Seq[Attribute] = { scaladocs .get(s"$className.$methodName") .map(value => Attribute(SCALADOC_ATTRIBUTE_NAME, Some(jsObjToJsValue(value)))) .toList } private[this] def jsObjToJsValue(jsObj: JsObject): JsValue = { JsValue.build(CourierFormats.objToDataMap(jsObj), DataConversion.SetReadOnly) } }
Example 33
Source File: ObjectConstraints4.scala From play-json-schema-validator with Apache License 2.0 | 5 votes |
package com.eclipsesource.schema.internal.draft4.constraints import com.eclipsesource.schema.{SchemaMap, SchemaObject, SchemaProp, SchemaResolutionContext, SchemaType, SchemaValue} import com.eclipsesource.schema.internal.constraints.Constraints._ import com.eclipsesource.schema.internal.validation.VA import com.osinka.i18n.Lang import play.api.libs.json.{JsNumber, JsObject, JsValue} import scalaz.std.option._ import scalaz.std.set._ import scalaz.syntax.semigroup._ import scalaz.Success import com.eclipsesource.schema.internal._ case class ObjectConstraints4(additionalProps: Option[SchemaType] = None, dependencies: Option[Map[String, SchemaType]] = None, patternProps: Option[Map[String, SchemaType]] = None, required: Option[Seq[String]] = None, minProperties: Option[Int] = None, maxProperties: Option[Int] = None, any: AnyConstraints = AnyConstraints4() ) extends HasAnyConstraint with ObjectConstraints { type A = ObjectConstraints4 import com.eclipsesource.schema.internal.validators.ObjectValidators._ override def subSchemas: Set[SchemaType] = (additionalProps.map(Set(_)) |+| dependencies.map(_.values.toSet) |+| patternProps.map(_.values.toSet)) .getOrElse(Set.empty[SchemaType]) ++ any.subSchemas override def resolvePath(path: String): Option[SchemaType] = path match { case Keywords.Object.AdditionalProperties => additionalProps case Keywords.Object.Dependencies => dependencies.map(entries => SchemaMap(Keywords.Object.Dependencies, entries.toSeq.map(e => SchemaProp(e._1, e._2))) ) case Keywords.Object.PatternProperties => patternProps.map(patternProps => SchemaMap( Keywords.Object.PatternProperties, patternProps.toSeq.map(e => SchemaProp(e._1, e._2))) ) case Keywords.Object.MinProperties => minProperties.map(min => SchemaValue(JsNumber(min))) case Keywords.Object.MaxProperties => maxProperties.map(max => SchemaValue(JsNumber(max))) case other => any.resolvePath(other) } override def validate(schema: SchemaType, json: JsValue, context: SchemaResolutionContext) (implicit lang: Lang): VA[JsValue] = (schema, json) match { case (obj@SchemaObject(_, _, _), jsObject@JsObject(_)) => val validation = for { _ <- validateDependencies(schema, dependencies, jsObject) remaining <- validateProps(obj.properties, required, jsObject) unmatched <- validatePatternProps(patternProps, jsObject.fields.toSeq) _ <- validateAdditionalProps(additionalProps, unmatched.intersect(remaining), json) _ <- validateMinProperties(minProperties, jsObject) _ <- validateMaxProperties(maxProperties, jsObject) } yield schema val (_, _, result) = validation.run(context, Success(json)) result case _ => Success(json) } } object ObjectConstraints4 { def emptyObject: SchemaType = SchemaObject(Seq.empty, ObjectConstraints4()) }
Example 34
Source File: ObjectConstraints7.scala From play-json-schema-validator with Apache License 2.0 | 5 votes |
package com.eclipsesource.schema.internal.draft7.constraints import com.eclipsesource.schema.{SchemaMap, SchemaObject, SchemaProp, SchemaResolutionContext, SchemaType, SchemaValue} import com.eclipsesource.schema.internal.Keywords import com.eclipsesource.schema.internal.constraints.Constraints.{AnyConstraints, Constraint, HasAnyConstraint, ObjectConstraints} import com.eclipsesource.schema.internal.validation.VA import com.osinka.i18n.Lang import play.api.libs.json.{JsNumber, JsObject, JsValue} import scalaz.Success import scalaz.std.option._ import scalaz.std.set._ import scalaz.syntax.semigroup._ import com.eclipsesource.schema.internal._ case class ObjectConstraints7(additionalProps: Option[SchemaType] = None, dependencies: Option[Map[String, SchemaType]] = None, patternProps: Option[Map[String, SchemaType]] = None, required: Option[Seq[String]] = None, minProperties: Option[Int] = None, maxProperties: Option[Int] = None, propertyNames: Option[SchemaType] = None, any: AnyConstraints = AnyConstraints7() ) extends HasAnyConstraint with ObjectConstraints { import com.eclipsesource.schema.internal.validators.ObjectValidators._ override def subSchemas: Set[SchemaType] = (additionalProps.map(Set(_)) |+| dependencies.map(_.values.toSet) |+| patternProps.map(_.values.toSet)) .getOrElse(Set.empty[SchemaType]) ++ any.subSchemas override def resolvePath(path: String): Option[SchemaType] = path match { case Keywords.Object.AdditionalProperties => additionalProps case Keywords.Object.Dependencies => dependencies.map(entries => SchemaMap(Keywords.Object.Dependencies, entries.toSeq.map(e => SchemaProp(e._1, e._2))) ) case Keywords.Object.PatternProperties => patternProps.map(patternProps => SchemaMap(Keywords.Object.PatternProperties, patternProps.toSeq.map(e => SchemaProp(e._1, e._2))) ) case Keywords.Object.MinProperties => minProperties.map(min => SchemaValue(JsNumber(min))) case Keywords.Object.MaxProperties => maxProperties.map(max => SchemaValue(JsNumber(max))) case "propertyNames" => propertyNames case other => any.resolvePath(other) } override def validate(schema: SchemaType, json: JsValue, context: SchemaResolutionContext) (implicit lang: Lang): VA[JsValue] = (schema, json) match { case (obj@SchemaObject(_, _, _), jsObject@JsObject(_)) => val validation = for { _ <- validateDependencies(schema, dependencies, jsObject) remaining <- validateProps(obj.properties, required, jsObject) unmatched <- validatePatternProps(patternProps, jsObject.fields.toSeq) _ <- validateAdditionalProps(additionalProps, unmatched.intersect(remaining), json) _ <- validateMinProperties(minProperties, jsObject) _ <- validateMaxProperties(maxProperties, jsObject) _ <- validatePropertyNames(propertyNames, jsObject) } yield schema val (_, _, result) = validation.run(context, Success(json)) result case _ => Success(json) } }
Example 35
Source File: ResolveObjectConstraintsSpec.scala From play-json-schema-validator with Apache License 2.0 | 5 votes |
package com.eclipsesource.schema.internal.refs import com.eclipsesource.schema.{JsonSource, SchemaString, SchemaType} import com.eclipsesource.schema.drafts.{Version4, Version7} import com.eclipsesource.schema.internal.draft7.constraints.StringConstraints7 import org.specs2.mutable.Specification import play.api.libs.json.{JsBoolean, JsObject, JsString, JsValue} class ResolveObjectConstraintsSpec extends Specification { "draft v4" should { import Version4._ val resolver = SchemaRefResolver(Version4) "resolve dependencies constraint" in { val schema = JsonSource.schemaFromString( """{ |"dependencies": { | "a": "b", | "c": ["d", "e"] | } |}""".stripMargin).get val resolved = resolver.resolveFromRoot("#/dependencies/c/1", SchemaResolutionScope(schema)) resolved.right.map(_.toJson) must beRight[JsValue](JsString("e")) } "resolve patternProperties constraint" in { val schema = JsonSource.schemaFromString( """{ | "patternProperties": { | "^(/[^/]+)+$": {} | } |}""".stripMargin).get val result = resolver.resolveFromRoot("#/patternProperties", SchemaResolutionScope(schema)) result.map(_.toJson).right.get must beAnInstanceOf[JsObject] } "should resolve additionalProperties constraint" in { val schema = JsonSource.schemaFromString( """{ | "additionalProperties": false |}""".stripMargin).get val result = resolver.resolveFromRoot("#/additionalProperties", SchemaResolutionScope(schema)) result.map(_.toJson) must beRight[JsValue](JsBoolean(false)) } } "draft v7" should { import Version7._ val resolver = SchemaRefResolver(Version7) "resolve dependencies constraint" in { val schema = JsonSource.schemaFromString( """{ |"dependencies": { | "a": "b", | "c": ["d", "e"] | } |}""".stripMargin).get val resolved = resolver.resolveFromRoot("#/dependencies/c/1", SchemaResolutionScope(schema)) resolved.right.map(_.toJson) must beRight[JsValue](JsString("e")) } "resolve patternProperties constraint" in { val schema = JsonSource.schemaFromString( """{ | "patternProperties": { | "^(/[^/]+)+$": {} | } |}""".stripMargin).get val result = resolver.resolveFromRoot("#/patternProperties", SchemaResolutionScope(schema)) result.map(_.toJson).right.get must beAnInstanceOf[JsObject] } "should resolve additionalProperties constraint" in { val schema = JsonSource.schemaFromString( """{ | "additionalProperties": false |}""".stripMargin).get val result = resolver.resolveFromRoot("#/additionalProperties", SchemaResolutionScope(schema)) result.map(_.toJson) must beRight[JsValue](JsBoolean(false)) } "should resolve additionalProperties constraint" in { val schema = JsonSource.schemaFromString( """{ | "propertyNames": {"maxLength": 3} |}""".stripMargin).get val result = resolver.resolveFromRoot("#/propertyNames", SchemaResolutionScope(schema)) result.map(_.resolved) must beRight[SchemaType](SchemaString(StringConstraints7().copy(maxLength = Some(3)))) } } }
Example 36
Source File: MongoFeederSource.scala From gatling-mongodb-protocol with MIT License | 5 votes |
package com.ringcentral.gatling.mongo.feeder import com.ringcentral.gatling.mongo.MongoUtils import io.gatling.core.feeder.Record import play.api.libs.iteratee._ import play.api.libs.json.{JsObject, Json} import reactivemongo.api.{QueryOpts, ReadPreference} import reactivemongo.play.iteratees.cursorProducer import reactivemongo.play.json.ImplicitBSONHandlers._ import reactivemongo.play.json.collection.JSONCollection import scala.concurrent.{Await, Future} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ object MongoFeederSource { val defaultPostProcessor: JsObject => Map[String, Any] = o => o.fields.toMap def apply(url: String, collectionName: String, query: String, limit: Int, batchSize: Int, connectionTimeout: FiniteDuration, receiveTimeout: FiniteDuration, postProcessor: JsObject => Map[String, Any]): Vector[Record[Any]] = { Await.result(run(url, collectionName, query, limit, batchSize, connectionTimeout, postProcessor), receiveTimeout) } private def run(url: String, collectionName: String, query: String, limit: Int, batchSize: Int, connectionTimeout: FiniteDuration, postProcessor: (JsObject) => Map[String, Any]): Future[Vector[Record[Any]]] = { val document = Json.parse(query).as[JsObject] val collection: JSONCollection = MongoUtils.connectToDB(url, connectionTimeout).collection[JSONCollection](collectionName) val resultSet: Enumerator[Map[String, Any]] = collection.find(document).options(QueryOpts().batchSize(batchSize)).cursor[JsObject](ReadPreference.primary).enumerator(limit).map(postProcessor) resultSet.run(Iteratee.fold(Vector.empty[Record[Any]]) { (acc, next) => acc :+ next }) } }
Example 37
Source File: MongoDsl.scala From gatling-mongodb-protocol with MIT License | 5 votes |
package com.ringcentral.gatling.mongo import com.ringcentral.gatling.mongo.action.MongoActionBuilder import com.ringcentral.gatling.mongo.check.MongoCheckSupport import com.ringcentral.gatling.mongo.command.{MongoCommandBuilder, MongoDslBuilder} import com.ringcentral.gatling.mongo.feeder.MongoFeederSource import com.ringcentral.gatling.mongo.protocol.{MongoProtocol, MongoProtocolFieldsBuilder, MongoProtocolUriBuilder} import io.gatling.core.action.builder.ActionBuilder import io.gatling.core.config.GatlingConfiguration import io.gatling.core.feeder.RecordSeqFeederBuilder import io.gatling.core.session.Expression import play.api.libs.json.JsObject import scala.concurrent.duration.{FiniteDuration, _} trait MongoDsl extends MongoCheckSupport { def mongo(implicit configuration: GatlingConfiguration) = MongoProtocol def mongo(requestName: Expression[String])(implicit configuration: GatlingConfiguration) = new MongoDslBuilder(requestName, configuration) def mongoFeeder(url: String, collection: String, query: String, limit: Int = 100, batchSize: Int = 0, connectionTimeout: FiniteDuration = 5 seconds, receiveTimeout: FiniteDuration = 30 seconds, postProcessor: JsObject => Map[String, Any] = MongoFeederSource.defaultPostProcessor): RecordSeqFeederBuilder[Any] = RecordSeqFeederBuilder(MongoFeederSource(url, collection, query, limit, batchSize, connectionTimeout, receiveTimeout, postProcessor)) implicit def mongoProtocolUriBuilder2mongoProtocol(builder: MongoProtocolUriBuilder): MongoProtocol = builder.build() implicit def mongoProtocolBuilder2mongoProtocol(builder: MongoProtocolFieldsBuilder): MongoProtocol = builder.build() implicit def mongoCommandBuilder2ActionBuilder(commandBuilder: MongoCommandBuilder)(implicit configuration: GatlingConfiguration): ActionBuilder = { new MongoActionBuilder(commandBuilder.build(), configuration) } }
Example 38
Source File: MongoRawCommandAction.scala From gatling-mongodb-protocol with MIT License | 5 votes |
package com.ringcentral.gatling.mongo.action import com.ringcentral.gatling.mongo.command.MongoRawCommand import com.ringcentral.gatling.mongo.response.MongoStringResponse import io.gatling.commons.stats.KO import io.gatling.commons.util.TimeHelper.nowMillis import io.gatling.commons.validation.Validation import io.gatling.core.action.Action import io.gatling.core.config.GatlingConfiguration import io.gatling.core.session.{Expression, Session} import io.gatling.core.stats.StatsEngine import play.api.libs.json.JsObject import reactivemongo.api.commands.Command import reactivemongo.api.{DefaultDB, FailoverStrategy, ReadPreference} import reactivemongo.play.json.ImplicitBSONHandlers._ import reactivemongo.play.json.JSONSerializationPack import scala.concurrent.ExecutionContext.Implicits.global import scala.util.{Failure, Success} class MongoRawCommandAction(command: MongoRawCommand, database: DefaultDB, val statsEngine: StatsEngine, configuration: GatlingConfiguration, val next: Action) extends MongoAction(database) { override def name: String = genName("Mongo raw command") override def commandName: Expression[String] = command.commandName override def executeCommand(commandName: String, session: Session): Validation[Unit] = for { commandText <- command.command(session) commandDocument <- string2JsObject(commandText) } yield { val sent = nowMillis val runner = Command.run(JSONSerializationPack, FailoverStrategy.default) runner.apply(database, runner.rawCommand(commandDocument)).one[JsObject](ReadPreference.primaryPreferred).onComplete { case Success(result) => processResult(session, sent, nowMillis, command.checks, MongoStringResponse(result.toString()), next, commandName) case Failure(err) => executeNext(session, sent, nowMillis, KO, next, commandName, Some(err.getMessage)) } } }
Example 39
Source File: MongoFindAction.scala From gatling-mongodb-protocol with MIT License | 5 votes |
package com.ringcentral.gatling.mongo.action import com.ringcentral.gatling.mongo.command.MongoFindCommand import com.ringcentral.gatling.mongo.response.MongoStringResponse import io.gatling.commons.stats.KO import io.gatling.commons.util.TimeHelper.nowMillis import io.gatling.commons.validation.Validation import io.gatling.core.action.Action import io.gatling.core.config.GatlingConfiguration import io.gatling.core.session.{Expression, Session, resolveOptionalExpression} import io.gatling.core.stats.StatsEngine import play.api.libs.json.JsObject import reactivemongo.api.{DefaultDB, QueryOpts, ReadPreference} import reactivemongo.play.json.ImplicitBSONHandlers._ import reactivemongo.play.json.collection.JSONCollection import reactivemongo.play.json.collection.JsCursor._ import scala.concurrent.ExecutionContext.Implicits.global import scala.util.{Failure, Success} class MongoFindAction(command: MongoFindCommand, database: DefaultDB, val statsEngine: StatsEngine, configuration: GatlingConfiguration, val next: Action) extends MongoAction(database) { override def name: String = genName("Mongo find command") override def commandName: Expression[String] = command.commandName override def executeCommand(commandName: String, session: Session): Validation[Unit] = for { collectionName <- command.collection(session) resolvedFilter <- command.query(session) filter <- string2JsObject(resolvedFilter) resolvedHint <- resolveOptionalExpression(command.hint, session) hint <- string2JsObject(resolvedHint) resolvedSort <- resolveOptionalExpression(command.sort, session) sort <- string2JsObject(resolvedSort) } yield { val sent = nowMillis database.collection[JSONCollection](collectionName).find(filter).options(QueryOpts().batchSize(command.limit)).sort(sort).hint(hint) .cursor[JsObject](ReadPreference.primary).jsArray(command.limit).onComplete { case Success(result) => processResult(session, sent, nowMillis, command.checks, MongoStringResponse(result.toString()), next, commandName) case Failure(err) => executeNext(session, sent, nowMillis, KO, next, commandName, Some(err.getMessage)) } } }
Example 40
Source File: DataFrameConverter.scala From incubator-toree with Apache License 2.0 | 5 votes |
package org.apache.toree.utils import org.apache.spark.sql.{Dataset, Row} import org.apache.toree.plugins.Plugin import play.api.libs.json.{JsObject, Json} import scala.util.Try import org.apache.toree.plugins.annotations.Init import DataFrameConverter._ class DataFrameConverter extends Plugin with LogLike { @Init def init() = { register(this) } def convert(df: Dataset[Row], outputType: String, limit: Int = 10): Try[String] = { Try( outputType.toLowerCase() match { case "html" => convertToHtml(df = df, limit = limit) case "json" => convertToJson(df = df, limit = limit) case "csv" => convertToCsv(df = df, limit = limit) } ) } private def convertToHtml(df: Dataset[Row], limit: Int = 10): String = { val columnFields = df.schema.fieldNames.map(columnName => { s"<th>${columnName}</th>" }).reduce(_ + _) val columns = s"<tr>${columnFields}</tr>" val rows = df.rdd.map(row => { val fieldValues = row.toSeq.map(field => { s"<td>${fieldToString(field)}</td>" }).reduce(_ + _) s"<tr>${fieldValues}</tr>" }).take(limit).reduce(_ + _) s"<table>${columns}${rows}</table>" } private def convertToJson(df: Dataset[Row], limit: Int = 10): String = { val schema = Json.toJson(df.schema.fieldNames) val transformed = df.rdd.map(row => row.toSeq.map(fieldToString).toArray) val rows = transformed.take(limit) JsObject(Seq( "columns" -> schema, "rows" -> Json.toJson(rows) )).toString() } private def convertToCsv(df: Dataset[Row], limit: Int = 10): String = { val headers = df.schema.fieldNames.reduce(_ + "," + _) val rows = df.rdd.map(row => { row.toSeq.map(fieldToString).reduce(_ + "," + _) }).take(limit).reduce(_ + "\n" + _) s"${headers}\n${rows}" } } object DataFrameConverter { def fieldToString(any: Any): String = any match { case null => "null" case seq: Seq[_] => seq.mkString("[", ", ", "]") case _ => any.toString } }
Example 41
Source File: JsonFormatterTests.scala From play-json-extra with Apache License 2.0 | 5 votes |
package play.json.extra import java.time.LocalDateTime import org.scalatest.FunSuite import play.api.libs.json.{JsObject, Json} class JsonFormatterTests extends FunSuite { @JsonFormat final case class TestDataTime(dt: LocalDateTime, children: List[TestDataTime] = Nil) @JsonFormat final case class DefaultTest(@key("ok1") a1: Int = 1, @key("ok2") a2: Int = 2, @key("ok3") a3: Int = 3, @key("ok4") a4: Int = 4, @key("ok5") a5: Int = 5, @key("ok6") a6: Int = 6, @key("ok7") a7: Int = 7, @key("ok8") a8: Int = 8, @key("ok9") a9: Int = 9, @key("ok10") a10: Int = 10, @key("ok11") a11: Int = 11, @key("ok12") a12: Int = 12, @key("ok13") a13: Int = 13, @key("ok14") a14: Int = 14, @key("ok15") a15: Int = 15, @key("ok16") a16: Int = 16, @key("ok17") a17: Int = 17, @key("ok18") a18: Int = 18, @key("ok19") a19: Int = 19, @key("ok20") a20: Int = 20, @key("ok21") a21: Int = 21, @key("ok22") a22: Int = 22, @key("ok23") a23: Int = 23, @key("ok24") a24: Int = 24, @key("ok25") a25: Int = 25, @key("ok26") a26: Int = 26, @key("ok27") a27: Int = 27, @key("ok28") a28: Int = 28, @key("ok29") a29: Int = 29 ) test("basic datetime test") { val dt = LocalDateTime.of(2015, 8, 11, 12, 1, 2, 3) val ts = TestDataTime(dt) val json = Json.toJson(ts) // println(Json.stringify(json)) assert(Json.stringify(json) === """{"dt":"2015-08-11T12:01:02.000000003","children":[]}""") assert(json.as[TestDataTime].dt === dt) } test("default test key + >21 fields + des/ser") { val ts = DefaultTest() val json = Json.toJson(ts).as[JsObject] // println(Json.stringify(json)) assert(json.fields.length === 29) val fieldNames=List( "ok1", "ok2", "ok3", "ok4", "ok5", "ok6", "ok7", "ok8", "ok9", "ok10", "ok10", "ok11", "ok12", "ok13", "ok14", "ok15", "ok16", "ok17", "ok18", "ok19", "ok20", "ok21", "ok22", "ok23", "ok24", "ok25", "ok26", "ok27", "ok28", "ok29" ) fieldNames.foreach(value => assert(json.fields.map(_._1).contains(value) === true)) val json2=Json.parse("""{"ok27":27,"ok16":16,"ok4":4,"ok25":25,"ok14":14,"ok10":10,"ok17":17,"ok21":21,"ok24":24,"ok28":28,"ok3":3,"ok20":20,"ok15":15,"ok7":7,"ok11":11,"ok1":1,"ok23":23,"ok12":12,"ok8":8,"ok29":29,"ok19":19,"ok2":2,"ok5":5,"ok26":26,"ok13":13,"ok18":18,"ok9":9,"ok6":6,"ok22":22}""") val ts2 = json2.as[DefaultTest] assert(ts2.a29 === 29) } }
Example 42
Source File: ItemAdded.scala From lagom with Apache License 2.0 | 5 votes |
package docs.home.scaladsl.serialization.v2c import com.lightbend.lagom.scaladsl.playjson.JsonMigration import com.lightbend.lagom.scaladsl.playjson.JsonMigrations import com.lightbend.lagom.scaladsl.playjson.JsonSerializerRegistry import play.api.libs.json.JsObject import play.api.libs.json.JsPath import play.api.libs.json.JsString import scala.collection.immutable //#rename case class ItemAdded(shoppingCartId: String, itemId: String, quantity: Int) //#rename object ItemAddedMigration { class ShopSerializerRegistry1 extends JsonSerializerRegistry { override def serializers = Vector.empty //#imperative-migration private val itemAddedMigration = new JsonMigration(2) { override def transform(fromVersion: Int, json: JsObject): JsObject = { if (fromVersion < 2) { val productId = (JsPath \ "productId").read[JsString].reads(json).get json + ("itemId" -> productId) - "productId" } else { json } } } override def migrations = Map[String, JsonMigration]( classOf[ItemAdded].getName -> itemAddedMigration ) //#imperative-migration } class ShopSerializerRegistry2 extends JsonSerializerRegistry { override val serializers = Vector.empty //#transformer-migration val productIdToItemId = JsPath.json .update( (JsPath \ "itemId").json.copyFrom((JsPath \ "productId").json.pick) ) .andThen((JsPath \ "productId").json.prune) override def migrations = Map[String, JsonMigration]( JsonMigrations.transform[ItemAdded]( immutable.SortedMap( 1 -> productIdToItemId ) ) ) //#transformer-migration } }
Example 43
Source File: AddOrder.scala From lagom with Apache License 2.0 | 5 votes |
package docs.home.scaladsl.serialization import com.lightbend.lagom.scaladsl.playjson.JsonSerializer import play.api.libs.json.Format import play.api.libs.json.JsObject import play.api.libs.json.Json import play.api.libs.json.Reads object AddOrder { case class AddOrder(productId: String, quantity: Int) import play.api.libs.functional.syntax._ import play.api.libs.json._ object AddOrder { implicit val format: Format[AddOrder] = (JsPath \ "product_id") .format[String] .and((JsPath \ "quantity").format[Int]) .apply(AddOrder.apply, unlift(AddOrder.unapply)) } } object OrderCommands { //#singleton case object GetOrders { implicit val format: Format[GetOrders.type] = JsonSerializer.emptySingletonFormat(GetOrders) } //#singleton } object Hierarchy { //#hierarchy import play.api.libs.json._ sealed trait Fruit case object Pear extends Fruit case object Apple extends Fruit case class Banana(ripe: Boolean) extends Fruit object Banana { implicit val format: Format[Banana] = Json.format } object Fruit { implicit val format = Format[Fruit]( Reads { js => // use the fruitType field to determine how to deserialize val fruitType = (JsPath \ "fruitType").read[String].reads(js) fruitType.fold( errors => JsError("fruitType undefined or incorrect"), { case "pear" => JsSuccess(Pear) case "apple" => JsSuccess(Apple) case "banana" => (JsPath \ "data").read[Banana].reads(js) } ) }, Writes { case Pear => JsObject(Seq("fruitType" -> JsString("pear"))) case Apple => JsObject(Seq("fruitType" -> JsString("apple"))) case b: Banana => JsObject( Seq( "fruitType" -> JsString("banana"), "data" -> Banana.format.writes(b) ) ) } ) } //#hierarchy }
Example 44
Source File: Customer.scala From lagom with Apache License 2.0 | 5 votes |
package docs.home.scaladsl.serialization.v2a import com.lightbend.lagom.scaladsl.playjson.JsonMigration import com.lightbend.lagom.scaladsl.playjson.JsonSerializerRegistry import play.api.libs.json.JsObject import play.api.libs.json.JsPath import play.api.libs.json.Json import play.api.libs.json.Reads import scala.collection.immutable.Seq //#structural case class Address(street: String, city: String, zipCode: String, country: String) case class Customer(name: String, address: Address, shippingAddress: Option[Address]) //#structural object Customer { implicit val addressFormat = Json.format[Address] val customerFormat = Json.format[Customer] } class CustomerMigration extends JsonSerializerRegistry { override def serializers = Seq.empty // format: off //#structural-migration import play.api.libs.json._ import play.api.libs.functional.syntax._ val customerMigration = new JsonMigration(2) { // use arbitrary logic to parse an Address // out of the old schema val readOldAddress: Reads[Address] = { (JsPath \ "street") .read[String] .and( (JsPath \ "city").read[String]) .and( (JsPath \ "zipCode").read[String]) .and( (JsPath \ "country").read[String])(Address) } override def transform(fromVersion: Int, json: JsObject): JsObject = { if (fromVersion < 2) { val address = readOldAddress.reads(json).get val withoutOldAddress = json - "street" - "city" - "zipCode" - "country" // use existing formatter to write the address in the new schema withoutOldAddress + ("address" -> Customer.addressFormat.writes(address)) } else { json } } } override def migrations: Map[String, JsonMigration] = Map( classOf[Customer].getName -> customerMigration ) //#structural-migration // format: on }
Example 45
Source File: PropertyEopsDeclarationResourceISpec.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package router.resources import play.api.libs.json.{JsObject, Json} import support.IntegrationSpec class PropertyEopsDeclarationResourceISpec extends IntegrationSpec { val jsonRequest: JsObject = Json.obj("test" -> "json request") val jsonResponse: JsObject = Json.obj("test" -> "json response") "Post UK Property EOPS declaration" should { "return a 204 with no json response body" when { "the downstream response from the UK property api version 2.0 returns a 204 with no json response body" in { val incomingUrl = "/ni/AA111111A/uk-properties/end-of-period-statements/from/2018-01-01/to/2018-12-12" val outgoingUrl = "/2.0" + incomingUrl Given() .theClientIsAuthorised .And() .post(outgoingUrl) .returns(aResponse .withStatus(NO_CONTENT)) .When() .post(incomingUrl) .withBody(jsonRequest) .withHeaders( ACCEPT -> "application/vnd.hmrc.2.0+json", CONTENT_TYPE -> JSON) .Then() .statusIs(NO_CONTENT) .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } }
Example 46
Source File: TaxCalcResourceISpec.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package router.resources import play.api.libs.json.{JsObject, Json} import support.IntegrationSpec class TaxCalcResourceISpec extends IntegrationSpec { val jsonRequest: JsObject = Json.obj("test" -> "json request") val jsonResponse: JsObject = Json.obj("test" -> "json response") "GET Tax Calculation" should { "return a 200 with a json response body" when { "the downstream response from the self assessment api version 2.0 returns a 200 with a json response body" in { val incomingUrl = "/ni/AA111111A/calculations/041f7e4d-87d9-4d4a-a296-3cfbdf92f7e2" val outgoingUrl = "/2.0" + incomingUrl Given() .theClientIsAuthorised .And() .get(outgoingUrl) .returns(aResponse .withStatus(OK) .withBody(jsonResponse)) .When() .get(incomingUrl) .withHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json") .Then() .statusIs(OK) .bodyIs(jsonResponse) .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } "GET Tax Calculation Messages" should { "return a 200 with json response body" when { "the downstream response from the self assessment api version 2.0 returns a 200 with a json response body" in { val incomingUrl = "/ni/AA111111A/calculations/041f7e4d-87d9-4d4a-a296-3cfbdf92f7e2/validation-messages" val outgoingUrl = "/2.0" + incomingUrl Given() .theClientIsAuthorised .And() .get(outgoingUrl) .returns(aResponse .withStatus(OK) .withBody(jsonResponse)) .When() .get(incomingUrl) .withHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json") .Then() .statusIs(OK) .bodyIs(jsonResponse) .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } }
Example 47
Source File: PropertyEopsObligationsResourceISpec.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package router.resources import play.api.libs.json.{JsObject, Json} import support.IntegrationSpec class PropertyEopsObligationsResourceISpec extends IntegrationSpec { val jsonRequest: JsObject = Json.obj("test" -> "json request") val jsonResponse: JsObject = Json.obj("test" -> "json response") "GET Property End of Period Statements" should { "return a 200 with a json response body" when { "the downstream response from UK Property version 2.0 returns a 200 with a json response body" in { val incomingUrl = "/ni/AA111111A/uk-properties/end-of-period-statements/obligations?from=2017-04-06&to=2018-04-05" val outgoingUrl = "/2.0" + incomingUrl Given() .theClientIsAuthorised .And() .get(outgoingUrl) .returns(aResponse .withStatus(OK) .withBody(jsonResponse)) .When() .get(incomingUrl) .withHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json") .Then() .statusIs(OK) .bodyIs(jsonResponse) .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } }
Example 48
Source File: SelfEmploymentEopsDeclarationResourceISpec.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package router.resources import play.api.libs.json.{JsObject, Json} import support.IntegrationSpec class SelfEmploymentEopsDeclarationResourceISpec extends IntegrationSpec { val jsonRequest: JsObject = Json.obj("test" -> "json request") val jsonResponse: JsObject = Json.obj("test" -> "json response") "Post Self Employment EOPS declaration" should { "return a 204 with no json response body" when { "the downstream response from the self employment version 2.0 returns a 204 with no json response body" in { val incomingUrl = "/ni/AA111111A/self-employments/123456789012345/end-of-period-statements/from/2018-01-01/to/2018-12-12" val outgoingUrl = "/2.0" + incomingUrl Given() .theClientIsAuthorised .And() .post(outgoingUrl) .returns(aResponse .withStatus(NO_CONTENT)) .When() .post(incomingUrl) .withBody(jsonRequest) .withHeaders( ACCEPT -> "application/vnd.hmrc.2.0+json", CONTENT_TYPE -> JSON) .Then() .statusIs(NO_CONTENT) .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } }
Example 49
Source File: DividendsResourceISpec.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package router.resources import play.api.libs.json.{JsObject, Json} import support.IntegrationSpec class DividendsResourceISpec extends IntegrationSpec{ val jsonRequest: JsObject = Json.obj("test" -> "json request") val jsonResponse: JsObject = Json.obj("test" -> "json response") val body: String = s"""{ | "ukDividends": 1000.00, | "otherUkDividends": 2000.00 |}""".stripMargin val correlationId = "X-123" val testHeader = Map("X-CorrelationId" -> Seq(correlationId), "X-Content-Type-Options" -> Seq("nosniff")) "Amend Dividends income with Version 2 enabled" should { "return a 204 with no json response body" when { "a version 2.0 header is provided and the response from the Dividends income API is a 204" in { val incomingUrl = "/ni/AA111111A/dividends/2018-19" val outgoingUrl = "/2.0/ni/AA111111A/dividends/2018-19" Given() .theClientIsAuthorised .And() .put(outgoingUrl) .returns(aResponse .withStatus(NO_CONTENT) .withBody(jsonResponse)) .When() .put(incomingUrl) .withBody(jsonRequest) .withHeaders( ACCEPT -> "application/vnd.hmrc.2.0+json", CONTENT_TYPE -> JSON ) .Then() .statusIs(NO_CONTENT) .bodyIs("") .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } "Retrieve" should { "return response with status 200 and body contains dividends income" when { "version 2.0 header is provided in the request" in { val incomingUrl = "/ni/AA111111A/dividends/2018-19" val outgoingUrl = "/2.0/ni/AA111111A/dividends/2018-19" Given() .theClientIsAuthorised .And() .get(outgoingUrl) .returns(aResponse.withBody(Json.parse(body))) .When() .get(incomingUrl) .withHeaders( ACCEPT -> "application/vnd.hmrc.2.0+json", CONTENT_TYPE -> JSON ) .Then() .statusIs(OK) .bodyIs(Json.parse(body)) .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } }
Example 50
Source File: CharitableGivingResourceISpec.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package router.resources import play.api.libs.json.{JsObject, JsValue, Json} import support.IntegrationSpec import uk.gov.hmrc.http.HttpResponse class CharitableGivingResourceISpec extends IntegrationSpec { val jsonRequest: JsObject = Json.obj("test" -> "json request") val jsonResponse: JsObject = Json.obj("test" -> "json response") val body: JsValue = Json.parse( s"""{ | "giftAidPayments": { | "specifiedYear": 10000.00, | "oneOffSpecifiedYear": 1000.00, | "specifiedYearTreatedAsPreviousYear": 300.00, | "followingYearTreatedAsSpecifiedYear": 400.00, | "nonUKCharities": 2000.00, | "nonUKCharityNames": ["International Charity A","International Charity B"] | }, | "gifts": { | "landAndBuildings": 700.00, | "sharesOrSecurities": 600.00, | "investmentsNonUKCharities": 300.00, | "investmentsNonUKCharityNames": ["International Charity C","International Charity D"] | } |}""".stripMargin ) val correlationId = "X-123" val testHeader = Map("X-CorrelationId" -> Seq(correlationId), "X-Content-Type-Options" -> Seq("nosniff")) val httpResponse = HttpResponse(OK, Some(body), testHeader) "GET Charitable Giving annuals with release-2 enabled" should { s"return status 200 with a json response body" when { "the downstream response from the Charitable Giving api version 2 returns status 200 with a json response body" in { val incomingUrl = s"/ni/AA111111A/charitable-giving/2018-19" val outgoingUrl = s"/2.0/ni/AA111111A/charitable-giving/2018-19" Given() .theClientIsAuthorised .And() .get(outgoingUrl) .returns(aResponse .withStatus(OK) .withBody(body) .withHeader("X-CorrelationId", correlationId)) .When() .get(incomingUrl) .withHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json") .Then() .statusIs(OK) .bodyIs(body) .containsHeaders(("X-CorrelationId", correlationId)) .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } "Amend Charitable Giving with Version 2 enabled" should { "return a 204 with no json response body" when { "a version 2.0 header is provided and the response from the Charitable Giving API is a 204" in { val incomingUrl = s"/ni/AA111111A/charitable-giving/2018-19" val outgoingUrl = s"/2.0/ni/AA111111A/charitable-giving/2018-19" Given() .theClientIsAuthorised .And() .put(outgoingUrl) .returns(aResponse .withStatus(NO_CONTENT) .withBody(jsonResponse)) .When() .put(incomingUrl) .withBody(jsonRequest) .withHeaders( ACCEPT -> "application/vnd.hmrc.2.0+json", CONTENT_TYPE -> JSON ) .Then() .statusIs(NO_CONTENT) .bodyIs("") .verify(mockFor(outgoingUrl) .receivedHeaders(ACCEPT -> "application/vnd.hmrc.2.0+json")) } } } }
Example 51
Source File: ResourceSpec.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package support import mocks.auth.MockAuthConnector import org.mockito.stubbing.OngoingStubbing import play.api.libs.json.{JsObject, Json} import uk.gov.hmrc.auth.core.authorise.EmptyPredicate import uk.gov.hmrc.auth.core.retrieve.EmptyRetrieval import scala.concurrent.Future trait ResourceSpec extends UnitSpec with MockAuthConnector { val requestJson: JsObject = Json.obj("test" -> "request json") val responseJson: JsObject = Json.obj("test" -> "response json") val testHeader = Map("test" -> "header", "X-Content-Type-Options" -> "nosniff", "Content-Type" -> "application/json") val testHeaderResponse = Map("test" -> Seq("header")) def mockAuthAction: OngoingStubbing[Future[Unit]] = { MockAuthConnector.authorise(EmptyPredicate, EmptyRetrieval) .returns(Future.successful(())) } }
Example 52
Source File: SyntaxObj.scala From eidos with Apache License 2.0 | 5 votes |
package org.clulab.wm.eidos.serialization.web import org.clulab.processors.Document import org.clulab.processors.Sentence import play.api.libs.json.JsObject import play.api.libs.json.Json class SyntaxObj(val doc: Document, val text: String) { def mkJson: JsObject = { Json.obj(fields = "text" -> text, "entities" -> mkJsonFromTokens, "relations" -> mkJsonFromDependencies ) } def mkJsonFromTokens: Json.JsValueWrapper = { var offset = 0 val tokens = doc.sentences.flatMap { sent => val tokens = sent.words.indices.map(i => mkJsonFromToken(sent, offset, i)) offset += sent.words.length tokens } Json.arr(tokens: _*) } def mkJsonFromToken(sent: Sentence, offset: Int, i: Int): Json.JsValueWrapper = { Json.arr( s"T${offset + i + 1}", // token id (starts at one, not zero) sent.tags.get(i), // lets assume that tags are always available Json.arr(Json.arr(sent.startOffsets(i), sent.endOffsets(i))) ) } def mkJsonFromDependencies: Json.JsValueWrapper = { var offset = 1 val rels = doc.sentences.flatMap { sent => var relId = 0 val deps = sent.dependencies.get // lets assume that dependencies are always available val rels = for { governor <- deps.outgoingEdges.indices (dependent, label) <- deps.outgoingEdges(governor) } yield { val json = mkJsonFromDependency(offset + relId, offset + governor, offset + dependent, label) relId += 1 json } offset += sent.words.length rels } Json.arr(rels: _*) } def mkJsonFromDependency(relId: Int, governor: Int, dependent: Int, label: String): Json.JsValueWrapper = { Json.arr( s"R$relId", label, Json.arr( Json.arr("governor", s"T$governor"), Json.arr("dependent", s"T$dependent") ) ) } }
Example 53
Source File: ArticleTestHelper.scala From scala-play-realworld-example-app with MIT License | 5 votes |
package articles.test_helpers import articles.models._ import commons_test.test_helpers.WsScalaTestClientWithHost.TestWsClient import commons_test.test_helpers.{ResponseTransformer, WsScalaTestClientWithHost} import play.api.http.HeaderNames import play.api.libs.json.{JsObject, Json} import play.api.libs.ws.{EmptyBody, WSResponse} import scala.concurrent.{ExecutionContext, Future} class ArticleTestHelper(executionContext: ExecutionContext) extends WsScalaTestClientWithHost { def update(article: ArticleWithTags, articleUpdate: ArticleUpdate, token: String) (implicit testWsClient: TestWsClient): Future[WSResponse] = { wsUrl(s"/articles/${article.slug}") .addHttpHeaders(HeaderNames.AUTHORIZATION -> s"Token $token") .put(JsObject(Map("article" -> Json.toJson(articleUpdate)))) } implicit private val ex: ExecutionContext = executionContext private def getQueryParams(articlesPageRequest: ArticlesPageRequest) = { import articlesPageRequest._ val requiredParams = Seq("limit" -> limit.toString, "offset" -> offset.toString) val maybeFilterParam = articlesPageRequest match { case pg: ArticlesByTag => Some("tag" -> pg.tag) case pg: ArticlesByAuthor => Some("author" -> pg.author.value) case pg: ArticlesByFavorited => Some("favorited " -> pg.favoritedBy.value) case _: ArticlesAll => None } maybeFilterParam.map(requiredParams.prepended) .getOrElse(requiredParams) } def findAll[ReturnType](mainFeedPageRequest: ArticlesPageRequest, maybeToken: Option[String] = None) (implicit testWsClient: TestWsClient, responseTransformer: ResponseTransformer[ReturnType]): Future[ReturnType] = { val queryParams = getQueryParams(mainFeedPageRequest) val request = wsUrl( s"/articles").addQueryStringParameters(queryParams: _*) maybeToken .map(token => request.addHttpHeaders(HeaderNames.AUTHORIZATION -> s"Token $token")) .getOrElse(request) .get() .map(responseTransformer(_)) } def favorite[ReturnType](slug: String, token: String) (implicit testWsClient: TestWsClient, responseTransformer: ResponseTransformer[ReturnType]): Future[ReturnType] = { wsUrl(s"/articles/$slug/favorite") .addHttpHeaders(HeaderNames.AUTHORIZATION -> s"Token $token") .post(EmptyBody) .map(responseTransformer(_)) } def getBySlug[ReturnType](slug: String)(implicit testWsClient: TestWsClient, responseTransformer: ResponseTransformer[ReturnType]): Future[ReturnType] = { wsUrl(s"/articles/$slug") .get() .map(responseTransformer(_)) } def delete(articleWithTags: ArticleWithTags, token: String)(implicit testWsClient: TestWsClient): Future[WSResponse] = { wsUrl(s"/articles/${articleWithTags.slug}") .addHttpHeaders(HeaderNames.AUTHORIZATION -> s"Token $token") .delete() } def create[ReturnType](newArticle: NewArticle, token: String) (implicit testWsClient: TestWsClient, responseTransformer: ResponseTransformer[ReturnType]): Future[ReturnType] = { val body = Json.toJson(NewArticleWrapper(newArticle)) wsUrl("/articles") .addHttpHeaders(HeaderNames.AUTHORIZATION -> s"Token $token") .post(body) .map(responseTransformer(_)) } }
Example 54
Source File: UserTestHelper.scala From scala-play-realworld-example-app with MIT License | 5 votes |
package users.test_helpers import authentication.models.PlainTextPassword import commons.models.Email import commons_test.test_helpers.{ResponseTransformer, WsScalaTestClientWithHost} import commons_test.test_helpers.WsScalaTestClientWithHost.TestWsClient import play.api.http.HeaderNames import play.api.libs.json.{JsObject, JsString, JsValue, Json} import play.api.libs.ws.WSResponse import users.models._ import scala.concurrent.{ExecutionContext, Future} class UserTestHelper(executionContext: ExecutionContext) extends WsScalaTestClientWithHost { def update(updateUser: UserUpdate, token: String)(implicit testWsClient: TestWsClient): Future[WSResponse] = { val registrationRequestBody = Json.toJson(UpdateUserWrapper(updateUser)) wsUrl(s"/user") .addHttpHeaders(HeaderNames.AUTHORIZATION -> s"Token $token") .put(registrationRequestBody) } def login(email: Email, password: PlainTextPassword)(implicit testWsClient: TestWsClient): Future[WSResponse] = { val requestBody: JsValue = buildEmailAndPasswordRequestBody(email, password) wsUrl("/users/login") .post(requestBody) } private def buildEmailAndPasswordRequestBody(email: Email, password: PlainTextPassword) = { val rawEmail = email.value val rawPassword = password.value val userJsonObj = JsObject(Map("email" -> JsString(rawEmail), "password" -> JsString(rawPassword))) JsObject(Map("user" -> userJsonObj)) } implicit private val ex: ExecutionContext = executionContext def register[ReturnType](userRegistration: UserRegistration) (implicit testWsClient: TestWsClient, responseTransformer: ResponseTransformer[ReturnType]): Future[ReturnType] = { require(userRegistration != null) wsUrl("/users") .post(Json.toJson(UserRegistrationWrapper(userRegistration))) .map(responseTransformer(_)) } }
Example 55
Source File: Normalize.scala From ScalaNetwork with GNU General Public License v2.0 | 5 votes |
package kr.ac.kaist.ir.deep.layer import breeze.linalg.sum import breeze.numerics.pow import kr.ac.kaist.ir.deep.fn._ import play.api.libs.json.{JsObject, Json} abstract override def updateBy(delta: Iterator[ScalarMatrix], error: ScalarMatrix): ScalarMatrix = { val Xsq = pow(X, 2.0f) val lenSq = sum(Xsq) val len: Scalar = Math.sqrt(lenSq).toFloat // Note that length is the function of x_i. // Let z_i := x_i / len(x_i). // Then d z_i / d x_i = (len^2 - x_i^2) / len^3 = (1 - z_i^2) / len, // d z_j / d x_i = - x_i * x_j / len^3 = - z_i * z_j / len val rows = dFdX.rows val dZdX = ScalarMatrix $0(rows, rows) var r = 0 while (r < rows) { //dZ_r var c = 0 while (c < rows) { if (r == c) { //dX_c dZdX.update(r, c, (1.0f - Xsq(r, 0) / lenSq) / len) } else { dZdX.update(r, c, (-X(r, 0) * X(c, 0)) / (len * lenSq)) } c += 1 } r += 1 } // un-normalize the error super.updateBy(delta, dZdX * error) } }
Example 56
Source File: GraphQlController.scala From tap with Apache License 2.0 | 5 votes |
package controllers import javax.inject.Inject import models.GraphqlSchema import models.graphql.GraphqlActions import play.api.Logger import play.api.libs.json.{JsObject, JsValue, Json} import play.api.mvc.{Action, AnyContent, InjectedController, Result} import sangria.ast.Document import sangria.execution.{ErrorWithResolver, Executor, QueryAnalysisError} import sangria.marshalling.playJson.{PlayJsonInputUnmarshallerJObject, PlayJsonResultMarshaller} import sangria.parser.{QueryParser, SyntaxError} import sangria.schema.Schema import views.GraphiqlPage import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future import scala.util.{Failure, Success} class GraphQlController @Inject() (assets: AssetsFinder, gqlSchema: GraphqlSchema, actions: GraphqlActions) extends InjectedController { val schema:Schema[GraphqlActions,Unit] = gqlSchema.create def graphiql:Action[AnyContent] = Action { request => Logger.info("Got Any content request from:" + request.remoteAddress) //Ok(views.html.graphiql(assets)) Ok(GraphiqlPage.render("Explore TAP with GraphiQL")) } def graphql:Action[JsValue] = Action.async(parse.json) { request => val query = (request.body \ "query").as[String] val operation = (request.body \ "operationName").asOpt[String] val variables = (request.body \ "variables").asOpt[JsObject].getOrElse(Json.obj()) Logger.info(s"Query received from ${request.remoteAddress} >>> ${operation.getOrElse("No query")}") Logger.info(s"Variables: $variables") process(query,operation,variables) } def process(query:String,name:Option[String],variables:JsObject):Future[Result] = QueryParser.parse(query) match { case Success(queryAst) => executeGraphQLQuery(queryAst, name, variables) case Failure(error: SyntaxError) => Future.successful(BadRequest(error.getMessage)) case _ => Future.successful(BadRequest("There was a problem with the request to TAP graphql.")) } def executeGraphQLQuery(query: Document, name: Option[String], vars: JsObject):Future[Result] = { Executor.execute(schema, query, actions, operationName = name, variables = vars) .map(Ok(_)) .recover { case error: QueryAnalysisError => BadRequest(error.resolveError) case error: ErrorWithResolver => InternalServerError(error.resolveError) } } }
Example 57
Source File: Generators.scala From ionroller with MIT License | 5 votes |
package ionroller import com.amazonaws.services.elasticbeanstalk.model.ConfigurationOptionSetting import org.joda.time.DateTime import org.scalacheck.{Arbitrary, Gen} import play.api.libs.json.JsObject import scala.concurrent.duration._ object Generators { // Scalacheck seems to enjoy making empty strings val genNonEmptyString: Gen[String] = for { s <- Gen.alphaStr c <- Gen.alphaChar } yield s :+ c val releaseVersionGen: Gen[ReleaseVersion] = for { version <- genNonEmptyString } yield ReleaseVersion(version) val dockerImageGen: Gen[DockerImage] = for { server <- Gen.option(genNonEmptyString) account <- genNonEmptyString image <- genNonEmptyString version <- releaseVersionGen } yield { DockerImage(DockerRepository(s"${server.fold("")(_ + "/")}$account/$image"), version) } val portMappingGen: Gen[PortMapping] = for { containerPort <- Gen.choose(1, 65535) hostPort <- Gen.choose(1, 65535) } yield PortMapping(containerPort, hostPort) val volumeMappingGen: Gen[VolumeMapping] = for { containerMapping <- Gen.alphaStr hostMapping <- Gen.alphaStr } yield VolumeMapping(containerMapping, hostMapping) val configurationOptionSettingGen: Gen[ConfigurationOptionSetting] = for { namespace <- Gen.alphaStr optionName <- Gen.alphaStr value <- Gen.alphaStr } yield new ConfigurationOptionSetting().withNamespace(namespace).withOptionName(optionName).withValue(value) val ebConfigurationGen: Gen[EBSConfiguration] = for { deploymentBucket <- Gen.alphaStr solutionStack <- Gen.alphaStr envOptionSettings <- Gen.listOf(configurationOptionSettingGen) jsObject <- Gen.option(Gen.const(JsObject(Seq.empty))) } yield EBSConfiguration(deploymentBucket, solutionStack, envOptionSettings, jsObject, jsObject, jsObject, jsObject, jsObject, jsObject, jsObject, jsObject, jsObject) def timelineConfigurationGen(awsAccountIds: Seq[String]): Gen[TimelineConfiguration] = for { url <- Gen.alphaStr hostedZoneId <- Gen.alphaStr dockerImage <- dockerImageGen.map(_.repository) awsAccountId <- Gen.oneOf(awsAccountIds) serviceRole <- Gen.alphaStr portMappings <- Gen.nonEmptyListOf(portMappingGen) runArgs <- Gen.listOf(Gen.alphaStr) volumeMappings <- Gen.listOf(volumeMappingGen) removeUnusedAfter <- Gen.option(Gen.posNum[Int].map(_.minutes)) ebsConfig <- ebConfigurationGen } yield TimelineConfiguration(url, hostedZoneId, None, dockerImage, awsAccountId, serviceRole, portMappings, volumeMappings, runArgs, removeUnusedAfter, ebsConfig, new DateTime) val systemConfigurationWithEnabledTimelineGen: Gen[SystemConfiguration] = for { awsAccountIds <- Gen.listOf(Gen.numStr) tlConfig <- timelineConfigurationGen(awsAccountIds) } yield SystemConfiguration(Map(ConfigurationManager.modifyEnvironmentsWhitelist.head -> tlConfig)) val systemConfigurationGen: Gen[SystemConfiguration] = for { awsAccountIds <- Gen.listOf(Gen.numStr) timelines <- Gen.mapOf(Gen.zip(Gen.alphaStr.map(TimelineName.apply), timelineConfigurationGen(awsAccountIds))) } yield SystemConfiguration(timelines) implicit val releaseVersionArb: Arbitrary[ReleaseVersion] = Arbitrary(releaseVersionGen) implicit val dockerImageArb: Arbitrary[DockerImage] = Arbitrary(dockerImageGen) implicit val ebConfigArb: Arbitrary[EBSConfiguration] = Arbitrary(ebConfigurationGen) implicit val systemConfigurationArb: Arbitrary[SystemConfiguration] = Arbitrary(systemConfigurationGen) }
Example 58
Source File: AboutController.scala From cluster-broccoli with Apache License 2.0 | 5 votes |
package de.frosner.broccoli.controllers import javax.inject.Inject import de.frosner.broccoli.auth.Account import de.frosner.broccoli.services._ import de.frosner.broccoli.conf import de.frosner.broccoli.models.AboutInfo.aboutInfoWrites import jp.t2v.lab.play2.auth.BroccoliSimpleAuthorization import play.api.Environment import play.api.cache.CacheApi import play.api.libs.json.{JsBoolean, JsObject, JsString, Json} import play.api.mvc.{Action, AnyContent, Controller} case class AboutController @Inject()( aboutInfoService: AboutInfoService, override val securityService: SecurityService, override val cacheApi: CacheApi, override val playEnv: Environment ) extends Controller with BroccoliSimpleAuthorization { def about = StackAction(parse.empty) { implicit request => Ok(Json.toJson(AboutController.about(aboutInfoService, loggedIn))) } } object AboutController { def about(aboutInfoService: AboutInfoService, loggedIn: Account) = aboutInfoService.aboutInfo(loggedIn) }
Example 59
Source File: StatefulStore.scala From cloudstate with Apache License 2.0 | 5 votes |
package io.cloudstate.operator import play.api.libs.json.{Format, JsObject, Json} import skuber.ResourceSpecification.Subresources import skuber.apiextensions.CustomResourceDefinition import skuber.{CustomResource, ListResource, ResourceDefinition} object StatefulStore { type Resource = CustomResource[StatefulStore.Spec, Status] type ResourceList = ListResource[Resource] case class Spec(`type`: Option[String], deployment: Option[String], config: Option[JsObject]) object Spec { implicit val format: Format[Spec] = Json.format } case class Status(conditions: Option[List[Condition]], lastConfig: Option[String]) object Status { implicit val format: Format[Status] = Json.format } implicit val statefulStoreResourceDefinition = ResourceDefinition[Resource]( group = "cloudstate.io", version = "v1alpha1", kind = "StatefulStore", shortNames = Nil, subresources = Some(Subresources().withStatusSubresource) ) implicit val statusSubEnabled = CustomResource.statusMethodsEnabler[Resource] val crd = CustomResourceDefinition[Resource] def apply(name: String, spec: Spec) = CustomResource[Spec, Status](spec).withName(name) }
Example 60
Source File: SpotifyMappers.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.she.mappers import java.util.UUID import org.hatdex.hat.api.models.{ EndpointQuery, EndpointQueryFilter, PropertyQuery } import org.hatdex.hat.api.models.applications.{ DataFeedItem, DataFeedItemContent, DataFeedItemMedia, DataFeedItemTitle } import org.hatdex.hat.she.models.StaticDataValues import org.joda.time.DateTime import play.api.libs.json.{ JsError, JsNumber, JsObject, JsResult, JsSuccess, JsValue, __ } import scala.util.Try class SpotifyFeedMapper extends DataEndpointMapper { def dataQueries(fromDate: Option[DateTime], untilDate: Option[DateTime]): Seq[PropertyQuery] = { Seq(PropertyQuery( List(EndpointQuery("spotify/feed", None, dateFilter(fromDate, untilDate).map(f ⇒ Seq(EndpointQueryFilter("played_at", None, f))), None)), Some("played_at"), Some("descending"), None)) } def mapDataRecord(recordId: UUID, content: JsValue, tailRecordId: Option[UUID] = None, tailContent: Option[JsValue] = None): Try[DataFeedItem] = { for { durationSeconds ← Try((content \ "track" \ "duration_ms").as[Int] / 1000) title ← Try( DataFeedItemTitle("You listened", None, Some(s"${"%02d".format(durationSeconds / 60)}:${"%02d".format(durationSeconds % 60)}"))) itemContent ← Try(DataFeedItemContent( Some( s"""${(content \ "track" \ "name").as[String]}, |${(content \ "track" \ "artists").as[Seq[JsObject]].map(a ⇒ (a \ "name").as[String]).mkString(", ")}, |${(content \ "track" \ "album" \ "name").as[String]}""".stripMargin), None, Some( Seq(DataFeedItemMedia((content \ "track" \ "album" \ "images" \ 0 \ "url").asOpt[String], (content \ "track" \ "album" \ "images" \ 0 \ "url").asOpt[String]))), None)) date ← Try((content \ "played_at").as[DateTime]) } yield DataFeedItem("spotify", date, Seq(), Some(title), Some(itemContent), None) } } class SpotifyProfileStaticDataMapper extends StaticDataEndpointMapper { def dataQueries(): Seq[PropertyQuery] = { Seq(PropertyQuery( List( EndpointQuery("spotify/profile", None, None, None)), Some("dateCreated"), Some("descending"), Some(1))) } def mapDataRecord(recordId: UUID, content: JsValue, endpoint: String): Seq[StaticDataValues] = { val eventualData = content.validate[JsObject] eventualData match { case JsSuccess(value, _) => val lastPartOfEndpointString = endpoint.split("/").last val maybeTransformedData = transformData(value).flatMap(item => item.validate[Map[String, JsValue]]) maybeTransformedData match { case JsSuccess(data, _) => Seq(StaticDataValues(lastPartOfEndpointString, (data - "images" - "external_urls"))) case e: JsError => logger.error(s"Couldn't validate static data JSON for $endpoint. $e") Seq() } case e: JsError => logger.error(s"Couldn't validate static data JSON for $endpoint. $e") Seq() } } private def transformData(rawData: JsObject): JsResult[JsValue] = { val transformation = __.json.update( __.read[JsObject].map(profile => { val followers = (profile \ "followers" \ "total").asOpt[JsNumber].getOrElse(JsNumber(0)) profile ++ JsObject(Map( "followers" -> followers)) })) rawData.transform(transformation) } }
Example 61
Source File: Protocol.scala From graphcool-framework with Apache License 2.0 | 5 votes |
package cool.graph.shared.functions.dev import play.api.libs.json.{JsObject, Json} object Conversions { implicit val deploymentInputFormat = Json.format[DeploymentInput] implicit val statusResponseFormat = Json.format[StatusResponse] implicit val functionInvocationFormat = Json.format[FunctionInvocation] implicit val invacationResultFormat = Json.format[FunctionInvocationResult] } case class DeploymentInput(zipUrl: String, handlerPath: String, functionName: String) case class StatusResponse(success: Boolean, error: Option[String] = None) case class FunctionInvocation(functionName: String, input: String) case class FunctionInvocationResult( success: Boolean, error: Option[String], value: Option[JsObject], stdout: Option[String], stderr: Option[String] )
Example 62
Source File: FunctionLogsErrorShovel.scala From graphcool-framework with Apache License 2.0 | 5 votes |
package cool.graph.worker.helpers import java.util.concurrent.atomic.AtomicInteger import cool.graph.bugsnag.BugSnaggerImpl import cool.graph.messagebus.Conversions.ByteUnmarshaller import cool.graph.messagebus.queue.rabbit.RabbitQueue import cool.graph.worker.payloads.{JsonConversions, LogItem} import cool.graph.worker.utils.Utils import org.joda.time.DateTime import play.api.libs.json.{JsObject, Json} import scala.concurrent.{Await, Future} import scala.util.{Failure, Success, Try} object FunctionLogsErrorShovel extends App { import JsonConversions._ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ case class OldLogItem( id: String, projectId: String, functionId: String, requestId: String, status: String, duration: Long, timestamp: String, message: String ) { def toLogItem: LogItem = { status match { case "SUCCESS" => LogItem(id, projectId, functionId, requestId, status, duration, timestamp, Json.parse(message).as[JsObject]) case "FAILURE" => LogItem(id, projectId, functionId, requestId, status, duration, timestamp, Json.obj("error" -> message)) } } } implicit val bugsnagger = BugSnaggerImpl("") implicit val oldLogItemFormat = Json.format[OldLogItem] val amqpUri = sys.env("RABBITMQ_URI") val faultTolerantUnmarshaller: ByteUnmarshaller[LogItem] = { bytes => Try { logItemUnmarshaller(bytes) }.orElse(fromOldLogItemFormat(bytes)) match { case Success(logItem) => logItem.copy(timestamp = correctLogTimestamp(logItem.timestamp)) case Failure(err) => throw err } } val marshaller = JsonConversions.logItemMarshaller val targetPublisher = RabbitQueue.publisher[LogItem](amqpUri, "function-logs") val counter = new AtomicInteger(0) val consumeFn = { msg: LogItem => println(s"[FunctionLogsErrorShovel][${counter.incrementAndGet()}]] Re-processing: $msg") targetPublisher.publish(msg) Future.successful(()) } val plainErrConsumer = RabbitQueue.plainConsumer[LogItem](amqpUri, "function-logs-error", "function-logs", autoDelete = false)(bugsnagger, faultTolerantUnmarshaller) def fromOldLogItemFormat(bytes: Array[Byte]): Try[LogItem] = Try { Json.parse(bytes).as[OldLogItem].toLogItem } def correctLogTimestamp(timestamp: String): String = { val dt = DateTime.parse(timestamp) val newTst = Utils.msqlDateFormatter.print(dt) println(s"[FunctionLogsErrorShovel]\t$timestamp\t->\t$newTst") newTst } plainErrConsumer.withConsumer(consumeFn) println("Press enter to terminate...") scala.io.StdIn.readLine() println("Terminating.") plainErrConsumer.shutdown targetPublisher.shutdown }
Example 63
Source File: Payloads.scala From graphcool-framework with Apache License 2.0 | 5 votes |
package cool.graph.worker.payloads import play.api.libs.json.JsObject case class Webhook( projectId: String, functionId: String, requestId: String, url: String, payload: String, id: String, headers: Map[String, String] ) case class LogItem( id: String, projectId: String, functionId: String, requestId: String, status: String, duration: Long, timestamp: String, message: JsObject )
Example 64
Source File: WebhookDelivererWorker.scala From graphcool-framework with Apache License 2.0 | 5 votes |
package cool.graph.worker.workers import akka.http.scaladsl.model.ContentTypes import cool.graph.akkautil.http.{RequestFailedError, SimpleHttpClient} import cool.graph.cuid.Cuid import cool.graph.messagebus.{QueueConsumer, QueuePublisher} import cool.graph.worker.payloads.{LogItem, Webhook} import cool.graph.worker.utils.Utils import play.api.libs.json.{JsArray, JsObject, Json} import scala.concurrent.{ExecutionContext, Future} import scala.util.{Failure, Success, Try} case class WebhookDelivererWorker( httpClient: SimpleHttpClient, webhooksConsumer: QueueConsumer[Webhook], logsPublisher: QueuePublisher[LogItem] )(implicit ec: ExecutionContext) extends Worker { import scala.concurrent.ExecutionContext.Implicits.global // Current decision: Do not retry delivery, treat all return codes as work item "success" (== ack). val consumeFn = (wh: Webhook) => { val startTime = System.currentTimeMillis() def handleError(msg: String) = { val timing = System.currentTimeMillis() - startTime val timestamp = Utils.msqlDateTime3Timestamp() val logItem = LogItem(Cuid.createCuid(), wh.projectId, wh.functionId, wh.requestId, "FAILURE", timing, timestamp, formatFunctionErrorMessage(msg)) logsPublisher.publish(logItem) } httpClient .post(wh.url, wh.payload, ContentTypes.`application/json`, wh.headers.toList) .map { response => val timing = System.currentTimeMillis() - startTime val body = response.body val timestamp = Utils.msqlDateTime3Timestamp() val functionReturnValue = formatFunctionSuccessMessage(wh.payload, body.getOrElse("")) val logItem = LogItem(Cuid.createCuid(), wh.projectId, wh.functionId, wh.requestId, "SUCCESS", timing, timestamp, functionReturnValue) logsPublisher.publish(logItem) } .recover { case e: RequestFailedError => val message = s"Call to ${wh.url} failed with status ${e.response.status}, response body '${e.response.body.getOrElse("")}' and headers [${formatHeaders(e.response.headers)}]" handleError(message) case e: Throwable => val message = s"Call to ${wh.url} failed with: ${e.getMessage}" handleError(message) } } lazy val consumerRef = webhooksConsumer.withConsumer(consumeFn) def formatFunctionErrorMessage(errMsg: String): JsObject = Json.obj("error" -> errMsg) override def start: Future[_] = Future { consumerRef } override def stop: Future[_] = Future { consumerRef.stop } }
Example 65
Source File: Protocol.scala From graphcool-framework with Apache License 2.0 | 5 votes |
package cool.graph.localfaas import play.api.libs.json.{JsObject, Json} object Conversions { implicit val deploymentInputFormat = Json.format[DeploymentInput] implicit val statusResponseFormat = Json.format[StatusResponse] implicit val functionInvocationFormat = Json.format[FunctionInvocation] implicit val invocationResultFormat = Json.format[FunctionInvocationResult] } case class DeploymentInput(zipUrl: String, handlerPath: String, functionName: String) case class StatusResponse(success: Boolean, error: Option[String] = None) case class FunctionInvocation(functionName: String, input: String) // PARSE the stdout and then fill the fields! case class FunctionInvocationResult( success: Option[Boolean], error: Option[String], value: Option[JsObject], stdout: String, stderr: String ) { def printSummary(duration: Long, success: Boolean, projectId: String, name: String): Unit = { println( s"""Function invocation summary for project $projectId and function $name: |\tDuration: ${duration}ms |\tSuccess: $success |\tFunction return value: '${value.getOrElse("")}' |\tError: '${error.getOrElse("").stripLineEnd.trim}' |\tProcess stdout: '${stdout.stripLineEnd.trim}' |\tProcess stderr: '${stderr.stripLineEnd.trim}' """.stripMargin ) } }
Example 66
Source File: JsonOpsSpec.scala From reactive-nakadi with MIT License | 5 votes |
package org.zalando.react.nakadi.client.models import org.scalatest.{Matchers, WordSpec} import play.api.libs.json.{JsObject, JsString, Json} class JsonOpsSpec extends WordSpec with Matchers { import JsonOps._ val businessEvent = """ |{ | "metadata": { | "eid": "7b7c7100-0559-11e6-a837-0800200c9a66", | "occurred_at": "2016-04-01T13:42:16Z", | "event_type": "order-created" | }, | "id": "504c91de-17c9-46d8-81ee-55135084d696" |} """.stripMargin val dataChangeEvent = """ |{ | "data_type": "order", | "data_op": "C", | "data": {"some": "payload"}, | "metadata": { | "eid": "7b7c7100-0559-11e6-a837-0800200c9a66", | "occurred_at": "2016-04-01T13:42:16Z", | "event_type": "order-created" | } |} """.stripMargin "Event JsonOps" must { "correctly determine business event" in { val json = Json.parse(businessEvent) val validated = json.asOpt[Event] validated match { case Some(BusinessEvent(_, payload)) => payload shouldEqual JsObject(Seq("id" -> JsString("504c91de-17c9-46d8-81ee-55135084d696"))) case _ => fail("expected correctly parsed BusinessEvent") } } "correctly determine data change event" in { val json = Json.parse(dataChangeEvent) val validated = json.asOpt[Event] validated match { case Some(d :DataChangeEvent) => d.data shouldEqual JsObject(Seq("some" -> JsString("payload"))) case _ => fail("expected correctly parsed DataChangeEvent") } } "successfully serialize and deserialize the same events" in { val dataEvent = Json.parse(dataChangeEvent).as[DataChangeEvent] val dataJson = Json.toJson(dataEvent) dataJson shouldEqual Json.parse(dataChangeEvent) val businessEvt = Json.parse(businessEvent).as[BusinessEvent] val businessJson = Json.toJson(businessEvt) businessJson shouldEqual Json.parse(businessEvent) } } }
Example 67
Source File: DDPCAlgorithmJsonParser.scala From CM-Well with Apache License 2.0 | 5 votes |
package cmwell.dc.stream.algo import java.net.URL import cmwell.dc.LazyLogging import cmwell.dc.stream.MessagesTypesAndExceptions.AlgoData import play.api.libs.json.{JsArray, JsDefined, JsLookupResult, JsObject, JsString} object DDPCAlgorithmJsonParser extends LazyLogging { def extractAlgoInfo(f: JsLookupResult):AlgoData = { val algoClass = f \ "algoClass" match { case JsDefined(JsArray(seq)) if seq.length == 1 && seq.head.isInstanceOf[JsString] => seq.head.as[String] } val algoJarUrl = f \ "algoJarUrl" match { case JsDefined(JsArray(seq)) if seq.length == 1 && seq.head.isInstanceOf[JsString] => seq.head.as[String] } val params = f \ "algoParams" match { case JsDefined(JsArray(seq)) => seq.collect { case JsString(rule) => rule.split("->") match { case Array(source, target) => (source, target) } }.toMap case _ => Map.empty[String, String] } val url = new URL(algoJarUrl) if(url.getHost != "localhost" || !url.getPath.startsWith("/meta")) throw new IllegalArgumentException(s"Host is not localhost or url doesn't in /meta, url=$algoJarUrl") AlgoData(algoClass, algoJarUrl, params) } }
Example 68
Source File: FindByResourceTypeSpec.scala From ScalaWebTest with Apache License 2.0 | 5 votes |
package org.scalawebtest.integration.aem import org.scalawebtest.aem.PageProperties import org.scalawebtest.core.gauge.HtmlGauge.fits import org.scalawebtest.integration.extensions.aem.AemModuleScalaWebTestBaseSpec import play.api.libs.json.{JsObject, JsValue} class FindByResourceTypeSpec extends AemModuleScalaWebTestBaseSpec with PageProperties { path = "/aem/geometrixx-outdoors/en/company/our-story.html" case class ContentPage(pageProperties: JsValue) { def sidebarParsys: JsObject = (pageProperties \ "jcr:content" \ "sidebar").as[JsObject] def sidebarImageAltText: String = { val sidebarImages = sidebarParsys findByResourceType "foundation/components/image" (sidebarImages.head \ "alt").as[String] } } "Content page" should "have the correct alt text in the sidebar image" in { val contentPage = ContentPage(pageProperties) fits(<img alt={contentPage.sidebarImageAltText}></img>) } }
Example 69
Source File: PagePropertiesSpec.scala From ScalaWebTest with Apache License 2.0 | 5 votes |
package org.scalawebtest.integration.aem import org.scalawebtest.aem.PageProperties import org.scalawebtest.core.gauge.HtmlGauge.fits import org.scalawebtest.integration.extensions.aem.AemModuleScalaWebTestBaseSpec import play.api.libs.json.{JsObject, JsValue} class PagePropertiesSpec extends AemModuleScalaWebTestBaseSpec with PageProperties { path = "/aem/geometrixx-outdoors/en/company/our-story.html" case class ContentPage(pageProperties: JsValue) { def sidebarParsys = (pageProperties \ "jcr:content" \ "sidebar").as[JsObject] def jcrTitle =(pageProperties \ "jcr:content" \ "jcr:title").as[String] } "Content page" should "have the correct title (pageProperties example)" in { val contentPage = ContentPage(pageProperties) fits(<h1>{contentPage.jcrTitle}</h1>) } it should "have the correct title (jcrContent example" in { fits(<h1>{(pageProperties \ "jcr:content" \ "jcr:title").as[String]}</h1>) } it should "have the correct title (page model example" in { val individualPage = ContentPage(pageProperties) fits(<h1>{individualPage.jcrTitle}</h1>) } }
Example 70
Source File: JSONBuilder.scala From mimir with Apache License 2.0 | 5 votes |
package mimir.util; import mimir.algebra.{PrimitiveValue,StringPrimitive,TypePrimitive}; import play.api.libs.json.JsString import play.api.libs.json.JsArray import play.api.libs.json.JsObject import play.api.libs.json.JsValue import play.api.libs.json.JsNumber import play.api.libs.json.JsNull import play.api.libs.json.JsBoolean import mimir.algebra.NullPrimitive import mimir.algebra.RowIdPrimitive import mimir.algebra.IntPrimitive import mimir.algebra.FloatPrimitive import mimir.algebra.BoolPrimitive import mimir.algebra.TimestampPrimitive import mimir.algebra.DatePrimitive object JSONBuilder { def list(content: Seq[Any]): String = listJs(content).toString() private def listJs(content: Seq[Any]): JsArray = JsArray(content.map { el => value(el) }) def dict(content: Map[String,Any]): String = dictJs(content).toString() def dict(content: Seq[(String,Any)]): String = JsObject(content.map( (x) => x._1.toLowerCase() -> value(x._2))).toString() private def dictJs(content: Map[String,Any]): JsObject = JsObject(content.map { el => el._1 -> value(el._2) } ) def string(content: String): String = { value(content).toString() } def int(content: Int): String = { value(content).toString() } def double(content: Double): String = { value(content).toString() } def boolean(content: Boolean): String = { value(content).toString() } def prim(content: PrimitiveValue) = { primJs(content).toString() } private def primJs(content: PrimitiveValue) = { content match { case StringPrimitive(s) => JsString(s) case TypePrimitive(t) => JsString(t.toString()) case NullPrimitive() => JsNull case RowIdPrimitive(s) => JsString(s) case IntPrimitive(i) => JsNumber(i) case FloatPrimitive(f) => JsNumber(f) case BoolPrimitive(b) => JsBoolean(b) case TimestampPrimitive(_,_,_,_,_,_,_) => JsString(content.asString) case DatePrimitive(_,_,_) => JsString(content.asString) case _ => JsString(content.toString()) } } private def value(content: Any): JsValue = { content match { case s:String => { try { play.api.libs.json.Json.parse(s) } catch { case t: Throwable => JsString(s) } } case null => JsNull case i:Int => JsNumber(i) case f:Float => JsNumber(f) case l:Long => JsNumber(l) case d:Double => JsNumber(d) case b:Boolean => JsBoolean(b) case seq:Seq[Any] => listJs(seq) case map:Map[_,_] => dictJs(map.asInstanceOf[Map[String,Any]]) case jsval:JsValue => jsval case prim:PrimitiveValue => primJs(prim) case _ => JsString(content.toString()) } } }
Example 71
Source File: SimpleJobsIT.scala From metronome with Apache License 2.0 | 5 votes |
package dcos.metronome.integrationtest import play.api.libs.json.{JsArray, JsObject} import scala.concurrent.duration._ class SimpleJobsIT extends MetronomeITBase { override lazy implicit val patienceConfig = PatienceConfig(180.seconds, interval = 1.second) "A job run should complete" in withFixture() { f => When("A job description is posted") val appId = "my-job" val jobDef = s""" |{ | "id": "${appId}", | "description": "A job that sleeps", | "run": { | "cmd": "sleep 60", | "cpus": 0.01, | "mem": 32, | "disk": 0 | } |} """.stripMargin val resp = f.metronome.createJob(jobDef) Then("The response should be OK") resp shouldBe Created When("A job run is started") val startRunResp = f.metronome.startRun(appId) Then("The response should be OK") startRunResp shouldBe Created eventually(timeout(30.seconds)) { val runsJson = f.metronome.getRuns(appId) runsJson shouldBe OK val runs = runsJson.entityJson.as[JsArray] runs.value should have size 1 val run = runs.value.head.as[JsObject] val status = run.value("status").as[String] status shouldBe "ACTIVE" } } }
Example 72
Source File: PersistenceIT.scala From metronome with Apache License 2.0 | 5 votes |
package dcos.metronome.integrationtest import org.scalatest.time.{Minutes, Span} import play.api.libs.json.{JsArray, JsObject} import scala.concurrent.Await import scala.concurrent.duration._ class PersistenceIT extends MetronomeITBase { override val timeLimit = Span(3, Minutes) override lazy implicit val patienceConfig = PatienceConfig(180.seconds, interval = 1.second) "A job and run should be available after a restart of metronome" in withFixture() { f => When("A job description is posted") val jobId = "persistence-my-job" val jobDef = s""" |{ | "id": "$jobId", | "description": "A job that sleeps", | "run": { | "cmd": "sleep 120", | "cpus": 0.02, | "mem": 64, | "disk": 0 | } |} """.stripMargin val resp = f.metronome.createJob(jobDef) Then("The response should be OK") resp shouldBe Created When("A job run is started") val startRunResp = f.metronome.startRun(jobId) Then("The response should be OK") startRunResp shouldBe Created eventually(timeout(30.seconds)) { val runsJson = f.metronome.getRuns(jobId) runsJson shouldBe OK val runs = runsJson.entityJson.as[JsArray] runs.value should have size 1 val run = runs.value.head.as[JsObject] val status = run.value("status").as[String] status shouldBe "ACTIVE" } When("Metronome is stopped and restarted") Await.result(f.metronomeFramework.stop(), 30.seconds) Await.result(f.metronomeFramework.start(), 60.seconds) Then("The Job and the Run should be available") val jobResp = f.metronome.getJob(jobId) jobResp shouldBe OK (jobResp.entityJson \ "id").as[String] shouldBe jobId val runResp = f.metronome.getRuns(jobId) val runs = runResp.entityJson.as[JsArray] runs.value.length shouldBe 1 } }
Example 73
Source File: LandingController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.landing import com.mohiva.play.silhouette.api.Silhouette import controllers.{ HasConfig, HasUserService, HasVisitLogging, HasPrettyPrintJSON, Security } import java.io.FileInputStream import javax.inject.{ Inject, Singleton } import java.net.URI import org.webjars.play.WebJarsUtil import play.api.Configuration import play.api.i18n.I18nSupport import play.api.libs.json.{Json, JsObject} import play.api.mvc.{Action, AbstractController, ControllerComponents} import scala.concurrent.ExecutionContext import services.annotation.AnnotationService import services.contribution.ContributionService import services.document.DocumentService import services.user.UserService import services.visit.VisitService @Singleton class LandingController @Inject() ( val components: ControllerComponents, val config: Configuration, val annotations: AnnotationService, val contributions: ContributionService, val documents: DocumentService, val users: UserService, val silhouette: Silhouette[Security.Env], implicit val ctx: ExecutionContext, implicit val visits: VisitService, implicit val webjars: WebJarsUtil ) extends AbstractController(components) with HasConfig with HasUserService with HasVisitLogging with HasPrettyPrintJSON with I18nSupport { def index = silhouette.UserAwareAction { implicit request => // Temporary hack only request.queryString.get("lang").flatMap(_.headOption) match { case Some(lang) => Redirect(routes.LandingController.index).withLang(play.api.i18n.Lang(lang)) case None => request.identity match { case Some(user) => Redirect(controllers.my.routes.WorkspaceController.workspace(user.username)) case None => logPageView() Ok(views.html.landing.index()) } } } def getStats() = silhouette.UnsecuredAction.async { implicit request => val fAnnotations = annotations.countTotal() val fEdits = contributions.countLast24hrs() val fUsers = users.countUsers() val f = for { annotations <- fAnnotations edits <- fEdits users <- fUsers } yield (annotations, edits, users) f.map { case (annotations, edits, users) => jsonOk(Json.obj( "annotations" -> annotations, "edits" -> edits, "users" -> users )) } } def sitemap() = Action.async { implicit request => documents.listOwnersWithPublicDocuments().map { users => val baseURL = routes.LandingController.index().absoluteURL() val sitemap = users.map(user => s"${baseURL}${user}").mkString("\n") Ok(sitemap).as("text/plain") } } def robots() = Action { implicit request => val sitemapURL = routes.LandingController.sitemap().absoluteURL() Ok(s"SITEMAP: ${sitemapURL}").as("text/plain") } def swaggerConfig() = Action { implicit request => val json = Json.parse(new FileInputStream("conf/swagger.json")) val baseURL = new URI(routes.LandingController.index.absoluteURL) val host = if (baseURL.getPort == -1) baseURL.getHost else s"${baseURL.getHost}:${baseURL.getPort}" jsonOk(json.as[JsObject] ++ Json.obj("host" -> host)) } }
Example 74
Source File: AuthoritiesAPIController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.api.entity import controllers.{BaseOptAuthController, HasPrettyPrintJSON} import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.libs.json.{Json, JsObject} import play.api.mvc.ControllerComponents import scala.concurrent.ExecutionContext import services.document.DocumentService import services.entity.{AuthorityFileService, EntityType} import services.entity.builtin.EntityService import services.user.UserService @Singleton class AuthoritiesAPIController @Inject() ( val authorities: AuthorityFileService, val components: ControllerComponents, val config: Configuration, val documents: DocumentService, val entities: EntityService, val users: UserService, implicit val ctx: ExecutionContext ) extends BaseOptAuthController(components, config, documents, users) with HasPrettyPrintJSON { def listGazetteers = Action.async { implicit request => val fMetadata = authorities.listAll(Some(EntityType.PLACE)) val fRecordCounts = entities.countByAuthority(Some(EntityType.PLACE)) val f = for { metadata <- fMetadata counts <- fRecordCounts } yield (metadata, counts) f.map { case (listedGazetteers, counts) => import AuthorityFileService._ // Import implicit JSON serialization // In order to see possible inconsistencies between DB and index, // we separately handle: i) gazetteers described in the DB, ii) gazetteer // IDs recorded in the index, but without a metadata record in the DB. // Normally, the list below should be empty. val unlistedGazetteers = counts.filterNot { case (id, count) => listedGazetteers.map(_.getId).contains(id) } val json = listedGazetteers.map { m => val count = counts.find(_._1 == m.getId).map(_._2).getOrElse(0l) Json.toJson(m).as[JsObject] ++ Json.obj("count" -> count) } ++ unlistedGazetteers.map { case (id, count) => Json.obj( "identifier" -> id, "authority_type" -> "PLACE", "shortname" -> id, "count" -> count, "conflicted" -> true) } jsonOk(Json.toJson(json)) } } }
Example 75
Source File: DataFrameConverter.scala From incubator-toree with Apache License 2.0 | 5 votes |
package org.apache.toree.utils import org.apache.spark.sql.{Dataset, Row} import org.apache.toree.plugins.Plugin import play.api.libs.json.{JsObject, Json} import scala.util.Try import org.apache.toree.plugins.annotations.Init import DataFrameConverter._ class DataFrameConverter extends Plugin with LogLike { @Init def init() = { register(this) } def convert(df: Dataset[Row], outputType: String, limit: Int = 10): Try[String] = { Try( outputType.toLowerCase() match { case "html" => convertToHtml(df = df, limit = limit) case "json" => convertToJson(df = df, limit = limit) case "csv" => convertToCsv(df = df, limit = limit) } ) } private def convertToHtml(df: Dataset[Row], limit: Int = 10): String = { val columnFields = df.schema.fieldNames.map(columnName => { s"<th>${columnName}</th>" }).reduce(_ + _) val columns = s"<tr>${columnFields}</tr>" val rows = df.rdd.map(row => { val fieldValues = row.toSeq.map(field => { s"<td>${fieldToString(field)}</td>" }).reduce(_ + _) s"<tr>${fieldValues}</tr>" }).take(limit).reduce(_ + _) s"<table>${columns}${rows}</table>" } private def convertToJson(df: Dataset[Row], limit: Int = 10): String = { val schema = Json.toJson(df.schema.fieldNames) val transformed = df.rdd.map(row => row.toSeq.map(fieldToString).toArray) val rows = transformed.take(limit) JsObject(Seq( "columns" -> schema, "rows" -> Json.toJson(rows) )).toString() } private def convertToCsv(df: Dataset[Row], limit: Int = 10): String = { val headers = df.schema.fieldNames.reduce(_ + "," + _) val rows = df.rdd.map(row => { row.toSeq.map(fieldToString).reduce(_ + "," + _) }).take(limit).reduce(_ + "\n" + _) s"${headers}\n${rows}" } } object DataFrameConverter { def fieldToString(any: Any): String = any match { case null => "null" case seq: Seq[_] => seq.mkString("[", ", ", "]") case _ => any.toString } }
Example 76
Source File: Domain.scala From play-swagger with Apache License 2.0 | 5 votes |
package com.iheart.playSwagger import play.api.libs.json.{ JsObject, JsPath, JsValue, Reads } import play.twirl.api.TemplateMagic.Default object Domain { type Path = String type Method = String final case class Definition( name: String, properties: Seq[SwaggerParameter], description: Option[String] = None) sealed trait SwaggerParameter { def name: String def required: Boolean def default: Option[JsValue] def update(required: Boolean, default: Option[JsValue]): SwaggerParameter } final case class GenSwaggerParameter( name: String, referenceType: Option[String] = None, `type`: Option[String] = None, format: Option[String] = None, required: Boolean = true, default: Option[JsValue] = None, example: Option[JsValue] = None, items: Option[SwaggerParameter] = None, enum: Option[Seq[String]] = None) extends SwaggerParameter { def update(_required: Boolean, _default: Option[JsValue]) = copy(required = _required, default = _default) } final case class CustomSwaggerParameter( name: String, specAsParameter: List[JsObject], specAsProperty: Option[JsObject], required: Boolean = true, default: Option[JsValue] = None) extends SwaggerParameter { def update(_required: Boolean, _default: Option[JsValue]) = copy(required = _required, default = _default) } type CustomMappings = List[CustomTypeMapping] case class CustomTypeMapping( `type`: String, specAsParameter: List[JsObject] = Nil, specAsProperty: Option[JsObject] = None, required: Boolean = true) object CustomTypeMapping { import play.api.libs.functional.syntax._ implicit val csmFormat: Reads[CustomTypeMapping] = ( (JsPath \ 'type).read[String] and (JsPath \ 'specAsParameter).read[List[JsObject]] and (JsPath \ 'specAsProperty).readNullable[JsObject] and ((JsPath \ 'required).read[Boolean] orElse Reads.pure(true)))(CustomTypeMapping.apply _) } }
Example 77
Source File: OutputTransformer.scala From play-swagger with Apache License 2.0 | 5 votes |
package com.iheart.playSwagger import java.util.regex.Pattern import com.iheart.playSwagger.OutputTransformer.SimpleOutputTransformer import play.api.libs.json.{ JsArray, JsString, JsValue, JsObject } import scala.util.matching.Regex import scala.util.{ Success, Failure, Try } def >=>(b: JsObject ⇒ Try[JsObject]): OutputTransformer = SimpleOutputTransformer { value: JsObject ⇒ this.apply(value).flatMap(b) } } object OutputTransformer { final case class SimpleOutputTransformer(run: (JsObject ⇒ Try[JsObject])) extends OutputTransformer { override def apply(value: JsObject): Try[JsObject] = run(value) } def traverseTransformer(vals: JsArray)(transformer: JsValue ⇒ Try[JsValue]): Try[JsArray] = { val tryElements = vals.value.map { case value: JsObject ⇒ traverseTransformer(value)(transformer) case value: JsArray ⇒ traverseTransformer(value)(transformer) case value: JsValue ⇒ transformer(value) } val failures: Seq[Failure[JsValue]] = tryElements.filter(_.isInstanceOf[Failure[_]]).asInstanceOf[Seq[Failure[JsValue]]] if (failures.nonEmpty) { Failure(failures.head.exception) } else { Success(JsArray(tryElements.asInstanceOf[Seq[Success[JsValue]]].map(_.value))) } } def traverseTransformer(obj: JsObject)(transformer: JsValue ⇒ Try[JsValue]): Try[JsObject] = { val tryFields = obj.fields.map { case (key, value: JsObject) ⇒ (key, traverseTransformer(value)(transformer)) case (key, values: JsArray) ⇒ (key, traverseTransformer(values)(transformer)) case (key, value: JsValue) ⇒ (key, transformer(value)) } val failures: Seq[(String, Failure[JsValue])] = tryFields .filter(_._2.isInstanceOf[Failure[_]]) .asInstanceOf[Seq[(String, Failure[JsValue])]] if (failures.nonEmpty) { Failure(failures.head._2.exception) } else { Success(JsObject(tryFields.asInstanceOf[Seq[(String, Success[JsValue])]].map { case (key, Success(result)) ⇒ (key, result) })) } } } class PlaceholderVariablesTransformer(map: String ⇒ Option[String], pattern: Regex = "^\\$\\{(.*)\\}$".r) extends OutputTransformer { def apply(value: JsObject) = OutputTransformer.traverseTransformer(value) { case JsString(pattern(key)) ⇒ map(key) match { case Some(result) ⇒ Success(JsString(result)) case None ⇒ Failure(new IllegalStateException(s"Unable to find variable $key")) } case e: JsValue ⇒ Success(e) } } final case class MapVariablesTransformer(map: Map[String, String]) extends PlaceholderVariablesTransformer(map.get) class EnvironmentVariablesTransformer extends PlaceholderVariablesTransformer((key: String) ⇒ Option(System.getenv(key)))
Example 78
Source File: SetAssetScriptTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.account.AddressScheme import com.wavesplatform.serialization.{ByteBufferOps, Deser} import com.wavesplatform.transaction.TxVersion import com.wavesplatform.transaction.assets.SetAssetScriptTransaction import play.api.libs.json.{JsObject, Json} import scala.util.Try object SetAssetScriptTxSerializer { def toJson(tx: SetAssetScriptTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "assetId" -> asset.id.toString, "script" -> script.map(_.bytes().base64) ) ++ (if (tx.version == TxVersion.V1) Json.obj("chainId" -> tx.chainId) else Json.obj()) } def bodyBytes(tx: SetAssetScriptTransaction): Array[Byte] = { import tx._ version match { case TxVersion.V1 => Bytes.concat( Array(builder.typeId, version, chainId), sender.arr, asset.id.arr, Longs.toByteArray(fee), Longs.toByteArray(timestamp), Deser.serializeOptionOfArrayWithLength(script)(s => s.bytes().arr) ) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: SetAssetScriptTransaction): Array[Byte] = if (tx.isProtobufVersion) PBTransactionSerializer.bytes(tx) else Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) def parseBytes(bytes: Array[Byte]): Try[SetAssetScriptTransaction] = Try { require(bytes.length > 2, "buffer underflow while parsing transaction") val buf = ByteBuffer.wrap(bytes) require(buf.getByte == 0 && buf.getByte == SetAssetScriptTransaction.typeId && buf.getByte == TxVersion.V1, "transaction type mismatch") require(buf.getByte == AddressScheme.current.chainId, "transaction chainId mismatch") val sender = buf.getPublicKey val asset = buf.getIssuedAsset val fee = buf.getLong val timestamp = buf.getLong val script = buf.getScript val proofs = buf.getProofs SetAssetScriptTransaction(TxVersion.V1, sender, asset, script, fee, timestamp, proofs, AddressScheme.current.chainId) } }
Example 79
Source File: DataTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import java.nio.charset.StandardCharsets.UTF_8 import com.google.common.primitives.{Bytes, Longs, Shorts} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.account.AddressScheme import com.wavesplatform.serialization._ import com.wavesplatform.state.DataEntry.Type import com.wavesplatform.state.{BinaryDataEntry, BooleanDataEntry, DataEntry, IntegerDataEntry, StringDataEntry} import com.wavesplatform.transaction.{DataTransaction, TxVersion} import com.wavesplatform.utils.StringBytes import play.api.libs.json.{JsObject, Json} import scala.util.Try object DataTxSerializer { def toJson(tx: DataTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj("data" -> Json.toJson(data) ) } def bodyBytes(tx: DataTransaction): Array[Byte] = { import tx._ version match { case TxVersion.V1 => Bytes.concat( Array(builder.typeId, version), sender.arr, Shorts.toByteArray(data.size.toShort), Bytes.concat(data.map(serializeEntry): _*), Longs.toByteArray(timestamp), Longs.toByteArray(fee) ) case _ => PBTransactionSerializer.bodyBytes(tx) } } private def serializeEntry(e: DataEntry[_]): Array[Byte] = { val keyBytes = e.key.utf8Bytes val valueBytes = e match { case IntegerDataEntry(_, value) => Bytes.concat(Array(Type.Integer.id.toByte), Longs.toByteArray(value)) case BooleanDataEntry(_, value) => Array(Type.Boolean.id, if (value) 1 else 0).map(_.toByte) case BinaryDataEntry(_, value) => Bytes.concat(Array(Type.Binary.id.toByte), Deser.serializeArrayWithLength(value.arr)) case StringDataEntry(_, value) => Bytes.concat(Array(Type.String.id.toByte), Deser.serializeArrayWithLength(value.utf8Bytes)) case other => throw new IllegalArgumentException(s"Unsupported data entry: $other") } Bytes.concat(Shorts.toByteArray(keyBytes.length.toShort), keyBytes, valueBytes) } def toBytes(tx: DataTransaction): Array[Byte] = if (tx.isProtobufVersion) PBTransactionSerializer.bytes(tx) else Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) def parseBytes(bytes: Array[Byte]): Try[DataTransaction] = Try { def parseDataEntries(buf: ByteBuffer): Seq[DataEntry[_]] = { val entryCount = buf.getShort require(entryCount >= 0 && buf.remaining() > entryCount, s"Broken array size ($entryCount entries while ${buf.remaining()} bytes available)") Vector.fill(entryCount)(parseEntry(buf)) } val buf = ByteBuffer.wrap(bytes) require(buf.getByte == 0 && buf.getByte == DataTransaction.typeId && buf.getByte == 1, "transaction type mismatch") val sender = buf.getPublicKey val data = parseDataEntries(buf) val timestamp = buf.getLong // Timestamp before fee val fee = buf.getLong DataTransaction(TxVersion.V1, sender, data, fee, timestamp, buf.getProofs, AddressScheme.current.chainId) } private def parseEntry(buf: ByteBuffer): DataEntry[_] = { val key = new String(Deser.parseArrayWithLength(buf), UTF_8) buf.get match { case t if t == Type.Integer.id => IntegerDataEntry(key, buf.getLong) case t if t == Type.Boolean.id => BooleanDataEntry(key, buf.get != 0) case t if t == Type.Binary.id => BinaryDataEntry(key, ByteStr(Deser.parseArrayWithLength(buf))) case t if t == Type.String.id => StringDataEntry(key, new String(Deser.parseArrayWithLength(buf), UTF_8)) case other => throw new IllegalArgumentException(s"Unknown type $other") } } }
Example 80
Source File: ReissueTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.account.AddressScheme import com.wavesplatform.serialization._ import com.wavesplatform.transaction.assets.ReissueTransaction import com.wavesplatform.transaction.{Proofs, TxVersion} import play.api.libs.json.{JsObject, Json} import scala.util.Try object ReissueTxSerializer { def toJson(tx: ReissueTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "assetId" -> asset.id.toString, "quantity" -> quantity, "reissuable" -> reissuable ) ++ (if (tx.version == TxVersion.V2) Json.obj("chainId" -> chainId) else Json.obj()) } def bodyBytes(tx: ReissueTransaction): Array[Byte] = { import tx._ lazy val baseBytes = Bytes.concat( sender.arr, asset.id.arr, Longs.toByteArray(quantity), if (reissuable) Array(1: Byte) else Array(0: Byte), Longs.toByteArray(fee), Longs.toByteArray(timestamp) ) version match { case TxVersion.V1 => Bytes.concat(Array(typeId), baseBytes) case TxVersion.V2 => Bytes.concat( Array(builder.typeId, version, chainId), baseBytes ) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: ReissueTransaction): Array[Byte] = { tx.version match { case TxVersion.V1 => Bytes.concat(Array(tx.typeId), tx.proofs.toSignature.arr, this.bodyBytes(tx)) // Signature before body, typeId appears twice case TxVersion.V2 => Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) case _ => PBTransactionSerializer.bytes(tx) } } def parseBytes(bytes: Array[Byte]): Try[ReissueTransaction] = Try { def parseCommonPart(version: TxVersion, buf: ByteBuffer): ReissueTransaction = { val sender = buf.getPublicKey val asset = buf.getIssuedAsset val quantity = buf.getLong val reissuable = buf.getBoolean val fee = buf.getLong val timestamp = buf.getLong ReissueTransaction(version, sender, asset, quantity, reissuable, fee, timestamp, Nil, AddressScheme.current.chainId) } require(bytes.length > 2, "buffer underflow while parsing transaction") if (bytes(0) == 0) { require(bytes(1) == ReissueTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 4, bytes.length - 4) parseCommonPart(TxVersion.V2, buf).copy(proofs = buf.getProofs) } else { require(bytes(0) == ReissueTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 1, bytes.length - 1) val signature = buf.getSignature require(buf.getByte == ReissueTransaction.typeId, "transaction type mismatch") parseCommonPart(TxVersion.V1, buf).copy(proofs = Proofs(signature)) } } }
Example 81
Source File: LeaseTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.serialization.ByteBufferOps import com.wavesplatform.transaction.Asset.Waves import com.wavesplatform.transaction.lease.LeaseTransaction import com.wavesplatform.transaction.{Proofs, TxVersion} import play.api.libs.json.{JsObject, Json} import scala.util.Try object LeaseTxSerializer { def toJson(tx: LeaseTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "amount" -> amount, "recipient" -> recipient.stringRepr ) } def bodyBytes(tx: LeaseTransaction): Array[Byte] = { import tx._ val baseBytes = Bytes.concat(sender.arr, recipient.bytes, Longs.toByteArray(amount), Longs.toByteArray(fee), Longs.toByteArray(timestamp)) version match { case TxVersion.V1 => Bytes.concat(Array(typeId), baseBytes) case TxVersion.V2 => Bytes.concat(Array(typeId, version), Waves.byteRepr, baseBytes) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: LeaseTransaction): Array[Byte] = tx.version match { case TxVersion.V1 => Bytes.concat(this.bodyBytes(tx), tx.proofs.toSignature.arr) case TxVersion.V2 => Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) case _ => PBTransactionSerializer.bytes(tx) } def parseBytes(bytes: Array[Byte]): Try[LeaseTransaction] = Try { def parseCommonPart(version: TxVersion, buf: ByteBuffer): LeaseTransaction = { val sender = buf.getPublicKey val recipient = buf.getAddressOrAlias val amount = buf.getLong val fee = buf.getLong val timestamp = buf.getLong LeaseTransaction(version, sender, recipient, amount, fee, timestamp, Nil, recipient.chainId) } require(bytes.length > 2, "buffer underflow while parsing transaction") if (bytes(0) == 0) { require(bytes(1) == LeaseTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 3, bytes.length - 3) require(buf.getAsset == Waves, "Leasing assets is not supported yet") parseCommonPart(TxVersion.V2, buf).copy(proofs = buf.getProofs) } else { require(bytes(0) == LeaseTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 1, bytes.length - 1) parseCommonPart(TxVersion.V1, buf).copy(proofs = Proofs(buf.getSignature)) } } }
Example 82
Source File: InvokeScriptTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.account.AddressScheme import com.wavesplatform.common.state.ByteStr import com.wavesplatform.common.utils._ import com.wavesplatform.lang.v1.Serde import com.wavesplatform.lang.v1.compiler.Terms import com.wavesplatform.lang.v1.compiler.Terms.{EXPR, FUNCTION_CALL} import com.wavesplatform.serialization._ import com.wavesplatform.transaction.Asset.{IssuedAsset, Waves} import com.wavesplatform.transaction.smart.InvokeScriptTransaction import com.wavesplatform.transaction.smart.InvokeScriptTransaction.Payment import com.wavesplatform.transaction.{Asset, TxVersion} import play.api.libs.json.{JsArray, JsObject, JsString, Json} import scala.util.Try object InvokeScriptTxSerializer { def functionCallToJson(fc: Terms.FUNCTION_CALL): JsObject = { Json.obj( "function" -> JsString(fc.function.asInstanceOf[com.wavesplatform.lang.v1.FunctionHeader.User].internalName), "args" -> JsArray( fc.args.map { case Terms.ARR(elements) => Json.obj("type" -> "list", "value" -> elements.map(mapSingleArg)) case other => mapSingleArg(other) } ) ) } private def mapSingleArg(arg: EXPR) = arg match { case Terms.CONST_LONG(num) => Json.obj("type" -> "integer", "value" -> num) case Terms.CONST_BOOLEAN(bool) => Json.obj("type" -> "boolean", "value" -> bool) case Terms.CONST_BYTESTR(bytes) => Json.obj("type" -> "binary", "value" -> bytes.base64) case Terms.CONST_STRING(str) => Json.obj("type" -> "string", "value" -> str) case arg => throw new NotImplementedError(s"Not supported: $arg") } def toJson(tx: InvokeScriptTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "dApp" -> dAppAddressOrAlias.stringRepr, "payment" -> payments ) ++ (funcCallOpt match { case Some(fc) => Json.obj("call" -> this.functionCallToJson(fc)) case None => JsObject.empty }) } def bodyBytes(tx: InvokeScriptTransaction): Array[Byte] = { import tx._ version match { case TxVersion.V1 => Bytes.concat( Array(builder.typeId, version, chainId), sender.arr, dAppAddressOrAlias.bytes, Deser.serializeOption(funcCallOpt)(Serde.serialize(_)), Deser.serializeArrays(payments.map(pmt => Longs.toByteArray(pmt.amount) ++ pmt.assetId.byteRepr)), Longs.toByteArray(fee), feeAssetId.byteRepr, Longs.toByteArray(timestamp) ) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: InvokeScriptTransaction): Array[Byte] = if (tx.isProtobufVersion) PBTransactionSerializer.bytes(tx) else Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) def parseBytes(bytes: Array[Byte]): Try[InvokeScriptTransaction] = Try { def parsePayment(arr: Array[Byte]): Payment = { val amt = Longs.fromByteArray(arr.take(8)) val (maybeAssetId, _) = Deser.parseOption(arr, 8, 32)(ByteStr.apply) val asset = maybeAssetId.fold[Asset](Waves)(IssuedAsset) Payment(amt, asset) } val buf = ByteBuffer.wrap(bytes) require(buf.getByte == 0 && buf.getByte == InvokeScriptTransaction.typeId && buf.getByte == 1, "transaction type mismatch") val chainId = buf.getByte require(chainId == AddressScheme.current.chainId, "chainId mismatch") val sender = buf.getPublicKey val dApp = buf.getAddressOrAlias val functionCall = Deser.parseOption(buf)(Serde.deserialize(_).explicitGet().asInstanceOf[FUNCTION_CALL]) val payments = Deser.parseArrays(buf).map(parsePayment) val fee = buf.getLong val feeAssetId = buf.getAsset val timestamp = buf.getLong InvokeScriptTransaction(TxVersion.V1, sender, dApp, functionCall, payments, fee, feeAssetId, timestamp, buf.getProofs, chainId) } }
Example 83
Source File: SponsorFeeTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.account.AddressScheme import com.wavesplatform.serialization.ByteBufferOps import com.wavesplatform.transaction.TxVersion import com.wavesplatform.transaction.assets.SponsorFeeTransaction import play.api.libs.json.{JsObject, Json} import scala.util.Try object SponsorFeeTxSerializer { def toJson(tx: SponsorFeeTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "assetId" -> asset.id.toString, "minSponsoredAssetFee" -> minSponsoredAssetFee ) } def bodyBytes(tx: SponsorFeeTransaction): Array[Byte] = { import tx._ version match { case TxVersion.V1 => Bytes.concat( Array(builder.typeId, version), sender.arr, asset.id.arr, Longs.toByteArray(minSponsoredAssetFee.getOrElse(0)), Longs.toByteArray(fee), Longs.toByteArray(timestamp) ) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: SponsorFeeTransaction): Array[Byte] = { if (tx.isProtobufVersion) PBTransactionSerializer.bytes(tx) else Bytes.concat(Array(0: Byte, tx.typeId, tx.version), this.bodyBytes(tx), tx.proofs.bytes()) // [typeId, version] appears twice } def parseBytes(bytes: Array[Byte]): Try[SponsorFeeTransaction] = Try { require(bytes.length > 2, "buffer underflow while parsing transaction") val buf = ByteBuffer.wrap(bytes) require(buf.getByte == 0 && buf.getByte == SponsorFeeTransaction.typeId && buf.getByte == TxVersion.V1, "transaction type mismatch") require(buf.getByte == SponsorFeeTransaction.typeId && buf.getByte == TxVersion.V1, "transaction type mismatch") val sender = buf.getPublicKey val asset = buf.getIssuedAsset val minSponsoredAssetFee = buf.getLong val fee = buf.getLong val timestamp = buf.getLong val proofs = buf.getProofs SponsorFeeTransaction(TxVersion.V1, sender, asset, Some(minSponsoredAssetFee).filterNot(_ == 0), fee, timestamp, proofs, AddressScheme.current.chainId) } }
Example 84
Source File: BaseTxJson.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import com.wavesplatform.transaction.{LegacyPBSwitch, ProvenTransaction, SigProofsSwitch, VersionedTransaction} import play.api.libs.json.{JsArray, JsObject, JsString, Json} object BaseTxJson { def toJson(tx: ProvenTransaction): JsObject = { import tx._ Json.obj( "type" -> typeId, "id" -> id().toString, "sender" -> sender.toAddress, "senderPublicKey" -> sender, "fee" -> assetFee._2, "feeAssetId" -> assetFee._1.maybeBase58Repr, "timestamp" -> timestamp, "proofs" -> JsArray(proofs.proofs.map(p => JsString(p.toString))) ) ++ (tx match { // Compatibility case s: SigProofsSwitch if s.usesLegacySignature => Json.obj("signature" -> tx.signature.toString) case _ => Json.obj() }) ++ (tx match { case v: VersionedTransaction => Json.obj("version" -> v.version) case _ => Json.obj() }) ++ (tx match { case pbs: LegacyPBSwitch if pbs.isProtobufVersion => Json.obj("chainId" -> tx.chainId) case _ => Json.obj() }) } }
Example 85
Source File: SetScriptTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.account.AddressScheme import com.wavesplatform.serialization.{ByteBufferOps, Deser} import com.wavesplatform.transaction.TxVersion import com.wavesplatform.transaction.smart.SetScriptTransaction import play.api.libs.json.{JsObject, Json} import scala.util.Try object SetScriptTxSerializer { def toJson(tx: SetScriptTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "script" -> script.map(_.bytes().base64) ) ++ (if (tx.version == TxVersion.V1) Json.obj("chainId" -> chainId) else Json.obj()) } def bodyBytes(tx: SetScriptTransaction): Array[Byte] = { import tx._ version match { case TxVersion.V1 => Bytes.concat( Array(builder.typeId, version, chainId), sender.arr, Deser.serializeOptionOfArrayWithLength(script)(s => s.bytes().arr), Longs.toByteArray(fee), Longs.toByteArray(timestamp) ) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: SetScriptTransaction): Array[Byte] = { if (tx.isProtobufVersion) PBTransactionSerializer.bytes(tx) else Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) } def parseBytes(bytes: Array[Byte]): Try[SetScriptTransaction] = Try { require(bytes.length > 2, "buffer underflow while parsing transaction") val buf = ByteBuffer.wrap(bytes) require(buf.getByte == 0 && buf.getByte == SetScriptTransaction.typeId && buf.getByte == TxVersion.V1, "transaction type mismatch") require(buf.getByte == AddressScheme.current.chainId, "transaction chainId mismatch") val sender = buf.getPublicKey val script = buf.getScript val fee = buf.getLong val timestamp = buf.getLong val proofs = buf.getProofs SetScriptTransaction(TxVersion.V1, sender, script, fee, timestamp, proofs, AddressScheme.current.chainId) } }
Example 86
Source File: LeaseCancelTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.account.AddressScheme import com.wavesplatform.common.state.ByteStr import com.wavesplatform.crypto import com.wavesplatform.serialization.ByteBufferOps import com.wavesplatform.transaction.lease.LeaseCancelTransaction import com.wavesplatform.transaction.{Proofs, TxVersion} import play.api.libs.json.{JsObject, Json} import scala.util.Try object LeaseCancelTxSerializer { def toJson(tx: LeaseCancelTransaction): JsObject = BaseTxJson.toJson(tx) ++ Json.obj("leaseId" -> tx.leaseId.toString) ++ (if (tx.version == TxVersion.V2) Json.obj("chainId" -> tx.chainId) else Json.obj()) def bodyBytes(tx: LeaseCancelTransaction): Array[Byte] = { import tx._ val baseBytes = Bytes.concat(sender.arr, Longs.toByteArray(fee), Longs.toByteArray(timestamp), leaseId.arr) version match { case TxVersion.V1 => Bytes.concat(Array(typeId), baseBytes) case TxVersion.V2 => Bytes.concat(Array(typeId, version, chainId), baseBytes) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: LeaseCancelTransaction): Array[Byte] = { tx.version match { case TxVersion.V1 => Bytes.concat(this.bodyBytes(tx), tx.proofs.toSignature.arr) case TxVersion.V2 => Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) case _ => PBTransactionSerializer.bytes(tx) } } def parseBytes(bytes: Array[Byte]): Try[LeaseCancelTransaction] = Try { def parseCommonPart(version: TxVersion, buf: ByteBuffer): LeaseCancelTransaction = { val sender = buf.getPublicKey val fee = buf.getLong val timestamp = buf.getLong val leaseId = buf.getByteArray(crypto.DigestLength) LeaseCancelTransaction(version, sender, ByteStr(leaseId), fee, timestamp, Nil, AddressScheme.current.chainId) } require(bytes.length > 2, "buffer underflow while parsing transaction") if (bytes(0) == 0) { require(bytes(1) == LeaseCancelTransaction.typeId, "transaction type mismatch") require(bytes(2) == TxVersion.V2, "transaction version mismatch") val buf = ByteBuffer.wrap(bytes, 4, bytes.length - 4) parseCommonPart(TxVersion.V2, buf).copy(proofs = buf.getProofs) } else { require(bytes(0) == LeaseCancelTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 1, bytes.length - 1) parseCommonPart(TxVersion.V1, buf).copy(proofs = Proofs(buf.getSignature)) } } }
Example 87
Source File: TransferTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.serialization.{ByteBufferOps, Deser} import com.wavesplatform.transaction.transfer.TransferTransaction import com.wavesplatform.transaction.{Proofs, TxVersion} import com.wavesplatform.utils.byteStrFormat import play.api.libs.json.{JsObject, Json} import scala.util.Try object TransferTxSerializer { def toJson(tx: TransferTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "recipient" -> recipient.stringRepr, "assetId" -> assetId.maybeBase58Repr, "feeAsset" -> feeAssetId.maybeBase58Repr, // legacy v0.11.1 compat "amount" -> amount, "attachment" -> attachment ) } def bodyBytes(tx: TransferTransaction): Array[Byte] = { import tx._ lazy val baseBytes = Bytes.concat( sender.arr, assetId.byteRepr, feeAssetId.byteRepr, Longs.toByteArray(timestamp), Longs.toByteArray(amount), Longs.toByteArray(fee), recipient.bytes, Deser.serializeArrayWithLength(attachment.arr) ) version match { case TxVersion.V1 => Bytes.concat(Array(typeId), baseBytes) case TxVersion.V2 => Bytes.concat(Array(typeId, version), baseBytes) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: TransferTransaction): Array[Byte] = tx.version match { case TxVersion.V1 => Bytes.concat(Array(tx.typeId), tx.proofs.toSignature.arr, this.bodyBytes(tx)) case TxVersion.V2 => Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) case _ => PBTransactionSerializer.bytes(tx) } def parseBytes(bytes: Array[Byte]): Try[TransferTransaction] = Try { def parseCommonPart(version: TxVersion, buf: ByteBuffer): TransferTransaction = { val sender = buf.getPublicKey val assetId = buf.getAsset val feeAssetId = buf.getAsset val ts = buf.getLong val amount = buf.getLong val fee = buf.getLong val recipient = buf.getAddressOrAlias val attachment = buf.getByteArrayWithLength TransferTransaction(version, sender, recipient, assetId, amount, feeAssetId, fee, ByteStr(attachment), ts, Proofs.empty, recipient.chainId) } require(bytes.length > 2, "buffer underflow while parsing transaction") if (bytes(0) == 0) { require(bytes(1) == TransferTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 3, bytes.length - 3) val tx = parseCommonPart(TxVersion.V2, buf) val proofs = buf.getProofs tx.copy(proofs = proofs) } else { require(bytes(0) == TransferTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 1, bytes.length - 1) val signature = buf.getSignature require(buf.get == TransferTransaction.typeId, "transaction type mismatch") parseCommonPart(TxVersion.V1, buf).copy(proofs = Proofs(signature)) } } }
Example 88
Source File: IssueTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.serialization.{ByteBufferOps, Deser} import com.wavesplatform.transaction.assets.IssueTransaction import com.wavesplatform.transaction.{Proofs, TxVersion} import play.api.libs.json.{JsObject, Json} import scala.util.Try object IssueTxSerializer { def toJson(tx: IssueTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "assetId" -> id().toString, "name" -> name.toStringUtf8, "quantity" -> quantity, "reissuable" -> reissuable, "decimals" -> decimals, "description" -> description.toStringUtf8 ) ++ (if (version >= TxVersion.V2) Json.obj("script" -> script.map(_.bytes().base64)) else JsObject.empty) ++ (if (version == TxVersion.V2) Json.obj("chainId" -> chainId) else JsObject.empty) } def bodyBytes(tx: IssueTransaction): Array[Byte] = { import tx._ lazy val baseBytes = Bytes.concat( sender.arr, Deser.serializeArrayWithLength(name.toByteArray), Deser.serializeArrayWithLength(description.toByteArray), Longs.toByteArray(quantity), Array(decimals), Deser.serializeBoolean(reissuable), Longs.toByteArray(fee), Longs.toByteArray(timestamp) ) version match { case TxVersion.V1 => Bytes.concat(Array(typeId), baseBytes) case TxVersion.V2 => Bytes.concat(Array(builder.typeId, version, chainId), baseBytes, Deser.serializeOptionOfArrayWithLength(script)(_.bytes().arr)) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: IssueTransaction): Array[Byte] = tx.version match { case TxVersion.V1 => Bytes.concat(Array(tx.typeId), tx.proofs.toSignature.arr, this.bodyBytes(tx)) // Signature before body, typeId appears twice case TxVersion.V2 => Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) case _ => PBTransactionSerializer.bytes(tx) } def parseBytes(bytes: Array[Byte]): Try[IssueTransaction] = Try { def parseCommonPart(version: TxVersion, buf: ByteBuffer): IssueTransaction = { val sender = buf.getPublicKey val name = Deser.parseArrayWithLength(buf) val description = Deser.parseArrayWithLength(buf) val quantity = buf.getLong val decimals = buf.getByte val reissuable = buf.getBoolean val fee = buf.getLong val timestamp = buf.getLong IssueTransaction( version, sender, name, description, quantity, decimals, reissuable, None, fee, timestamp, ) } require(bytes.length > 2, "buffer underflow while parsing transaction") if (bytes(0) == 0) { require(bytes(1) == IssueTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 4, bytes.length - 4) parseCommonPart(TxVersion.V2, buf).copy(script = buf.getScript, proofs = buf.getProofs) } else { require(bytes(0) == IssueTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 1, bytes.length - 1) val signature = buf.getSignature require(buf.getByte == IssueTransaction.typeId, "transaction type mismatch") parseCommonPart(TxVersion.V1, buf).copy(proofs = Proofs(signature)) } } }
Example 89
Source File: PaymentTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Ints, Longs} import com.wavesplatform.serialization._ import com.wavesplatform.transaction.PaymentTransaction import play.api.libs.json.{JsObject, Json} import scala.util.Try object PaymentTxSerializer { def toJson(tx: PaymentTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj("recipient" -> recipient.stringRepr, "amount" -> amount) } def hashBytes(tx: PaymentTransaction): Array[Byte] = { import tx._ Bytes.concat( Array(builder.typeId), Longs.toByteArray(timestamp), sender.arr, recipient.bytes, Longs.toByteArray(amount), Longs.toByteArray(fee) ) } def bodyBytes(tx: PaymentTransaction): Array[Byte] = { import tx._ Bytes.concat( Ints.toByteArray(builder.typeId), // 4 bytes Longs.toByteArray(timestamp), sender.arr, recipient.bytes, Longs.toByteArray(amount), Longs.toByteArray(fee) ) } def toBytes(tx: PaymentTransaction): Array[Byte] = { Bytes.concat(this.hashBytes(tx), tx.signature.arr) } def parseBytes(bytes: Array[Byte]): Try[PaymentTransaction] = Try { val buf = ByteBuffer.wrap(bytes) require(buf.getByte == PaymentTransaction.typeId, "transaction type mismatch") val timestamp = buf.getLong val sender = buf.getPublicKey val recipient = buf.getAddress val amount = buf.getLong val fee = buf.getLong val signature = buf.getSignature PaymentTransaction(sender, recipient, amount, fee, timestamp, signature, recipient.chainId) } }
Example 90
Source File: CreateAliasTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.serialization.{ByteBufferOps, Deser} import com.wavesplatform.transaction.{CreateAliasTransaction, Proofs, Transaction, TxVersion} import play.api.libs.json.{JsObject, Json} import scala.util.Try object CreateAliasTxSerializer { def toJson(tx: CreateAliasTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj("alias" -> aliasName) } def bodyBytes(tx: CreateAliasTransaction): Array[Byte] = { import tx._ lazy val base = Bytes.concat( sender.arr, Deser.serializeArrayWithLength(alias.bytes), Longs.toByteArray(fee), Longs.toByteArray(timestamp) ) version match { case TxVersion.V1 => Bytes.concat(Array(builder.typeId), base) case TxVersion.V2 => Bytes.concat(Array(builder.typeId, version), base) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: CreateAliasTransaction): Array[Byte] = tx.version match { case TxVersion.V1 => Bytes.concat(this.bodyBytes(tx), tx.signature.arr) case TxVersion.V2 => Bytes.concat(Array(0: Byte), this.bodyBytes(tx), tx.proofs.bytes()) case _ => PBTransactionSerializer.bytes(tx) } def parseBytes(bytes: Array[Byte]): Try[CreateAliasTransaction] = Try { require(bytes.length > 3, "buffer underflow while parsing transaction") bytes.take(3) match { case Array(CreateAliasTransaction.typeId, _, _) => val buf = ByteBuffer.wrap(bytes, 1, bytes.length - 1) val sender = buf.getPublicKey val alias = buf.getAlias val fee = buf.getLong val timestamp = buf.getLong val signature = buf.getSignature CreateAliasTransaction(Transaction.V1, sender, alias.name, fee, timestamp, Proofs(signature), alias.chainId) case Array(0, CreateAliasTransaction.typeId, 2) => val buf = ByteBuffer.wrap(bytes, 3, bytes.length - 3) val sender = buf.getPublicKey val alias = buf.getAlias val fee = buf.getLong val timestamp = buf.getLong val proofs = buf.getProofs CreateAliasTransaction(Transaction.V2, sender, alias.name, fee, timestamp, proofs, alias.chainId) case Array(b1, b2, b3) => throw new IllegalArgumentException(s"Invalid tx header bytes: $b1, $b2, $b3") } } }
Example 91
Source File: BurnTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.account.AddressScheme import com.wavesplatform.serialization._ import com.wavesplatform.transaction.assets.BurnTransaction import com.wavesplatform.transaction.{Proofs, TxVersion} import monix.eval.Coeval import play.api.libs.json.{JsObject, Json} import scala.util.Try object BurnTxSerializer { def toJson(tx: BurnTransaction): Coeval[JsObject] = Coeval.evalOnce { import tx._ BaseTxJson.toJson(tx) ++ Json.obj("assetId" -> asset.id.toString, (if (version < TxVersion.V3) "amount" else "quantity") -> quantity) ++ (if (version == TxVersion.V2) Json.obj("chainId" -> chainId) else JsObject.empty) } def bodyBytes(tx: BurnTransaction): Coeval[Array[Byte]] = Coeval.evalOnce { import tx._ lazy val baseBytes = Bytes.concat( sender.arr, asset.id.arr, Longs.toByteArray(quantity), Longs.toByteArray(fee), Longs.toByteArray(timestamp) ) version match { case TxVersion.V1 => Bytes.concat(Array(typeId), baseBytes) case TxVersion.V2 => Bytes.concat(Array(builder.typeId, version, chainId), baseBytes) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: BurnTransaction): Coeval[Array[Byte]] = tx.version match { case TxVersion.V1 => tx.bodyBytes.map(bb => Bytes.concat(bb, tx.proofs.toSignature.arr)) case TxVersion.V2 => tx.bodyBytes.map(bb => Bytes.concat(Array(0: Byte), bb, tx.proofs.bytes())) case _ => Coeval.evalOnce(PBTransactionSerializer.bytes(tx)) } def parseBytes(bytes: Array[Byte]): Try[BurnTransaction] = Try { def parseCommonPart(version: TxVersion, buf: ByteBuffer): BurnTransaction = { val sender = buf.getPublicKey val asset = buf.getIssuedAsset val quantity = buf.getLong val fee = buf.getLong val timestamp = buf.getLong BurnTransaction(version, sender, asset, quantity, fee, timestamp, Nil, AddressScheme.current.chainId) } require(bytes.length > 2, "buffer underflow while parsing transaction") if (bytes(0) == 0) { require(bytes(1) == BurnTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 4, bytes.length - 4) parseCommonPart(TxVersion.V2, buf).copy(proofs = buf.getProofs) } else { require(bytes(0) == BurnTransaction.typeId, "transaction type mismatch") val buf = ByteBuffer.wrap(bytes, 1, bytes.length - 1) parseCommonPart(TxVersion.V1, buf).copy(proofs = Proofs(buf.getSignature)) } } }
Example 92
Source File: MassTransferTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs, Shorts} import com.wavesplatform.account.{AddressOrAlias, AddressScheme} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.common.utils._ import com.wavesplatform.serialization._ import com.wavesplatform.transaction.TxVersion import com.wavesplatform.transaction.transfer.MassTransferTransaction import com.wavesplatform.transaction.transfer.MassTransferTransaction.{ParsedTransfer, Transfer} import com.wavesplatform.utils.byteStrFormat import play.api.libs.json.{JsObject, JsValue, Json} import scala.util.Try object MassTransferTxSerializer { def transfersJson(transfers: Seq[ParsedTransfer]): JsValue = Json.toJson(transfers.map { case ParsedTransfer(address, amount) => Transfer(address.stringRepr, amount) }) def toJson(tx: MassTransferTransaction): JsObject = { import tx._ BaseTxJson.toJson(tx) ++ Json.obj( "assetId" -> assetId.maybeBase58Repr, "attachment" -> attachment, "transferCount" -> transfers.size, "totalAmount" -> transfers.map(_.amount).sum, "transfers" -> transfersJson(transfers) ) } def bodyBytes(tx: MassTransferTransaction): Array[Byte] = { import tx._ version match { case TxVersion.V1 => val transferBytes = transfers.map { case ParsedTransfer(recipient, amount) => Bytes.concat(recipient.bytes, Longs.toByteArray(amount)) } Bytes.concat( Array(builder.typeId, version), sender.arr, assetId.byteRepr, Shorts.toByteArray(transfers.size.toShort), Bytes.concat(transferBytes: _*), Longs.toByteArray(timestamp), Longs.toByteArray(fee), Deser.serializeArrayWithLength(attachment.arr) ) case _ => PBTransactionSerializer.bodyBytes(tx) } } def toBytes(tx: MassTransferTransaction): Array[Byte] = if (tx.isProtobufVersion) PBTransactionSerializer.bytes(tx) else Bytes.concat(this.bodyBytes(tx), tx.proofs.bytes()) // No zero mark def parseBytes(bytes: Array[Byte]): Try[MassTransferTransaction] = Try { def parseTransfers(buf: ByteBuffer): Seq[MassTransferTransaction.ParsedTransfer] = { def readTransfer(buf: ByteBuffer): ParsedTransfer = { val addressOrAlias = AddressOrAlias.fromBytes(buf).explicitGet() val amount = buf.getLong ParsedTransfer(addressOrAlias, amount) } val entryCount = buf.getShort require(entryCount >= 0 && buf.remaining() > entryCount, s"Broken array size ($entryCount entries while ${buf.remaining()} bytes available)") Vector.fill(entryCount)(readTransfer(buf)) } val buf = ByteBuffer.wrap(bytes) require(buf.getByte == MassTransferTransaction.typeId && buf.getByte == TxVersion.V1, "transaction type mismatch") val sender = buf.getPublicKey val assetId = buf.getAsset val transfers = parseTransfers(buf) val timestamp = buf.getLong // Timestamp before fee val fee = buf.getLong val attachment = Deser.parseArrayWithLength(buf) val proofs = buf.getProofs MassTransferTransaction(TxVersion.V1, sender, assetId, transfers, fee, timestamp, ByteStr(attachment), proofs, AddressScheme.current.chainId) } }
Example 93
Source File: GenesisTxSerializer.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.serialization.impl import java.nio.ByteBuffer import com.google.common.primitives.{Bytes, Longs} import com.wavesplatform.account.Address import com.wavesplatform.common.state.ByteStr import com.wavesplatform.serialization._ import com.wavesplatform.transaction.GenesisTransaction import play.api.libs.json.{JsObject, Json} import scala.util.Try object GenesisTxSerializer { val BaseLength: Int = Address.AddressLength + Longs.BYTES * 2 def toJson(tx: GenesisTransaction): JsObject = { import tx._ Json.obj( "type" -> builder.typeId, "id" -> id().toString, "fee" -> 0, "timestamp" -> timestamp, "signature" -> signature.toString, "recipient" -> recipient.stringRepr, "amount" -> amount ) } def toBytes(tx: GenesisTransaction): Array[Byte] = { import tx._ val typeBytes = Array(builder.typeId) val timestampBytes = Longs.toByteArray(timestamp) val rcpBytes = recipient.bytes val amountBytes = Longs.toByteArray(amount) require(rcpBytes.length == Address.AddressLength) val res = Bytes.concat(typeBytes, timestampBytes, rcpBytes, amountBytes) require(res.length == BaseLength + 1) res } def parseBytes(bytes: Array[Byte]): Try[GenesisTransaction] = Try { val buf = ByteBuffer.wrap(bytes) require(buf.getByte == GenesisTransaction.typeId, "transaction type mismatch") val timestamp = buf.getLong val recipient = buf.getAddress val amount = buf.getLong GenesisTransaction(recipient, amount, timestamp, ByteStr(GenesisTransaction.generateSignature(recipient, amount, timestamp)), recipient.chainId) } }
Example 94
Source File: PaymentTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction import com.wavesplatform.account.{Address, KeyPair, PublicKey} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.serialization.impl.PaymentTxSerializer import com.wavesplatform.transaction.validation.TxValidator import com.wavesplatform.transaction.validation.impl.PaymentTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try case class PaymentTransaction private ( sender: PublicKey, recipient: Address, amount: Long, fee: Long, timestamp: Long, signature: ByteStr, chainId: Byte ) extends SignedTransaction with TxWithFee.InWaves { override val builder = PaymentTransaction override val id: Coeval[ByteStr] = Coeval.evalOnce(signature) override val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.bodyBytes(this)) override val bytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(builder.serializer.toJson(this)) } object PaymentTransaction extends TransactionParser { type TransactionT = PaymentTransaction override val typeId: TxType = 2: Byte override val supportedVersions: Set[TxVersion] = Set(1) val serializer = PaymentTxSerializer override def parseBytes(bytes: Array[TxVersion]): Try[PaymentTransaction] = serializer.parseBytes(bytes) implicit val validator: TxValidator[PaymentTransaction] = PaymentTxValidator def create(sender: KeyPair, recipient: Address, amount: Long, fee: Long, timestamp: Long): Either[ValidationError, PaymentTransaction] = { create(sender.publicKey, recipient, amount, fee, timestamp, ByteStr.empty).map(unsigned => { unsigned.copy(signature = crypto.sign(sender.privateKey, unsigned.bodyBytes())) }) } def create( sender: PublicKey, recipient: Address, amount: Long, fee: Long, timestamp: Long, signature: ByteStr ): Either[ValidationError, PaymentTransaction] = PaymentTransaction(sender, recipient, amount, fee, timestamp, signature, recipient.chainId).validatedEither }
Example 95
Source File: CreateAliasTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction import com.google.common.primitives.Bytes import com.wavesplatform.account.{AddressScheme, Alias, KeyPair, PrivateKey, PublicKey} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.crypto import com.wavesplatform.common.utils.EitherExt2 import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.serialization.impl.CreateAliasTxSerializer import com.wavesplatform.transaction.validation.impl.CreateAliasTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try final case class CreateAliasTransaction( version: TxVersion, sender: PublicKey, aliasName: String, fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte ) extends SigProofsSwitch with VersionedTransaction with TxWithFee.InWaves with LegacyPBSwitch.V3 { lazy val alias: Alias = Alias.createWithChainId(aliasName, chainId).explicitGet() override def builder: TransactionParser = CreateAliasTransaction override val bodyBytes: Coeval[Array[TxVersion]] = Coeval.evalOnce(CreateAliasTransaction.serializer.bodyBytes(this)) override val bytes: Coeval[Array[TxVersion]] = Coeval.evalOnce(CreateAliasTransaction.serializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(CreateAliasTransaction.serializer.toJson(this)) override val id: Coeval[ByteStr] = Coeval.evalOnce { val payload = version match { case TxVersion.V1 | TxVersion.V2 => Bytes.concat(Array(builder.typeId), alias.bytes) case _ => bodyBytes() } ByteStr(crypto.fastHash(payload)) } } object CreateAliasTransaction extends TransactionParser { type TransactionT = CreateAliasTransaction val supportedVersions: Set[TxVersion] = Set(1, 2, 3) val typeId: TxType = 10: Byte implicit val validator = CreateAliasTxValidator val serializer = CreateAliasTxSerializer implicit def sign(tx: CreateAliasTransaction, privateKey: PrivateKey): CreateAliasTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) override def parseBytes(bytes: Array[TxVersion]): Try[CreateAliasTransaction] = serializer.parseBytes(bytes) def create( version: TxVersion, sender: PublicKey, aliasName: String, fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte = AddressScheme.current.chainId ): Either[ValidationError, TransactionT] = CreateAliasTransaction(version, sender, aliasName, fee, timestamp, proofs, chainId).validatedEither def signed( version: TxVersion, sender: PublicKey, alias: String, fee: TxAmount, timestamp: TxTimestamp, signer: PrivateKey ): Either[ValidationError, TransactionT] = create(version, sender, alias, fee, timestamp, Nil).map(_.signWith(signer)) def selfSigned(version: TxVersion, sender: KeyPair, alias: Alias, fee: TxAmount, timestamp: TxTimestamp): Either[ValidationError, TransactionT] = signed(version, sender.publicKey, alias.name, fee, timestamp, sender.privateKey) }
Example 96
Source File: TracedResult.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.smart.script.trace import cats.implicits._ import cats.{Applicative, Apply, Functor} import cats.kernel.Semigroup import com.wavesplatform.api.http.ApiError import com.wavesplatform.transaction.Transaction import play.api.libs.json.{JsObject, Json} final case class TracedResult[+E, +A]( resultE: Either[E, A], trace: List[TraceStep] = Nil ) { def transformE[B, E1](f: Either[E, A] => TracedResult[E1, B]): TracedResult[E1, B] = { val newResultE = f(resultE) newResultE.copy(trace = this.trace ::: newResultE.trace) } def flatMap[B, E1 >: E](f: A => TracedResult[E1, B]): TracedResult[E1, B] = { resultE match { case Left(_) => this.asInstanceOf[TracedResult[E1, B]] case Right(value) => val newResult = f(value) newResult.copy(trace = this.trace ::: newResult.trace) } } def map[B](f: A => B): TracedResult[E, B] = copy(resultE.map(f)) def leftMap[E1](f: E => E1): TracedResult[E1, A] = copy(resultE.leftMap(f)) def json(implicit ev1: E => ApiError, ev2: A => Transaction): JsObject = { val resultJson = resultE match { case Right(value) => value.json() case Left(e) => e.json } resultJson ++ Json.obj("trace" -> trace.map(_.json)) } def loggedJson(implicit ev1: E => ApiError, ev2: A => Transaction): JsObject = { val resultJson = resultE match { case Right(value) => value.json() case Left(e) => e.json } resultJson ++ Json.obj("trace" -> trace.map(_.loggedJson)) } } object TracedResult { implicit def wrapE[A, E](e: Either[E, A]): TracedResult[E, A] = TracedResult(e) implicit def wrapValue[A, E](value: A): TracedResult[E, A] = TracedResult(Right(value)) implicit def tracedResultSemigroup[A: Semigroup, E]: Semigroup[TracedResult[E, A]] = (a, b) => TracedResult( a.resultE |+| b.resultE, if (a.resultE.isRight) a.trace |+| b.trace else a.trace ) implicit def applicativeTracedResult[L]: Applicative[TracedResult[L, ?]] with Apply[TracedResult[L, ?]] with Functor[TracedResult[L, ?]] = new Applicative[TracedResult[L, ?]] { def pure[A](v:A) = wrapValue[A, L](v) def ap[A,B](fb: TracedResult[L, A=>B])(fa: TracedResult[L, A]) : TracedResult[L, B] = { TracedResult(fa.resultE ap fb.resultE, fa.trace ++ fb.trace) } override def product[A,B](fa: TracedResult[L, A], fb: TracedResult[L, B]) : TracedResult[L, (A,B)] = { TracedResult(fa.resultE product fb.resultE, fa.trace ++ fb.trace) } override def map[A,B](x: TracedResult[L, A])(f: A=>B) : TracedResult[L, B] = { TracedResult[L,B](x.resultE map f, x.trace) } } }
Example 97
Source File: SetScriptTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.smart import com.wavesplatform.account._ import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.lang.script.Script import com.wavesplatform.transaction._ import com.wavesplatform.transaction.serialization.impl.SetScriptTxSerializer import com.wavesplatform.transaction.validation.TxValidator import com.wavesplatform.transaction.validation.impl.SetScriptTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try case class SetScriptTransaction( version: TxVersion, sender: PublicKey, script: Option[Script], fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte ) extends ProvenTransaction with VersionedTransaction with TxWithFee.InWaves with FastHashId with LegacyPBSwitch.V2 { //noinspection TypeAnnotation override val builder = SetScriptTransaction val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce(SetScriptTransaction.serializer.bodyBytes(this)) override val bytes: Coeval[Array[Byte]] = Coeval.evalOnce(SetScriptTransaction.serializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(SetScriptTransaction.serializer.toJson(this)) } object SetScriptTransaction extends TransactionParser { type TransactionT = SetScriptTransaction override val typeId: TxType = 13: Byte override val supportedVersions: Set[TxVersion] = Set(1, 2) implicit val validator: TxValidator[SetScriptTransaction] = SetScriptTxValidator val serializer = SetScriptTxSerializer implicit def sign(tx: SetScriptTransaction, privateKey: PrivateKey): SetScriptTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) override def parseBytes(bytes: Array[TxVersion]): Try[SetScriptTransaction] = serializer.parseBytes(bytes) def create( version: TxVersion, sender: PublicKey, script: Option[Script], fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte = AddressScheme.current.chainId ): Either[ValidationError, SetScriptTransaction] = SetScriptTransaction(version, sender, script, fee, timestamp, proofs, chainId).validatedEither def signed( version: TxVersion, sender: PublicKey, script: Option[Script], fee: TxAmount, timestamp: TxTimestamp, signer: PrivateKey ): Either[ValidationError, SetScriptTransaction] = create(version, sender, script, fee, timestamp, Proofs.empty).map(_.signWith(signer)) def selfSigned( version: TxVersion, sender: KeyPair, script: Option[Script], fee: TxAmount, timestamp: TxTimestamp ): Either[ValidationError, SetScriptTransaction] = signed(version, sender.publicKey, script, fee, timestamp, sender.privateKey) }
Example 98
Source File: GenesisTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction import cats.data.Validated import com.google.common.primitives.{Bytes, Ints, Longs} import com.wavesplatform.account.Address import com.wavesplatform.common.state.ByteStr import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.Asset.Waves import com.wavesplatform.transaction.serialization.impl.GenesisTxSerializer import com.wavesplatform.transaction.validation.{TxConstraints, TxValidator} import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try case class GenesisTransaction private (recipient: Address, amount: Long, timestamp: Long, signature: ByteStr, chainId: Byte) extends Transaction { override val builder = GenesisTransaction override val assetFee: (Asset, Long) = (Waves, 0) override val id: Coeval[ByteStr] = Coeval.evalOnce(signature) override val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.toBytes(this)) override val bytes: Coeval[Array[Byte]] = bodyBytes override val json: Coeval[JsObject] = Coeval.evalOnce(builder.serializer.toJson(this)) } object GenesisTransaction extends TransactionParser { type TransactionT = GenesisTransaction override val typeId: TxType = 1: Byte override val supportedVersions: Set[TxVersion] = Set(1) val serializer = GenesisTxSerializer override def parseBytes(bytes: Array[TxVersion]): Try[GenesisTransaction] = serializer.parseBytes(bytes) implicit val validator: TxValidator[GenesisTransaction] = tx => TxConstraints.seq(tx)( Validated.condNel(tx.amount >= 0, tx, TxValidationError.NegativeAmount(tx.amount, "waves")), TxConstraints.addressChainId(tx.recipient, tx.chainId) ) def generateSignature(recipient: Address, amount: Long, timestamp: Long): Array[Byte] = { val payload = Bytes.concat(Ints.toByteArray(typeId), Longs.toByteArray(timestamp), recipient.bytes, Longs.toByteArray(amount)) val hash = crypto.fastHash(payload) Bytes.concat(hash, hash) } def create(recipient: Address, amount: Long, timestamp: Long): Either[ValidationError, GenesisTransaction] = { val signature = ByteStr(GenesisTransaction.generateSignature(recipient, amount, timestamp)) GenesisTransaction(recipient, amount, timestamp, signature, recipient.chainId).validatedEither } }
Example 99
Source File: SetAssetScriptTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.assets import com.wavesplatform.account._ import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.lang.script.Script import com.wavesplatform.transaction.Asset.IssuedAsset import com.wavesplatform.transaction._ import com.wavesplatform.transaction.serialization.impl.SetAssetScriptTxSerializer import com.wavesplatform.transaction.validation.TxValidator import com.wavesplatform.transaction.validation.impl.SetAssetScriptTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try case class SetAssetScriptTransaction( version: TxVersion, sender: PublicKey, asset: IssuedAsset, script: Option[Script], fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte ) extends VersionedTransaction with ProvenTransaction with TxWithFee.InWaves with FastHashId with LegacyPBSwitch.V2 { //noinspection TypeAnnotation override val builder = SetAssetScriptTransaction override val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.bodyBytes(this)) override val bytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(builder.serializer.toJson(this)) override val checkedAssets: Seq[IssuedAsset] = Seq(asset) } object SetAssetScriptTransaction extends TransactionParser { type TransactionT = SetAssetScriptTransaction override val typeId: TxType = 15: Byte override val supportedVersions: Set[TxVersion] = Set(1, 2) implicit val validator: TxValidator[SetAssetScriptTransaction] = SetAssetScriptTxValidator implicit def sign(tx: SetAssetScriptTransaction, privateKey: PrivateKey): SetAssetScriptTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) val serializer = SetAssetScriptTxSerializer override def parseBytes(bytes: Array[TxVersion]): Try[SetAssetScriptTransaction] = serializer.parseBytes(bytes) def create( version: TxVersion, sender: PublicKey, assetId: IssuedAsset, script: Option[Script], fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte = AddressScheme.current.chainId ): Either[ValidationError, SetAssetScriptTransaction] = SetAssetScriptTransaction(version, sender, assetId, script, fee, timestamp, proofs, chainId).validatedEither def signed( version: TxVersion, sender: PublicKey, asset: IssuedAsset, script: Option[Script], fee: TxAmount, timestamp: TxTimestamp, signer: PrivateKey ): Either[ValidationError, SetAssetScriptTransaction] = create(version, sender, asset, script, fee, timestamp, Proofs.empty).map(_.signWith(signer)) def selfSigned( version: TxVersion, sender: KeyPair, asset: IssuedAsset, script: Option[Script], fee: TxAmount, timestamp: TxTimestamp ): Either[ValidationError, SetAssetScriptTransaction] = signed(version, sender.publicKey, asset, script, fee, timestamp, sender.privateKey) }
Example 100
Source File: ExchangeTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.assets.exchange import com.wavesplatform.account.{AddressScheme, PrivateKey, PublicKey} import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.Asset.IssuedAsset import com.wavesplatform.transaction._ import com.wavesplatform.transaction.serialization.impl.ExchangeTxSerializer import com.wavesplatform.transaction.validation.impl.ExchangeTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try case class ExchangeTransaction( version: TxVersion, order1: Order, order2: Order, amount: Long, price: Long, buyMatcherFee: Long, sellMatcherFee: Long, fee: Long, timestamp: Long, proofs: Proofs, chainId: Byte ) extends VersionedTransaction with ProvenTransaction with TxWithFee.InWaves with FastHashId with SigProofsSwitch with LegacyPBSwitch.V3 { val (buyOrder, sellOrder) = if (order1.orderType == OrderType.BUY) (order1, order2) else (order2, order1) override def builder: TransactionParser = ExchangeTransaction override val sender: PublicKey = buyOrder.matcherPublicKey override val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce(ExchangeTransaction.serializer.bodyBytes(this)) override val bytes: Coeval[Array[Byte]] = Coeval.evalOnce(ExchangeTransaction.serializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(ExchangeTransaction.serializer.toJson(this)) override def checkedAssets: Seq[IssuedAsset] = { import buyOrder.{assetPair => pair} Vector(pair.priceAsset, pair.amountAsset, order1.matcherFeeAssetId, order2.matcherFeeAssetId) .distinct .collect { case a: IssuedAsset => a } } } object ExchangeTransaction extends TransactionParser { type TransactionT = ExchangeTransaction implicit val validator = ExchangeTxValidator val serializer = ExchangeTxSerializer implicit def sign(tx: ExchangeTransaction, privateKey: PrivateKey): ExchangeTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) override def parseBytes(bytes: Array[TxVersion]): Try[ExchangeTransaction] = serializer.parseBytes(bytes) override def supportedVersions: Set[TxVersion] = Set(1, 2, 3) val typeId: TxType = 7: Byte def create( version: TxVersion, order1: Order, order2: Order, amount: Long, price: Long, buyMatcherFee: Long, sellMatcherFee: Long, fee: Long, timestamp: Long, proofs: Proofs = Proofs.empty, chainId: Byte = AddressScheme.current.chainId ): Either[ValidationError, ExchangeTransaction] = ExchangeTransaction(version, order1, order2, amount, price, buyMatcherFee, sellMatcherFee, fee, timestamp, proofs, chainId).validatedEither def signed( version: TxVersion, matcher: PrivateKey, order1: Order, order2: Order, amount: Long, price: Long, buyMatcherFee: Long, sellMatcherFee: Long, fee: Long, timestamp: Long ): Either[ValidationError, ExchangeTransaction] = create(version, order1, order2, amount, price, buyMatcherFee, sellMatcherFee, fee, timestamp, Proofs.empty).map(_.signWith(matcher)) }
Example 101
Source File: AssetPair.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.assets.exchange import com.google.common.primitives.Bytes import com.wavesplatform.common.state.ByteStr import com.wavesplatform.serialization.Deser import com.wavesplatform.transaction.Asset.{IssuedAsset, Waves} import com.wavesplatform.transaction._ import com.wavesplatform.transaction.assets.exchange.Validation.booleanOperators import net.ceedubs.ficus.readers.ValueReader import play.api.libs.json.{JsObject, Json} import scala.util.{Failure, Success, Try} case class AssetPair( amountAsset: Asset, priceAsset: Asset ) { import AssetPair._ lazy val priceAssetStr: String = assetIdStr(priceAsset) lazy val amountAssetStr: String = assetIdStr(amountAsset) override def toString: String = key def key: String = amountAssetStr + "-" + priceAssetStr def isValid: Validation = (amountAsset != priceAsset) :| "Invalid AssetPair" def bytes: Array[Byte] = Bytes.concat(amountAsset.byteRepr, priceAsset.byteRepr) def json: JsObject = Json.obj( "amountAsset" -> amountAsset.maybeBase58Repr, "priceAsset" -> priceAsset.maybeBase58Repr ) def reverse = AssetPair(priceAsset, amountAsset) def assets: Set[Asset] = Set(amountAsset, priceAsset) } object AssetPair { val WavesName = "WAVES" def assetIdStr(aid: Asset): String = aid match { case Waves => WavesName case IssuedAsset(id) => id.toString } def extractAssetId(a: String): Try[Asset] = a match { case `WavesName` => Success(Waves) case other => ByteStr.decodeBase58(other).map(IssuedAsset) } def createAssetPair(amountAsset: String, priceAsset: String): Try[AssetPair] = for { a1 <- extractAssetId(amountAsset) a2 <- extractAssetId(priceAsset) } yield AssetPair(a1, a2) def fromBytes(xs: Array[Byte]): AssetPair = { val (amount, offset) = Deser.parseByteArrayOption(xs, 0, AssetIdLength) val (price, _) = Deser.parseByteArrayOption(xs, offset, AssetIdLength) AssetPair( Asset.fromCompatId(amount.map(ByteStr(_))), Asset.fromCompatId(price.map(ByteStr(_))) ) } def fromString(s: String): Try[AssetPair] = Try(s.split("-")).flatMap { case Array(amtAssetStr, prcAssetStr) => AssetPair.createAssetPair(amtAssetStr, prcAssetStr) case xs => Failure(new Exception(s"$s (incorrect assets count, expected 2 but got ${xs.size}: ${xs.mkString(", ")})")) } implicit val assetPairReader: ValueReader[AssetPair] = (cfg, path) => fromString(cfg.getString(path)).get }
Example 102
Source File: WalletRouteSpec.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.http import com.wavesplatform.TestWallet import com.wavesplatform.api.http.ApiError.ApiKeyNotValid import com.wavesplatform.api.http.WalletApiRoute import com.wavesplatform.common.utils.Base58 import com.wavesplatform.http.ApiMarshallers._ import play.api.libs.json.JsObject class WalletRouteSpec extends RouteSpec("/wallet") with RestAPISettingsHelper with TestWallet { private val route = WalletApiRoute(restAPISettings, testWallet).route private val brokenRestApiSettings = restAPISettings.copy(apiKeyHash = "InvalidAPIKeyHash") private val routeWithIncorrectKeyHash = WalletApiRoute(brokenRestApiSettings, testWallet).route routePath("/seed") - { "requires api-key header" in { Get(routePath("/seed")) ~> route should produce(ApiKeyNotValid) } "returns seed when api-key header is present" in { Get(routePath("/seed")) ~> ApiKeyHeader ~> route ~> check { (responseAs[JsObject] \ "seed").as[String] shouldEqual Base58.encode(testWallet.seed) } } "doesn't work if invalid api-key-hash was set" in { Get(routePath("/seed")) ~> ApiKeyHeader ~> routeWithIncorrectKeyHash should produce(ApiKeyNotValid) } } }
Example 103
Source File: FallbackExperimentStrategy.scala From izanami with Apache License 2.0 | 5 votes |
package izanami.experiments import java.time.LocalDateTime import akka.http.scaladsl.util.FastFuture import izanami._ import izanami.scaladsl.{ExperimentClient, ExperimentsClient} import play.api.libs.json.{JsObject, Json} import scala.concurrent.Future object FallbackExperimentStrategy { def apply(fallback: Experiments): FallbackExperimentStrategy = new FallbackExperimentStrategy(fallback) } class FallbackExperimentStrategy(fallback: Experiments) extends ExperimentsClient { override def experiment(id: String): Future[Option[ExperimentClient]] = FastFuture.successful(fallback.experiments.find(_.id == id).map { fb => ExperimentClient(this, fb.experiment) }) override def list(pattern: Seq[String]): Future[Seq[ExperimentClient]] = FastFuture.successful( fallback.experiments.map(fb => ExperimentClient(this, fb.experiment)).filter(ec => ec.matchPattern(pattern)) ) override def tree(pattern: Seq[String], clientId: String): Future[JsObject] = FastFuture.successful( fallback.experiments .filter(_.enabled) .filter(ec => ec.matchPatterns(pattern)) .map { _.tree } .foldLeft(Json.obj())(_ deepMerge _) ) override def getVariantFor(experimentId: String, clientId: String): Future[Option[Variant]] = FastFuture.successful(fallback.experiments.find(_.id == experimentId).map(_.variant)) override def markVariantDisplayed(experimentId: String, clientId: String): Future[ExperimentVariantDisplayed] = { val experiment: ExperimentFallback = fallback.experiments .find(_.id == experimentId) .getOrElse(ExperimentFallback(experimentId, "", "", false, Variant("", "", ""))) FastFuture.successful( ExperimentVariantDisplayed( s"${experiment.id}:${experiment.variant.id}:${clientId}:${System.currentTimeMillis()}", experiment.id, clientId, experiment.variant, LocalDateTime.now(), 0, experiment.variant.id ) ) } override def markVariantWon(experimentId: String, clientId: String): Future[ExperimentVariantWon] = { val experiment: ExperimentFallback = fallback.experiments .find(_.id == experimentId) .getOrElse(ExperimentFallback(experimentId, "", "", false, Variant("", "", ""))) FastFuture.successful( ExperimentVariantWon( s"${experiment.id}:${experiment.variant.id}:${clientId}:${System.currentTimeMillis()}", experiment.id, clientId, experiment.variant, LocalDateTime.now(), 0, experiment.variant.id ) ) } }
Example 104
Source File: HomeController.scala From izanami with Apache License 2.0 | 5 votes |
package controllers import controllers.actions.AuthContext import domains.auth.AuthInfo import domains.user.{User, UserNoPasswordInstances} import env.{Env, Oauth2Config} import play.api.libs.json.{JsObject, JsValue, Json} import play.api.mvc._ class HomeController(_env: Env, AuthAction: ActionBuilder[AuthContext, AnyContent], cc: ControllerComponents) extends AbstractController(cc) { private val maybeOauth2Config: Option[Oauth2Config] = _env.izanamiConfig.oauth2.filter(_.enabled) private lazy val userManagementMode: String = (_env.izanamiConfig.filter, maybeOauth2Config) match { case (_, Some(c)) if c.izanamiManagedUser => "OAuth" case (_: env.Default, _) => "Izanami" case _ => "None" } private lazy val enabledApikeyManagement: Boolean = _env.izanamiConfig.filter match { case _: env.Default => true case _ => false } private lazy val baseURL: String = _env.baseURL private lazy val confirmationDialog: Boolean = _env.izanamiConfig.confirmationDialog private lazy val logoutUrl: String = if (_env.izanamiConfig.logout.url.startsWith("http")) { _env.izanamiConfig.logout.url } else { s"$baseURL${_env.izanamiConfig.logout.url}" } private val p: Package = getClass.getPackage private val version: String = p.getImplementationVersion def index() = AuthAction { ctx => ctx.auth match { case Some(_) => Ok( views.html .index(_env, baseURL, logoutUrl, confirmationDialog, userManagementMode, enabledApikeyManagement, toJson(ctx.auth), version) ) case None => Redirect(s"$baseURL/login") } } def login() = AuthAction { ctx => maybeOauth2Config match { case Some(_) => Redirect(controllers.routes.OAuthController.appLoginPage()) case _ => Ok( views.html.index(_env, baseURL, logoutUrl, confirmationDialog, userManagementMode, enabledApikeyManagement, toJson(ctx.auth), version) ) } } def logout() = Action { _ => maybeOauth2Config match { case Some(_) => Redirect(controllers.routes.OAuthController.appLogout()) case _ => Redirect(s"${_env.baseURL}/login").withCookies(Cookie(name = _env.cookieName, value = "", maxAge = Some(0))) } } def otherRoutes(anyPath: String) = index() private def toJson(auth: Option[AuthInfo.Service]): JsValue = auth match { case Some(u: User) => UserNoPasswordInstances.format.writes(u).as[JsObject] - "id" case _ => Json.obj() } }
Example 105
Source File: AuthController.scala From izanami with Apache License 2.0 | 5 votes |
package controllers import com.auth0.jwt.algorithms.Algorithm import domains.{AuthorizedPatterns, Key} import domains.user.{IzanamiUser, User, UserContext, UserService} import env.{DefaultFilter, Env} import libs.crypto.Sha import play.api.libs.json.{JsObject, JsValue, Json} import play.api.mvc._ import store.Query import zio.{Runtime, ZIO} import libs.http.HttpContext case class Auth(userId: String, password: String) object Auth { implicit val format = Json.format[Auth] } class AuthController(_env: Env, cc: ControllerComponents)(implicit R: HttpContext[UserContext]) extends AbstractController(cc) { import domains.user.UserNoPasswordInstances._ import cats.implicits._ import libs.http._ lazy val _config: DefaultFilter = _env.izanamiConfig.filter match { case env.Default(config) => config case _ => throw new RuntimeException("Wrong config") } lazy val algorithm: Algorithm = Algorithm.HMAC512(_config.sharedKey) def authenticate: Action[JsValue] = Action.asyncZio[UserContext](parse.json) { req => val auth: Auth = req.body.as[Auth] UserService .getByIdWithoutPermissions(Key(auth.userId)) .mapError(_ => InternalServerError("")) .flatMap { case Some(user: User) => ZIO.succeed { user match { case IzanamiUser(_, _, _, Some(password), _, _) if password === Sha.hexSha512(auth.password) => val token: String = User.buildToken(user, _config.issuer, algorithm) Ok(Json.toJson(user).as[JsObject] - "password") .withCookies(Cookie(name = _env.cookieName, value = token)) case _ => Forbidden } } case None => UserService .countWithoutPermissions(Query.oneOf("*")) .map { case count if count === 0 && auth.userId === _env.izanamiConfig.user.initialize.userId && auth.password === _env.izanamiConfig.user.initialize.password => { val userId = _env.izanamiConfig.user.initialize.userId val user: User = IzanamiUser(id = userId, name = userId, email = s"[email protected]", password = None, admin = true, authorizedPatterns = AuthorizedPatterns.All) val token: String = User.buildToken(user, _config.issuer, algorithm) Ok(Json.toJson(user).as[JsObject] ++ Json.obj("changeme" -> true)) .withCookies(Cookie(name = _env.cookieName, value = token)) } case _ => Forbidden } .mapError(_ => InternalServerError("")) } } }
Example 106
Source File: ExecutorIdExtenderPlugin.scala From marathon-example-plugins with Apache License 2.0 | 5 votes |
package mesosphere.marathon.example.plugin.executorid import com.typesafe.scalalogging.StrictLogging import mesosphere.marathon.plugin.{ApplicationSpec, PodSpec} import mesosphere.marathon.plugin.plugin.PluginConfiguration import mesosphere.marathon.plugin.task.RunSpecTaskProcessor import org.apache.mesos.Protos._ import play.api.libs.json.JsObject import scala.collection.JavaConverters._ class ExecutorIdExtenderPlugin extends RunSpecTaskProcessor with PluginConfiguration with StrictLogging { val ExecutorIdLabel = "MARATHON_EXECUTOR_ID" override def taskInfo(appSpec: ApplicationSpec, builder: TaskInfo.Builder): Unit = { // If custom executor is used if (builder.hasExecutor && builder.getExecutor.hasCommand) { val labels = builder.getLabels.getLabelsList.asScala // ... and there is MARATHON_EXECUTOR_ID label set labels.find(_.getKey == ExecutorIdLabel).foreach {label => // Set the executorID from the MARATHON_EXECUTOR_ID label val executorId = label.getValue val executorBuilder = builder.getExecutor.toBuilder executorBuilder.setExecutorId(ExecutorID.newBuilder.setValue(executorId)) // An executor id of the executor to launch this application. Note that all application sharing the same // executor id will share the same executor instance allowing to save resources. The downfall is that all // the apps started with the same executo id must have identical `TaskInfo.ExecutorInfo`. Among other things that // means environment variables must be identical. Since marathon would automatically generate per-task environment // variables like `MARATHON_APP_VERSION`, `MESOS_TASK_ID` or `PORTx` this will not work. // For this reason we just remove all the environment variables. It is possible to be more selective and remove // only those environment variables that change from task to task but that's too much hustle for this simple plugin. val commandBuilder = executorBuilder.getCommand.toBuilder commandBuilder.clearEnvironment() executorBuilder.setCommand(commandBuilder) builder.setExecutor(executorBuilder) } } } override def taskGroup(podSpec: PodSpec, executor: ExecutorInfo.Builder, taskGroup: TaskGroupInfo.Builder): Unit = {} override def initialize(marathonInfo: Map[String, Any], configuration: JsObject): Unit = { logger.info(s"ExecutorIdExtenderPlugin successfully initialized") } }
Example 107
Source File: ExampleAuthenticator.scala From marathon-example-plugins with Apache License 2.0 | 5 votes |
package mesosphere.marathon.example.plugin.auth import java.util.Base64 import mesosphere.marathon.plugin.auth.{ Authenticator, Identity } import mesosphere.marathon.plugin.http.{ HttpRequest, HttpResponse } import mesosphere.marathon.plugin.plugin.PluginConfiguration import play.api.libs.json.JsObject import scala.concurrent.Future class ExampleAuthenticator extends Authenticator with PluginConfiguration { import scala.concurrent.ExecutionContext.Implicits.global override def handleNotAuthenticated(request: HttpRequest, response: HttpResponse): Unit = { response.status(401) response.header("WWW-Authenticate", """Basic realm="Marathon Example Authentication"""") response.body("application/json", """{"message": "Not Authenticated!"}""".getBytes("UTF-8")) } override def authenticate(request: HttpRequest): Future[Option[Identity]] = Future { def basicAuth(header: String): Option[(String, String)] = { val BasicAuthRegex = "Basic (.+)".r val UserPassRegex = "([^:]+):(.+)".r header match { case BasicAuthRegex(encoded) => val decoded = new String(Base64.getDecoder.decode(encoded)) val UserPassRegex(username, password) = decoded Some(username->password) case _ => None } } for { auth <- request.header("Authorization").headOption (username, password) <- basicAuth(auth) identity <- identities.get(username) if identity.password == password } yield identity } private var identities = Map.empty[String, ExampleIdentity] override def initialize(marathonInfo: Map[String, Any], configuration: JsObject): Unit = { //read all identities from the configuration identities = (configuration \ "users").as[Seq[ExampleIdentity]].map(id => id.username -> id).toMap } }
Example 108
Source File: EnvVarExtenderPluginTest.scala From marathon-example-plugins with Apache License 2.0 | 5 votes |
package mesosphere.marathon.example.plugin.env import mesosphere.marathon.plugin.ApplicationSpec import org.apache.mesos.Protos import org.scalatest.{FlatSpec, Matchers} import play.api.libs.json.{JsObject, Json} class EnvVarExtenderPluginTest extends FlatSpec with Matchers { "Initialization with a configuration" should "work" in { val f = new Fixture f.envVarExtender.envVariables should be(Map("foo" -> "bar", "key" -> "value")) } "Applying the plugin" should "work" in { val f = new Fixture val runSpec: ApplicationSpec = null val builder = Protos.TaskInfo.newBuilder() f.envVarExtender.taskInfo(runSpec, builder) builder.getCommand.getEnvironment.getVariablesList.get(0).getName should be("foo") } class Fixture { val json = """{ | "env": { | "foo": "bar", | "key": "value" | } |} """.stripMargin val config = Json.parse(json).as[JsObject] val envVarExtender = new EnvVarExtenderPlugin() envVarExtender.initialize(Map.empty, config) } }
Example 109
Source File: HttpReceptionist.scala From sumobot with Apache License 2.0 | 5 votes |
package com.sumologic.sumobot.core import java.time.Instant import akka.actor.{Actor, ActorLogging, ActorRef, Props} import com.sumologic.sumobot.core.model.PublicChannel import com.sumologic.sumobot.plugins.BotPlugin.{InitializePlugin, PluginAdded, PluginRemoved} import play.api.libs.json.{JsObject, JsValue} import slack.api.RtmStartState import slack.models.{Channel, Group, Im, Team, User} import slack.rtm.RtmState object HttpReceptionist { private[core] val DefaultChannel = Channel("C0001SUMO", "sumobot", Instant.now().getEpochSecond(), Some("U0001SUMO"), Some(false), Some(true), Some(false), Some(false), Some(true), None, Some(false), Some(false), None, None, None, None, None, None, None, None) val DefaultSumoBotChannel = PublicChannel(DefaultChannel.id, DefaultChannel.name) val DefaultBotUser = User("U0001SUMO", "sumobot-bot", None, None, None, None, None, None, None, None, None, None, None, None, None, None) val DefaultClientUser = User("U0002SUMO", "sumobot-client", None, None, None, None, None, None, None, None, None, None, None, None, None, None) private[core] val StateUrl = "" private[core] val StateTeam = Team("T0001SUMO", "Sumo Bot", "sumobot", "sumologic.com", 30, false, new JsObject(Map.empty), "std") private[core] val StateUsers: Seq[User] = Array(DefaultBotUser, DefaultClientUser) private[core] val StateChannels: Seq[Channel] = Array(DefaultChannel) private[core] val StateGroups: Seq[Group] = Seq.empty private[core] val StateIms: Seq[Im] = Seq.empty private[core] val StateBots: Seq[JsValue] = Seq.empty private[core] val StartState = RtmStartState(StateUrl, DefaultBotUser, StateTeam, StateUsers, StateChannels, StateGroups, StateIms, StateBots) private[core] val State = new RtmState(StartState) } class HttpReceptionist(brain: ActorRef) extends Actor with ActorLogging { private val pluginRegistry = context.system.actorOf(Props(classOf[PluginRegistry]), "plugin-registry") override def receive: Receive = { case message@PluginAdded(plugin, _) => plugin ! InitializePlugin(HttpReceptionist.State, brain, pluginRegistry) pluginRegistry ! message case message@PluginRemoved(_) => pluginRegistry ! message } }
Example 110
Source File: PlayJsonBackend.scala From caliban with Apache License 2.0 | 5 votes |
package caliban.interop.play import akka.http.scaladsl.unmarshalling.FromEntityUnmarshaller import caliban._ import caliban.interop.play.json.parsingException import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport import play.api.libs.json.{ JsObject, JsValue, Json } import scala.util.Try final class PlayJsonBackend extends JsonBackend with PlayJsonSupport { private def parseJson(s: String): Try[JsValue] = Try(Json.parse(s)) def parseHttpRequest( query: Option[String], op: Option[String], vars: Option[String], exts: Option[String] ): Either[Throwable, GraphQLRequest] = { val variablesJs = vars.flatMap(parseJson(_).toOption) val extensionsJs = exts.flatMap(parseJson(_).toOption) Json .obj( "query" -> query, "operationName" -> op, "variables" -> variablesJs, "extensions" -> extensionsJs ) .validate[GraphQLRequest] .asEither .left .map(parsingException) } def encodeGraphQLResponse(r: GraphQLResponse[Any]): String = Json.toJson(r).toString() def parseWSMessage(text: String): Either[Throwable, WSMessage] = parseJson(text).toEither.map { json => PlayWSMessage( (json \ "id").validate[String].getOrElse(""), (json \ "type").validate[String].getOrElse(""), (json \ "payload").validate[JsObject].asOpt ) } def encodeWSResponse[E](id: String, data: ResponseValue, errors: List[E]): String = Json.stringify( Json .obj( "id" -> id, "type" -> "data", "payload" -> GraphQLResponse(data, errors) ) ) def encodeWSError(id: String, error: Throwable): String = Json.stringify( Json .obj( "id" -> id, "type" -> "complete", "payload" -> error.toString ) ) def reqUnmarshaller: FromEntityUnmarshaller[GraphQLRequest] = implicitly }
Example 111
Source File: Duration.scala From quick-plan with Apache License 2.0 | 5 votes |
package com.github.mgifos.workouts.model import com.github.mgifos.workouts.model.DistanceUnits.DistanceUnit import play.api.libs.json.{JsNull, JsObject, Json} sealed trait Duration { def json: JsObject } case class DistanceDuration(distance: Float, unit: DistanceUnit) extends Duration { override def json: JsObject = Json.obj( "endCondition" -> Json.obj("conditionTypeKey" -> "distance", "conditionTypeId" -> 3), "preferredEndConditionUnit" -> Json.obj("unitKey" -> unit.fullName), "endConditionValue" -> unit.toMeters(distance), "endConditionCompare" -> JsNull, "endConditionZone" -> JsNull ) } case class TimeDuration(minutes: Int = 0, seconds: Int = 0) extends Duration { override def json: JsObject = Json.obj( "endCondition" -> Json.obj("conditionTypeKey" -> "time", "conditionTypeId" -> 2), "preferredEndConditionUnit" -> JsNull, "endConditionValue" -> (minutes * 60 + seconds), "endConditionCompare" -> JsNull, "endConditionZone" -> JsNull ) } object LapButtonPressed extends Duration { override def json: JsObject = Json.obj( "endCondition" -> Json.obj("conditionTypeKey" -> "lap.button", "conditionTypeId" -> 1), "preferredEndConditionUnit" -> JsNull, "endConditionValue" -> JsNull, "endConditionCompare" -> JsNull, "endConditionZone" -> JsNull ) } object Duration { private val DistanceRx = """^(\d+([\.]\d+)?)\s*(km|mi|m)$""".r private val MinutesRx = """^(\d{1,3}):(\d{2})$""".r def parse(x: String): Duration = x match { case DistanceRx(quantity, _, uom) => DistanceDuration(quantity.toFloat, DistanceUnits.named(uom)) case MinutesRx(minutes, seconds) => TimeDuration(minutes = minutes.toInt, seconds = seconds.toInt) case "lap-button" => LapButtonPressed case _ => throw new IllegalArgumentException(s"Duration cannot be parsed $x") } }
Example 112
Source File: GithubHttpSpecs.scala From releaser with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.releaser.github import org.scalatest.{Matchers, OptionValues, WordSpec} import play.api.libs.json.{JsNumber, JsObject} import play.api.libs.ws.{EmptyBody, WSAuthScheme} import uk.gov.hmrc.ServiceCredentials class GithubHttpSpecs extends WordSpec with Matchers with OptionValues{ "GithubHttpSpecs" should { "build request holder" in { val githubHttp = new GithubHttp(ServiceCredentials("Charles", "123")) val body = JsObject(Seq("a" -> JsNumber(1))) val call = githubHttp.buildCall("POST", "http://example.com", Some(body)) call.method shouldBe "POST" call.body should not be EmptyBody call.url shouldBe "http://example.com" call.auth.value shouldBe (("Charles", "123", WSAuthScheme.BASIC)) } } }
Example 113
Source File: ConsensusRouteSpec.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.http import akka.http.scaladsl.server.Route import com.wavesplatform.BlockGen import com.wavesplatform.api.http.ApiError.BlockDoesNotExist import com.wavesplatform.consensus.nxt.api.http.NxtConsensusApiRoute import com.wavesplatform.db.WithDomain import com.wavesplatform.http.ApiMarshallers._ import com.wavesplatform.state._ import org.scalatestplus.scalacheck.{ScalaCheckPropertyChecks => PropertyChecks} import play.api.libs.json.JsObject class ConsensusRouteSpec extends RouteSpec("/consensus") with RestAPISettingsHelper with PropertyChecks with BlockGen with HistoryTest with WithDomain { private def routeTest(f: (Blockchain, Route) => Any) = withDomain() { d => d.blockchainUpdater.processBlock(genesisBlock, genesisBlock.header.generationSignature) 1 to 10 foreach { _ => val block = getNextTestBlock(d.blockchainUpdater) d.blockchainUpdater.processBlock(block, block.header.generationSignature) } f(d.blockchainUpdater, NxtConsensusApiRoute(restAPISettings, d.blockchainUpdater).route) } routePath("/basetarget") - { "for existing block" in routeTest { (h, route) => val sh = h.blockHeader(3).get Get(routePath(s"/basetarget/${sh.id()}")) ~> route ~> check { (responseAs[JsObject] \ "baseTarget").as[Long] shouldEqual sh.header.baseTarget } } "for non-existent block" in routeTest { (h, route) => Get(routePath(s"/basetarget/24aTK4mg6DMFKw4SuQCfSRG52MXg8DSjDWQopahs38Cm3tPMFM1m6fGqCoPY69kstM7TE4mpJAMYmG7LWTTjndCH")) ~> route should produce(BlockDoesNotExist) } } }
Example 114
Source File: ReissueTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.assets import com.wavesplatform.account.{AddressScheme, KeyPair, PrivateKey, PublicKey} import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.Asset.IssuedAsset import com.wavesplatform.transaction._ import com.wavesplatform.transaction.serialization.impl.ReissueTxSerializer import com.wavesplatform.transaction.validation.TxValidator import com.wavesplatform.transaction.validation.impl.ReissueTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util._ case class ReissueTransaction( version: TxVersion, sender: PublicKey, asset: IssuedAsset, quantity: Long, reissuable: Boolean, fee: Long, timestamp: Long, proofs: Proofs, chainId: Byte ) extends VersionedTransaction with ProvenTransaction with SigProofsSwitch with TxWithFee.InWaves with FastHashId with LegacyPBSwitch.V3 { //noinspection TypeAnnotation override val builder = ReissueTransaction override val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.bodyBytes(this)) override val bytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(builder.serializer.toJson(this)) override def checkedAssets: Seq[IssuedAsset] = Seq(asset) } object ReissueTransaction extends TransactionParser { type TransactionT = ReissueTransaction override val typeId: TxType = 5: Byte override def supportedVersions: Set[TxVersion] = Set(1, 2, 3) implicit val validator: TxValidator[ReissueTransaction] = ReissueTxValidator implicit def sign(tx: ReissueTransaction, privateKey: PrivateKey): ReissueTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) val serializer = ReissueTxSerializer override def parseBytes(bytes: Array[TxVersion]): Try[ReissueTransaction] = serializer.parseBytes(bytes) def create( version: TxVersion, sender: PublicKey, asset: IssuedAsset, quantity: Long, reissuable: Boolean, fee: Long, timestamp: Long, proofs: Proofs, chainId: Byte = AddressScheme.current.chainId ): Either[ValidationError, ReissueTransaction] = ReissueTransaction(version, sender, asset, quantity, reissuable, fee, timestamp, proofs, chainId).validatedEither def signed( version: TxVersion, sender: PublicKey, asset: IssuedAsset, quantity: Long, reissuable: Boolean, fee: Long, timestamp: Long, signer: PrivateKey ): Either[ValidationError, ReissueTransaction] = create(version, sender, asset, quantity, reissuable, fee, timestamp, Nil).map(_.signWith(signer)) def selfSigned( version: TxVersion, sender: KeyPair, asset: IssuedAsset, quantity: Long, reissuable: Boolean, fee: Long, timestamp: Long ): Either[ValidationError, ReissueTransaction] = signed(version, sender.publicKey, asset, quantity, reissuable, fee, timestamp, sender.privateKey) }
Example 115
Source File: IssueV2Request.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.api.http.requests import com.wavesplatform.transaction.assets.IssueTransaction import play.api.libs.json.{Format, JsNumber, JsObject, Json} case class IssueV2Request( sender: String, name: String, description: String, quantity: Long, decimals: Byte, reissuable: Boolean, script: Option[String], fee: Long, timestamp: Option[Long] ) object IssueV2Request { implicit val jsonFormat: Format[IssueV2Request] = Json.format implicit class SmartIssueRequestExt(val self: IssueV2Request) extends AnyVal { def toJsObject: JsObject = Json.toJson(self).as[JsObject] + ("type" -> JsNumber(IssueTransaction.typeId.toInt)) } }
Example 116
Source File: NxtConsensusApiRoute.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.consensus.nxt.api.http import akka.http.scaladsl.server.Route import com.wavesplatform.api.http.ApiError.BlockDoesNotExist import com.wavesplatform.api.http._ import com.wavesplatform.block.BlockHeader import com.wavesplatform.common.state.ByteStr import com.wavesplatform.features.BlockchainFeatures import com.wavesplatform.settings.RestAPISettings import com.wavesplatform.state.Blockchain import play.api.libs.json.{JsObject, Json} case class NxtConsensusApiRoute(settings: RestAPISettings, blockchain: Blockchain) extends ApiRoute { override val route: Route = pathPrefix("consensus") { algo ~ basetarget ~ baseTargetId ~ generatingBalance } def generatingBalance: Route = (path("generatingbalance" / AddrSegment) & get) { address => complete(Json.obj("address" -> address.stringRepr, "balance" -> blockchain.generatingBalance(address))) } private def headerForId(blockId: ByteStr, f: BlockHeader => JsObject) = complete { (for { height <- blockchain.heightOf(blockId) meta <- blockchain.blockHeader(height) } yield f(meta.header)).toRight[ApiError](BlockDoesNotExist) } def baseTargetId: Route = (path("basetarget" / Signature) & get) { signature => headerForId(signature, m => Json.obj("baseTarget" -> m.baseTarget)) } def basetarget: Route = (path("basetarget") & get) { complete( blockchain.lastBlockHeader .map(m => Json.obj("baseTarget" -> m.header.baseTarget)) .toRight(BlockDoesNotExist) ) } def algo: Route = (path("algo") & get) { complete( if (blockchain.activatedFeatures.contains(BlockchainFeatures.FairPoS.id)) Json.obj("consensusAlgo" -> "Fair Proof-of-Stake (FairPoS)") else Json.obj("consensusAlgo" -> "proof-of-stake (PoS)") ) } }
Example 117
Source File: BlockMeta.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.api import com.wavesplatform.block.Block.protoHeaderHash import com.wavesplatform.block.serialization.BlockHeaderSerializer import com.wavesplatform.block.{Block, BlockHeader, SignedBlockHeader} import com.wavesplatform.common.state.ByteStr import monix.eval.Coeval import play.api.libs.json.{JsObject, Json} case class BlockMeta( header: BlockHeader, signature: ByteStr, headerHash: Option[ByteStr], height: Int, size: Int, transactionCount: Int, totalFeeInWaves: Long, reward: Option[Long], vrf: Option[ByteStr] ) { def toSignedHeader: SignedBlockHeader = SignedBlockHeader(header, signature) def id: ByteStr = headerHash.getOrElse(signature) val json: Coeval[JsObject] = Coeval.evalOnce { BlockHeaderSerializer.toJson(header, size, transactionCount, signature) ++ Json.obj("height" -> height, "totalFee" -> totalFeeInWaves) ++ reward.fold(Json.obj())(r => Json.obj("reward" -> r)) ++ vrf.fold(Json.obj())(v => Json.obj("VRF" -> v.toString)) ++ headerHash.fold(Json.obj())(h => Json.obj("id" -> h.toString)) } } object BlockMeta { def fromBlock(block: Block, height: Int, totalFee: Long, reward: Option[Long], vrf: Option[ByteStr]): BlockMeta = BlockMeta( block.header, block.signature, if (block.header.version >= Block.ProtoBlockVersion) Some(protoHeaderHash(block.header)) else None, height, block.bytes().length, block.transactionData.length, totalFee, reward, vrf ) }
Example 118
Source File: SetAssetScriptRequest.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.api.http.requests import com.wavesplatform.transaction.assets.SetAssetScriptTransaction import play.api.libs.json.{Format, JsNumber, JsObject, Json} case class SetAssetScriptRequest( version: Option[Byte], sender: String, assetId: String, script: Option[String], fee: Long, timestamp: Option[Long] = None ) {} object SetAssetScriptRequest { implicit val jsonFormat: Format[SetAssetScriptRequest] = Json.format implicit class SetAssetScriptRequestExt(val self: SetAssetScriptRequest) extends AnyVal { def toJsObject: JsObject = Json.toJson(self).as[JsObject] + ("type" -> JsNumber(SetAssetScriptTransaction.typeId.toInt)) } }
Example 119
Source File: CustomDirectives.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.api.http import akka.http.scaladsl.server.{Directive1, _} import com.wavesplatform.http.ApiMarshallers import com.wavesplatform.utils.ScorexLogging import monix.execution.{Scheduler, UncaughtExceptionReporter} import play.api.libs.json.JsObject trait CustomDirectives extends Directives with ApiMarshallers with ScorexLogging { def anyParam(paramName: String): Directive1[Iterable[String]] = (get & parameter(paramName.as[String].*).map(_.toSeq.reverse)) | post & (formField(paramName.as[String].*) | entity(as[JsObject]).map { jso => (jso \ s"${paramName}s").as[Iterable[String]] }) def extractScheduler: Directive1[Scheduler] = extractExecutionContext.map(ec => Scheduler(ec, UncaughtExceptionReporter((t: Throwable) => log.debug("Error processing request", t)))) }
Example 120
Source File: CompositeHttpService.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.api.http import akka.actor.ActorSystem import akka.http.scaladsl.model.HttpMethods._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.model.{HttpRequest, StatusCodes} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.RouteResult.Complete import akka.http.scaladsl.server._ import akka.http.scaladsl.server.directives.{DebuggingDirectives, LoggingMagnet} import com.wavesplatform.settings.RestAPISettings import com.wavesplatform.utils.ScorexLogging case class CompositeHttpService(routes: Seq[ApiRoute], settings: RestAPISettings)(system: ActorSystem) extends ScorexLogging { private val redirectToSwagger = redirect("/api-docs/index.html", StatusCodes.PermanentRedirect) private val swaggerRoute: Route = (pathEndOrSingleSlash | path("swagger"))(redirectToSwagger) ~ pathPrefix("api-docs") { pathEndOrSingleSlash(redirectToSwagger) ~ path("swagger.json")(complete(patchedSwaggerJson)) ~ getFromResourceDirectory("swagger-ui") } val compositeRoute: Route = extendRoute(routes.map(_.route).reduce(_ ~ _)) ~ swaggerRoute ~ complete(StatusCodes.NotFound) val loggingCompositeRoute: Route = Route.seal(DebuggingDirectives.logRequestResult(LoggingMagnet(_ => logRequestResponse))(compositeRoute)) private def logRequestResponse(req: HttpRequest)(res: RouteResult): Unit = res match { case Complete(resp) => val msg = s"HTTP ${resp.status.value} from ${req.method.value} ${req.uri}" if (resp.status == StatusCodes.OK) log.info(msg) else log.warn(msg) case _ => } private val corsAllowedHeaders = (if (settings.apiKeyDifferentHost) List("api_key", "X-API-Key") else List.empty[String]) ++ Seq("Authorization", "Content-Type", "X-Requested-With", "Timestamp", "Signature") private def corsAllowAll = if (settings.cors) respondWithHeader(`Access-Control-Allow-Origin`.*) else pass private def extendRoute(base: Route): Route = handleAllExceptions { if (settings.cors) { ctx => val extendedRoute = corsAllowAll(base) ~ options { respondWithDefaultHeaders( `Access-Control-Allow-Credentials`(true), `Access-Control-Allow-Headers`(corsAllowedHeaders), `Access-Control-Allow-Methods`(OPTIONS, POST, PUT, GET, DELETE) )(corsAllowAll(complete(StatusCodes.OK))) } extendedRoute(ctx) } else base } private[this] lazy val patchedSwaggerJson = { import com.wavesplatform.Version import com.wavesplatform.account.AddressScheme import play.api.libs.json.{JsObject, Json} def chainIdString: String = if (Character.isAlphabetic(AddressScheme.current.chainId)) AddressScheme.current.chainId.toChar.toString else s"#${AddressScheme.current.chainId}" val json = Json.parse(getClass.getClassLoader.getResourceAsStream("swagger-ui/swagger.json")).as[JsObject] val patchedInfo = (json \ "info").as[JsObject] ++ Json.obj( "version" -> Version.VersionString, "title" -> s"Waves Full Node ($chainIdString)" ) json ++ Json.obj("info" -> patchedInfo) } }
Example 121
Source File: LeaseTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.lease import com.wavesplatform.account.{AddressOrAlias, KeyPair, PrivateKey, PublicKey} import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.serialization.impl.LeaseTxSerializer import com.wavesplatform.transaction.validation.impl.LeaseTxValidator import com.wavesplatform.transaction._ import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try final case class LeaseTransaction( version: TxVersion, sender: PublicKey, recipient: AddressOrAlias, amount: TxAmount, fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte ) extends SigProofsSwitch with VersionedTransaction with TxWithFee.InWaves with FastHashId with LegacyPBSwitch.V3 { override def builder: TransactionParser = LeaseTransaction override val bodyBytes: Coeval[Array[TxVersion]] = Coeval.evalOnce(LeaseTransaction.serializer.bodyBytes(this)) override val bytes: Coeval[Array[TxVersion]] = Coeval.evalOnce(LeaseTransaction.serializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(LeaseTransaction.serializer.toJson(this)) } object LeaseTransaction extends TransactionParser { type TransactionT = LeaseTransaction val supportedVersions: Set[TxVersion] = Set(1, 2, 3) val typeId: TxType = 8: Byte implicit val validator = LeaseTxValidator val serializer = LeaseTxSerializer implicit def sign(tx: LeaseTransaction, privateKey: PrivateKey): LeaseTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) override def parseBytes(bytes: Array[TxVersion]): Try[LeaseTransaction] = serializer.parseBytes(bytes) def create( version: TxVersion, sender: PublicKey, recipient: AddressOrAlias, amount: TxAmount, fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs ): Either[ValidationError, TransactionT] = LeaseTransaction(version, sender, recipient, amount, fee, timestamp, proofs, recipient.chainId).validatedEither def signed( version: TxVersion, sender: PublicKey, recipient: AddressOrAlias, amount: TxAmount, fee: TxAmount, timestamp: TxTimestamp, signer: PrivateKey ): Either[ValidationError, TransactionT] = create(version, sender, recipient, amount, fee, timestamp, Nil).map(_.signWith(signer)) def selfSigned( version: TxVersion, sender: KeyPair, recipient: AddressOrAlias, amount: TxAmount, fee: TxAmount, timestamp: TxTimestamp ): Either[ValidationError, TransactionT] = signed(version, sender.publicKey, recipient, amount, fee, timestamp, sender.privateKey) }
Example 122
Source File: LeaseCancelTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.lease import com.wavesplatform.account.{AddressScheme, PrivateKey, PublicKey} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction._ import com.wavesplatform.transaction.serialization.impl.LeaseCancelTxSerializer import com.wavesplatform.transaction.validation.TxValidator import com.wavesplatform.transaction.validation.impl.LeaseCancelTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try final case class LeaseCancelTransaction( version: TxVersion, sender: PublicKey, leaseId: ByteStr, fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte ) extends SigProofsSwitch with VersionedTransaction with TxWithFee.InWaves with FastHashId with LegacyPBSwitch.V3 { override def builder: TransactionParser = LeaseCancelTransaction override val bodyBytes: Coeval[Array[TxVersion]] = Coeval.evalOnce(LeaseCancelTxSerializer.bodyBytes(this)) override val bytes: Coeval[Array[TxVersion]] = Coeval.evalOnce(LeaseCancelTxSerializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(LeaseCancelTxSerializer.toJson(this)) } object LeaseCancelTransaction extends TransactionParser { type TransactionT = LeaseCancelTransaction val supportedVersions: Set[TxVersion] = Set(1, 2, 3) val typeId: TxType = 9: Byte implicit val validator: TxValidator[LeaseCancelTransaction] = LeaseCancelTxValidator implicit def sign(tx: LeaseCancelTransaction, privateKey: PrivateKey): LeaseCancelTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) override def parseBytes(bytes: Array[Byte]): Try[LeaseCancelTransaction] = LeaseCancelTxSerializer.parseBytes(bytes) def create( version: TxVersion, sender: PublicKey, leaseId: ByteStr, fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte = AddressScheme.current.chainId ): Either[ValidationError, TransactionT] = LeaseCancelTransaction(version, sender, leaseId, fee, timestamp, proofs, chainId).validatedEither def signed( version: TxVersion, sender: PublicKey, leaseId: ByteStr, fee: TxAmount, timestamp: TxTimestamp, signer: PrivateKey ): Either[ValidationError, TransactionT] = create(version, sender, leaseId, fee, timestamp, Nil).map(_.signWith(signer)) }
Example 123
Source File: Transaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction import com.wavesplatform.common.state.ByteStr import com.wavesplatform.protobuf.transaction.PBTransactions import com.wavesplatform.transaction.Asset.IssuedAsset import monix.eval.Coeval import play.api.libs.json.JsObject trait Transaction { val id: Coeval[ByteStr] def typeId: Byte = builder.typeId def builder: TransactionParser def assetFee: (Asset, Long) def timestamp: Long def chainId: Byte def bytesSize: Int = bytes().length val protoSize: Coeval[Int] = Coeval(PBTransactions.protobuf(this).serializedSize) val bytes: Coeval[Array[Byte]] val json: Coeval[JsObject] override def toString: String = json().toString override def equals(other: Any): Boolean = other match { case tx: Transaction => id() == tx.id() case _ => false } override def hashCode(): Int = id().hashCode val bodyBytes: Coeval[Array[Byte]] def checkedAssets: Seq[IssuedAsset] = Nil } object Transaction { type Type = Byte val V1: TxVersion = TxVersion.V1 val V2: TxVersion = TxVersion.V2 }
Example 124
Source File: SponsorFeeTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.assets import com.wavesplatform.account.{AddressScheme, KeyPair, PrivateKey, PublicKey} import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.Asset.IssuedAsset import com.wavesplatform.transaction._ import com.wavesplatform.transaction.serialization.impl.SponsorFeeTxSerializer import com.wavesplatform.transaction.validation.TxValidator import com.wavesplatform.transaction.validation.impl.SponsorFeeTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try case class SponsorFeeTransaction( version: TxVersion, sender: PublicKey, asset: IssuedAsset, minSponsoredAssetFee: Option[TxAmount], fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte ) extends ProvenTransaction with VersionedTransaction with TxWithFee.InWaves with FastHashId with LegacyPBSwitch.V2 { override val builder: SponsorFeeTransaction.type = SponsorFeeTransaction val bodyBytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.bodyBytes(this)) override val bytes: Coeval[Array[Byte]] = Coeval.evalOnce(builder.serializer.toBytes(this)) override val json: Coeval[JsObject] = Coeval.evalOnce(builder.serializer.toJson(this)) override val checkedAssets: Seq[IssuedAsset] = Seq(asset) } object SponsorFeeTransaction extends TransactionParser { type TransactionT = SponsorFeeTransaction override val typeId: TxType = 14: Byte override val supportedVersions: Set[TxVersion] = Set(1, 2) implicit val validator: TxValidator[SponsorFeeTransaction] = SponsorFeeTxValidator implicit def sign(tx: SponsorFeeTransaction, privateKey: PrivateKey): SponsorFeeTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) val serializer = SponsorFeeTxSerializer override def parseBytes(bytes: Array[TxVersion]): Try[SponsorFeeTransaction] = serializer.parseBytes(bytes) def create( version: TxVersion, sender: PublicKey, asset: IssuedAsset, minSponsoredAssetFee: Option[TxTimestamp], fee: TxAmount, timestamp: TxTimestamp, proofs: Proofs, chainId: Byte = AddressScheme.current.chainId ): Either[ValidationError, SponsorFeeTransaction] = SponsorFeeTransaction(version, sender, asset, minSponsoredAssetFee, fee, timestamp, proofs, chainId).validatedEither def signed( version: TxVersion, sender: PublicKey, asset: IssuedAsset, minSponsoredAssetFee: Option[TxTimestamp], fee: TxAmount, timestamp: TxTimestamp, signer: PrivateKey ): Either[ValidationError, SponsorFeeTransaction] = create(version, sender, asset, minSponsoredAssetFee, fee, timestamp, Proofs.empty).map(_.signWith(signer)) def selfSigned( version: TxVersion, sender: KeyPair, asset: IssuedAsset, minSponsoredAssetFee: Option[TxTimestamp], fee: TxAmount, timestamp: TxTimestamp ): Either[ValidationError, SponsorFeeTransaction] = signed(version, sender.publicKey, asset, minSponsoredAssetFee, fee, timestamp, sender.privateKey) }
Example 125
Source File: BurnTransaction.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.transaction.assets import com.wavesplatform.account.{AddressScheme, KeyPair, PrivateKey, PublicKey} import com.wavesplatform.crypto import com.wavesplatform.lang.ValidationError import com.wavesplatform.transaction.Asset.IssuedAsset import com.wavesplatform.transaction._ import com.wavesplatform.transaction.serialization.impl.BurnTxSerializer import com.wavesplatform.transaction.validation.TxValidator import com.wavesplatform.transaction.validation.impl.BurnTxValidator import monix.eval.Coeval import play.api.libs.json.JsObject import scala.util.Try final case class BurnTransaction( version: TxVersion, sender: PublicKey, asset: IssuedAsset, quantity: Long, fee: Long, timestamp: Long, proofs: Proofs, chainId: Byte ) extends ProvenTransaction with VersionedTransaction with SigProofsSwitch with TxWithFee.InWaves with FastHashId with LegacyPBSwitch.V3 { override def builder: TransactionParser = BurnTransaction override val bodyBytes: Coeval[Array[Byte]] = BurnTxSerializer.bodyBytes(this) override val bytes: Coeval[Array[Byte]] = BurnTxSerializer.toBytes(this) override val json: Coeval[JsObject] = BurnTxSerializer.toJson(this) override def checkedAssets: Seq[IssuedAsset] = Seq(asset) } object BurnTransaction extends TransactionParser { type TransactionT = BurnTransaction override val typeId: TxType = 6: Byte override val supportedVersions: Set[TxVersion] = Set(1, 2, 3) implicit val validator: TxValidator[BurnTransaction] = BurnTxValidator implicit def sign(tx: BurnTransaction, privateKey: PrivateKey): BurnTransaction = tx.copy(proofs = Proofs(crypto.sign(privateKey, tx.bodyBytes()))) val serializer = BurnTxSerializer override def parseBytes(bytes: Array[TxVersion]): Try[BurnTransaction] = serializer.parseBytes(bytes) def create( version: TxVersion, sender: PublicKey, asset: IssuedAsset, quantity: Long, fee: Long, timestamp: Long, proofs: Proofs, chainId: Byte = AddressScheme.current.chainId ): Either[ValidationError, BurnTransaction] = BurnTransaction(version, sender, asset, quantity, fee, timestamp, proofs, chainId).validatedEither def signed( version: TxVersion, sender: PublicKey, asset: IssuedAsset, quantity: Long, fee: Long, timestamp: Long, signer: PrivateKey ): Either[ValidationError, BurnTransaction] = create(version, sender, asset, quantity, fee, timestamp, Proofs.empty).map(_.signWith(signer)) def selfSigned( version: TxVersion, sender: KeyPair, asset: IssuedAsset, quantity: Long, fee: Long, timestamp: Long ): Either[ValidationError, BurnTransaction] = { signed(version, sender.publicKey, asset, quantity, fee, timestamp, sender.privateKey) } }