src/main/scala/bootstrap/liftweb/Boot.scala
author Tomas Zeman <tzeman@volny.cz>
Fri, 10 Feb 2012 09:53:08 +0100
changeset 14 5a2f996a5ba0
parent 11 43fa65f5072e
child 15 995184977e9b
permissions -rw-r--r--
Workaround for #950 + #999 #950 Connections unexpectedly closed when using DB.use with a JNDI datasource with squerylrecord https://www.assembla.com/spaces/liftweb/tickets/950 #999 DB connection issue using Menu.param https://www.assembla.com/spaces/liftweb/tickets/999
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
/*
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
 * Copyright 2011 Tomas Zeman <tzeman@volny.cz>
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
 *
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
 *
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
 *     http://www.apache.org/licenses/LICENSE-2.0
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 *
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 * limitations under the License.
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 */
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
package bootstrap.liftweb
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
import fis.base.model._
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
import net.liftweb.common._
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
import net.liftweb.db.{DB, ConnectionIdentifier}
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
import net.liftweb.http._
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
import net.liftweb.squerylrecord.SquerylRecord
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
import net.liftweb.util._
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
import net.liftweb.util.Helpers._
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    25
import net.tz.lift.boot.ProtoBoot
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
import net.tz.lift.util.StandardDBVendor
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
class Boot extends ProtoBoot {
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
  override def boot = {
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
    /* DB stuff */
14
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    32
    val dbVendor = new FisDbVendor
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    33
    DB.defineConnectionManager(FisConnectionIdentifier, dbVendor)
11
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
    S.addAround(DB.buildLoanWrapper(List(FisConnectionIdentifier)))
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
    SquerylRecord.init(() => new SeqIdPostgreSqlAdapter)
14
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    36
    SquerylTxMgr.initSqueryl(FisConnectionIdentifier,
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    37
      () => new SeqIdPostgreSqlAdapter)
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    38
    LiftRules.unloadHooks.append(dbVendor.closeAllConnections_! _)
11
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
    super.boot
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
  }
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
}
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
case object FisConnectionIdentifier extends ConnectionIdentifier {
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
  val jndiName = "fis"
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
}
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
import java.sql.Connection
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
class FisDbVendor extends StandardDBVendor(
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
  "org.postgresql.Driver", Props.get("db.fis.url", ""),
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
  Props.get("db.fis.user"), Props.get("db.fis.pass")) {
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
  val testQuery = "SELECT version()"
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
  override protected def testConnection(c: Connection) = {
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
    c.prepareStatement(testQuery).executeQuery
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    58
  }
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
}
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
14
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    61
import org.squeryl._
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    62
import org.squeryl.internals.DatabaseAdapter
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    63
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    64
object SquerylTxMgr {
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    65
  def initSqueryl(name: ConnectionIdentifier,
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    66
    mkAdapter: () => DatabaseAdapter) = {
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    67
    SessionFactory.externalTransactionManagementAdapter =
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    68
    Some(new SquerylTxMgr(name, mkAdapter))
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    69
  }
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    70
}
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    71
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    72
class SquerylTxMgr(name: ConnectionIdentifier, mkAdapter: () => DatabaseAdapter)
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    73
  extends Loggable with Function0[Session] {
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    74
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    75
  private object currentSession extends DynoVar[Session]
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    76
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    77
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    78
  def apply = currentSession.is openOr {
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    79
    DB.use(name) { superConn =>
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    80
      val sess = Session.create(superConn.connection, mkAdapter())
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    81
      sess.setLogger(s => logger.debug(s))
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    82
      currentSession.set(sess)
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    83
      sess
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    84
    }
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    85
  }
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    86
}
5a2f996a5ba0 Workaround for #950 + #999
Tomas Zeman <tzeman@volny.cz>
parents: 11
diff changeset
    87
11
43fa65f5072e 8f749d3777e669ff Web UI skeleton
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
// vim: set ts=2 sw=2 et: