From 750f916afae70735c85ef72db79ccf16aff5e231 Mon Sep 17 00:00:00 2001 From: harmindar Date: Fri, 8 Nov 2019 17:53:13 -0700 Subject: [PATCH 1/6] Added Enums and used them to replace arbitrary constants used to pass error return values internally. --- .../newlibertie/pollster/DataAdapter.scala | 27 ++++++---- .../newlibertie/pollster/api/v1/PollApi.scala | 16 ++++-- .../errorenum/ApplicationErrorEnum.scala | 9 ++++ .../pollster/errorenum/BaseErrorEnum.scala | 49 +++++++++++++++++++ .../errorenum/DatabaseErrorEnum.scala | 14 ++++++ .../com/newlibertie/pollster/impl/Poll.scala | 8 +-- 6 files changed, 106 insertions(+), 17 deletions(-) create mode 100644 src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala create mode 100644 src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala create mode 100644 src/main/scala/com/newlibertie/pollster/errorenum/DatabaseErrorEnum.scala diff --git a/src/main/scala/com/newlibertie/pollster/DataAdapter.scala b/src/main/scala/com/newlibertie/pollster/DataAdapter.scala index 4cdd7d0..5171305 100644 --- a/src/main/scala/com/newlibertie/pollster/DataAdapter.scala +++ b/src/main/scala/com/newlibertie/pollster/DataAdapter.scala @@ -1,7 +1,8 @@ package com.newlibertie.pollster -import java.sql.{Connection, DriverManager, ResultSet} +import java.sql.{Connection, DriverManager, ResultSet, SQLException, SQLTimeoutException} +import com.newlibertie.pollster.errorenum.{ApplicationError, DatabaseError} import com.newlibertie.pollster.impl.Poll import com.typesafe.scalalogging.LazyLogging import net.liftweb.json.DefaultFormats @@ -30,6 +31,15 @@ object DataAdapter extends LazyLogging { } } + private def executeUpdateQuery(sql: String): Any = { + try getConnection.createStatement().executeUpdate(sql) + catch { + case _: SQLException => DatabaseError.Access + case _: SQLTimeoutException => DatabaseError.Timeout + case _: Throwable => ApplicationError.ExceptionError + } + } + def createPoll(poll: Poll) = { val query = s""" @@ -54,11 +64,10 @@ object DataAdapter extends LazyLogging { |) """.stripMargin logger.info(query) - val statement = getConnection.createStatement - val numRows = statement.executeUpdate(query) + val numRows = executeUpdateQuery(query) if (numRows != 1) { logger.error("failed to insert " + query) - -1 + DatabaseError.ConstraintViolation } else { logger.info("poll.p.id: " + poll.p.id) @@ -76,11 +85,11 @@ object DataAdapter extends LazyLogging { | WHERE id = '$id' """.stripMargin logger.info(query) - val statement = getConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY) - val rs: ResultSet = statement.executeQuery(query) + val rs: ResultSet = + getConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY).executeQuery(query) if (!rs.first()) { logger.error("failed to retrieve using: " + query) - -1 + DatabaseError.RecordNotFound } else { val md = rs.getMetaData @@ -108,7 +117,7 @@ object DataAdapter extends LazyLogging { logger.info(query) getConnection.createStatement().executeUpdate(query) } - def deletePoll(id: String): Int = { - getConnection.createStatement().executeUpdate("DELETE FROM polls WHERE id = '" + id + "'") + def deletePoll(id: String): Any = { + executeUpdateQuery(s"DELETE FROM polls WHERE id = '$id'") } } diff --git a/src/main/scala/com/newlibertie/pollster/api/v1/PollApi.scala b/src/main/scala/com/newlibertie/pollster/api/v1/PollApi.scala index bcd47d0..d50a900 100644 --- a/src/main/scala/com/newlibertie/pollster/api/v1/PollApi.scala +++ b/src/main/scala/com/newlibertie/pollster/api/v1/PollApi.scala @@ -1,10 +1,13 @@ package com.newlibertie.pollster.api.v1 +import java.sql.{DatabaseMetaData, SQLException, SQLTimeoutException} + import akka.http.scaladsl.model.ContentTypes._ import akka.http.scaladsl.model.headers.`Content-Type` import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse, StatusCodes} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route +import com.newlibertie.pollster.errorenum.{ApplicationError, ApplicationErrorEnum, BaseErrorEnum, DatabaseError, DatabaseErrorEnum} import com.newlibertie.pollster.impl.Poll import com.typesafe.scalalogging.LazyLogging @@ -23,9 +26,10 @@ object PollApi extends LazyLogging { get { parameters("id") { id: String => Poll.read(id) match { - case -1 => complete(StatusCodes.NotFound) - case -2 => complete(StatusCodes.BadRequest) case p: Poll => complete(HttpResponse(entity = p.toJsonString)) + case DatabaseError.RecordNotFound => complete(StatusCodes.NotFound) + case ApplicationError.ExceptionError => complete(StatusCodes.InternalServerError) + case _ => complete(StatusCodes.InternalServerError) } } } ~ @@ -70,12 +74,14 @@ object PollApi extends LazyLogging { delete { parameters("id") { id: String => Poll.read(id) match { - case -1 => complete(StatusCodes.NotFound) - case -2 => complete(StatusCodes.BadRequest) + case DatabaseError.RecordNotFound => complete(StatusCodes.NotFound) + case _:DatabaseErrorEnum#AEVal => complete(StatusCodes.BadRequest) + case _:BaseErrorEnum#AEVal => complete(StatusCodes.InternalServerError) case p: Poll => if (p.canDelete()) { p.deletePoll() match { case 1 => complete(StatusCodes.OK) - case _ => complete(StatusCodes.NotFound) + case 0 => complete(StatusCodes.NotFound) + case _ => complete(StatusCodes.InternalServerError) } } else complete(StatusCodes.NotAcceptable) } diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala new file mode 100644 index 0000000..2935341 --- /dev/null +++ b/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala @@ -0,0 +1,9 @@ +package com.newlibertie.pollster.errorenum + +class ApplicationErrorEnum (errEnumName: String, initial:Int, capacity:Int) extends BaseErrorEnum(errEnumName, initial, capacity) + +object ApplicationError extends DatabaseErrorEnum("DatabaseError", 0, 1000){ + val Unknown = AEVal(0, "Unknown") + val AssertionError = AEVal(1, "AssertionError") + val ExceptionError = AEVal(2, "ExceptionError") +} diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala new file mode 100644 index 0000000..9926bda --- /dev/null +++ b/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala @@ -0,0 +1,49 @@ +package com.newlibertie.pollster.errorenum + +import scala.collection.mutable + +class BaseErrorEnum(val errEnumName: String, val initial:Int, val capacity:Int) extends Enumeration{ + require(EnumStore.register(errEnumName, initial, capacity), "Failed to register: "+errEnumName) + type AppErr = AEVal + import scala.language.implicitConversions + implicit def valueAppErrVal(x: Value): AEVal = x.asInstanceOf[AEVal] + + case class AEVal(i: Int, name: String) extends super.Val(initial+i, name){ + protected def nextId: Int = BaseErrorEnum.super.Value.nextId + } + + protected object AEVal{ + protected def generateName(i: Int): String = {s"$errEnumName.Error#$i"} + protected def generateName(s: String): String = {s"$errEnumName.$s"} + def apply(i:Int):AEVal ={ + val name = AEVal.generateName(i) + require(BaseErrorEnum.super.values.find(_.toString == name) == None, "Duplicate AEVal.name: " + name) + AEVal(i, name) + } + def apply(name: String):AEVal = { + val name2 = generateName(name) + require(BaseErrorEnum.super.values.find(_.toString == name2) == None, "Duplicate AEVal.name: " + name2) + AEVal(nextId-initial, name2) + } + def apply():AEVal = { + AEVal(nextId-initial) + } + } +} + +private object EnumStore { + class ErrEnumRange(val initial: Int, val capacity: Int) + val registery: mutable.Map[String, ErrEnumRange] = new mutable.HashMap + def register(errEnumName: String, initial:Int, capacity:Int):Boolean = { + if (registery.contains(errEnumName) || + (registery.valuesIterator.exists(er => er.initial < (initial + capacity) && + initial < (er.initial + er.capacity)))){ + false + } + else + { + registery(errEnumName) = new ErrEnumRange(initial, capacity) + true + } + } +} diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/DatabaseErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/DatabaseErrorEnum.scala new file mode 100644 index 0000000..a10e7d9 --- /dev/null +++ b/src/main/scala/com/newlibertie/pollster/errorenum/DatabaseErrorEnum.scala @@ -0,0 +1,14 @@ +package com.newlibertie.pollster.errorenum + +class DatabaseErrorEnum(errEnumName: String, initial:Int, capacity:Int) extends BaseErrorEnum(errEnumName, initial, capacity) + +object DatabaseError extends DatabaseErrorEnum("DatabaseError", 1000, 1000){ + val RecordNotFound = AEVal(0, "RecordNotFound") + val ConstraintViolation = AEVal(1, "ConstraintViolation") + val RecordIntegrityError = AEVal(2, "RecordIntegrityError") + val ConnectIdentifierResolution = AEVal(3, "ConnectIdentifierResolution") + val InternalCodeError = AEVal(4, "InternalCodeError") + val DataTypeMisMatch = AEVal(5, "DataTypeMisMatch") + val Access = AEVal(6, "Access") + val Timeout = AEVal(7, "Timeout") +} diff --git a/src/main/scala/com/newlibertie/pollster/impl/Poll.scala b/src/main/scala/com/newlibertie/pollster/impl/Poll.scala index a86f520..a773028 100644 --- a/src/main/scala/com/newlibertie/pollster/impl/Poll.scala +++ b/src/main/scala/com/newlibertie/pollster/impl/Poll.scala @@ -4,6 +4,7 @@ import java.math.BigInteger import java.util.Date import com.newlibertie.pollster.DataAdapter +import com.newlibertie.pollster.errorenum.{ApplicationError, BaseErrorEnum, DatabaseError, DatabaseErrorEnum} import com.typesafe.scalalogging.LazyLogging import net.liftweb.json._ @@ -55,9 +56,10 @@ object Poll extends LazyLogging { catch { case ex: Exception => logger.error(s"Error constructing poll Object from id=${id}: ${ex.getMessage}") - -2 + ApplicationError.ExceptionError } - case _ => -1 + case DatabaseError.RecordNotFound => DatabaseError.RecordNotFound + case _ => ApplicationError.Unknown } } } @@ -79,7 +81,7 @@ class Poll(val p:PollParameters, val cp:CryptographicParameters = new Cryptograp def canOpen():Boolean = { p.opening_ts after new Date() } - def deletePoll(): Int = { + def deletePoll(): Any = { DataAdapter.deletePoll(p.id.get) } def toJsonString: String = { From 040d671efb485ce3bde0986c70678eb1f0db7626 Mon Sep 17 00:00:00 2001 From: harmindar Date: Mon, 18 Nov 2019 10:56:39 -0700 Subject: [PATCH 2/6] Added comments, fixed a typo and made registry private --- .../errorenum/ApplicationErrorEnum.scala | 9 +++++++++ .../pollster/errorenum/BaseErrorEnum.scala | 19 +++++++++++++++---- .../errorenum/DatabaseErrorEnum.scala | 9 +++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala index 2935341..3bf4f84 100644 --- a/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala +++ b/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala @@ -1,7 +1,16 @@ package com.newlibertie.pollster.errorenum +/** + * Class to define errors related to application logic + * @param errEnumName The unique name of the derived class + * @param initial the id of the first enum variable in the class with name $errEnumName + * @param capacity the number of unique ids for the enum variables in the class with name $errEnumName + */ class ApplicationErrorEnum (errEnumName: String, initial:Int, capacity:Int) extends BaseErrorEnum(errEnumName, initial, capacity) +/** + * companion object to define error variables for application errors + */ object ApplicationError extends DatabaseErrorEnum("DatabaseError", 0, 1000){ val Unknown = AEVal(0, "Unknown") val AssertionError = AEVal(1, "AssertionError") diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala index 9926bda..67ad87e 100644 --- a/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala +++ b/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala @@ -2,6 +2,14 @@ package com.newlibertie.pollster.errorenum import scala.collection.mutable +/*** + * A class at the root of all error enum derivations + * responsible for validating uniqueness of the name of the errEnumName and non-overlapping id ranges + * registers the EnumClass + * @param errEnumName The unique name of the derived class + * @param initial the id of the first enum variable in the class with name $errEnumName + * @param capacity the number of unique ids for the enum variables in the class with name $errEnumName + */ class BaseErrorEnum(val errEnumName: String, val initial:Int, val capacity:Int) extends Enumeration{ require(EnumStore.register(errEnumName, initial, capacity), "Failed to register: "+errEnumName) type AppErr = AEVal @@ -31,18 +39,21 @@ class BaseErrorEnum(val errEnumName: String, val initial:Int, val capacity:Int) } } +/** + * Helping Object providing validations and register each EnumClass derived from BaseErrorEnum + */ private object EnumStore { class ErrEnumRange(val initial: Int, val capacity: Int) - val registery: mutable.Map[String, ErrEnumRange] = new mutable.HashMap + private val registry: mutable.Map[String, ErrEnumRange] = new mutable.HashMap def register(errEnumName: String, initial:Int, capacity:Int):Boolean = { - if (registery.contains(errEnumName) || - (registery.valuesIterator.exists(er => er.initial < (initial + capacity) && + if (registry.contains(errEnumName) || + (registry.valuesIterator.exists(er => er.initial < (initial + capacity) && initial < (er.initial + er.capacity)))){ false } else { - registery(errEnumName) = new ErrEnumRange(initial, capacity) + registry(errEnumName) = new ErrEnumRange(initial, capacity) true } } diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/DatabaseErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/DatabaseErrorEnum.scala index a10e7d9..e2e16c6 100644 --- a/src/main/scala/com/newlibertie/pollster/errorenum/DatabaseErrorEnum.scala +++ b/src/main/scala/com/newlibertie/pollster/errorenum/DatabaseErrorEnum.scala @@ -1,7 +1,16 @@ package com.newlibertie.pollster.errorenum +/** + * Class to define errors related to database + * @param errEnumName The unique name of the derived class + * @param initial the id of the first enum variable in the class with name $errEnumName + * @param capacity the number of unique ids for the enum variables in the class with name $errEnumName + */ class DatabaseErrorEnum(errEnumName: String, initial:Int, capacity:Int) extends BaseErrorEnum(errEnumName, initial, capacity) +/** + * companion object to define error variables for database errors + */ object DatabaseError extends DatabaseErrorEnum("DatabaseError", 1000, 1000){ val RecordNotFound = AEVal(0, "RecordNotFound") val ConstraintViolation = AEVal(1, "ConstraintViolation") From 34741eedd54b0b35dc003d69b21cc7f7c29d9e4f Mon Sep 17 00:00:00 2001 From: harmindar Date: Mon, 18 Nov 2019 16:34:23 -0700 Subject: [PATCH 3/6] Added test cases for all coded failure detections in Enums --- .../errorenum/ApplicationErrorEnum.scala | 2 +- .../pollster/errorenum/BaseErrorEnum.scala | 6 +- .../errorenum/ApplicationErrorEnumTest.scala | 68 +++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 src/test/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnumTest.scala diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala index 3bf4f84..e964a31 100644 --- a/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala +++ b/src/main/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnum.scala @@ -11,7 +11,7 @@ class ApplicationErrorEnum (errEnumName: String, initial:Int, capacity:Int) exte /** * companion object to define error variables for application errors */ -object ApplicationError extends DatabaseErrorEnum("DatabaseError", 0, 1000){ +object ApplicationError extends ApplicationErrorEnum("ApplicationError", 0, 1000){ val Unknown = AEVal(0, "Unknown") val AssertionError = AEVal(1, "AssertionError") val ExceptionError = AEVal(2, "ExceptionError") diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala index 67ad87e..6a444ce 100644 --- a/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala +++ b/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala @@ -11,7 +11,7 @@ import scala.collection.mutable * @param capacity the number of unique ids for the enum variables in the class with name $errEnumName */ class BaseErrorEnum(val errEnumName: String, val initial:Int, val capacity:Int) extends Enumeration{ - require(EnumStore.register(errEnumName, initial, capacity), "Failed to register: "+errEnumName) + require(BaseErrorEnum.register(errEnumName, initial, capacity), "Failed to register: "+errEnumName) type AppErr = AEVal import scala.language.implicitConversions implicit def valueAppErrVal(x: Value): AEVal = x.asInstanceOf[AEVal] @@ -40,9 +40,9 @@ class BaseErrorEnum(val errEnumName: String, val initial:Int, val capacity:Int) } /** - * Helping Object providing validations and register each EnumClass derived from BaseErrorEnum + * Helping Object providing validations and register each EnumClass derived from BaseErrorEnum */ -private object EnumStore { +private object BaseErrorEnum { class ErrEnumRange(val initial: Int, val capacity: Int) private val registry: mutable.Map[String, ErrEnumRange] = new mutable.HashMap def register(errEnumName: String, initial:Int, capacity:Int):Boolean = { diff --git a/src/test/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnumTest.scala b/src/test/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnumTest.scala new file mode 100644 index 0000000..9250c2a --- /dev/null +++ b/src/test/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnumTest.scala @@ -0,0 +1,68 @@ +package com.newlibertie.pollster.errorenum + +import org.scalatest._ +import com.typesafe.scalalogging.LazyLogging +class ApplicationErrorEnumTest extends WordSpec with Matchers with LazyLogging { + + class TestApplicationErrorEnum (errEnumName: String, initial:Int, capacity:Int) extends BaseErrorEnum(errEnumName, initial, capacity) + object TestApplicationErrorEnum extends TestApplicationErrorEnum("TestApplicationError", 0, 10){ + val Unknown = AEVal(0, "Unknown") + } + + "the enum creation" should { + "detect duplicate enum name" in { + class TestApplicationErrorEnum2 (errEnumName: String, initial:Int, capacity:Int) extends BaseErrorEnum(errEnumName, initial, capacity) + object TestApplicationErrorEnum2 extends TestApplicationErrorEnum2("TestApplicationError", 0, 10){ + val Unknown = AEVal(0, "Unknown") + } + var stat = -1 + try { + var err:Any = TestApplicationErrorEnum.Unknown + err = TestApplicationErrorEnum2.Unknown + } + catch { + case ex: Exception => + logger.info(ex.getMessage) + stat = if (ex.getMessage().equalsIgnoreCase("requirement failed: Failed to register: TestApplicationError")) 0 else -1 + } + stat shouldEqual 0 + } + "detect overlapping id range" in { + var stat = -1 + class TestApplicationErrorEnum3 (errEnumName: String, initial:Int, capacity:Int) extends BaseErrorEnum(errEnumName, initial, capacity) + object TestApplicationErrorEnum3 extends TestApplicationErrorEnum3("TestApplicationError3", 0, 10){ + val Unknown = AEVal(0, "Unknown") + } + try { + var err:Any = TestApplicationErrorEnum.Unknown + err = TestApplicationErrorEnum3.Unknown + } + catch { + case ex: Exception => + logger.info(ex.getMessage) + stat = if (ex.getMessage().equalsIgnoreCase("requirement failed: Failed to register: TestApplicationError3")) 0 else -1 + case t: Throwable => + logger.info(t.getLocalizedMessage) + stat = -1 + } + stat shouldEqual 0 + } + "detect duplicate id" in { + var stat = -1 + class TestApplicationErrorEnum4 (errEnumName: String, initial:Int, capacity:Int) extends BaseErrorEnum(errEnumName, initial, capacity) + try { + object TestApplicationErrorEnum4 extends TestApplicationErrorEnum4("TestApplicationError4", 10, 10){ + val Unknown = AEVal(0, "Unknown") + val Unknown2 = AEVal(0, "Unknown2") + } + TestApplicationErrorEnum4.Unknown + } + catch { + case t: Throwable => + logger.info(t.getMessage) + stat = if (t.getMessage.startsWith("assertion failed: Duplicate id: ")) 0 else -1 + } + stat shouldEqual 0 + } + } +} From c1f4a502480d29939e1ad25fd71bb51bd41de78f Mon Sep 17 00:00:00 2001 From: harmindar Date: Mon, 18 Nov 2019 16:35:53 -0700 Subject: [PATCH 4/6] Removed a commented code line --- src/test/scala/com/newlibertie/pollster/api/v1/PollApiSpec.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/scala/com/newlibertie/pollster/api/v1/PollApiSpec.scala b/src/test/scala/com/newlibertie/pollster/api/v1/PollApiSpec.scala index dbbfa2c..14094c0 100644 --- a/src/test/scala/com/newlibertie/pollster/api/v1/PollApiSpec.scala +++ b/src/test/scala/com/newlibertie/pollster/api/v1/PollApiSpec.scala @@ -3,7 +3,6 @@ package com.newlibertie.pollster.api.v1 import akka.http.scaladsl.model.{ContentTypes, StatusCodes} import akka.http.scaladsl.server.Route import akka.http.scaladsl.testkit.ScalatestRouteTest -//import com.newlibertie.pollster.DataAdapter.logger import com.newlibertie.pollster.impl.Poll import org.scalatest._ import com.typesafe.scalalogging.LazyLogging From 6e1642f2cd62e7e2e7e77e665968875b758a28f4 Mon Sep 17 00:00:00 2001 From: harmindar Date: Wed, 20 Nov 2019 16:24:52 -0700 Subject: [PATCH 5/6] Replaced Any with AnyRef --- .../pollster/errorenum/ApplicationErrorEnumTest.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnumTest.scala b/src/test/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnumTest.scala index 9250c2a..ee39a0e 100644 --- a/src/test/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnumTest.scala +++ b/src/test/scala/com/newlibertie/pollster/errorenum/ApplicationErrorEnumTest.scala @@ -17,7 +17,7 @@ class ApplicationErrorEnumTest extends WordSpec with Matchers with LazyLogging { } var stat = -1 try { - var err:Any = TestApplicationErrorEnum.Unknown + var err:AnyRef = TestApplicationErrorEnum.Unknown err = TestApplicationErrorEnum2.Unknown } catch { @@ -34,7 +34,7 @@ class ApplicationErrorEnumTest extends WordSpec with Matchers with LazyLogging { val Unknown = AEVal(0, "Unknown") } try { - var err:Any = TestApplicationErrorEnum.Unknown + var err:AnyRef = TestApplicationErrorEnum.Unknown err = TestApplicationErrorEnum3.Unknown } catch { From 6b7e2ffd616183c37095a87b0c52d70b753268e2 Mon Sep 17 00:00:00 2001 From: vivekpathak Date: Sat, 30 Nov 2019 21:51:38 -0500 Subject: [PATCH 6/6] updates from phone call discussion --- .../newlibertie/pollster/DataAdapter.scala | 30 +++++++++++++++---- .../pollster/errorenum/BaseErrorEnum.scala | 5 +++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/newlibertie/pollster/DataAdapter.scala b/src/main/scala/com/newlibertie/pollster/DataAdapter.scala index 5171305..a29d8c7 100644 --- a/src/main/scala/com/newlibertie/pollster/DataAdapter.scala +++ b/src/main/scala/com/newlibertie/pollster/DataAdapter.scala @@ -87,9 +87,13 @@ object DataAdapter extends LazyLogging { logger.info(query) val rs: ResultSet = getConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY).executeQuery(query) + + // Comvert to Option form + if (!rs.first()) { logger.error("failed to retrieve using: " + query) - DatabaseError.RecordNotFound + // TODO throw DatabaseError.RecordNotFound + throw new Error("dkfldsfd"); } else { val md = rs.getMetaData @@ -101,7 +105,15 @@ object DataAdapter extends LazyLogging { mutableMap } } - def updatePoll(poll:Poll): Any = { + + /** + * Update the poll. if success then return nothing else throw exception + * + * @param poll + */ + def updatePoll(poll:Poll):Unit = { + + val query = s""" |UPDATE nldb.polls @@ -115,9 +127,17 @@ object DataAdapter extends LazyLogging { |WHERE id = '${poll.p.id.get}' """.stripMargin logger.info(query) - getConnection.createStatement().executeUpdate(query) + val x = getConnection.createStatement().executeUpdate(query) + //x match { + // case Some() + // case None => Throw new ErrorEnum(XXX) + //} } - def deletePoll(id: String): Any = { - executeUpdateQuery(s"DELETE FROM polls WHERE id = '$id'") + def deletePoll(id: String):Unit = { + val x = executeUpdateQuery(s"DELETE FROM polls WHERE id = '$id'") + //x match { + // case Some() + // case None => Throw + //} } } diff --git a/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala b/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala index 6a444ce..7ab3266 100644 --- a/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala +++ b/src/main/scala/com/newlibertie/pollster/errorenum/BaseErrorEnum.scala @@ -10,7 +10,10 @@ import scala.collection.mutable * @param initial the id of the first enum variable in the class with name $errEnumName * @param capacity the number of unique ids for the enum variables in the class with name $errEnumName */ -class BaseErrorEnum(val errEnumName: String, val initial:Int, val capacity:Int) extends Enumeration{ + +// TODO : Is there a benefit in having class also extend from or implement Exception or Throwable + +class BaseErrorEnum(val errEnumName: String, val initial:Int, val capacity:Int) extends Enumeration { // with Throwable { require(BaseErrorEnum.register(errEnumName, initial, capacity), "Failed to register: "+errEnumName) type AppErr = AEVal import scala.language.implicitConversions