This repository has been archived by the owner on Aug 12, 2019. It is now read-only.
/
LiftTemplateEngine.scala
141 lines (118 loc) · 4.15 KB
/
LiftTemplateEngine.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
* Copyright 2010-2011 WorldWide Conferencing, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.liftweb
package scalate
import java.io.File
import tools.nsc.Global
import org.fusesource.scalate.layout.DefaultLayoutStrategy
import org.fusesource.scalate.util.{ClassPathBuilder, FileResourceLoader}
import org.fusesource.scalate.{DefaultRenderContext, ResourceNotFoundException, Binding, TemplateEngine}
import common._
import http.LiftRules
import http.provider.servlet.HTTPServletContext
/**
* A TemplateEngine using the Lift web abstractions.
*/
class LiftTemplateEngine extends TemplateEngine with Loggable {
bindings = List(Binding("context", classOf[DefaultRenderContext].getName, true, isImplicit = true))
if (useWebInfWorkingDirectory) {
val path = realPath("WEB-INF")
if (path != null) {
workingDirectory = new File(path, "_scalate")
workingDirectory.mkdirs
}
}
classpath = buildClassPath
resourceLoader = new LiftResourceLoader(this)
layoutStrategy = new DefaultLayoutStrategy(this, "/WEB-INF/scalate/layouts/default.scaml", "/WEB-INF/scalate/layouts/default.ssp")
private def buildClassPath(): String = {
val builder = new ClassPathBuilder
// Add containers class path
builder.addPathFrom(getClass)
.addPathFrom(classOf[TemplateEngine])
.addPathFrom(classOf[Product])
.addPathFrom(classOf[Global])
// Always include WEB-INF/classes and all the JARs in WEB-INF/lib just in case
builder.addClassesDir(realPath("/WEB-INF/classes"))
.addLibDir(realPath("/WEB-INF/lib"))
builder.classPath
}
def useWebInfWorkingDirectory = {
val customWorkDir = System.getProperty("scalate.workingdir", "")
val property = System.getProperty("scalate.temp.workingdir", "")
println("using scalate.temp.workingdir: " + property)
property.toLowerCase != "true" && customWorkDir.length <= 0
}
def realPath(uri: String): String = {
LiftRules.context match {
case http: HTTPServletContext => http.ctx.getRealPath(uri)
case c => logger.warn("Do not know how to get the real path of: " + uri + " for context: " + c); uri
}
}
class LiftResourceLoader(context: LiftTemplateEngine) extends FileResourceLoader {
override protected def toFile(uri: String) = {
realFile(uri)
}
protected def toFileOrFail(uri: String): File = {
val file = realFile(uri)
if (file == null) {
throw new ResourceNotFoundException(resource = uri, root = context.realPath("/"))
}
file
}
/**
* Returns the real path for the given uri
*/
def realPath(uri: String): String = {
val file = realFile(uri)
if (file != null) file.getPath else null
}
/**
* Returns the File for the given uri
*/
def realFile(uri: String): File = {
def findFile(uri: String): File = {
/*
val url = LiftRules.context.resource(uri)
if (url != null) {
url.toFile
}
else {
null
}
*/
val path = context.realPath(uri)
logger.debug("realPath for: " + uri + " is: " + path)
var answer: File = null
if (path != null) {
val file = new File(path)
logger.debug("file from realPath for: " + uri + " is: " + file)
if (file.canRead) {answer = file}
}
answer
}
findFile(uri) match {
case file: File => file
case _ => if (uri.startsWith("/") && !uri.startsWith("/WEB-INF")) {
findFile("/WEB-INF" + uri)
}
else {
null
}
}
}
}
}