Skip to content

Commit

Permalink
Merge pull request #2 from lombardo-chcg/integrate-sql
Browse files Browse the repository at this point in the history
Integrate sql
  • Loading branch information
lombardo-chcg committed Apr 9, 2017
2 parents 2532140 + b3393ad commit cb06651
Show file tree
Hide file tree
Showing 7 changed files with 178 additions and 38 deletions.
3 changes: 2 additions & 1 deletion build.sbt
Expand Up @@ -28,7 +28,8 @@ libraryDependencies ++= Seq(
"org.eclipse.jetty" % "jetty-webapp" % "9.2.15.v20160210" % "container;compile",
"javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided",
"org.scalatra" %% "scalatra-json" % ScalatraVersion,
"org.json4s" %% "json4s-jackson" % "3.5.0"
"org.json4s" %% "json4s-jackson" % "3.5.0",
"postgresql" % "postgresql" % "9.1-901.jdbc4"
)

scalateTemplateConfig in Compile := {
Expand Down
3 changes: 2 additions & 1 deletion src/main/scala/ScalatraBootstrap.scala
@@ -1,9 +1,10 @@
import com.lombardo.app._
import com.lombardo.app.resources._
import org.scalatra._
import javax.servlet.ServletContext

class ScalatraBootstrap extends LifeCycle {
override def init(context: ServletContext) {
context.mount(new DemoApiServlet, "/*")
context.mount(new GreetingServlet, "/*")
}
}
35 changes: 0 additions & 35 deletions src/main/scala/com/lombardo/app/DemoApiServlet.scala

This file was deleted.

37 changes: 37 additions & 0 deletions src/main/scala/com/lombardo/app/resources/GreetingServlet.scala
@@ -0,0 +1,37 @@
package com.lombardo.app.resources

import org.json4s.{DefaultFormats, Formats}
import org.scalatra.json._
import org.slf4j.LoggerFactory
import com.lombardo.app._
import com.lombardo.app.services.GreetingService

class GreetingServlet extends DemoapiStack with JacksonJsonSupport {

protected implicit val jsonFormats: Formats = DefaultFormats
val logger = LoggerFactory.getLogger(getClass)
val greetingService = new GreetingService()


before() {
contentType = formats("json")
}

get("/greetings/?") {
logger.info("GET /greetings")

greetingService.getAll
}

get ("/greetings/:id") {
logger.info("GET /greetings/" + params("id"))

try {
val id = params("id").toInt
greetingService.getOne(id)
} catch {
case e: NumberFormatException => response.setStatus(400)
"message" -> "param must be valid number"
}
}
}
36 changes: 36 additions & 0 deletions src/main/scala/com/lombardo/app/services/GreetingService.scala
@@ -0,0 +1,36 @@
package com.lombardo.app.services

import java.sql.Timestamp

import org.slf4j.LoggerFactory
import com.lombardo.app.services.RepositoryService

class GreetingService {

val logger = LoggerFactory.getLogger(getClass)
val repoService = new RepositoryService

case class Greeting(id: Int, language: String, content: String, create_date: String)

def getAll: List[Greeting] = {
val greetings = repoService
.findAll("greetings")
.map { dbResult => convertToGreeting(dbResult) }

greetings
}

def getOne(id: Int): Greeting = {
val rawGreeting = repoService
.findOne("greetings", id)

convertToGreeting(rawGreeting)
}


private def convertToGreeting(dbResult: Map[String, String]): Greeting = {
val greeting = Greeting(dbResult("id").toInt, dbResult("language"), dbResult("content"), dbResult("create_date"))

greeting
}
}
99 changes: 99 additions & 0 deletions src/main/scala/com/lombardo/app/services/RepositoryService.scala
@@ -0,0 +1,99 @@
package com.lombardo.app.services

import java.sql._

import org.postgresql._
import org.slf4j.LoggerFactory

class RepositoryService {

val logger = LoggerFactory.getLogger(getClass)
val postgresUri = "jdbc:postgresql://0.0.0.0:5431/greeting"
val postgresUsername = "postgres"
val postgresPassword = "postgres"

def findAll(resource: String) : List[Map[String, String]] = {
try {
Class.forName("org.postgresql.Driver")
val pgConnection = DriverManager.getConnection(postgresUri, postgresUsername, postgresPassword)

logger.info("PG connection established")

val dbMetaData = pgConnection.getMetaData
val columns = getColumnNames(dbMetaData, resource)

val sql = "select * from " + resource
val resultSet = pgConnection.createStatement.executeQuery(sql)
val allRows = List.newBuilder[Map[String, String]]

while (resultSet.next) {
allRows += getRow(resultSet, columns)
}

resultSet.close
pgConnection.close

allRows.result
} catch {
case e =>

val errorText = e.toString

logger.error(errorText)
List()
}
}

def findOne(resource: String, id: Int) : Map[String, String] = {
try {
Class.forName("org.postgresql.Driver")
val pgConnection = DriverManager.getConnection(postgresUri, postgresUsername, postgresPassword)

logger.info("PG connection established")

val dbMetaData = pgConnection.getMetaData
val columns = getColumnNames(dbMetaData, resource)

val sql = "select * from " + resource + " where id = " + id
val resultSet = pgConnection.createStatement.executeQuery(sql)
val output = Map.newBuilder[String, String]

resultSet.next

val row = getRow(resultSet, columns)

resultSet.close
pgConnection.close

row
} catch {
case e =>

val errorText = e.toString

logger.error(errorText)
Map()
}
}

private def getColumnNames(metaData: DatabaseMetaData, tableName: String): List[String] = {
val cols = metaData.getColumns(null, null, tableName, null)
val columnNames = List.newBuilder[String]

while (cols.next) {
columnNames += cols.getString("COLUMN_NAME")
}

columnNames.result
}

private def getRow(resultSet: ResultSet, columns: List[String]): Map[String, String] = {
val row = Map.newBuilder[String, String]

columns.foreach(col =>
row += (col -> resultSet.getString(col))
)

row.result
}
}
3 changes: 2 additions & 1 deletion src/test/scala/com/lombardo/app/DemoApiServletSpec.scala
@@ -1,14 +1,15 @@
package com.lombardo.app

import org.scalatra.test.specs2._
import com.lombardo.app.resources._

// For more on Specs2, see http://etorreborre.github.com/specs2/guide/org.specs2.guide.QuickStart.html
class DemoApiServletSpec extends ScalatraSpec { def is =
"GET / on DemoApiServlet" ^
"should return status 200" ! root200^
end

addServlet(classOf[DemoApiServlet], "/*")
addServlet(classOf[GreetingServlet], "/*")

def root200 = get("/") {
status must_== 200
Expand Down

0 comments on commit cb06651

Please sign in to comment.