Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import ch.wsl.box.client.views.elements.Offline
import ch.wsl.box.client.views.helpers.{PopupFrame, TableColumnDrag}
import ch.wsl.box.model.shared.EntityKind.VIEW
import ch.wsl.box.model.shared.GeoJson.Polygon
import ch.wsl.box.model.shared.JSONFieldTypes.{ARRAY_NUMBER, ARRAY_STRING}
import ch.wsl.box.model.shared.geo.GeoDataRequest
import ch.wsl.box.model.shared._
import ch.wsl.box.shared.utils.JSONUtils.EnhancedJson
Expand Down Expand Up @@ -444,7 +445,7 @@ case class EntityTablePresenter(model:ModelProperty[EntityTableModel], onSelect:
qWithFullText.copy(
fields = Some(selectedFields),
lookups = Some(metadata.flatMap(_.fields)
.filter(x => selectedFields.contains(x.name))
.filter(x => selectedFields.contains(x.name) && !Seq(ARRAY_NUMBER,ARRAY_STRING).contains(x.`type`))
.flatMap( x=> x.lookup match {
case Some(value) => value match {
case r:JSONFieldLookupRemote => Some(r)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ object ExportWidget extends ComponentWidgetFactory {
c <- field.child
m <- params.children.find(_.objId == c.objId)
} yield {
val childFilters = c.mapping.map(m => JSONQueryFilter.WHERE.eq(m.child,params.allData.get.get(m.parent)))
ExportParams(m,m.table,c.childQuery.getOrElse(JSONQuery.empty).filterWith(childFilters:_*))
ExportParams(m,m.table,c.query(params.allData.get))
}

override def killWidget(): Unit = {
Expand Down
3 changes: 2 additions & 1 deletion codegen/src/main/scala/BaseCodeGenerator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ import slick.jdbc.meta.MTable
import net.ceedubs.ficus.Ficus._

import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.concurrent.duration._

case class GeneratorParams(tables:Seq[String],views:Seq[String],excludes:Seq[String],excludeFields:Seq[String],schema:String,boxSchema:String, postgisSchema:String,langs:Seq[String])

trait BaseCodeGenerator {

implicit def _ex:ExecutionContext

def dbSchema:String
def connection:Connection
def generatorParams:GeneratorParams
Expand Down
10 changes: 6 additions & 4 deletions codegen/src/main/scala/CustomizedCodeGenerator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ import scribe.{Level, Logger, Priority}
import scribe.filter.{level, packageName, select}
import slick.codegen.SourceCodeGenerator

import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Await, ExecutionContext}
import scala.concurrent.duration.DurationInt


Expand All @@ -28,7 +27,8 @@ case class GeneratedFiles(
fieldRegistry: FieldAccessGenerator
)

case class CodeGenerator(dbSchema:String,connection:Connection, generatorParams:GeneratorParams) extends BaseCodeGenerator {
case class CodeGenerator(dbSchema:String,connection:Connection, generatorParams:GeneratorParams)(implicit val _ex:ExecutionContext) extends BaseCodeGenerator {


def generatedFiles(): GeneratedFiles = {

Expand Down Expand Up @@ -72,7 +72,9 @@ object CustomizedCodeGenerator {

val connection = new ConnectionConfImpl()

CodeGeneratorWriter.write(connection,params,args(0),"ch.wsl.box.generated")
val ex = ExecutionContext.fromExecutorService(null)

CodeGeneratorWriter.write(connection,params,args(0),"ch.wsl.box.generated")(ex)

}

Expand Down
5 changes: 2 additions & 3 deletions codegen/src/main/scala/FieldAccessGenerator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@ import ch.wsl.box.jdbc.{Connection, Managed, TypeMapping}
import ch.wsl.box.model.shared.JSONFieldTypes
import slick.model.Model

import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Await, ExecutionContext}
import scala.concurrent.duration.DurationInt



case class FieldAccessGenerator(connection:Connection,tabs:Seq[String], views:Seq[String], model:Model,box_schema:String) extends slick.codegen.SourceCodeGenerator(model)
case class FieldAccessGenerator(connection:Connection,tabs:Seq[String], views:Seq[String], model:Model,box_schema:String)(implicit ex:ExecutionContext) extends slick.codegen.SourceCodeGenerator(model)
with BoxSourceCodeGenerator
with slick.codegen.OutputHelpers {

Expand Down
2 changes: 2 additions & 0 deletions codegen/src/main/scala/ch/wsl/box/jdbc/Connection.scala
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ trait Connection extends Logging {

def adminDB = dbForUser(adminUser,"box_admin",adminDbConnection)

def checkConnection()(implicit ex:ExecutionContext) = adminDB.run(sql"select 1".as[Int].head).map(_ == 1)


def dbForUser(name: String,app_user:String,db:box.jdbc.PostgresProfile.backend.Database = dbConnection): UserDatabase = new UserDatabase {

Expand Down
4 changes: 3 additions & 1 deletion project/Settings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,9 @@ object Settings {
"com.typesafe.akka" %% "akka-http-testkit"% versions.akkaHttp % "test",
"com.dimafeng" %% "testcontainers-scala-scalatest" % versions.testcontainersScalaVersion % "test",
"ch.wavein" %% "scala-thumbnailer" % "0.8.0",
"com.openhtmltopdf" % "openhtmltopdf-pdfbox" % "1.0.9",
// "com.openhtmltopdf" % "openhtmltopdf-pdfbox" % "1.0.9",
"com.github.librepdf" % "openpdf" % "3.0.5",
"com.github.librepdf" % "openpdf-html" % "3.0.5",
"org.jsoup" % "jsoup" % "1.23.1",
"com.github.spullara.mustache.java" % "compiler" % "0.9.6",
"com.fasterxml.jackson.core" % "jackson-databind" % "2.10.3",
Expand Down
4 changes: 3 additions & 1 deletion server/src/main/scala/ch/wsl/box/rest/Boot.scala
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,9 @@ object Boot extends App {
for {
res <- server.start()
} yield res
}.recover{ case t => t.printStackTrace(); throw t}
}.recover{ case t => t.printStackTrace();
running = false
throw t}
while(running) { Thread.sleep(1000) }
Await.result(binding.flatMap(_.unbind()), 20.seconds)
}
Expand Down
4 changes: 3 additions & 1 deletion server/src/main/scala/ch/wsl/box/rest/Module.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import com.softwaremill.session.{InMemoryRefreshTokenStorage, RefreshTokenStorag
import scribe.Logging
import wvlet.airframe._

import java.util.concurrent.Executors
import scala.concurrent.{Await, ExecutionContext}
import scala.concurrent.duration._

Expand All @@ -40,7 +41,8 @@ object DefaultModule extends Module {

val injector = newDesign
.bind[ExecutionContext].toInstance{
scala.concurrent.ExecutionContext.global
//val executor = Executors.newFixedThreadPool(16)
ExecutionContext.fromExecutorService(null)
}
.bind[ActorSystem].toInstance{
ActorSystem()
Expand Down
31 changes: 18 additions & 13 deletions server/src/main/scala/ch/wsl/box/rest/auth/oidc/AuthFlow.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,28 @@ import io.circe.generic.auto._

import scala.concurrent.{ExecutionContext, Future}

object AuthFlow {
case class OpenIDToken(
access_token:String,
expires_in: Int,
refresh_expires_in: Option[Int],
refresh_token: Option[String],
token_type: String,
session_state: Option[String],
scope: Option[String]
)

class AuthFlow(implicit ec:ExecutionContext) {




case class OpenIDToken(
access_token:String,
expires_in: Int,
refresh_expires_in: Option[Int],
refresh_token: Option[String],
token_type: String,
session_state: Option[String],
scope: Option[String]
)



val backend = DefaultFutureBackend()


private def currentUserFromUserInfo(provider:OIDCConf,userInfo: UserInfo)(implicit ec:ExecutionContext, services:Services):Future[CurrentUser] = {
private def currentUserFromUserInfo(provider:OIDCConf,userInfo: UserInfo)(implicit services:Services):Future[CurrentUser] = {

val dbUser = services.config.singleUser match {
case true => services.connection.user
Expand Down Expand Up @@ -64,7 +66,7 @@ object AuthFlow {
// "session_state": "57b36158-2ad7-4614-80bf-3aa037ab38fe",
// "scope": "email profile"
// }
def code(provider:OIDCConf,c:String,code_verifier:Option[String])(implicit ex:ExecutionContext, services: Services):Future[Either[ResponseException[String],CurrentUser]] = {
def code(provider:OIDCConf,c:String,code_verifier:Option[String])(implicit services: Services):Future[Either[ResponseException[String],CurrentUser]] = {

def authToken = {

Expand Down Expand Up @@ -121,7 +123,7 @@ object AuthFlow {
}


def code(provider_id:String,c:String,state:String)(implicit ex:ExecutionContext, services: Services):Future[Either[ResponseException[String],CurrentUser]] = {
def code(provider_id:String,c:String,state:String)(implicit services: Services):Future[Either[ResponseException[String],CurrentUser]] = {

services.config.openid.find(_.provider_id == provider_id) match {
case Some(provider) if provider.jwks.isEmpty => code(provider, c,None)
Expand All @@ -131,6 +133,9 @@ object AuthFlow {
case None => Future.failed(new Exception(s"OIDC Provider $provider_id not found"))
}

}.recover{ case t:Throwable =>
t.printStackTrace()
throw t
}


Expand Down
58 changes: 29 additions & 29 deletions server/src/main/scala/ch/wsl/box/rest/io/pdf/OpenHtmlToPDF.scala
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
package ch.wsl.box.rest.io.pdf

import java.io.ByteArrayOutputStream

import akka.stream.scaladsl.{Source, StreamConverters}
import akka.util.ByteString
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder
import org.jsoup.Jsoup
import org.jsoup.helper.W3CDom

class OpenHtmlToPDF extends Pdf {
override def render(html: String): Array[Byte] = {
val os = new ByteArrayOutputStream();
val pdfRenderer = new PdfRendererBuilder
val htmlDocument = html5ParseDocument(html)
pdfRenderer.withW3cDocument(htmlDocument, "http://localhost:8080/")
//pdfRenderer.withHtmlContent(html, "/")
pdfRenderer.toStream(os)
pdfRenderer.run()
os.close()
println("rendered finished")
os.toByteArray
}

private def html5ParseDocument(html:String):org.w3c.dom.Document = {
new W3CDom().fromJsoup(Jsoup.parse(html))
}

}
//package ch.wsl.box.rest.io.pdf
//
//import java.io.ByteArrayOutputStream
//
//import akka.stream.scaladsl.{Source, StreamConverters}
//import akka.util.ByteString
//import com.openhtmltopdf.pdfboxout.PdfRendererBuilder
//import org.jsoup.Jsoup
//import org.jsoup.helper.W3CDom
//
//class OpenHtmlToPDF extends Pdf {
// override def render(html: String): Array[Byte] = {
// val os = new ByteArrayOutputStream();
// val pdfRenderer = new PdfRendererBuilder
// val htmlDocument = html5ParseDocument(html)
// pdfRenderer.withW3cDocument(htmlDocument, "http://localhost:8080/")
// //pdfRenderer.withHtmlContent(html, "/")
// pdfRenderer.toStream(os)
// pdfRenderer.run()
// os.close()
// println("rendered finished")
// os.toByteArray
// }
//
// private def html5ParseDocument(html:String):org.w3c.dom.Document = {
// new W3CDom().fromJsoup(Jsoup.parse(html))
// }
//
//}
41 changes: 41 additions & 0 deletions server/src/main/scala/ch/wsl/box/rest/io/pdf/OpenPDF.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package ch.wsl.box.rest.io.pdf

import org.jsoup.Jsoup
import org.jsoup.helper.W3CDom
import org.openpdf.pdf.ITextRenderer
import org.openpdf.resource.{HtmlParserConfig, HtmlResource}

import java.io.ByteArrayOutputStream

class OpenPDF extends Pdf {

override def render(html: String): Array[Byte] = {
val os = new ByteArrayOutputStream()

// // Parse with custom configuration
// val config = HtmlParserConfig.builder
// .reportErrors(true)
// .allowSelfClosingTags(true)
// .encoding("UTF-8").build
// val resource = HtmlResource.load(html, config)


val doc = Jsoup.parse(html.linesIterator.mkString(""))
println(doc.outerHtml)
val renderer = new ITextRenderer
renderer.setDocument(new W3CDom().fromJsoup(doc))
//renderer.setDocumentFromString(doc.outerHtml)
renderer.layout
renderer.createPDF(os)


os.close()
println("rendered finished")
os.toByteArray
}

private def html5ParseDocument(html:String):org.w3c.dom.Document = {
new W3CDom().fromJsoup(Jsoup.parse(html))
}

}
2 changes: 1 addition & 1 deletion server/src/main/scala/ch/wsl/box/rest/io/pdf/Pdf.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import akka.util.ByteString

object Pdf {

private val pdf:Pdf = new OpenHtmlToPDF();
private val pdf:Pdf = new OpenPDF();

def render(html:String): Array[Byte] = pdf.render(html)
}
Expand Down
14 changes: 1 addition & 13 deletions server/src/main/scala/ch/wsl/box/rest/logic/FormActions.scala
Original file line number Diff line number Diff line change
Expand Up @@ -390,22 +390,10 @@ case class FormActions(metadata:JSONMetadata,

override def updateDiff(diff: JSONDiff):DBIO[Option[Json]] = ???

private def createQuery(entity:Json, child: Child):JSONQuery = {
val parentFilter = for{
m <- child.mapping
} yield {
JSONQueryFilter.withValue(m.child,Some(Filter.EQUALS),entity.get(m.parent))
}

val filters = parentFilter ++ child.childQuery.toSeq.flatMap(_.filter)



child.childQuery.getOrElse(JSONQuery.empty).copy(filter=filters.toList.distinct)
}

private def getChild(dataJson:Json, metadata:JSONMetadata, field:JSONField, child:Child):DBIO[Seq[Json]] = {
val query = createQuery(dataJson,child)
val query = child.query(dataJson)
FormActions(metadata,registry,metadataFactory,Some(field)).findSimple(query)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ trait RuntimePSQL{

trait RuntimeUtils{
def qrCode(url:String):String
def swissTopoMap(geometry:Option[Json], width:Int, height:Int, padding:Int = 500):String
def swissTopoMap(geometry:Option[Json], width:Int, height:Int, padding:Int = 500)(implicit ec:ExecutionContext):String
}

case class Context(data:Json,ws:RuntimeWS,psql:RuntimePSQL,utils:RuntimeUtils)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
import io.circe.Json

import java.util
import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Await, ExecutionContext}
import scala.concurrent.duration.DurationInt

object UtilsImpl extends RuntimeUtils {
Expand All @@ -36,7 +35,7 @@ object UtilsImpl extends RuntimeUtils {
result
}

override def swissTopoMap(geomJS: Option[Json], width:Int, height:Int, padding:Int = 500): String = {
override def swissTopoMap(geomJS: Option[Json], width:Int, height:Int, padding:Int = 500)(implicit ec:ExecutionContext): String = {
import Geometry._
val geometry = geomJS.get.as[Geometry].toOption.get
val minX = geometry.allCoordinates.map(_.x).min
Expand Down
10 changes: 6 additions & 4 deletions server/src/main/scala/ch/wsl/box/rest/routes/Root.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ import ch.wsl.box.rest.{Box, Module}
import ch.wsl.box.rest.routes.v1.ApiV1
import ch.wsl.box.services.Services

import scala.util.{Failure, Success}
import scala.concurrent.duration.DurationInt
import scala.util.{Failure, Success, Try}

/**
* Created by andreaminetti on 15/03/16.
Expand Down Expand Up @@ -55,9 +56,10 @@ case class Root(appVersion:String,uiVersion:String,akkaConf:Config, origins:Seq[

def status = path("status") {
get {
complete(
HttpResponse(entity = HttpEntity(ContentTypes.`text/plain(UTF-8)`,"RUNNING"))
)
Try(Await.result(services.connection.checkConnection(),2.seconds)) match {
case Success(true) => complete(HttpResponse(entity = HttpEntity(ContentTypes.`text/plain(UTF-8)`,"RUNNING")))
case _ => complete(StatusCodes.ServiceUnavailable, "DB Connection error")
}
}
}

Expand Down
Loading
Loading