diff --git a/play-scala-anorm-example/.gitignore b/play-scala-anorm-example/.gitignore new file mode 100644 index 000000000..e82006735 --- /dev/null +++ b/play-scala-anorm-example/.gitignore @@ -0,0 +1,22 @@ +build +logs +project/project +project/target +target +tmp +.history +dist +/.idea +/*.iml +/out +/.idea_modules +.classpath +.project +.gradle +/RUNNING_PID +.settings +.target +.cache* +bin +.DS_Store +activator-sbt-*-shim.sbt diff --git a/play-scala-anorm-example/.mergify.yml b/play-scala-anorm-example/.mergify.yml new file mode 100644 index 000000000..32f8689ae --- /dev/null +++ b/play-scala-anorm-example/.mergify.yml @@ -0,0 +1,27 @@ +pull_request_rules: + - name: automatic merge on CI success require review + conditions: + - status-success=Travis CI - Pull Request + - "#approved-reviews-by>=1" + - "#changes-requested-reviews-by=0" + - label!=block-merge + actions: + merge: + method: squash + strict: smart + + - name: automatic merge on CI success for TemplateControl + conditions: + - status-success=Travis CI - Pull Request + - label=merge-when-green + - label!=block-merge + actions: + merge: + method: squash + strict: smart + + - name: delete branch after merge + conditions: + - merged + actions: + delete_head_branch: {} diff --git a/play-scala-anorm-example/.travis.yml b/play-scala-anorm-example/.travis.yml new file mode 100644 index 000000000..1e8c0e7c4 --- /dev/null +++ b/play-scala-anorm-example/.travis.yml @@ -0,0 +1,50 @@ +language: scala +scala: + - 2.12.8 + +before_install: + - curl -sL https://github.com/shyiko/jabba/raw/master/install.sh | bash && . ~/.jabba/jabba.sh + +env: + global: + - JABBA_HOME=$HOME/.jabba + matrix: + # There is no concise way to specify multi-dimensional build matrix: + # https://github.com/travis-ci/travis-ci/issues/1519 + - SCRIPT=scripts/test-sbt TRAVIS_JDK=adopt@1.8.192-12 + - SCRIPT=scripts/test-sbt TRAVIS_JDK=adopt@1.11.0-1 + - SCRIPT=scripts/test-gradle TRAVIS_JDK=adopt@1.8.192-12 + - SCRIPT=scripts/test-gradle TRAVIS_JDK=adopt@1.11.0-1 + +# Exclude some combinations from build matrix. See: +# https://docs.travis-ci.com/user/customizing-the-build/#Build-Matrix +matrix: + fast_finish: true + allow_failures: + # Current release of Gradle still does not supports Play 2.7.x releases + # As soon as there is a release of Gradle that fixes that, we can then + # remove this allowed failure. + - env: SCRIPT=scripts/test-gradle TRAVIS_JDK=adopt@1.8.192-12 + - env: SCRIPT=scripts/test-gradle TRAVIS_JDK=adopt@1.11.0-1 + # Java 11 is still not fully supported. It is good that we are already + # testing our sample applications to better discover possible problems + # but we can allow failures here too. + - env: SCRIPT=scripts/test-sbt TRAVIS_JDK=adopt@1.11.0-1 + +install: + - $JABBA_HOME/bin/jabba install $TRAVIS_JDK + - unset _JAVA_OPTIONS + - export JAVA_HOME="$JABBA_HOME/jdk/$TRAVIS_JDK" && export PATH="$JAVA_HOME/bin:$PATH" && java -Xmx32m -version + +script: + - $SCRIPT + +before_cache: + - find $HOME/.ivy2 -name "ivydata-*.properties" -delete + - find $HOME/.sbt -name "*.lock" -delete + +cache: + directories: + - "$HOME/.ivy2/cache" + - "$HOME/.gradle/caches" + - "$HOME/.jabba/jdk" diff --git a/play-scala-anorm-example/LICENSE b/play-scala-anorm-example/LICENSE new file mode 100644 index 000000000..670154e35 --- /dev/null +++ b/play-scala-anorm-example/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see + diff --git a/play-scala-anorm-example/NOTICE b/play-scala-anorm-example/NOTICE new file mode 100644 index 000000000..6d6c034d3 --- /dev/null +++ b/play-scala-anorm-example/NOTICE @@ -0,0 +1,8 @@ +Written by Lightbend + +To the extent possible under law, the author(s) have dedicated all copyright and +related and neighboring rights to this software to the public domain worldwide. +This software is distributed without any warranty. + +You should have received a copy of the CC0 Public Domain Dedication along with +this software. If not, see . diff --git a/play-scala-anorm-example/README.md b/play-scala-anorm-example/README.md new file mode 100644 index 000000000..af29b6c71 --- /dev/null +++ b/play-scala-anorm-example/README.md @@ -0,0 +1,18 @@ +# play-scala-anorm-example + +[](https://travis-ci.org/playframework/play-scala-anorm-example) + +This is an example Play application that uses Scala on the front end, and communicates with an in memory database using Anorm. + +## Play + +Play documentation is here: + + + +## Anorm + +Anorm is a Scala library that uses SQL. + +- up to 2.5.3: +- 2.6+: diff --git a/play-scala-anorm-example/app/controllers/HomeController.scala b/play-scala-anorm-example/app/controllers/HomeController.scala new file mode 100644 index 000000000..04d25de5f --- /dev/null +++ b/play-scala-anorm-example/app/controllers/HomeController.scala @@ -0,0 +1,135 @@ +package controllers + +import javax.inject.Inject + +import models._ +import play.api.data.Forms._ +import play.api.data._ +import play.api.i18n._ +import play.api.mvc._ +import views._ + +import scala.concurrent.{ExecutionContext, Future} + +/** + * Manage a database of computers + */ +class HomeController @Inject()(computerService: ComputerRepository, + companyService: CompanyRepository, + cc: MessagesControllerComponents)(implicit ec: ExecutionContext) + extends MessagesAbstractController(cc) { + + private val logger = play.api.Logger(this.getClass) + + /** + * This result directly redirect to the application home. + */ + val Home = Redirect(routes.HomeController.list(0, 2, "")) + + /** + * Describe the computer form (used in both edit and create screens). + */ + val computerForm = Form( + mapping( + "id" -> ignored(None: Option[Long]), + "name" -> nonEmptyText, + "introduced" -> optional(date("yyyy-MM-dd")), + "discontinued" -> optional(date("yyyy-MM-dd")), + "company" -> optional(longNumber) + )(Computer.apply)(Computer.unapply) + ) + + // -- Actions + + /** + * Handle default path requests, redirect to computers list + */ + def index = Action { + Home + } + + /** + * Display the paginated list of computers. + * + * @param page Current page number (starts from 0) + * @param orderBy Column to be sorted + * @param filter Filter applied on computer names + */ + def list(page: Int, orderBy: Int, filter: String) = Action.async { implicit request => + computerService.list(page = page, orderBy = orderBy, filter = ("%" + filter + "%")).map { page => + Ok(html.list(page, orderBy, filter)) + } + } + + /** + * Display the 'edit form' of a existing Computer. + * + * @param id Id of the computer to edit + */ + def edit(id: Long) = Action.async { implicit request => + computerService.findById(id).flatMap { + case Some(computer) => + companyService.options.map { options => + Ok(html.editForm(id, computerForm.fill(computer), options)) + } + case other => + Future.successful(NotFound) + } + } + + /** + * Handle the 'edit form' submission + * + * @param id Id of the computer to edit + */ + def update(id: Long) = Action.async { implicit request => + computerForm.bindFromRequest.fold( + formWithErrors => { + logger.warn(s"form error: $formWithErrors") + companyService.options.map { options => + BadRequest(html.editForm(id, formWithErrors, options)) + } + }, + computer => { + computerService.update(id, computer).map { _ => + Home.flashing("success" -> "Computer %s has been updated".format(computer.name)) + } + } + ) + } + + /** + * Display the 'new computer form'. + */ + def create = Action.async { implicit request => + companyService.options.map { options => + Ok(html.createForm(computerForm, options)) + } + } + + /** + * Handle the 'new computer form' submission. + */ + def save = Action.async { implicit request => + computerForm.bindFromRequest.fold( + formWithErrors => companyService.options.map { options => + BadRequest(html.createForm(formWithErrors, options)) + }, + computer => { + computerService.insert(computer).map { _ => + Home.flashing("success" -> "Computer %s has been created".format(computer.name)) + } + } + ) + } + + /** + * Handle computer deletion. + */ + def delete(id: Long) = Action.async { + computerService.delete(id).map { _ => + Home.flashing("success" -> "Computer has been deleted") + } + } + +} diff --git a/play-scala-anorm-example/app/models/CompanyRepository.scala b/play-scala-anorm-example/app/models/CompanyRepository.scala new file mode 100644 index 000000000..b3e203ddb --- /dev/null +++ b/play-scala-anorm-example/app/models/CompanyRepository.scala @@ -0,0 +1,56 @@ +package models + +import javax.inject.Inject + +import scala.util.{ Failure, Success } + +import anorm._ +import anorm.SqlParser.{ get, str } + +import play.api.db.DBApi + +import scala.concurrent.Future + +case class Company(id: Option[Long] = None, name: String) + +@javax.inject.Singleton +class CompanyRepository @Inject()(dbapi: DBApi)(implicit ec: DatabaseExecutionContext) { + + private val db = dbapi.database("default") + + /** + * Parse a Company from a ResultSet + */ + private[models] val simple = { + get[Option[Long]]("company.id") ~ str("company.name") map { + case id ~ name => Company(id, name) + } + } + + /** + * Construct the Seq[(String,String)] needed to fill a select options set. + * + * Uses `SqlQueryResult.fold` from Anorm streaming, + * to accumulate the rows as an options list. + */ + def options: Future[Seq[(String,String)]] = Future(db.withConnection { implicit connection => + SQL"select * from company order by name". + fold(Seq.empty[(String, String)], ColumnAliaser.empty) { (acc, row) => // Anorm streaming + row.as(simple) match { + case Failure(parseErr) => { + println(s"Fails to parse $row: $parseErr") + acc + } + + case Success(Company(Some(id), name)) => + (id.toString -> name) +: acc + + case Success(Company(None, _)) => acc + } + } + }).flatMap { + case Left(err :: _) => Future.failed(err) + case Left(_) => Future(Seq.empty) + case Right(acc) => Future.successful(acc.reverse) + } +} diff --git a/play-scala-anorm-example/app/models/ComputerRepository.scala b/play-scala-anorm-example/app/models/ComputerRepository.scala new file mode 100644 index 000000000..88e367903 --- /dev/null +++ b/play-scala-anorm-example/app/models/ComputerRepository.scala @@ -0,0 +1,148 @@ +package models + +import java.util.Date +import javax.inject.Inject + +import anorm.SqlParser.{ get, scalar } +import anorm._ +import play.api.db.DBApi + +import scala.concurrent.Future + +case class Computer(id: Option[Long] = None, + name: String, + introduced: Option[Date], + discontinued: Option[Date], + companyId: Option[Long]) + +object Computer { + implicit def toParameters: ToParameterList[Computer] = + Macro.toParameters[Computer] +} + +/** + * Helper for pagination. + */ +case class Page[A](items: Seq[A], page: Int, offset: Long, total: Long) { + lazy val prev = Option(page - 1).filter(_ >= 0) + lazy val next = Option(page + 1).filter(_ => (offset + items.size) < total) +} + + +@javax.inject.Singleton +class ComputerRepository @Inject()(dbapi: DBApi, companyRepository: CompanyRepository)(implicit ec: DatabaseExecutionContext) { + + private val db = dbapi.database("default") + + // -- Parsers + + /** + * Parse a Computer from a ResultSet + */ + private val simple = { + get[Option[Long]]("computer.id") ~ + get[String]("computer.name") ~ + get[Option[Date]]("computer.introduced") ~ + get[Option[Date]]("computer.discontinued") ~ + get[Option[Long]]("computer.company_id") map { + case id ~ name ~ introduced ~ discontinued ~ companyId => + Computer(id, name, introduced, discontinued, companyId) + } + } + + /** + * Parse a (Computer,Company) from a ResultSet + */ + private val withCompany = simple ~ (companyRepository.simple.?) map { + case computer ~ company => computer -> company + } + + // -- Queries + + /** + * Retrieve a computer from the id. + */ + def findById(id: Long): Future[Option[Computer]] = Future { + db.withConnection { implicit connection => + SQL"select * from computer where id = $id".as(simple.singleOpt) + } + }(ec) + + /** + * Return a page of (Computer,Company). + * + * @param page Page to display + * @param pageSize Number of computers per page + * @param orderBy Computer property used for sorting + * @param filter Filter applied on the name column + */ + def list(page: Int = 0, pageSize: Int = 10, orderBy: Int = 1, filter: String = "%"): Future[Page[(Computer, Option[Company])]] = Future { + + val offset = pageSize * page + + db.withConnection { implicit connection => + + val computers = SQL""" + select * from computer + left join company on computer.company_id = company.id + where computer.name like ${filter} + order by ${orderBy} nulls last + limit ${pageSize} offset ${offset} + """.as(withCompany.*) + + val totalRows = SQL""" + select count(*) from computer + left join company on computer.company_id = company.id + where computer.name like ${filter} + """.as(scalar[Long].single) + + Page(computers, page, offset, totalRows) + } + }(ec) + + /** + * Update a computer. + * + * @param id The computer id + * @param computer The computer values. + */ + def update(id: Long, computer: Computer) = Future { + db.withConnection { implicit connection => + SQL(""" + update computer set name = {name}, introduced = {introduced}, + discontinued = {discontinued}, company_id = {companyId} + where id = {id} + """).bind(computer.copy(id = Some(id)/* ensure */)).executeUpdate() + // case class binding using ToParameterList, + // note using SQL(..) but not SQL.. interpolation + } + }(ec) + + /** + * Insert a new computer. + * + * @param computer The computer values. + */ + def insert(computer: Computer): Future[Option[Long]] = Future { + db.withConnection { implicit connection => + SQL(""" + insert into computer values ( + (select next value for computer_seq), + {name}, {introduced}, {discontinued}, {companyId} + ) + """).bind(computer).executeInsert() + } + }(ec) + + /** + * Delete a computer. + * + * @param id Id of the computer to delete. + */ + def delete(id: Long) = Future { + db.withConnection { implicit connection => + SQL"delete from computer where id = ${id}".executeUpdate() + } + }(ec) + +} diff --git a/play-scala-anorm-example/app/models/DatabaseExecutionContext.scala b/play-scala-anorm-example/app/models/DatabaseExecutionContext.scala new file mode 100644 index 000000000..ef2c77035 --- /dev/null +++ b/play-scala-anorm-example/app/models/DatabaseExecutionContext.scala @@ -0,0 +1,13 @@ +package models + +import javax.inject._ + +import akka.actor.ActorSystem +import play.api.libs.concurrent.CustomExecutionContext + +/** + * This class is a pointer to an execution context configured to point to "database.dispatcher" + * in the "application.conf" file. + */ +@Singleton +class DatabaseExecutionContext @Inject()(system: ActorSystem) extends CustomExecutionContext(system, "database.dispatcher") diff --git a/play-scala-anorm-example/app/views/createForm.scala.html b/play-scala-anorm-example/app/views/createForm.scala.html new file mode 100644 index 000000000..94195cf35 --- /dev/null +++ b/play-scala-anorm-example/app/views/createForm.scala.html @@ -0,0 +1,34 @@ +@(computerForm: Form[Computer], companies: Seq[(String, String)])(implicit requestHeader: MessagesRequestHeader) + +@import views.html.helper._ + +@main { + +

Add a computer

+ + @form(routes.HomeController.save()) { + +
+ @CSRF.formField + @inputText(computerForm("name"), '_label -> "Computer name", '_help -> "") + @inputText(computerForm("introduced"), '_label -> "Introduced date", '_help -> "") + @inputText(computerForm("discontinued"), '_label -> "Discontinued date", '_help -> "") + + @select( + computerForm("company"), + companies, + '_label -> "Company", '_default -> "-- Choose a company --", + '_showConstraints -> false + ) +
+ +

Dates are in yyyy-MM-dd format

+ +
+ or + Cancel +
+ + } + +} diff --git a/play-scala-anorm-example/app/views/editForm.scala.html b/play-scala-anorm-example/app/views/editForm.scala.html new file mode 100644 index 000000000..17c678368 --- /dev/null +++ b/play-scala-anorm-example/app/views/editForm.scala.html @@ -0,0 +1,38 @@ +@(id: Long, computerForm: Form[Computer], companies : Seq[(String, String)])(implicit requestHeader: MessagesRequestHeader) + +@import views.html.helper._ + +@main { + +

Edit computer

+ + @form(routes.HomeController.update(id)) { + +
+ @CSRF.formField + @inputText(computerForm("name"), '_label -> "Computer name", '_help -> "") + @inputText(computerForm("introduced"), '_label -> "Introduced date", '_help -> "") + @inputText(computerForm("discontinued"), '_label -> "Discontinued date", '_help -> "") + + @select( + computerForm("company"), + companies, + '_label -> "Company", '_default -> "-- Choose a company --", + '_showConstraints -> false + ) +
+

Dates are in yyyy-MM-dd format

+ +
+ or + Cancel +
+ + } + + @form(routes.HomeController.delete(id), 'class -> "topRight") { + @CSRF.formField + + } + +} diff --git a/play-scala-anorm-example/app/views/helper/date.scala.html b/play-scala-anorm-example/app/views/helper/date.scala.html new file mode 100644 index 000000000..6b55780f9 --- /dev/null +++ b/play-scala-anorm-example/app/views/helper/date.scala.html @@ -0,0 +1,7 @@ +@(field: play.api.data.Field, args: (Symbol,Any)*)(implicit handler: FieldConstructor, messages: play.api.i18n.MessagesProvider) + +@inputType = @{ "date" } + +@input(field, args.filter(_._1 != 'type):_*) { (id, name, value, htmlArgs) => + +} diff --git a/play-scala-anorm-example/app/views/list.scala.html b/play-scala-anorm-example/app/views/list.scala.html new file mode 100644 index 000000000..40b73ed3c --- /dev/null +++ b/play-scala-anorm-example/app/views/list.scala.html @@ -0,0 +1,114 @@ +@(currentPage: Page[(Computer, Option[Company])], currentOrderBy: Int, currentFilter: String)(implicit request: MessagesRequestHeader) + +@import helper._ + +@**************************************** +* Helper generating navigation links * +****************************************@ +@link(newPage: Int, newOrderBy: Option[Int] = None) = @{ + routes.HomeController.list(newPage, newOrderBy.map { orderBy => + if(orderBy == scala.math.abs(currentOrderBy)) -currentOrderBy else orderBy + }.getOrElse(currentOrderBy), currentFilter) + +} + +@********************************** +* Helper generating table headers * +***********************************@ +@header(orderBy: Int, title: String) = { + + @title + +} + +@main { + +

@Messages("computers.list.title", currentPage.total)

+ + @request.flash.get("success").map { message => +
+ Done! @message +
+ } + +
+ + @form(action=routes.HomeController.list()) { + + + } + + Add a new computer + +
+ + @Option(currentPage.items).filterNot(_.isEmpty).map { computers => + + + + + @header(2, "Computer name") + @header(3, "Introduced") + @header(4, "Discontinued") + @header(5, "Company") + + + + + @computers.map { + case (computer, company) => { + + + + + + + } + } + + +
@computer.name + @computer.introduced.map(_.format("dd MMM yyyy")).getOrElse { - } + + @computer.discontinued.map(_.format("dd MMM yyyy")).getOrElse { - } + + @company.map(_.name).getOrElse { - } +
+ + + + }.getOrElse { + +
+ Nothing to display +
+ + } + + +} + diff --git a/play-scala-anorm-example/app/views/main.scala.html b/play-scala-anorm-example/app/views/main.scala.html new file mode 100644 index 000000000..2b6a2f2cc --- /dev/null +++ b/play-scala-anorm-example/app/views/main.scala.html @@ -0,0 +1,36 @@ +@(content: Html)(implicit request: MessagesRequestHeader) + + + + + Computers database + + @************************************* + + + + + + *************************************@ + + + + + + + + +
+

+ + Play sample application — Computer database + +

+
+ +
+ @content +
+ + + diff --git a/play-scala-anorm-example/build.gradle b/play-scala-anorm-example/build.gradle new file mode 100644 index 000000000..6c27690ab --- /dev/null +++ b/play-scala-anorm-example/build.gradle @@ -0,0 +1,48 @@ +plugins { + id 'play' + id 'idea' +} + +def playVersion = "2.6.21" +def scalaVersion = System.getProperty("scala.binary.version", /* default = */ "2.12") + +model { + components { + play { + platform play: playVersion, scala: scalaVersion, java: '1.8' + injectedRoutesGenerator = true + + sources { + twirlTemplates { + defaultImports = TwirlImports.SCALA + } + } + } + } +} + +dependencies { + play "com.typesafe.play:play-guice_$scalaVersion:$playVersion" + play "com.typesafe.play:filters-helpers_$scalaVersion:$playVersion" + play "com.typesafe.play:play-logback_$scalaVersion:$playVersion" + play "com.typesafe.play:play-jdbc_$scalaVersion:$playVersion" + play "com.typesafe.play:play-jdbc-evolutions_$scalaVersion:$playVersion" + + play "com.h2database:h2:1.4.197" + + play "org.playframework.anorm:anorm_$scalaVersion:2.6.1" + playTest "org.scalatestplus.play:scalatestplus-play_$scalaVersion:3.1.2" +} + +repositories { + jcenter() + maven { + name "lightbend-maven-releases" + url "https://repo.lightbend.com/lightbend/maven-release" + } + ivy { + name "lightbend-ivy-release" + url "https://repo.lightbend.com/lightbend/ivy-releases" + layout "ivy" + } +} diff --git a/play-scala-anorm-example/build.sbt b/play-scala-anorm-example/build.sbt new file mode 100644 index 000000000..20e79d3fd --- /dev/null +++ b/play-scala-anorm-example/build.sbt @@ -0,0 +1,18 @@ +name := "play-scala-anorm-example" + +version := "2.6.0-SNAPSHOT" + +scalaVersion := "2.12.8" + +crossScalaVersions := Seq("2.11.12", "2.12.6") + +lazy val root = (project in file(".")).enablePlugins(PlayScala) + +libraryDependencies += guice +libraryDependencies += jdbc +libraryDependencies += evolutions + +libraryDependencies += "com.h2database" % "h2" % "1.4.197" + +libraryDependencies += "org.playframework.anorm" %% "anorm" % "2.6.1" +libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test diff --git a/play-scala-anorm-example/conf/application.conf b/play-scala-anorm-example/conf/application.conf new file mode 100644 index 000000000..4f896ee3e --- /dev/null +++ b/play-scala-anorm-example/conf/application.conf @@ -0,0 +1,32 @@ +# Database configuration +# ~~~~~ +# You can declare as many datasources as you want. +# By convention, the default datasource is named `default` +db.default.driver=org.h2.Driver +db.default.url="jdbc:h2:mem:play" + +# Assets configuration +# ~~~~~ +"assets.cache./public/stylesheets/bootstrap.min.css"="max-age=3600" + + +# Number of database connections +# See https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing +fixedConnectionPool = 9 + +play.db { + prototype { + hikaricp.minimumIdle = ${fixedConnectionPool} + hikaricp.maximumPoolSize = ${fixedConnectionPool} + } +} + +# Job queue sized to HikariCP connection pool +database.dispatcher { + executor = "thread-pool-executor" + throughput = 1 + thread-pool-executor { + fixed-pool-size = ${fixedConnectionPool} + } +} + diff --git a/play-scala-anorm-example/conf/evolutions/default/1.sql b/play-scala-anorm-example/conf/evolutions/default/1.sql new file mode 100644 index 000000000..317d2eadb --- /dev/null +++ b/play-scala-anorm-example/conf/evolutions/default/1.sql @@ -0,0 +1,43 @@ +# --- First database schema + +# --- !Ups + +set ignorecase true; + +create table company ( + id bigint not null, + name varchar(255) not null, + constraint pk_company primary key (id)) +; + +create table computer ( + id bigint not null, + name varchar(255) not null, + introduced timestamp, + discontinued timestamp, + company_id bigint, + constraint pk_computer primary key (id)) +; + +create sequence company_seq start with 1000; + +create sequence computer_seq start with 1000; + +alter table computer add constraint fk_computer_company_1 foreign key (company_id) references company (id) on delete restrict on update restrict; +create index ix_computer_company_1 on computer (company_id); + + +# --- !Downs + +SET REFERENTIAL_INTEGRITY FALSE; + +drop table if exists company; + +drop table if exists computer; + +SET REFERENTIAL_INTEGRITY TRUE; + +drop sequence if exists company_seq; + +drop sequence if exists computer_seq; + diff --git a/play-scala-anorm-example/conf/evolutions/default/2.sql b/play-scala-anorm-example/conf/evolutions/default/2.sql new file mode 100644 index 000000000..a15bd5644 --- /dev/null +++ b/play-scala-anorm-example/conf/evolutions/default/2.sql @@ -0,0 +1,626 @@ +# --- Sample dataset + +# --- !Ups + +insert into company (id,name) values ( 1,'Apple Inc.'); +insert into company (id,name) values ( 2,'Thinking Machines'); +insert into company (id,name) values ( 3,'RCA'); +insert into company (id,name) values ( 4,'Netronics'); +insert into company (id,name) values ( 5,'Tandy Corporation'); +insert into company (id,name) values ( 6,'Commodore International'); +insert into company (id,name) values ( 7,'MOS Technology'); +insert into company (id,name) values ( 8,'Micro Instrumentation and Telemetry Systems'); +insert into company (id,name) values ( 9,'IMS Associates, Inc.'); +insert into company (id,name) values ( 10,'Digital Equipment Corporation'); +insert into company (id,name) values ( 11,'Lincoln Laboratory'); +insert into company (id,name) values ( 12,'Moore School of Electrical Engineering'); +insert into company (id,name) values ( 13,'IBM'); +insert into company (id,name) values ( 14,'Amiga Corporation'); +insert into company (id,name) values ( 15,'Canon'); +insert into company (id,name) values ( 16,'Nokia'); +insert into company (id,name) values ( 17,'Sony'); +insert into company (id,name) values ( 18,'OQO'); +insert into company (id,name) values ( 19,'NeXT'); +insert into company (id,name) values ( 20,'Atari'); +insert into company (id,name) values ( 22,'Acorn computer'); +insert into company (id,name) values ( 23,'Timex Sinclair'); +insert into company (id,name) values ( 24,'Nintendo'); +insert into company (id,name) values ( 25,'Sinclair Research Ltd'); +insert into company (id,name) values ( 26,'Xerox'); +insert into company (id,name) values ( 27,'Hewlett-Packard'); +insert into company (id,name) values ( 28,'Zemmix'); +insert into company (id,name) values ( 29,'ACVS'); +insert into company (id,name) values ( 30,'Sanyo'); +insert into company (id,name) values ( 31,'Cray'); +insert into company (id,name) values ( 32,'Evans & Sutherland'); +insert into company (id,name) values ( 33,'E.S.R. Inc.'); +insert into company (id,name) values ( 34,'OMRON'); +insert into company (id,name) values ( 35,'BBN Technologies'); +insert into company (id,name) values ( 36,'Lenovo Group'); +insert into company (id,name) values ( 37,'ASUS'); +insert into company (id,name) values ( 38,'Amstrad'); +insert into company (id,name) values ( 39,'Sun Microsystems'); +insert into company (id,name) values ( 40,'Texas Instruments'); +insert into company (id,name) values ( 41,'HTC Corporation'); +insert into company (id,name) values ( 42,'Research In Motion'); +insert into company (id,name) values ( 43,'Samsung Electronics'); + +insert into computer (id,name,introduced,discontinued,company_id) values ( 1,'MacBook Pro 15.4 inch',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 2,'CM-2a',null,null,2); +insert into computer (id,name,introduced,discontinued,company_id) values ( 3,'CM-200',null,null,2); +insert into computer (id,name,introduced,discontinued,company_id) values ( 4,'CM-5e',null,null,2); +insert into computer (id,name,introduced,discontinued,company_id) values ( 5,'CM-5','1991-01-01',null,2); +insert into computer (id,name,introduced,discontinued,company_id) values ( 6,'MacBook Pro','2006-01-10',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 7,'Apple IIe',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 8,'Apple IIc',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 9,'Apple IIGS',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 10,'Apple IIc Plus',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 11,'Apple II Plus',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 12,'Apple III','1980-05-01','1984-04-01',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 13,'Apple Lisa',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 14,'CM-2',null,null,2); +insert into computer (id,name,introduced,discontinued,company_id) values ( 15,'Connection Machine','1987-01-01',null,2); +insert into computer (id,name,introduced,discontinued,company_id) values ( 16,'Apple II','1977-04-01','1993-10-01',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 17,'Apple III Plus','1983-12-01','1984-04-01',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 18,'COSMAC ELF',null,null,3); +insert into computer (id,name,introduced,discontinued,company_id) values ( 19,'COSMAC VIP','1977-01-01',null,3); +insert into computer (id,name,introduced,discontinued,company_id) values ( 20,'ELF II','1977-01-01',null,4); +insert into computer (id,name,introduced,discontinued,company_id) values ( 21,'Macintosh','1984-01-24',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 22,'Macintosh II',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 23,'Macintosh Plus','1986-01-16','1990-10-15',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 24,'Macintosh IIfx',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 25,'iMac','1998-01-01',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 26,'Mac Mini','2005-01-22',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 27,'Mac Pro','2006-08-07',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 28,'Power Macintosh','1994-03-01','2006-08-01',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 29,'PowerBook','1991-01-01','2006-01-01',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 30,'Xserve',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 31,'Powerbook 100',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 32,'Powerbook 140',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 33,'Powerbook 170',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 34,'PowerBook Duo',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 35,'PowerBook 190',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 36,'Macintosh Quadra','1991-01-01',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 37,'Macintosh Quadra 900',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 38,'Macintosh Quadra 700',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 39,'Macintosh LC','1990-01-01',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 40,'Macintosh LC II','1990-01-01',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 41,'Macintosh LC III','1993-01-01',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 42,'Macintosh LC III+',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 43,'Macintosh Quadra 605','1993-10-21',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 44,'Macintosh LC 500 series',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 45,'TRS-80 Color Computer','1980-01-01',null,5); +insert into computer (id,name,introduced,discontinued,company_id) values ( 46,'Acorn System 2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 47,'Dragon 32/64',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 48,'MEK6800D2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 49,'Newbear 77/68',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 50,'Commodore PET',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 51,'Commodore 64','1982-08-01','1994-01-01',6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 52,'Commodore 64C',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 53,'Commodore SX-64',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 54,'Commodore 128',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 55,'Apple I','1976-04-01','1977-10-01',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 56,'KIM-1','1975-01-01',null,7); +insert into computer (id,name,introduced,discontinued,company_id) values ( 57,'Altair 8800','1974-12-19',null,8); +insert into computer (id,name,introduced,discontinued,company_id) values ( 58,'IMSAI 8080','1975-08-01',null,9); +insert into computer (id,name,introduced,discontinued,company_id) values ( 59,'IMSAI Series Two',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 60,'VAX','1977-10-25',null,10); +insert into computer (id,name,introduced,discontinued,company_id) values ( 61,'VAX 11/780','1977-10-25',null,10); +insert into computer (id,name,introduced,discontinued,company_id) values ( 62,'VAX 11/750','1980-10-01',null,10); +insert into computer (id,name,introduced,discontinued,company_id) values ( 63,'TX-2','1958-01-01',null,11); +insert into computer (id,name,introduced,discontinued,company_id) values ( 64,'TX-0','1956-01-01',null,11); +insert into computer (id,name,introduced,discontinued,company_id) values ( 65,'Whirlwind','1951-04-20',null,11); +insert into computer (id,name,introduced,discontinued,company_id) values ( 66,'ENIAC','1946-02-15','1955-10-02',12); +insert into computer (id,name,introduced,discontinued,company_id) values ( 67,'IBM PC','1981-08-12',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values ( 68,'Macintosh Classic',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 69,'Macintosh Classic II','1991-01-01',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 70,'Amiga','1985-01-01',null,14); +insert into computer (id,name,introduced,discontinued,company_id) values ( 71,'Amiga 1000',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 72,'Amiga 500','1987-01-01',null,6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 73,'Amiga 500+',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 74,'Amiga 2000','1986-01-01','1990-01-01',6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 75,'Amiga 3000',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 76,'Amiga 600','1992-03-01',null,6); +insert into computer (id,name,introduced,discontinued,company_id) values ( 77,'Macintosh 128K','1984-01-01',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 78,'Macintosh 512K','1984-09-10','1986-04-14',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 79,'Macintosh SE','1987-03-02','1989-08-01',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 80,'Macintosh SE/30','1989-01-19','1991-10-21',1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 81,'Canon Cat','1987-01-01',null,15); +insert into computer (id,name,introduced,discontinued,company_id) values ( 82,'Nokia 770',null,null,16); +insert into computer (id,name,introduced,discontinued,company_id) values ( 83,'Nokia N800','2007-01-01',null,16); +insert into computer (id,name,introduced,discontinued,company_id) values ( 84,'Mylo','2006-09-21',null,17); +insert into computer (id,name,introduced,discontinued,company_id) values ( 85,'OQO 02','2007-01-01',null,18); +insert into computer (id,name,introduced,discontinued,company_id) values ( 86,'OQO 01+',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 87,'Pinwheel calculator',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 88,'iBook',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 89,'MacBook','2006-05-16',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values ( 90,'NeXTstation','1990-01-01','1993-01-01',19); +insert into computer (id,name,introduced,discontinued,company_id) values ( 91,'NeXTcube','1988-01-01','1993-01-01',19); +insert into computer (id,name,introduced,discontinued,company_id) values ( 92,'NeXTstation Color Turbo',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 93,'NeXTstation Color',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 94,'NeXTstation Turbo',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 95,'NeXTcube Turbo',null,null,19); +insert into computer (id,name,introduced,discontinued,company_id) values ( 96,'NeXTcube 040',null,null,19); +insert into computer (id,name,introduced,discontinued,company_id) values ( 97,'NeXTcube 030',null,null,19); +insert into computer (id,name,introduced,discontinued,company_id) values ( 98,'Tinkertoy Tic-Tac-Toe Computer',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values ( 99,'Z3',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (100,'Z4',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (101,'Z1',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (102,'Z2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (103,'Wang 2200','1973-05-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (104,'Wang VS',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (105,'Wang OIS',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (106,'BBC Micro',null,null,22); +insert into computer (id,name,introduced,discontinued,company_id) values (107,'IBM 650','1953-01-01','1962-01-01',13); +insert into computer (id,name,introduced,discontinued,company_id) values (108,'Cray-1',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (109,'Cray-3',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (110,'Cray-2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (111,'Cray-4',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (112,'Cray X1',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (113,'Cray XD1',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (114,'Cray T3D','1993-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (115,'Cray T3E','1995-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (116,'Cray C90',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (117,'Cray T90',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (118,'Cray SV1',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (119,'Cray J90',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (120,'Cray XT3',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (121,'Cray CS6400',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (122,'Atari ST','1985-01-01','1993-01-01',20); +insert into computer (id,name,introduced,discontinued,company_id) values (123,'Amiga 2500',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (124,'Amiga 2500',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (125,'Amiga 4000',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (126,'Amiga 3000UX',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (127,'Amiga 3000T',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (128,'Amiga 4000T',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (129,'Amiga 1200','1992-10-01','1996-01-01',6); +insert into computer (id,name,introduced,discontinued,company_id) values (130,'Atari 1040 STf','1986-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (131,'Atari 520 ST','1985-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (132,'Atari 520 STfm','1986-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (133,'Atari 1040 STe','1989-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (134,'Atari MEGA STe','1991-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (135,'Atari 520 ST+','1985-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (136,'Atari 520 STm','1985-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (137,'Atari 130 ST','1985-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (138,'Atari 260 ST','1985-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (139,'Atari MEGA ST','1987-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (140,'Atari 520 STf','1986-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (141,'Atari 1040 STfm','1986-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (142,'Atari 2080 ST','1986-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (143,'Atari 260 ST+','1985-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (144,'Atari 4160 STe','1988-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (145,'TRS-80 Color Computer 2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (146,'TRS-80 Color Computer 3',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (147,'TRS-80 Model 1','1977-01-01',null,5); +insert into computer (id,name,introduced,discontinued,company_id) values (148,'Timex Sinclair 2068','1983-11-01','1984-04-01',23); +insert into computer (id,name,introduced,discontinued,company_id) values (149,'ZX Spectrum','1982-01-01',null,25); +insert into computer (id,name,introduced,discontinued,company_id) values (150,'Xerox Star','1981-01-01',null,26); +insert into computer (id,name,introduced,discontinued,company_id) values (151,'Xerox Alto',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (152,'Acorn Archimedes',null,null,22); +insert into computer (id,name,introduced,discontinued,company_id) values (153,'Nintendo Entertainment System',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (154,'Super Nintendo Entertainment System','1991-08-01','1999-01-01',24); +insert into computer (id,name,introduced,discontinued,company_id) values (155,'Super Famicom',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (156,'Nintendo GameCube',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (157,'Game Boy line',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (158,'PlayStation','1994-12-03',null,17); +insert into computer (id,name,introduced,discontinued,company_id) values (159,'PlayStation 2','2000-03-24',null,17); +insert into computer (id,name,introduced,discontinued,company_id) values (160,'Game & Watch',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (161,'EDSAC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (162,'IBM System/4 Pi',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (163,'IBM AP-101',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (164,'IBM TC-1',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (165,'IBM AP-101B',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (166,'IBM AP-101S',null,null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (167,'ProLiant',null,null,27); +insert into computer (id,name,introduced,discontinued,company_id) values (168,'Http://nepomuk.semanticdesktop.org/xwiki/',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (169,'Sinclair QL','1984-01-01','1986-01-01',25); +insert into computer (id,name,introduced,discontinued,company_id) values (170,'Sinclair ZX81','1981-01-01',null,25); +insert into computer (id,name,introduced,discontinued,company_id) values (171,'Sinclair ZX80',null,null,25); +insert into computer (id,name,introduced,discontinued,company_id) values (172,'Atari 65XE',null,null,20); +insert into computer (id,name,introduced,discontinued,company_id) values (173,'Deep Blue',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (174,'Macintosh Quadra 650',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (175,'Macintosh Quadra 610',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (176,'Macintosh Quadra 800',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (177,'Macintosh Quadra 950',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (178,'PowerBook 160',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (179,'PowerBook 145B',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (180,'PowerBook 170',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (181,'PowerBook 145',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (182,'PowerBook G3',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (183,'PowerBook 140',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (184,'Macintosh IIcx',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (185,'Powerbook 180',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (186,'PowerBook G4',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (187,'Macintosh XL',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (188,'PowerBook 100',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (189,'PowerBook 2400c',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (190,'PowerBook 1400',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (191,'Macintosh Quadra 630',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (192,'Macintosh Quadra 660AV',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (193,'Macintosh Quadra 840AV',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (194,'PowerBook 5300',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (195,'PowerBook 3400c',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (196,'Macintosh Color Classic',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (197,'Macintosh 512Ke',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (198,'Macintosh IIsi',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (199,'Macintosh IIx',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (200,'PowerBook 500 series',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (201,'Power Macintosh G3',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (202,'Macintosh IIci',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (203,'iMac G5','2004-08-31',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (204,'Power Mac G4',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (205,'Power Macintosh 7100',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (206,'Power Macintosh 9600',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (207,'Power Macintosh 7200',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (208,'Power Macintosh 7300',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (209,'Power Macintosh 8600',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (210,'Power Macintosh 6200',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (211,'Power Macintosh 8100',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (212,'Compact Macintosh',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (213,'Power Macintosh 4400',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (214,'Power Macintosh 9500',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (215,'Macintosh Portable',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (216,'EMac',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (217,'Power Macintosh 7600',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (218,'Power Mac G5',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (219,'Power Macintosh 7500',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (220,'Power Macintosh 6100',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (221,'Power Macintosh 8500',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (222,'Macintosh IIvi',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (223,'Macintosh IIvx',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (224,'IMac G3',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (225,'IMac G4',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (226,'Power Mac G4 Cube',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (227,'Intel iMac',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (228,'Deep Thought',null,null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (229,'Wii','2006-11-19',null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (230,'IBM System x',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (231,'IBM System i','2006-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (232,'IBM System z','2006-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (233,'IBM System p','2000-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (234,'LC 575',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (235,'Macintosh TV',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (236,'Macintosh Performa',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (237,'Macintosh II series',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (238,'Power Macintosh 6400',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (239,'Power Macintosh 6500',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (240,'Apple PenLite',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (241,'Wallstreet',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (242,'Twentieth Anniversary Macintosh',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (243,'Power Macintosh 5500',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (244,'iBook G3',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (245,'Power Macintosh 5200 LC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (246,'Power Macintosh 5400',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (247,'CM-1',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (248,'MSX','1983-01-01','1995-01-01',28); +insert into computer (id,name,introduced,discontinued,company_id) values (249,'PlayStation 3',null,null,17); +insert into computer (id,name,introduced,discontinued,company_id) values (250,'MSX2','1986-01-01',null,29); +insert into computer (id,name,introduced,discontinued,company_id) values (251,'MSX2+','1988-01-01',null,30); +insert into computer (id,name,introduced,discontinued,company_id) values (252,'MSX turbo R','1990-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (253,'Panasonic FS A1GT',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (254,'Panasonic FS A1ST',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (255,'PDP-11',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (256,'PDP-1',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (257,'PDP-10',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (258,'PDP-8',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (259,'PDP-6',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (260,'DECSYSTEM-20',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (261,'PDP-7',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (262,'PDP-5',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (263,'PDP-12',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (264,'LINC',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (265,'PDP-14',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (266,'PDP-15',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (267,'PDP-16',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (268,'Cray X2','2007-01-01',null,31); +insert into computer (id,name,introduced,discontinued,company_id) values (269,'Cray X-MP','1982-01-01',null,31); +insert into computer (id,name,introduced,discontinued,company_id) values (270,'Evans & Sutherland ES-1',null,null,32); +insert into computer (id,name,introduced,discontinued,company_id) values (271,'Commodore VIC-20','1980-01-01',null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (272,'PowerBook 150',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (273,'MacBook Air','2008-01-15',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (274,'Digi-Comp I','1963-01-01',null,33); +insert into computer (id,name,introduced,discontinued,company_id) values (275,'Digi-Comp',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (276,'Digi-Comp II',null,null,33); +insert into computer (id,name,introduced,discontinued,company_id) values (277,'Manchester Mark I','1949-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (278,'Small-Scale Experimental Machine','1948-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (279,'Nintendo 64',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (280,'Game Boy Advance',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (281,'Game Boy',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (282,'Nintendo DS Lite',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (283,'Nintendo DS','2004-01-01',null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (284,'Game Boy Color',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (285,'Game Boy Advance SP',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (286,'Virtual Boy',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (287,'Game Boy Micro',null,null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (288,'Roadrunner',null,null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (289,'HP 9000',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (290,'OMRON Luna-88K2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (291,'OMRON Luna-88K',null,null,34); +insert into computer (id,name,introduced,discontinued,company_id) values (292,'Motorola series 900',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (293,'Motorola M8120',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (294,'Triton Dolphin System 100',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (295,'BBN TC2000','1989-08-01',null,35); +insert into computer (id,name,introduced,discontinued,company_id) values (296,'WRT54G',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (297,'ThinkPad','1992-01-01',null,36); +insert into computer (id,name,introduced,discontinued,company_id) values (298,'Apple Newton','1993-01-01','1998-01-01',1); +insert into computer (id,name,introduced,discontinued,company_id) values (299,'Atanasoff-Berry Computer','1937-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (300,'Atlas Computer','1962-01-01','1974-01-01',null); +insert into computer (id,name,introduced,discontinued,company_id) values (301,'ASUS Eee PC 901',null,null,37); +insert into computer (id,name,introduced,discontinued,company_id) values (302,'ASUS Eee PC 701',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (303,'IBM 7030','1961-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (304,'System/38','1979-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (305,'System/36','1983-01-01','2000-01-01',13); +insert into computer (id,name,introduced,discontinued,company_id) values (306,'IBM 7090','1959-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (307,'IBM RT',null,null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (308,'System/360','1964-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (309,'IBM 801','1980-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (310,'IBM 1401','1959-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (311,'ASCI White','2001-01-01','2006-01-01',13); +insert into computer (id,name,introduced,discontinued,company_id) values (312,'Blue Gene',null,null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (313,'ASCI Blue Pacific','1998-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (314,'iPhone','2007-06-01',null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (315,'Nokia N810','2007-10-17',null,16); +insert into computer (id,name,introduced,discontinued,company_id) values (316,'EDSAC 2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (317,'Titan',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (318,'Pilot ACE',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (319,'HP Mini 1000','2008-10-29',null,27); +insert into computer (id,name,introduced,discontinued,company_id) values (320,'HP 2133 Mini-Note PC','2008-04-15',null,27); +insert into computer (id,name,introduced,discontinued,company_id) values (321,'Kogan Agora Pro','2008-12-04',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (322,'D-Series Machines',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (323,'ZX Spectrum 48K','1982-01-01',null,25); +insert into computer (id,name,introduced,discontinued,company_id) values (324,'ZX Spectrum 16K','1982-01-01',null,25); +insert into computer (id,name,introduced,discontinued,company_id) values (325,'ZX Spectrum 128','1985-09-01',null,25); +insert into computer (id,name,introduced,discontinued,company_id) values (326,'ZX Spectrum +3',null,null,38); +insert into computer (id,name,introduced,discontinued,company_id) values (327,'ZX Spectrum +2','1986-01-01',null,38); +insert into computer (id,name,introduced,discontinued,company_id) values (328,'ZX Spectrum +2A','1987-01-01',null,38); +insert into computer (id,name,introduced,discontinued,company_id) values (329,'ZX Spectrum +','1984-06-01',null,25); +insert into computer (id,name,introduced,discontinued,company_id) values (330,'Acer Extensa',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (331,'Acer Extensa 5220',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (332,'Dell Latitude',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (333,'Toshiba Satellite',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (334,'Timex Sinclair 2048',null,null,23); +insert into computer (id,name,introduced,discontinued,company_id) values (335,'Sprinter',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (336,'Timex Computer 2048',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (337,'Pentagon',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (338,'Belle',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (339,'Loki',null,null,25); +insert into computer (id,name,introduced,discontinued,company_id) values (340,'Hobbit',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (341,'NeXT Computer',null,null,19); +insert into computer (id,name,introduced,discontinued,company_id) values (342,'TRS-80',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (343,'TRS-80 Model 2','1980-01-01',null,5); +insert into computer (id,name,introduced,discontinued,company_id) values (344,'TRS-80 Model 3',null,null,5); +insert into computer (id,name,introduced,discontinued,company_id) values (345,'STacy','1989-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (346,'ST BOOK','1990-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (347,'Atari 520 STE','1989-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (348,'Amiga 2000 Model A',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (349,'Amiga 2000 Model B',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (350,'Amiga 2000 Model C',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (351,'IBM 3270',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (352,'CALDIC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (353,'Modbook',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (354,'Compaq SystemPro',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (355,'ARRA',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (356,'IBM System Cluster 1350',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (357,'Finite element machine',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (358,'ES7000',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (359,'HP MediaSmart Server',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (360,'HP Superdome',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (361,'IBM Power Systems','2008-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (362,'Oslo Analyzer',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (363,'Microsoft Softcard',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (364,'WITCH',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (365,'Analytical engine',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (366,'EDVAC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (367,'BINAC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (368,'Earth Simulator',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (369,'BARK',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (370,'Harvard Mark I','1944-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (371,'ILLIAC IV',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (372,'ILLIAC II',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (373,'ILLIAC III',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (374,'Water integrator',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (375,'CSIRAC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (376,'System X',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (377,'Harvest',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (378,'ChipTest',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (379,'HiTech',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (380,'Bomba',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (381,'ACE',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (382,'ASCI Red',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (383,'ASCI Thors Hammer',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (384,'ASCI Purple','2005-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (385,'ASCI Blue Mountain',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (386,'Columbia',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (387,'HP Integrity',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (388,'APEXC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (389,'Datasaab D2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (390,'BRLESC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (391,'DYSEAC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (392,'SSEC','1948-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (393,'Hydra',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (394,'FUJIC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (395,'RAYDAC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (396,'Harvard Mark III',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (397,'DATAR',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (398,'ReserVec',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (399,'DASK',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (400,'UTEC',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (401,'DRTE Computer',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (402,'PowerEdge',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (403,'Apple Network Server',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (404,'Goodyear MPP',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (405,'Macintosh 128K technical details',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (406,'Power Macintosh G3',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (407,'CER-10',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (408,'CER-20',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (409,'IBM BladeCenter','2002-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (410,'Wisconsin Integrally Synchronized Computer',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (411,'Amstrad CPC',null,null,38); +insert into computer (id,name,introduced,discontinued,company_id) values (412,'Amstrad CPC 6128',null,null,38); +insert into computer (id,name,introduced,discontinued,company_id) values (413,'Amstrad CPC 664',null,null,38); +insert into computer (id,name,introduced,discontinued,company_id) values (414,'Amstrad CPC 464',null,null,38); +insert into computer (id,name,introduced,discontinued,company_id) values (415,'Intergraph',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (416,'Enterprise',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (417,'MTX500',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (418,'Acorn Electron',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (419,'Sony Vaio P','2009-02-01',null,17); +insert into computer (id,name,introduced,discontinued,company_id) values (420,'VAIO',null,null,17); +insert into computer (id,name,introduced,discontinued,company_id) values (421,'Sony Vaio P VGN-P588E/Q',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (422,'Sony Vaio P VGN-P530H/G',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (423,'Sony Vaio P VGN-P530H/W',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (424,'Sony Vaio P VGN-P530H/Q',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (425,'Sony Vaio P VGN-P530H/R',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (426,'Sony Vaio P VGN-P588E/R',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (427,'Sony Vaio P VGN-P598E/Q',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (428,'Timex Sinclair 1000','1982-07-01',null,23); +insert into computer (id,name,introduced,discontinued,company_id) values (429,'Komputer 2086',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (430,'Galaksija',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (431,'Vector-06C',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (432,'Elektronika BK',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (433,'Sun386i',null,null,39); +insert into computer (id,name,introduced,discontinued,company_id) values (434,'Xerox Daybreak','1985-01-01','1989-01-01',null); +insert into computer (id,name,introduced,discontinued,company_id) values (435,'Xerox NoteTaker',null,null,26); +insert into computer (id,name,introduced,discontinued,company_id) values (436,'D4a','1965-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (437,'LGP-30',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (438,'LGP-21',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (439,'ASUS Eee PC 900','2008-05-01',null,37); +insert into computer (id,name,introduced,discontinued,company_id) values (440,'Atari TT030',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (441,'Bi Am ZX-Spectrum 48/64',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (442,'Bi Am ZX-Spectrum 128',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (443,'PlayStation Portable',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (444,'MSI Wind Netbook',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (445,'Sharp Mebius NJ70A','2009-04-21',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (446,'HTC Snap',null,null,41); +insert into computer (id,name,introduced,discontinued,company_id) values (447,'Commodore Educator 64',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (448,'Amiga 1500',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (449,'Commodore 65',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (450,'Commodore 16',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (451,'Commodore CBM-II',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (452,'Commodore Plus/4',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (453,'Commodore LCD',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (454,'Commodore MAX Machine',null,null,6); +insert into computer (id,name,introduced,discontinued,company_id) values (455,'Aster CT-80',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (456,'Test','2009-01-01','2009-01-01',null); +insert into computer (id,name,introduced,discontinued,company_id) values (457,'MSI GX723',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (458,'Eee PC 1000HV','2009-05-22',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (459,'VTech Laser 200','1983-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (460,'CrunchPad',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (461,'Neo Geo','1990-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (462,'Sega Mega Drive',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (463,'Sega Master System',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (464,'TurboGrafx-16',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (465,'Sun-3',null,null,39); +insert into computer (id,name,introduced,discontinued,company_id) values (466,'Pleiades',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (467,'IBM Sequoia',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (468,'Inves Spectrum 48k plus',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (469,'iPhone 3G',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (470,'iPhone 3GS',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (471,'Beagle Board',null,null,40); +insert into computer (id,name,introduced,discontinued,company_id) values (472,'HP nPar',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (473,'MacBook Family',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (474,'Reservisor',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (475,'BladeSystem',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (476,'lenovo thinkpad t60p',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (477,'lenovo thinkpad x200',null,null,36); +insert into computer (id,name,introduced,discontinued,company_id) values (478,'lenovo thinkpad t60',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (479,'lenovo thinkpad w700',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (480,'lenovo thinkpad t41',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (481,'lenovo thinkpad z61p',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (482,'lenovo thinkpad x61s',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (483,'lenovo thinkpad t43',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (484,'lenovo thinkpad r400',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (485,'lenovo thinkpad x60s',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (486,'lenovo thinkpad x301',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (487,'lenovo thinkpad t42',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (488,'lenovo thinkpad r61',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (489,'lenovo thinkpad w500',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (490,'lenovo thinkpad sl400',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (491,'lenovo thinkpad x40',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (492,'lenovo thinkpad x200 tablet',null,null,36); +insert into computer (id,name,introduced,discontinued,company_id) values (493,'lenovo thinkpad t400s',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (494,'Nokia N900','2009-10-01',null,16); +insert into computer (id,name,introduced,discontinued,company_id) values (495,'Internet Tablet',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (496,'Meiko Computing Surface','1986-01-01','1993-01-01',null); +insert into computer (id,name,introduced,discontinued,company_id) values (497,'CS-2',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (498,'IBM 701','1952-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (499,'IBM 5100','1975-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (500,'AN/FSQ-7','1958-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (501,'AN/FSQ-32','1960-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (502,'IBM CPC','1949-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (503,'System/34','1978-01-01','1983-01-01',13); +insert into computer (id,name,introduced,discontinued,company_id) values (504,'System/32','1975-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (505,'System/3','1969-01-01','1985-01-01',13); +insert into computer (id,name,introduced,discontinued,company_id) values (506,'IBM 305','1956-01-01',null,13); +insert into computer (id,name,introduced,discontinued,company_id) values (507,'English Electric DEUCE',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (508,'CER-203',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (509,'CER-22',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (510,'Kentucky Linux Athlon Testbed',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (511,'QNAP TS-101',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (512,'iPad','2010-01-01','2011-03-02',1); +insert into computer (id,name,introduced,discontinued,company_id) values (513,'iPhone 2G',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (514,'Inslaw',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (515,'WePad','2010-07-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (516,'MacBook Parts',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (517,'MacBook 13-inch Core 2 Duo 2.13GHz (MC240LL/A) DDR2 Model',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (518,'MacBook 13-inch Core 2 Duo 2.13GHz (MC240T/A) DDR2 Model',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (519,'MacBook 13-inch Core 2 Duo 2.13GHz (MC240X/A) DDR2 Model',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (520,'MacBook 13-inch Core 2 Duo 2.26GHz (Unibody MC207LL/A) DDR3 Model',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (521,'MC240LL/A',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (522,'D.K.COMMUNICATION',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (523,'iPhone 4',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (524,'Nintendo 3DS','2010-03-23',null,24); +insert into computer (id,name,introduced,discontinued,company_id) values (525,'ASUS Eee PC 1005PE','2010-01-01',null,37); +insert into computer (id,name,introduced,discontinued,company_id) values (526,'National Law Enforcement System',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (527,'BlackBerry PlayBook',null,null,42); +insert into computer (id,name,introduced,discontinued,company_id) values (528,'Barnes & Noble nook','2009-10-20',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (529,'SAM Coupé',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (530,'HTC Dream','2008-10-22',null,41); +insert into computer (id,name,introduced,discontinued,company_id) values (531,'Samsung Galaxy Tab','2010-09-02',null,43); +insert into computer (id,name,introduced,discontinued,company_id) values (532,'BlackBerry PlayBook','2010-09-27',null,42); +insert into computer (id,name,introduced,discontinued,company_id) values (533,'Tianhe-I',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (534,'Kno',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (535,'ThinkPad 701 C',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (536,'ThinkPad 340 CSE',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (537,'ThinkPad 755 CX',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (538,'ThinkPad 755 CE',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (539,'ThinkPad 370 C',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (540,'Coleco Adam','1983-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (541,'Nebulae',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (542,'Alex eReader',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (543,'Acer Iconia',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (544,'Archos 101',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (545,'Fujitsu Lifebook T900',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (546,'Motorola Xoom',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (547,'ViewSonic G Tablet',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (548,'DEC Professional','1982-01-01',null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (549,'DEC Multia','1994-11-07',null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (550,'DEC Firefly',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (551,'DEC 3000 AXP',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (552,'DEC 2000 AXP','1993-05-25',null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (553,'DEC 4000 AXP','1992-11-10',null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (554,'DEC 7000/10000 AXP','1992-11-10',null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (555,'DEC Professional 350',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (556,'DEC Rainbow 100',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (557,'DEC Professional 325',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (558,'DECmate II',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (559,'DECmate',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (560,'DECsystem',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (561,'NetApp Filer',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (562,'DEC GT40',null,null,10); +insert into computer (id,name,introduced,discontinued,company_id) values (563,'ecoATM',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (564,'MindWave BrainCubed Education Bundle',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (565,'PalmPilot',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (566,'Upcoming iPhone 5',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (567,'Dell Inspiron 560 Desktop Computer ',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (568,'IPad 2',null,null,1); +insert into computer (id,name,introduced,discontinued,company_id) values (569,'HP TouchPad','2011-02-09',null,27); +insert into computer (id,name,introduced,discontinued,company_id) values (570,'HP Veer','2011-02-09',null,27); +insert into computer (id,name,introduced,discontinued,company_id) values (571,'Lenovo Thinkpad Edge 11',null,null,36); +insert into computer (id,name,introduced,discontinued,company_id) values (572,'Dell Vostro',null,null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (573,'Gateway LT3103U','2008-01-01',null,null); +insert into computer (id,name,introduced,discontinued,company_id) values (574,'iPhone 4S','2011-10-14',null,1); + +# --- !Downs + +delete from computer; +delete from company; diff --git a/play-scala-anorm-example/conf/logback.xml b/play-scala-anorm-example/conf/logback.xml new file mode 100644 index 000000000..3df42b7a7 --- /dev/null +++ b/play-scala-anorm-example/conf/logback.xml @@ -0,0 +1,34 @@ + + + + + + logs/application.log + + %date [%level] from %logger in %thread - %message%n%xException + + + + + + %coloredLevel %logger{15} - %message%n%xException{10} + + + + + + + + + + + + + + + + + + + + diff --git a/play-scala-anorm-example/conf/messages b/play-scala-anorm-example/conf/messages new file mode 100644 index 000000000..c35175b48 --- /dev/null +++ b/play-scala-anorm-example/conf/messages @@ -0,0 +1,3 @@ +# Messages + +computers.list.title={0,choice,0#No computers|1#One computer|1<{0,number,integer} computers} found diff --git a/play-scala-anorm-example/conf/routes b/play-scala-anorm-example/conf/routes new file mode 100644 index 000000000..f54d67406 --- /dev/null +++ b/play-scala-anorm-example/conf/routes @@ -0,0 +1,24 @@ +# Routes +# This file defines all application routes (Higher priority routes first) +# ~~~~ + +# Default path will just redirect to the computer list +GET / controllers.HomeController.index + +# Computers list (look at the default values for pagination parameters) +GET /computers controllers.HomeController.list(p:Int ?= 0, s:Int ?= 2, f ?= "") + +# Add computer +GET /computers/new controllers.HomeController.create +POST /computers controllers.HomeController.save + +# Edit existing computer +GET /computers/:id controllers.HomeController.edit(id:Long) +POST /computers/:id controllers.HomeController.update(id:Long) + +# Delete a computer +POST /computers/:id/delete controllers.HomeController.delete(id:Long) + +# Map static resources from the /public folder to the /assets URL path +GET /assets/*file controllers.Assets.at(path="/public", file) + diff --git a/play-scala-anorm-example/gradle/wrapper/gradle-wrapper.jar b/play-scala-anorm-example/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..01b8bf6b1 Binary files /dev/null and b/play-scala-anorm-example/gradle/wrapper/gradle-wrapper.jar differ diff --git a/play-scala-anorm-example/gradle/wrapper/gradle-wrapper.properties b/play-scala-anorm-example/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..89dba2d9d --- /dev/null +++ b/play-scala-anorm-example/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/play-scala-anorm-example/gradlew b/play-scala-anorm-example/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/play-scala-anorm-example/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/play-scala-anorm-example/gradlew.bat b/play-scala-anorm-example/gradlew.bat new file mode 100644 index 000000000..e95643d6a --- /dev/null +++ b/play-scala-anorm-example/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/play-scala-anorm-example/project/build.properties b/play-scala-anorm-example/project/build.properties new file mode 100644 index 000000000..c0bab0494 --- /dev/null +++ b/play-scala-anorm-example/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.8 diff --git a/play-scala-anorm-example/project/plugins.sbt b/play-scala-anorm-example/project/plugins.sbt new file mode 100644 index 000000000..f9c49a60a --- /dev/null +++ b/play-scala-anorm-example/project/plugins.sbt @@ -0,0 +1,3 @@ +// The Play plugin +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.21") + diff --git a/play-scala-anorm-example/public/stylesheets/bootstrap.min.css b/play-scala-anorm-example/public/stylesheets/bootstrap.min.css new file mode 100644 index 000000000..bf4532834 --- /dev/null +++ b/play-scala-anorm-example/public/stylesheets/bootstrap.min.css @@ -0,0 +1,330 @@ +html,body{margin:0;padding:0;} +h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;} +table{border-collapse:collapse;border-spacing:0;} +ol,ul{list-style:none;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;} +a:hover,a:active{outline:0;} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;} +button,input{line-height:normal;*overflow:visible;} +button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +html,body{background-color:#ffffff;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;color:#404040;} +.container{width:940px;margin-left:auto;margin-right:auto;zoom:1;}.container:before,.container:after{display:table;content:"";zoom:1;*display:inline;} +.container:after{clear:both;} +.container-fluid{position:relative;min-width:940px;padding-left:20px;padding-right:20px;zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";zoom:1;*display:inline;} +.container-fluid:after{clear:both;} +.container-fluid>.sidebar{float:left;width:220px;} +.container-fluid>.content{margin-left:240px;} +a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.row{zoom:1;margin-left:-20px;}.row:before,.row:after{display:table;content:"";zoom:1;*display:inline;} +.row:after{clear:both;} +[class*="span"]{display:inline;float:left;margin-left:20px;} +.span1{width:40px;} +.span2{width:100px;} +.span3{width:160px;} +.span4{width:220px;} +.span5{width:280px;} +.span6{width:340px;} +.span7{width:400px;} +.span8{width:460px;} +.span9{width:520px;} +.span10{width:580px;} +.span11{width:640px;} +.span12{width:700px;} +.span13{width:760px;} +.span14{width:820px;} +.span15{width:880px;} +.span16{width:940px;} +.span17{width:1000px;} +.span18{width:1060px;} +.span19{width:1120px;} +.span20{width:1180px;} +.span21{width:1240px;} +.span22{width:1300px;} +.span23{width:1360px;} +.span24{width:1420px;} +.offset1{margin-left:80px;} +.offset2{margin-left:140px;} +.offset3{margin-left:200px;} +.offset4{margin-left:260px;} +.offset5{margin-left:320px;} +.offset6{margin-left:380px;} +.offset7{margin-left:440px;} +.offset8{margin-left:500px;} +.offset9{margin-left:560px;} +.offset10{margin-left:620px;} +.offset11{margin-left:680px;} +.offset12{margin-left:740px;} +.span-one-third{width:300px;} +.span-two-thirds{width:620px;} +.offset-one-third{margin-left:340px;} +.offset-two-thirds{margin-left:660px;} +p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;} +h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;} +h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;} +h3,h4,h5,h6{line-height:36px;} +h3{font-size:18px;}h3 small{font-size:14px;} +h4{font-size:16px;}h4 small{font-size:12px;} +h5{font-size:14px;} +h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;} +ul,ol{margin:0 0 18px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;color:#808080;} +ul.unstyled{list-style:none;margin-left:0;} +dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;} +dl dt{font-weight:bold;} +dl dd{margin-left:9px;} +hr{margin:20px 0 19px;border:0;border-bottom:1px solid #eee;} +strong{font-style:inherit;font-weight:bold;} +em{font-style:italic;font-weight:inherit;line-height:inherit;} +.muted{color:#bfbfbf;} +blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;} +blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';} +address{display:block;line-height:18px;margin-bottom:18px;} +code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;} +pre{background-color:#f5f5f5;display:block;padding:8.5px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;} +form{margin-bottom:18px;} +fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;padding-left:150px;font-size:19.5px;line-height:1;color:#404040;*padding:0 0 5px 145px;*line-height:1.5;} +form .clearfix{margin-bottom:18px;zoom:1;}form .clearfix:before,form .clearfix:after{display:table;content:"";zoom:1;*display:inline;} +form .clearfix:after{clear:both;} +label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;} +label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;} +form .input{margin-left:150px;} +input[type=checkbox],input[type=radio]{cursor:pointer;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;font-size:13px;line-height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:none;} +input[type=file]{background-color:#ffffff;padding:initial;border:initial;line-height:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;} +select,input[type=file]{height:27px;line-height:27px;*margin-top:4px;} +select[multiple]{height:inherit;} +textarea{height:auto;} +.uneditable-input{background-color:#ffffff;display:block;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#bfbfbf;} +::-webkit-input-placeholder{color:#bfbfbf;} +input,textarea{-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);} +input:focus,textarea:focus{outline:0;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);} +input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:1px dotted #666;} +form div.clearfix.error{background:#fae5e3;padding:10px 0;margin:-10px 0 10px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}form div.clearfix.error>label,form div.clearfix.error span.help-inline,form div.clearfix.error span.help-block{color:#9d261d;} +form div.clearfix.error input,form div.clearfix.error textarea{border-color:#c87872;-webkit-box-shadow:0 0 3px rgba(171, 41, 32, 0.25);-moz-box-shadow:0 0 3px rgba(171, 41, 32, 0.25);box-shadow:0 0 3px rgba(171, 41, 32, 0.25);}form div.clearfix.error input:focus,form div.clearfix.error textarea:focus{border-color:#b9554d;-webkit-box-shadow:0 0 6px rgba(171, 41, 32, 0.5);-moz-box-shadow:0 0 6px rgba(171, 41, 32, 0.5);box-shadow:0 0 6px rgba(171, 41, 32, 0.5);} +form div.clearfix.error .input-prepend span.add-on,form div.clearfix.error .input-append span.add-on{background:#f4c8c5;border-color:#c87872;color:#b9554d;} +.input-mini,input.mini,textarea.mini,select.mini{width:60px;} +.input-small,input.small,textarea.small,select.small{width:90px;} +.input-medium,input.medium,textarea.medium,select.medium{width:150px;} +.input-large,input.large,textarea.large,select.large{width:210px;} +.input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;} +.input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;} +textarea.xxlarge{overflow-y:auto;} +input.span1,textarea.span1,select.span1{display:inline-block;float:none;width:30px;margin-left:0;} +input.span2,textarea.span2,select.span2{display:inline-block;float:none;width:90px;margin-left:0;} +input.span3,textarea.span3,select.span3{display:inline-block;float:none;width:150px;margin-left:0;} +input.span4,textarea.span4,select.span4{display:inline-block;float:none;width:210px;margin-left:0;} +input.span5,textarea.span5,select.span5{display:inline-block;float:none;width:270px;margin-left:0;} +input.span6,textarea.span6,select.span6{display:inline-block;float:none;width:330px;margin-left:0;} +input.span7,textarea.span7,select.span7{display:inline-block;float:none;width:390px;margin-left:0;} +input.span8,textarea.span8,select.span8{display:inline-block;float:none;width:450px;margin-left:0;} +input.span9,textarea.span9,select.span9{display:inline-block;float:none;width:510px;margin-left:0;} +input.span10,textarea.span10,select.span10{display:inline-block;float:none;width:570px;margin-left:0;} +input.span11,textarea.span11,select.span11{display:inline-block;float:none;width:630px;margin-left:0;} +input.span12,textarea.span12,select.span12{display:inline-block;float:none;width:690px;margin-left:0;} +input.span13,textarea.span13,select.span13{display:inline-block;float:none;width:750px;margin-left:0;} +input.span14,textarea.span14,select.span14{display:inline-block;float:none;width:810px;margin-left:0;} +input.span15,textarea.span15,select.span15{display:inline-block;float:none;width:870px;margin-left:0;} +input.span16,textarea.span16,select.span16{display:inline-block;float:none;width:930px;margin-left:0;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;} +.help-inline,.help-block{font-size:11px;line-height:18px;color:#bfbfbf;} +.help-inline{padding-left:5px;*position:relative;*top:-5px;} +.help-block{display:block;max-width:600px;} +.inline-inputs{color:#808080;}.inline-inputs span,.inline-inputs input{display:inline-block;} +.inline-inputs input.mini{width:60px;} +.inline-inputs input.small{width:90px;} +.inline-inputs span{padding:0 2px 0 1px;} +.input-prepend input,.input-append input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-prepend .add-on,.input-append .add-on{position:relative;background:#f5f5f5;border:1px solid #ccc;z-index:2;float:left;display:block;width:auto;min-width:16px;height:18px;padding:4px 4px 4px 5px;margin-right:-1px;font-weight:normal;line-height:18px;color:#bfbfbf;text-align:center;text-shadow:0 1px 0 #ffffff;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin-right:0;margin-left:-1px;} +.inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;} +.inputs-list label{display:block;float:none;width:auto;padding:0;line-height:18px;text-align:left;white-space:normal;}.inputs-list label strong{color:#808080;} +.inputs-list label small{font-size:11px;font-weight:normal;} +.inputs-list .inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;} +.inputs-list:first-child{padding-top:6px;} +.inputs-list li+li{padding-top:2px;} +.inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;} +.form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;} +.form-stacked legend{padding-left:0;} +.form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;} +.form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;} +.form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;} +.form-stacked div.clearfix.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;} +.form-stacked .actions{margin-left:-20px;padding-left:20px;} +table{width:100%;margin-bottom:18px;padding:0;border-collapse:separate;*border-collapse:collapse;font-size:13px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}table th,table td{padding:10px 10px 9px;line-height:18px;text-align:left;} +table th{padding-top:9px;font-weight:bold;vertical-align:middle;border-bottom:1px solid #ddd;} +table td{vertical-align:top;} +table th+th,table td+td{border-left:1px solid #ddd;} +table tr+tr td{border-top:1px solid #ddd;} +table tbody tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +table tbody tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +table tbody tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +table tbody tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.zebra-striped tbody tr:nth-child(odd) td{background-color:#f9f9f9;} +.zebra-striped tbody tr:hover td{background-color:#f5f5f5;} +table .header{cursor:pointer;}table .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;} +table .headerSortUp,table .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);} +table .header:hover:after{visibility:visible;} +table .headerSortDown:after,table .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} +table .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} +table .blue{color:#049cdb;border-bottom-color:#049cdb;} +table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;} +table .green{color:#46a546;border-bottom-color:#46a546;} +table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;} +table .red{color:#9d261d;border-bottom-color:#9d261d;} +table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;} +table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;} +table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;} +table .orange{color:#f89406;border-bottom-color:#f89406;} +table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;} +table .purple{color:#7a43b6;border-bottom-color:#7a43b6;} +table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;} +.topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.topbar h3 a:hover,.topbar .brand a:hover,.topbar ul .active>a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;} +.topbar h3{position:relative;} +.topbar h3 a,.topbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;} +.topbar p{margin:0;line-height:40px;}.topbar p a:hover{background-color:transparent;color:#ffffff;} +.topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;} +.topbar form.pull-right{float:right;} +.topbar input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;padding:4px 9px;color:#ffffff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.topbar input:-moz-placeholder{color:#e6e6e6;} +.topbar input::-webkit-input-placeholder{color:#e6e6e6;} +.topbar input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#ffffff;} +.topbar input:focus,.topbar input.focused{outline:0;background-color:#ffffff;color:#404040;text-shadow:0 1px 0 #ffffff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);} +.topbar-inner,.topbar .fill{background-color:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.topbar div>ul,.nav{display:block;float:left;margin:0 10px 0 0;position:relative;left:0;}.topbar div>ul>li,.nav>li{display:block;float:left;} +.topbar div>ul a,.nav a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar div>ul a:hover,.nav a:hover{color:#ffffff;text-decoration:none;} +.topbar div>ul .active>a,.nav .active>a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);} +.topbar div>ul.secondary-nav,.nav.secondary-nav{float:right;margin-left:10px;margin-right:0;}.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu{right:0;border:0;} +.topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle{background:#444;background:rgba(255, 255, 255, 0.05);} +.topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu{background-color:#333;}.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle{color:#ffffff;}.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open{background:#444;background:rgba(255, 255, 255, 0.05);} +.topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a{color:#999;text-shadow:0 1px 0 rgba(0, 0, 0, 0.5);}.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover{background-color:#191919;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));background-image:-moz-linear-gradient(top, #292929, #191919);background-image:-ms-linear-gradient(top, #292929, #191919);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));background-image:-webkit-linear-gradient(top, #292929, #191919);background-image:-o-linear-gradient(top, #292929, #191919);background-image:linear-gradient(top, #292929, #191919);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);color:#ffffff;} +.topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a{color:#ffffff;} +.topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider{background-color:#222;border-color:#444;} +.topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a{padding:4px 15px;} +li.menu,.dropdown{position:relative;} +a.menu:after,.dropdown-toggle:after{width:0;height:0;display:inline-block;content:"↓";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;} +.menu-dropdown,.dropdown-menu{background-color:#ffffff;float:left;display:none;position:absolute;top:40px;z-index:900;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:6px 0;zoom:1;border-color:#999;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:0 1px 1px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.menu-dropdown li,.dropdown-menu li{float:none;display:block;background-color:none;} +.menu-dropdown .divider,.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#eee;border-bottom:1px solid #ffffff;} +.topbar .dropdown-menu a,.dropdown-menu a{display:block;padding:4px 15px;clear:both;font-weight:normal;line-height:18px;color:#808080;text-shadow:0 1px 0 #ffffff;}.topbar .dropdown-menu a:hover,.dropdown-menu a:hover{background-color:#dddddd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));background-image:-moz-linear-gradient(top, #eeeeee, #dddddd);background-image:-ms-linear-gradient(top, #eeeeee, #dddddd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eeeeee, #dddddd);background-image:-o-linear-gradient(top, #eeeeee, #dddddd);background-image:linear-gradient(top, #eeeeee, #dddddd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);color:#404040;text-decoration:none;-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);} +.open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu{display:block;} +.tabs,.pills{margin:0 0 20px;padding:0;list-style:none;zoom:1;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";zoom:1;*display:inline;} +.tabs:after,.pills:after{clear:both;} +.tabs>li,.pills>li{float:left;}.tabs>li>a,.pills>li>a{display:block;} +.tabs{float:left;width:100%;border-bottom:1px solid #ddd;}.tabs>li{position:relative;top:1px;}.tabs>li>a{padding:0 15px;margin-right:2px;line-height:36px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.tabs>li>a:hover{text-decoration:none;background-color:#eee;border-color:#eee #eee #ddd;} +.tabs>li.active>a{color:#808080;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;} +.tabs .menu-dropdown,.tabs .dropdown-menu{top:35px;border-width:1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} +.tabs a.menu:after,.tabs .dropdown-toggle:after{border-top-color:#999;margin-top:15px;margin-left:5px;} +.tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle{border-color:#999;} +.tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after{border-top-color:#555;} +.tab-content{clear:both;} +.pills a{margin:5px 3px 5px 0;padding:0 15px;text-shadow:0 1px 1px #ffffff;line-height:30px;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills a:hover{background:#00438a;color:#ffffff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);} +.pills .active a{background:#0069d6;color:#ffffff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);} +.tab-content>*,.pill-content>*{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.breadcrumb{margin:0 0 18px;padding:7px 14px;background-color:#f5f5f5;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#bfbfbf;} +.breadcrumb .active a{color:#404040;} +.hero-unit{background-color:#f5f5f5;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;} +.page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;} +.btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;} +.btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} +.btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} +.btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} +.btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;} +.btn:focus{outline:1px dotted #666;} +.btn.primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} +.btn:active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn.large{font-size:15px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.btn.small{padding:7px 9px 7px;font-size:11px;} +:root .alert-message,:root .btn{border-radius:0 \0;} +button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;} +.close{float:right;color:#000000;font-size:20px;font-weight:bold;line-height:13.5px;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=20);-khtml-opacity:0.2;-moz-opacity:0.2;opacity:0.2;}.close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;} +.alert-message{position:relative;padding:7px 15px;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message .close{*margin-top:3px;} +.alert-message h5{line-height:18px;} +.alert-message p{margin-bottom:0;} +.alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;} +.alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);} +.alert-message.block-message{background-image:none;background-color:#fdf5d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message ul,.alert-message.block-message p{margin-right:30px;} +.alert-message.block-message ul{margin-bottom:0;} +.alert-message.block-message li{color:#404040;} +.alert-message.block-message .alert-actions{margin-top:5px;} +.alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;} +.alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;} +.alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;} +.pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;} +.pagination a:hover,.pagination .active a{background-color:#c7eefe;} +.pagination .disabled a,.pagination .disabled a:hover{background-color:transparent;color:#bfbfbf;} +.pagination .next a{border:0;} +.well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.modal-backdrop{background-color:#000000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;} +.modal{position:fixed;top:50%;left:50%;z-index:11000;width:560px;margin:-250px 0 0 -250px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .close{margin-top:7px;} +.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{border-bottom:1px solid #eee;padding:5px 15px;} +.modal-body{padding:15px;} +.modal-footer{background-color:#f5f5f5;padding:14px 15px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:0;}.modal-footer:before,.modal-footer:after{display:table;content:"";zoom:1;*display:inline;} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;} +.twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;} +.twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.twipsy-inner{padding:3px 8px;background-color:#000000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.twipsy-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover .inner{background-color:#000000;background-color:rgba(0, 0, 0, 0.8);padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;} +.popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.label{padding:1px 3px 2px;background-color:#bfbfbf;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;white-space:nowrap;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;} +.label.warning{background-color:#f89406;} +.label.success{background-color:#46a546;} +.label.notice{background-color:#62cffc;} +.media-grid{margin-left:-20px;margin-bottom:0;zoom:1;}.media-grid:before,.media-grid:after{display:table;content:"";zoom:1;*display:inline;} +.media-grid:after{clear:both;} +.media-grid li{display:inline;} +.media-grid a{float:left;padding:4px;margin:0 0 20px 20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}.media-grid a img{display:block;} +.media-grid a:hover{border-color:#0069d6;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} \ No newline at end of file diff --git a/play-scala-anorm-example/public/stylesheets/main.css b/play-scala-anorm-example/public/stylesheets/main.css new file mode 100644 index 000000000..4f0a4165a --- /dev/null +++ b/play-scala-anorm-example/public/stylesheets/main.css @@ -0,0 +1,65 @@ +html { + background: #eee; +} + +header h1 { + padding: 0.4em 1.1em; + color: white; + font-weight: normal; + font-size: 24px; +} + +section#main { + position: relative; + padding: 5em 2em; + border-bottom: 1px solid #ccc; + min-height: 600px; +} + +section#main .topRight { + position: absolute; + right: 20px; + top: 70px; +} + +table.computers em { + color: #aaa; +} + +table.computers .col3, table.computers .col4 { + width: 10%; + min-width: 100px; +} + +table.computers .col5 { + width: 30%; + min-width: 300px; +} + +table.computers .header a { +} + +#actions { + position: relative; +} + +#actions #add { + position: absolute; + right: 0; + top: 0; +} + +#pagination { + position: relative; +} + +#pagination ul { + position: absolute; + right: 0; +} + +#pagination ul .current a { + color: #666; +} + + diff --git a/play-scala-anorm-example/scripts/script-helper b/play-scala-anorm-example/scripts/script-helper new file mode 100644 index 000000000..9a2faa643 --- /dev/null +++ b/play-scala-anorm-example/scripts/script-helper @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +java_version=$(java -version 2>&1 | java -version 2>&1 | awk -F '"' '/version/ {print $2}') + +if [[ $java_version = 1.8* ]] ; then + echo "The build is using Java 8 ($java_version). No addional JVM params needed." +else + echo "The build is using Java 9+ ($java_version). We need additional JVM parameters" + export _JAVA_OPTIONS="$_JAVA_OPTIONS --add-modules=java.xml.bind" +fi diff --git a/play-scala-anorm-example/scripts/test-gradle b/play-scala-anorm-example/scripts/test-gradle new file mode 100755 index 000000000..84a051a20 --- /dev/null +++ b/play-scala-anorm-example/scripts/test-gradle @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +. "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/script-helper" + +# Using cut because TRAVIS_SCALA_VERSION is the full Scala +# version (for example 2.12.4), but Gradle expects just the +# binary version (for example 2.12) +scala_binary_version=$(echo $TRAVIS_SCALA_VERSION | cut -c1-4) + +echo "+------------------------------+" +echo "| Executing tests using Gradle |" +echo "+------------------------------+" +./gradlew -Dscala.binary.version=$scala_binary_version check -i --stacktrace diff --git a/play-scala-anorm-example/scripts/test-sbt b/play-scala-anorm-example/scripts/test-sbt new file mode 100755 index 000000000..0425367b1 --- /dev/null +++ b/play-scala-anorm-example/scripts/test-sbt @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +. "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/script-helper" + +echo "+----------------------------+" +echo "| Executing tests using sbt |" +echo "+----------------------------+" +sbt ++$TRAVIS_SCALA_VERSION test diff --git a/play-scala-anorm-example/test/BrowserSpec.scala b/play-scala-anorm-example/test/BrowserSpec.scala new file mode 100644 index 000000000..f873c8f5f --- /dev/null +++ b/play-scala-anorm-example/test/BrowserSpec.scala @@ -0,0 +1,72 @@ +import org.scalatestplus.play._ +import org.scalatestplus.play.guice.GuiceOneServerPerTest + +/** + * Runs a browser based test against the application. + * + * http://doc.scalatest.org/3.0.0/index.html#org.scalatest.selenium.WebBrowser + * http://www.scalatest.org/user_guide/using_selenium + * https://www.playframework.com/documentation/latest/ScalaFunctionalTestingWithScalaTest#Testing-with-a-web-browser + */ +class BrowserSpec extends PlaySpec + with OneBrowserPerTest + with GuiceOneServerPerTest + with HtmlUnitFactory { + + def $(str: String) = find(cssSelector(str)).getOrElse(throw new IllegalArgumentException(s"Cannot find $str")) + + "Application" should { + + "work from within a browser" in { + System.setProperty("webdriver.gecko.driver", "/path/to/geckodriver") + + go to(s"http://localhost:$port/") + + find("header-title").get.text must equal("Play sample application — Computer database") + find("section-title").get.text must equal("574 computers found") + + find(cssSelector(".current")).get.text must equal("Displaying 1 to 10 of 574") + + click on $("#pagination li.next a") + + $("#pagination li.current").text must equal("Displaying 11 to 20 of 574") + + click on id("searchbox") + enter("Apple") + click on id("searchsubmit") + + $("section h1").text must equal("13 computers found") + click on linkText("Apple II") + + click on id("discontinued") + enter("xxx") + submit() + + find(cssSelector("dl.error")) must not be empty + $("dl.error label").text must equal("Discontinued date") + + click on id("discontinued") + enter("") + submit() + + $("section h1").text must equal("574 computers found") + $(".alert-message").text must equal("Done! Computer Apple II has been updated") + + click on id("searchbox") + enter("Apple") + submit + + click on linkText("Apple II") + click on $("input.danger") + + $("section h1").text must equal("573 computers found") + $(".alert-message").text must equal("Done! Computer has been deleted") + + click on $("#searchbox") + enter("Apple") + submit() // $("#searchsubmit").click() + + $("section h1").text must equal("12 computers found") + } + } +} diff --git a/play-scala-anorm-example/test/FunctionalSpec.scala b/play-scala-anorm-example/test/FunctionalSpec.scala new file mode 100644 index 000000000..720076792 --- /dev/null +++ b/play-scala-anorm-example/test/FunctionalSpec.scala @@ -0,0 +1,72 @@ + +import controllers.HomeController +import org.scalatest.concurrent.ScalaFutures +import play.api.test._ +import play.api.test.Helpers._ +import org.scalatestplus.play._ +import org.scalatestplus.play.guice._ +import play.api.test.CSRFTokenHelper._ + +class FunctionalSpec extends PlaySpec with GuiceOneAppPerSuite with ScalaFutures { + + def dateIs(date: java.util.Date, str: String) = { + new java.text.SimpleDateFormat("yyyy-MM-dd").format(date) == str + } + + def homeController = app.injector.instanceOf(classOf[HomeController]) + + "HomeController" should { + + "redirect to the computer list on /" in { + val result = homeController.index(FakeRequest()) + + status(result) must equal(SEE_OTHER) + redirectLocation(result) mustBe Some("/computers") + } + + "list computers on the the first page" in { + val result = homeController.list(0, 2, "")(FakeRequest()) + + status(result) must equal(OK) + contentAsString(result) must include("574 computers found") + } + + "filter computer by name" in { + val result = homeController.list(0, 2, "Apple")(FakeRequest()) + + status(result) must equal(OK) + contentAsString(result) must include("13 computers found") + } + + //running(FakeApplication(additionalConfiguration = inMemoryDatabase())) { + + "create new computer" in { + val badResult = homeController.save(FakeRequest().withCSRFToken) + + status(badResult) must equal(BAD_REQUEST) + + val badDateFormat = homeController.save( + FakeRequest().withFormUrlEncodedBody("name" -> "FooBar", "introduced" -> "badbadbad", "company" -> "1").withCSRFToken + ) + + status(badDateFormat) must equal(BAD_REQUEST) + contentAsString(badDateFormat) must include("""""") + contentAsString(badDateFormat) must include(""" "FooBar", "introduced" -> "2011-12-24", "company" -> "1").withCSRFToken + ) + + status(result) must equal(SEE_OTHER) + redirectLocation(result) mustBe Some("/computers") + flash(result).get("success") mustBe Some("Computer FooBar has been created") + + val list = homeController.list(0, 2, "FooBar")(FakeRequest()) + + status(list) must equal(OK) + contentAsString(list) must include("One computer found") + } + } +} diff --git a/play-scala-anorm-example/test/ModelSpec.scala b/play-scala-anorm-example/test/ModelSpec.scala new file mode 100644 index 000000000..bcefab19b --- /dev/null +++ b/play-scala-anorm-example/test/ModelSpec.scala @@ -0,0 +1,61 @@ + +import org.scalatest.concurrent.ScalaFutures +import org.scalatestplus.play._ +import org.scalatestplus.play.guice.GuiceOneAppPerSuite + +class ModelSpec extends PlaySpec with GuiceOneAppPerSuite with ScalaFutures { + import models._ + + import scala.concurrent.ExecutionContext.Implicits.global + + // -- Date helpers + + def dateIs(date: java.util.Date, str: String) = { + new java.text.SimpleDateFormat("yyyy-MM-dd").format(date) == str + } + + // -- + + def computerService: ComputerRepository = app.injector.instanceOf(classOf[ComputerRepository]) + + "Computer model" should { + + "be retrieved by id" in { + whenReady(computerService.findById(21)) { maybeComputer => + val macintosh = maybeComputer.get + + macintosh.name must equal("Macintosh") + macintosh.introduced.value must matchPattern { + case date:java.util.Date if dateIs(date, "1984-01-24") => + } + } + } + + "be listed along its companies" in { + whenReady(computerService.list()) { computers => + + computers.total must equal(574) + computers.items must have length(10) + } + } + + "be updated if needed" in { + + val result = computerService.findById(21).flatMap { computer => + computerService.update(21, Computer(name="The Macintosh", + introduced=None, + discontinued=None, + companyId=Some(1))).flatMap { _ => + computerService.findById(21) + } + } + + whenReady(result) { computer => + val macintosh = computer.get + + macintosh.name must equal("The Macintosh") + macintosh.introduced mustBe None + } + } + } +}