From c0288799a547b43915ac898d3f0fa5749f176b9e Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Sun, 12 Jul 2015 22:34:14 +0900 Subject: [PATCH] Remove SkinnyScalatrabase, use LoggerProvider instead of Logging --- common/src/main/scala/skinny/I18n.scala | 4 +- .../scala/skinny/logging/LoggerProvider.scala | 3 +- .../skinny/nlp/KuromojiJapaneseAnalyzer.scala | 4 +- .../main/scala/skinny/util/TimeLogging.scala | 4 +- .../skinny/engine/SkinnyEngineBase.scala | 111 ++++++++----- .../skinny/engine/SkinnyEngineListener.scala | 4 +- .../main/scala/skinny/test/FactoryGirl.scala | 4 +- .../controller/SkinnyControllerBase.scala | 7 +- .../feature/AngularXHRServerFeature.scala | 6 +- .../AngularXSRFProtectionFeature.scala | 6 +- .../controller/feature/CORSFeature.scala | 4 +- .../feature/CSRFProtectionFeature.scala | 6 +- .../feature/ChunkedResponseFeature.scala | 4 +- .../feature/ExplicitRedirectFeature.scala | 4 +- .../feature/JSONParamsAutoBinderFeature.scala | 10 +- .../feature/RequestScopeFeature.scala | 6 +- .../feature/TemplateEngineFeature.scala | 4 +- ...ntentTypeOptionsNosniffHeaderFeature.scala | 4 +- .../feature/XFrameOptionsHeaderFeature.scala | 4 +- .../feature/XXSSProtectionHeaderFeature.scala | 4 +- .../skinny/engine/SkinnyScalatraBase.scala | 148 ------------------ .../skinny/filter/TxPerRequestFilter.scala | 4 +- framework/src/main/scala/skinny/package.scala | 1 + .../skinny/session/SkinnyHttpSession.scala | 4 +- .../session/SkinnyHttpSessionJDBCImpl.scala | 4 +- .../session/SkinnySessionInitializer.scala | 5 +- .../skinny/session/jdbc/SkinnySession.scala | 6 +- .../session/jdbc/SkinnySessionAttribute.scala | 4 +- .../src/main/scala/skinny/http/HTTP.scala | 4 +- .../scala/skinny/mailer/JavaMailOps.scala | 5 +- .../scala/skinny/mailer/RichMimeMessage.scala | 4 +- .../mailer/SkinnyMailerConfigBase.scala | 4 +- .../feature/JavaMailSessionFeature.scala | 4 +- .../oauth2/client/backlog/BacklogAPI.scala | 4 +- .../oauth2/client/backlog/BacklogJPAPI.scala | 4 +- .../oauth2/client/dropbox/DropboxAPI.scala | 4 +- .../client/facebook/FacebookGraphAPI.scala | 4 +- .../oauth2/client/github/GitHubAPI.scala | 4 +- .../oauth2/client/google/GooglePlusAPI.scala | 4 +- .../oauth2/client/typetalk/TypetalkAPI.scala | 4 +- .../orm/feature/AssociationsFeature.scala | 5 +- .../scala/skinny/injection/SkinnyScaldi.scala | 4 +- .../SessionInjectorController.scala | 3 +- .../scala/skinny/test/SkinnyTestSupport.scala | 4 +- .../scala/skinny/worker/SkinnyWorker.scala | 4 +- 45 files changed, 165 insertions(+), 283 deletions(-) delete mode 100644 framework/src/main/scala/skinny/engine/SkinnyScalatraBase.scala diff --git a/common/src/main/scala/skinny/I18n.scala b/common/src/main/scala/skinny/I18n.scala index eed5313e..19850d6e 100644 --- a/common/src/main/scala/skinny/I18n.scala +++ b/common/src/main/scala/skinny/I18n.scala @@ -2,7 +2,7 @@ package skinny import java.text.MessageFormat import java.util.Locale -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.util.TypesafeConfigReader import scala.collection.concurrent.TrieMap @@ -17,7 +17,7 @@ object I18n { * * @param locale locale */ -case class I18n(locale: Locale = null) extends Logging { +case class I18n(locale: Locale = null) extends LoggerProvider { /** * Messages loaded from "src/main/resources/messages_{locale}.conf". diff --git a/common/src/main/scala/skinny/logging/LoggerProvider.scala b/common/src/main/scala/skinny/logging/LoggerProvider.scala index ad7331ae..db9dfb4d 100644 --- a/common/src/main/scala/skinny/logging/LoggerProvider.scala +++ b/common/src/main/scala/skinny/logging/LoggerProvider.scala @@ -16,4 +16,5 @@ trait LoggerProvider { * Get the name associated with this logger. */ protected def loggerName = logger.name -} + +} \ No newline at end of file diff --git a/common/src/main/scala/skinny/nlp/KuromojiJapaneseAnalyzer.scala b/common/src/main/scala/skinny/nlp/KuromojiJapaneseAnalyzer.scala index c07962d3..6deb01e4 100644 --- a/common/src/main/scala/skinny/nlp/KuromojiJapaneseAnalyzer.scala +++ b/common/src/main/scala/skinny/nlp/KuromojiJapaneseAnalyzer.scala @@ -4,13 +4,13 @@ import org.apache.lucene.analysis.ja.JapaneseAnalyzer import org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute import org.apache.lucene.analysis.ja.util.ToStringUtil import org.apache.lucene.analysis.tokenattributes.CharTermAttribute -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.util.LoanPattern._ import scala.collection.mutable.ListBuffer import scala.util.Try -case class KuromojiJapaneseAnalyzer(kuromojiAnalyzer: JapaneseAnalyzer) extends SkinnyJapaneseAnalyzer with Logging { +case class KuromojiJapaneseAnalyzer(kuromojiAnalyzer: JapaneseAnalyzer) extends SkinnyJapaneseAnalyzer with LoggerProvider { private[this] val KATAKANA_CHARS_TO_BE_AS_IS = Seq('゠', '・', 'ー', 'ヽ', 'ヾ', 'ヿ') diff --git a/common/src/main/scala/skinny/util/TimeLogging.scala b/common/src/main/scala/skinny/util/TimeLogging.scala index 0b73fbc3..3b0da51f 100644 --- a/common/src/main/scala/skinny/util/TimeLogging.scala +++ b/common/src/main/scala/skinny/util/TimeLogging.scala @@ -1,7 +1,7 @@ package skinny.util -import skinny.logging.Logging import skinny.SkinnyEnv +import skinny.logging.LoggerProvider object TimeLogging extends TimeLogging @@ -23,7 +23,7 @@ object TimeLogging extends TimeLogging * } * }}} */ -trait TimeLogging extends Logging { +trait TimeLogging extends LoggerProvider { protected def stackTraceDepthForTimeLogging: Int = 5 diff --git a/engine/src/main/scala/skinny/engine/SkinnyEngineBase.scala b/engine/src/main/scala/skinny/engine/SkinnyEngineBase.scala index 61ac0ee8..9099f085 100644 --- a/engine/src/main/scala/skinny/engine/SkinnyEngineBase.scala +++ b/engine/src/main/scala/skinny/engine/SkinnyEngineBase.scala @@ -1,5 +1,19 @@ package skinny.engine +import scala.language.implicitConversions +import scala.language.reflectiveCalls + +import scala.annotation.tailrec +import scala.util.control.Exception._ +import scala.util.matching.Regex +import scala.util.{ Failure, Success, Try } + +import java.io.{ File, FileInputStream } +import java.util.concurrent.atomic.AtomicInteger +import javax.servlet.http.{ HttpServlet, HttpServletRequest, HttpServletResponse } +import javax.servlet.{ ServletRegistration, Filter, ServletContext } + +import skinny.SkinnyEnv import skinny.engine.async.FutureSupport import skinny.engine.constant._ import skinny.engine.context.SkinnyEngineContext @@ -10,22 +24,9 @@ import skinny.engine.multipart.FileCharset import skinny.engine.response.{ ResponseStatus, ActionResult, Found } import skinny.engine.routing._ import skinny.engine.util.UriDecoder - -import scala.language.implicitConversions -import scala.language.reflectiveCalls - -import java.io.{ File, FileInputStream } -import javax.servlet.http.{ HttpServlet, HttpServletRequest, HttpServletResponse } -import javax.servlet.{ ServletRegistration, Filter, ServletContext } - -import SkinnyEngineBase._ +import skinny.logging.LoggerProvider import skinny.util.LoanPattern._ -import scala.annotation.tailrec -import scala.util.control.Exception._ -import scala.util.matching.Regex -import scala.util.{ Failure, Success, Try } - object SkinnyEngineBase { import ServletApiImplicits._ @@ -100,14 +101,14 @@ trait SkinnyEngineBase with CoreDsl with DynamicScope with Initializable + with LoggerProvider with ServletApiImplicits with EngineParamsImplicits with DefaultImplicits with RicherStringImplicits with SessionImplicits { - @deprecated("Use servletContext instead", "1.4") - def applicationContext: ServletContext = servletContext + import SkinnyEngineBase._ /** * The routes registered in this kernel. @@ -161,22 +162,23 @@ trait SkinnyEngineBase * $ 4. Executes the after filters with `runFilters`. * $ 5. The action result is passed to `renderResponse`. */ - protected def executeRoutes(): Unit = { + protected def executeRoutes() { var result: Any = null var rendered = true def runActions = { - val prehandleException = request.get(PrehandleExceptionKey) + val prehandleException = request.get(SkinnyEngineBase.PrehandleExceptionKey) if (prehandleException.isEmpty) { val (rq, rs) = (request, response) - onCompleted { _ => + SkinnyEngineBase.onCompleted { _ => withRequestResponse(rq, rs) { + val className = this.getClass.toString this match { - case f: Filter if !rq.contains("skinny.engine.SkinnyEngineFilter.afterFilters.Run") => - rq("skinny.engine.SkinnyEngineFilter.afterFilters.Run") = new {} + case f: Filter if !rq.contains(s"skinny.engine.SkinnyEngineFilter.afterFilters.Run (${className})") => + rq(s"skinny.engine.SkinnyEngineFilter.afterFilters.Run (${className})") = new {} runFilters(routes.afterFilters) - case f: HttpServlet if !rq.contains("skinny.engine.SkinnyEngineServlet.afterFilters.Run") => - rq("skinny.engine.SkinnyEngineServlet.afterFilters.Run") = new {} + case f: HttpServlet if !rq.contains("org.scalatra.ScalatraServlet.afterFilters.Run") => + rq("org.scalatra.ScalatraServlet.afterFilters.Run") = new {} runFilters(routes.afterFilters) case _ => } @@ -200,11 +202,11 @@ trait SkinnyEngineBase result = errorHandler(e) rendered = false }, e => { - runCallbacks(Failure(e)) + SkinnyEngineBase.runCallbacks(Failure(e)) try { renderUncaughtException(e) } finally { - runRenderCallbacks(Failure(e)) + SkinnyEngineBase.runRenderCallbacks(Failure(e)) } }) }) @@ -356,7 +358,24 @@ trait SkinnyEngineBase case t => throw t } + /** + * Count execution of error filter registration. + */ + private[this] lazy val errorMethodCallCountAtSkinnyScalatraBase: AtomicInteger = new AtomicInteger(0) + + /** + * Detects error filter leak issue as an error. + */ + protected def detectTooManyErrorFilterRegistrationnAsAnErrorAtSkinnyScalatraBase: Boolean = false + + // https://github.com/scalatra/scalatra/blob/v2.3.1/core/src/main/scala/org/scalatra/ScalatraBase.scala#L333-L335 def error(handler: ErrorHandler): Unit = { + val count = errorMethodCallCountAtSkinnyScalatraBase.incrementAndGet() + if (count > 500) { + val message = s"skinny's error filter registration for this controller has been evaluated $count times, this behavior will cause memory leak." + if (detectTooManyErrorFilterRegistrationnAsAnErrorAtSkinnyScalatraBase) throw new RuntimeException(message) + else logger.warn(message) + } errorHandler = handler orElse errorHandler } @@ -655,6 +674,7 @@ trait SkinnyEngineBase * @return the path plus the query string, if any. The path is run through * `response.encodeURL` to add any necessary session tracking parameters. */ + // TODO: Scalatra 2.3.1 still has this issue. Remove this override when it will be fixed in the future def url( path: String, params: Iterable[(String, Any)] = Iterable.empty, @@ -664,25 +684,32 @@ trait SkinnyEngineBase withSessionId: Boolean = true)( implicit request: HttpServletRequest, response: HttpServletResponse): String = { - val newPath = path match { - case x if x.startsWith("/") && includeContextPath && includeServletPath => - ensureSlash(routeBasePath) + ensureContextPathsStripped(ensureSlash(path)) - case x if x.startsWith("/") && includeContextPath => - ensureSlash(contextPath) + ensureContextPathStripped(ensureSlash(path)) - case x if x.startsWith("/") && includeServletPath => request.getServletPath.blankOption map { - ensureSlash(_) + ensureServletPathStripped(ensureSlash(path)) - } getOrElse "/" - case _ if absolutize => ensureContextPathsStripped(ensureSlash(path)) - case _ => path - } + try { + val newPath = path match { + case x if x.startsWith("/") && includeContextPath && includeServletPath => + ensureSlash(routeBasePath) + ensureContextPathsStripped(ensureSlash(path)) + case x if x.startsWith("/") && includeContextPath => + ensureSlash(contextPath) + ensureContextPathStripped(ensureSlash(path)) + case x if x.startsWith("/") && includeServletPath => request.getServletPath.blankOption map { + ensureSlash(_) + ensureServletPathStripped(ensureSlash(path)) + } getOrElse "/" + case _ if absolutize => ensureContextPathsStripped(ensureSlash(path)) + case _ => path + } - val pairs = params map { - case (key, None) => key.urlEncode + "=" - case (key, Some(value)) => key.urlEncode + "=" + value.toString.urlEncode - case (key, value) => key.urlEncode + "=" + value.toString.urlEncode + val pairs = params map { + case (key, None) => key.urlEncode + "=" + case (key, Some(value)) => key.urlEncode + "=" + value.toString.urlEncode + case (key, value) => key.urlEncode + "=" + value.toString.urlEncode + } + val queryString = if (pairs.isEmpty) "" else pairs.mkString("?", "&", "") + if (withSessionId) addSessionId(newPath + queryString) else newPath + queryString + } catch { + case e: NullPointerException => + // work around for Scalatra issue + if (SkinnyEnv.isTest()) "[work around] see https://github.com/scalatra/scalatra/issues/368" + else throw e } - val queryString = if (pairs.isEmpty) "" else pairs.mkString("?", "&", "") - if (withSessionId) addSessionId(newPath + queryString) else newPath + queryString } private[this] def ensureContextPathsStripped(path: String)(implicit request: HttpServletRequest): String = { diff --git a/engine/src/main/scala/skinny/engine/SkinnyEngineListener.scala b/engine/src/main/scala/skinny/engine/SkinnyEngineListener.scala index 497ec62b..c5e5c77a 100644 --- a/engine/src/main/scala/skinny/engine/SkinnyEngineListener.scala +++ b/engine/src/main/scala/skinny/engine/SkinnyEngineListener.scala @@ -3,10 +3,10 @@ package skinny.engine import javax.servlet.{ ServletContext, ServletContextEvent, ServletContextListener } import skinny.engine.implicits.RicherStringImplicits -import skinny.logging.Logging +import skinny.logging.LoggerProvider import SkinnyEngineListener._ -class SkinnyEngineListener extends ServletContextListener with Logging { +class SkinnyEngineListener extends ServletContextListener with LoggerProvider { import RicherStringImplicits._ diff --git a/factory-girl/src/main/scala/skinny/test/FactoryGirl.scala b/factory-girl/src/main/scala/skinny/test/FactoryGirl.scala index 73b0de0b..cc69d6ce 100644 --- a/factory-girl/src/main/scala/skinny/test/FactoryGirl.scala +++ b/factory-girl/src/main/scala/skinny/test/FactoryGirl.scala @@ -1,12 +1,12 @@ package skinny.test import com.typesafe.config.ConfigFactory +import skinny.logging.LoggerProvider import scala.collection.JavaConverters._ import scalikejdbc._ import skinny.orm.feature.CRUDFeatureWithId import skinny.exception.FactoryGirlException import skinny.util.{ DateTimeUtil, JavaReflectAPI } -import skinny.logging.Logging import scala.util.Try @@ -15,7 +15,7 @@ import scala.util.Try * * @see "https://github.com/thoughtbot/factory_girl" */ -case class FactoryGirl[Id, Entity](mapper: CRUDFeatureWithId[Id, Entity], name: Symbol = null) extends Logging { +case class FactoryGirl[Id, Entity](mapper: CRUDFeatureWithId[Id, Entity], name: Symbol = null) extends LoggerProvider { private[this] val c = mapper.column diff --git a/framework/src/main/scala/skinny/controller/SkinnyControllerBase.scala b/framework/src/main/scala/skinny/controller/SkinnyControllerBase.scala index a8cb5e66..ba0470c7 100644 --- a/framework/src/main/scala/skinny/controller/SkinnyControllerBase.scala +++ b/framework/src/main/scala/skinny/controller/SkinnyControllerBase.scala @@ -4,10 +4,11 @@ import javax.servlet.http.HttpServletRequest import skinny._ import skinny.controller.feature._ -import skinny.engine.{ SkinnyScalatraBase, ApiFormats, UrlGeneratorSupport } +import skinny.engine.{ SkinnyEngineBase, ApiFormats, UrlGeneratorSupport } import skinny.engine.response.ResponseStatus import skinny.engine.routing.Route import skinny.filter.SkinnyFilterActivation +import skinny.logging.LoggerProvider import skinny.validator.implicits.ParametersGetAsImplicits import skinny.controller.implicits.ParamsPermitImplicits import skinny.routing.implicits.RoutesAsImplicits @@ -21,7 +22,7 @@ import org.json4s.JsonAST.JInt import org.json4s.JDecimal trait SkinnyControllerBase - extends SkinnyScalatraBase + extends SkinnyEngineBase with ApiFormats with EnvFeature with QueryParamsFeature @@ -45,7 +46,7 @@ trait SkinnyControllerBase with ParametersGetAsImplicits with ParamsPermitImplicits with SkinnyFilterActivation - with Logging { + with LoggerProvider { /** * Default charset. diff --git a/framework/src/main/scala/skinny/controller/feature/AngularXHRServerFeature.scala b/framework/src/main/scala/skinny/controller/feature/AngularXHRServerFeature.scala index 470be295..84504939 100644 --- a/framework/src/main/scala/skinny/controller/feature/AngularXHRServerFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/AngularXHRServerFeature.scala @@ -1,7 +1,7 @@ package skinny.controller.feature -import skinny.Logging -import skinny.engine.SkinnyScalatraBase +import skinny.engine.SkinnyEngineBase +import skinny.logging.LoggerProvider /** * Server side implementation for Angular apps. @@ -11,6 +11,6 @@ trait AngularXHRServerFeature with JSONParamsAutoBinderFeature with AngularXSRFProtectionFeature { - self: SkinnyScalatraBase with ActionDefinitionFeature with BeforeAfterActionFeature with RequestScopeFeature with Logging => + self: SkinnyEngineBase with ActionDefinitionFeature with BeforeAfterActionFeature with RequestScopeFeature with LoggerProvider => } \ No newline at end of file diff --git a/framework/src/main/scala/skinny/controller/feature/AngularXSRFProtectionFeature.scala b/framework/src/main/scala/skinny/controller/feature/AngularXSRFProtectionFeature.scala index 52e5d33a..31c4c7f4 100644 --- a/framework/src/main/scala/skinny/controller/feature/AngularXSRFProtectionFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/AngularXSRFProtectionFeature.scala @@ -1,7 +1,7 @@ package skinny.controller.feature -import skinny.engine.SkinnyScalatraBase -import skinny.logging.Logging +import skinny.engine.SkinnyEngineBase +import skinny.logging.LoggerProvider /** * Angular.js Cross Site Request Forgery (XSRF) Protection support. @@ -10,7 +10,7 @@ import skinny.logging.Logging */ trait AngularXSRFProtectionFeature extends AngularXSRFCookieProviderFeature { - self: SkinnyScalatraBase with ActionDefinitionFeature with BeforeAfterActionFeature with RequestScopeFeature with Logging => + self: SkinnyEngineBase with ActionDefinitionFeature with BeforeAfterActionFeature with RequestScopeFeature with LoggerProvider => /** * Enabled if true. diff --git a/framework/src/main/scala/skinny/controller/feature/CORSFeature.scala b/framework/src/main/scala/skinny/controller/feature/CORSFeature.scala index f5366899..5d2649ec 100644 --- a/framework/src/main/scala/skinny/controller/feature/CORSFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/CORSFeature.scala @@ -1,6 +1,6 @@ package skinny.controller.feature -import skinny.engine.SkinnyScalatraBase +import skinny.engine.SkinnyEngineBase /** * CORS(Cross-Origin Resource Sharing) support. @@ -8,7 +8,7 @@ import skinny.engine.SkinnyScalatraBase * http://www.w3.org/TR/cors/ * http://enable-cors.org/ */ -trait CORSFeature { self: SkinnyScalatraBase with BeforeAfterActionFeature => +trait CORSFeature { self: SkinnyEngineBase with BeforeAfterActionFeature => beforeAction() { response.setHeader("Access-Control-Allow-Origin", "*") diff --git a/framework/src/main/scala/skinny/controller/feature/CSRFProtectionFeature.scala b/framework/src/main/scala/skinny/controller/feature/CSRFProtectionFeature.scala index d0e91a08..3042872d 100644 --- a/framework/src/main/scala/skinny/controller/feature/CSRFProtectionFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/CSRFProtectionFeature.scala @@ -1,8 +1,8 @@ package skinny.controller.feature -import skinny.engine.SkinnyScalatraBase +import skinny.engine.SkinnyEngineBase import skinny.engine.csrf.CsrfTokenSupport -import skinny.logging.Logging +import skinny.logging.LoggerProvider object CSRFProtectionFeature { @@ -16,7 +16,7 @@ object CSRFProtectionFeature { */ trait CSRFProtectionFeature extends CsrfTokenSupport { - self: SkinnyScalatraBase with ActionDefinitionFeature with BeforeAfterActionFeature with RequestScopeFeature with Logging => + self: SkinnyEngineBase with ActionDefinitionFeature with BeforeAfterActionFeature with RequestScopeFeature with LoggerProvider => /** * Overrides Scalatra's default key name. diff --git a/framework/src/main/scala/skinny/controller/feature/ChunkedResponseFeature.scala b/framework/src/main/scala/skinny/controller/feature/ChunkedResponseFeature.scala index c2e0cfed..28e38c2d 100644 --- a/framework/src/main/scala/skinny/controller/feature/ChunkedResponseFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/ChunkedResponseFeature.scala @@ -3,12 +3,12 @@ package skinny.controller.feature import javax.servlet.ServletOutputStream import skinny.engine.SkinnyEngineBase -import skinny.logging.Logging +import skinny.logging.LoggerProvider /** * Chunked Response (Transfer-Encoding: chunked). */ -trait ChunkedResponseFeature { self: SkinnyEngineBase with Logging => +trait ChunkedResponseFeature { self: SkinnyEngineBase with LoggerProvider => def withOutputStream(f: ServletOutputStream => Unit): Unit = { val stream = response.getOutputStream diff --git a/framework/src/main/scala/skinny/controller/feature/ExplicitRedirectFeature.scala b/framework/src/main/scala/skinny/controller/feature/ExplicitRedirectFeature.scala index f313b516..afb3e879 100644 --- a/framework/src/main/scala/skinny/controller/feature/ExplicitRedirectFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/ExplicitRedirectFeature.scala @@ -1,13 +1,13 @@ package skinny.controller.feature import skinny.SkinnyEnv -import skinny.engine.SkinnyScalatraBase +import skinny.engine.SkinnyEngineBase import skinny.engine.response.{ SeeOther, Found, MovedPermanently, ActionResult } /** * Explicit redirect method support. */ -trait ExplicitRedirectFeature extends SkinnyScalatraBase { +trait ExplicitRedirectFeature extends SkinnyEngineBase { /** * Responds as "301 Moved Permanently" diff --git a/framework/src/main/scala/skinny/controller/feature/JSONParamsAutoBinderFeature.scala b/framework/src/main/scala/skinny/controller/feature/JSONParamsAutoBinderFeature.scala index 1935bc51..bc31c19d 100644 --- a/framework/src/main/scala/skinny/controller/feature/JSONParamsAutoBinderFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/JSONParamsAutoBinderFeature.scala @@ -6,9 +6,9 @@ import org.json4s.Xml._ import org.json4s._ import org.slf4j.LoggerFactory import skinny.engine.json.JsonSupport -import skinny.engine.{ EngineParams, Params, ApiFormats, SkinnyScalatraBase } +import skinny.engine.{ SkinnyEngineBase, EngineParams, Params, ApiFormats } import skinny.engine.routing.MatchedRoute -import skinny.logging.Logging +import skinny.logging.LoggerProvider import javax.servlet.http.HttpServletRequest /** @@ -17,10 +17,10 @@ import javax.servlet.http.HttpServletRequest * When you'd like to avoid merging JSON request body into params in some actions, please separate controllers. */ trait JSONParamsAutoBinderFeature - extends SkinnyScalatraBase + extends SkinnyEngineBase with JSONFeature - //with JacksonJsonSupport - with ApiFormats with Logging { + with ApiFormats + with LoggerProvider { /** * Merge parsedBody (JValue) into params if possible. diff --git a/framework/src/main/scala/skinny/controller/feature/RequestScopeFeature.scala b/framework/src/main/scala/skinny/controller/feature/RequestScopeFeature.scala index ca523990..d71e30fb 100644 --- a/framework/src/main/scala/skinny/controller/feature/RequestScopeFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/RequestScopeFeature.scala @@ -7,11 +7,11 @@ import skinny.exception.RequestScopeConflictException import java.util.Locale import org.joda.time._ import skinny.I18n -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.util.DateTimeUtil import javax.servlet.http.HttpServletRequest -object RequestScopeFeature extends Logging { +object RequestScopeFeature extends LoggerProvider { /** * Key for request scope. @@ -73,7 +73,7 @@ object RequestScopeFeature extends Logging { /** * Request scope support. */ -trait RequestScopeFeature extends SkinnyEngineBase with SnakeCasedParamKeysFeature with LocaleFeature with Logging { +trait RequestScopeFeature extends SkinnyEngineBase with SnakeCasedParamKeysFeature with LocaleFeature with LoggerProvider { // --------------------------------------------------- // Notice: Due to org.scalatra.DynamicScope's implicit conversion, we need to specify request explicitly. diff --git a/framework/src/main/scala/skinny/controller/feature/TemplateEngineFeature.scala b/framework/src/main/scala/skinny/controller/feature/TemplateEngineFeature.scala index 491efb2c..fcc477d7 100644 --- a/framework/src/main/scala/skinny/controller/feature/TemplateEngineFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/TemplateEngineFeature.scala @@ -2,7 +2,7 @@ package skinny.controller.feature import skinny.Format import skinny.engine.response.ResponseStatus -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.exception.ViewTemplateNotFoundException import skinny.controller.SkinnyControllerBase @@ -13,7 +13,7 @@ trait TemplateEngineFeature extends SkinnyControllerBase with RequestScopeFeature with JSONFeature - with Logging { + with LoggerProvider { /** * Renders body with template. diff --git a/framework/src/main/scala/skinny/controller/feature/XContentTypeOptionsNosniffHeaderFeature.scala b/framework/src/main/scala/skinny/controller/feature/XContentTypeOptionsNosniffHeaderFeature.scala index bffd74ab..d96f3d41 100644 --- a/framework/src/main/scala/skinny/controller/feature/XContentTypeOptionsNosniffHeaderFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/XContentTypeOptionsNosniffHeaderFeature.scala @@ -1,6 +1,6 @@ package skinny.controller.feature -import skinny.engine.SkinnyScalatraBase +import skinny.engine.SkinnyEngineBase /** * X-Content-Type-Options header support. @@ -10,7 +10,7 @@ import skinny.engine.SkinnyScalatraBase * - https://github.com/blog/1482-heads-up-nosniff-header-support-coming-to-chrome-and-firefox * - https://www.owasp.org/index.php/List_of_useful_HTTP_headers */ -trait XContentTypeOptionsNosniffHeaderFeature { self: SkinnyScalatraBase with BeforeAfterActionFeature => +trait XContentTypeOptionsNosniffHeaderFeature { self: SkinnyEngineBase with BeforeAfterActionFeature => // NOTE: To force this header to all responses //beforeAction() { diff --git a/framework/src/main/scala/skinny/controller/feature/XFrameOptionsHeaderFeature.scala b/framework/src/main/scala/skinny/controller/feature/XFrameOptionsHeaderFeature.scala index adb32491..d84b0cd3 100644 --- a/framework/src/main/scala/skinny/controller/feature/XFrameOptionsHeaderFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/XFrameOptionsHeaderFeature.scala @@ -1,13 +1,13 @@ package skinny.controller.feature -import skinny.engine.SkinnyScalatraBase +import skinny.engine.SkinnyEngineBase /** * X-Frame-Options header support * * - https://www.owasp.org/index.php/List_of_useful_HTTP_headers */ -trait XFrameOptionsHeaderFeature { self: SkinnyScalatraBase with BeforeAfterActionFeature => +trait XFrameOptionsHeaderFeature { self: SkinnyEngineBase with BeforeAfterActionFeature => // NOTE: There are three possible values for the X-Frame-Options headers. // - "deny" which prevents any domain from framing the content. diff --git a/framework/src/main/scala/skinny/controller/feature/XXSSProtectionHeaderFeature.scala b/framework/src/main/scala/skinny/controller/feature/XXSSProtectionHeaderFeature.scala index 0bb1a0af..97ee054e 100644 --- a/framework/src/main/scala/skinny/controller/feature/XXSSProtectionHeaderFeature.scala +++ b/framework/src/main/scala/skinny/controller/feature/XXSSProtectionHeaderFeature.scala @@ -1,13 +1,13 @@ package skinny.controller.feature -import skinny.engine.SkinnyScalatraBase +import skinny.engine.SkinnyEngineBase /** * X-XSS-Protection header support * * - https://www.owasp.org/index.php/List_of_useful_HTTP_headers */ -trait XXSSProtectionHeaderFeature { self: SkinnyScalatraBase with BeforeAfterActionFeature => +trait XXSSProtectionHeaderFeature { self: SkinnyEngineBase with BeforeAfterActionFeature => // NOTE: for all HTML responses defined as Skinny routes beforeAction() { diff --git a/framework/src/main/scala/skinny/engine/SkinnyScalatraBase.scala b/framework/src/main/scala/skinny/engine/SkinnyScalatraBase.scala deleted file mode 100644 index d199419d..00000000 --- a/framework/src/main/scala/skinny/engine/SkinnyScalatraBase.scala +++ /dev/null @@ -1,148 +0,0 @@ -package skinny.engine - -import java.util.concurrent.atomic.AtomicInteger -import javax.servlet.Filter -import javax.servlet.http.{ HttpServlet, HttpServletRequest, HttpServletResponse } - -import skinny.SkinnyEnv -import skinny.engine.control.{ HaltException, PassException } -import skinny.logging.Logging - -import scala.util.Failure - -/** - * Partially patched ScalatraBase for Skinny Framework. - * - * Scalatra runs only the first one of after filters. The others are skipped due to - * the servlet/filter is already marked as "org.scalatra.ScalatraFilter.afterFilters.Run". - * This means that when several Scalatra filters is already definied below at ScalatraBootstrap.scala, - * current ScalatraFilter's after callbacks would be ignored (even though all the before callbacks are called). - * - * So We've patched ScalatraBase to ignore "org.scalatra.ScalatraFilter.afterFilters.Run" only for Filters. - * Hope Scalatra to support ignoring "org.scalatra.ScalatraFilter.afterFilters.Run" option to 3rd party. - */ -trait SkinnyScalatraBase extends SkinnyEngineBase with Logging { - - override protected def executeRoutes() { - var result: Any = null - var rendered = true - - def runActions = { - val prehandleException = request.get(SkinnyEngineBase.PrehandleExceptionKey) - if (prehandleException.isEmpty) { - val (rq, rs) = (request, response) - SkinnyEngineBase.onCompleted { _ => - withRequestResponse(rq, rs) { - val className = this.getClass.toString - this match { - // **** PATCHED **** - case f: Filter if !rq.contains(s"org.scalatra.ScalatraFilter.afterFilters.Run (${className})") => - rq(s"org.scalatra.ScalatraFilter.afterFilters.Run (${className})") = new {} - runFilters(routes.afterFilters) - case f: HttpServlet if !rq.contains("org.scalatra.ScalatraServlet.afterFilters.Run") => - rq("org.scalatra.ScalatraServlet.afterFilters.Run") = new {} - runFilters(routes.afterFilters) - case _ => - } - } - } - runFilters(routes.beforeFilters) - val actionResult = runRoutes(routes(request.requestMethod)).headOption - // Give the status code handler a chance to override the actionResult - val r = handleStatusCode(status) getOrElse { - actionResult orElse matchOtherMethods() getOrElse doNotFound() - } - rendered = false - r - } else { - throw prehandleException.get.asInstanceOf[Exception] - } - } - - cradleHalt(result = runActions, e => { - cradleHalt({ - result = errorHandler(e) - rendered = false - }, e => { - SkinnyEngineBase.runCallbacks(Failure(e)) - try { - renderUncaughtException(e) - } finally { - SkinnyEngineBase.runRenderCallbacks(Failure(e)) - } - }) - }) - - if (!rendered) renderResponse(result) - } - - // involuntarily copied to call internal functions - - private[this] def cradleHalt(body: => Any, error: Throwable => Any) = { - try { body } catch { - case e: HaltException => renderHaltException(e) - case e: Throwable => error(e) - } - } - - private[this] def matchOtherMethods(): Option[Any] = { - val allow = routes.matchingMethodsExcept(request.requestMethod, requestPath) - if (allow.isEmpty) None else liftAction(() => doMethodNotAllowed(allow)) - } - - private[this] def handleStatusCode(status: Int): Option[Any] = - for { - handler <- routes(status) - matchedHandler <- handler(requestPath) - handlerResult <- invoke(matchedHandler) - } yield handlerResult - - private def liftAction(action: Action): Option[Any] = - try { - Some(action()) - } catch { - case e: PassException => None - } - - // TODO: Scalatra 2.3.1 still has this issue. Remove this override when it will be fixed in the future - override def url( - path: String, - params: Iterable[(String, Any)] = Iterable.empty, - includeContextPath: Boolean = true, - includeServletPath: Boolean = true, - absolutize: Boolean = true, - withSessionId: Boolean = true)( - implicit request: HttpServletRequest, response: HttpServletResponse): String = { - - try { - super.url(path, params, includeContextPath, includeServletPath, absolutize) - } catch { - case e: NullPointerException => - // work around for Scalatra issue - if (SkinnyEnv.isTest()) "[work around] see https://github.com/scalatra/scalatra/issues/368" - else throw e - } - } - - /** - * Count execution of error filter registration. - */ - private[this] lazy val errorMethodCallCountAtSkinnyScalatraBase: AtomicInteger = new AtomicInteger(0) - - /** - * Detects error filter leak issue as an error. - */ - protected def detectTooManyErrorFilterRegistrationnAsAnErrorAtSkinnyScalatraBase: Boolean = false - - // https://github.com/scalatra/scalatra/blob/v2.3.1/core/src/main/scala/org/scalatra/ScalatraBase.scala#L333-L335 - override def error(handler: ErrorHandler) { - val count = errorMethodCallCountAtSkinnyScalatraBase.incrementAndGet() - if (count > 500) { - val message = s"skinny's error filter registration for this controller has been evaluated $count times, this behavior will cause memory leak." - if (detectTooManyErrorFilterRegistrationnAsAnErrorAtSkinnyScalatraBase) throw new RuntimeException(message) - else logger.warn(message) - } - super.error(handler) - } - -} diff --git a/framework/src/main/scala/skinny/filter/TxPerRequestFilter.scala b/framework/src/main/scala/skinny/filter/TxPerRequestFilter.scala index 2c736a98..2452fb51 100644 --- a/framework/src/main/scala/skinny/filter/TxPerRequestFilter.scala +++ b/framework/src/main/scala/skinny/filter/TxPerRequestFilter.scala @@ -1,12 +1,12 @@ package skinny.filter import scalikejdbc._ -import skinny.logging.Logging +import skinny.logging.LoggerProvider /** * A filter which enables controller wired with a single transactional DB session. */ -trait TxPerRequestFilter extends SkinnyFilter with Logging { +trait TxPerRequestFilter extends SkinnyFilter with LoggerProvider { beforeAction()(beginTxPerRequest) diff --git a/framework/src/main/scala/skinny/package.scala b/framework/src/main/scala/skinny/package.scala index a9395d3d..c7c9310c 100644 --- a/framework/src/main/scala/skinny/package.scala +++ b/framework/src/main/scala/skinny/package.scala @@ -54,5 +54,6 @@ package object skinny { val TypeConverterSupport = implicits.TypeConverterSupport type Logging = skinny.logging.Logging + type LoggerProvider = skinny.logging.LoggerProvider } diff --git a/framework/src/main/scala/skinny/session/SkinnyHttpSession.scala b/framework/src/main/scala/skinny/session/SkinnyHttpSession.scala index ae96d03d..c5db42be 100644 --- a/framework/src/main/scala/skinny/session/SkinnyHttpSession.scala +++ b/framework/src/main/scala/skinny/session/SkinnyHttpSession.scala @@ -3,7 +3,7 @@ package skinny.session import javax.servlet.http.HttpServletRequest import skinny.controller.feature.RequestScopeFeature import skinny.filter.SkinnySessionFilter -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.session.jdbc.SkinnySession /** @@ -27,7 +27,7 @@ trait SkinnyHttpSession { } -object SkinnyHttpSession extends Logging { +object SkinnyHttpSession extends LoggerProvider { def getOrCreate(request: HttpServletRequest): SkinnyHttpSession = { val jsessionIdCookieName: String = request.getServletContext.getSessionCookieConfig.getName diff --git a/framework/src/main/scala/skinny/session/SkinnyHttpSessionJDBCImpl.scala b/framework/src/main/scala/skinny/session/SkinnyHttpSessionJDBCImpl.scala index dbeb8fb5..763531d9 100644 --- a/framework/src/main/scala/skinny/session/SkinnyHttpSessionJDBCImpl.scala +++ b/framework/src/main/scala/skinny/session/SkinnyHttpSessionJDBCImpl.scala @@ -1,11 +1,11 @@ package skinny.session import javax.servlet.http.HttpSession -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.session.jdbc.SkinnySession case class SkinnyHttpSessionJDBCImpl(underlying: HttpSession, skinnySession: SkinnySession) - extends SkinnyHttpSession with Logging { + extends SkinnyHttpSession with LoggerProvider { override def save() = skinnySession.save() diff --git a/framework/src/main/scala/skinny/session/SkinnySessionInitializer.scala b/framework/src/main/scala/skinny/session/SkinnySessionInitializer.scala index da6ddff1..b3936417 100644 --- a/framework/src/main/scala/skinny/session/SkinnySessionInitializer.scala +++ b/framework/src/main/scala/skinny/session/SkinnySessionInitializer.scala @@ -2,9 +2,8 @@ package skinny.session import javax.servlet._ import javax.servlet.http._ -import org.joda.time.DateTime import skinny.filter.SkinnySessionFilter -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.session.jdbc.SkinnySession import skinny.session.servlet._ @@ -18,7 +17,7 @@ import skinny.session.servlet._ * .... * }}} */ -class SkinnySessionInitializer extends Filter with Logging { +class SkinnySessionInitializer extends Filter with LoggerProvider { // just default settings, this might be updated by yourself def except: Seq[String] = Seq("/assets/") diff --git a/framework/src/main/scala/skinny/session/jdbc/SkinnySession.scala b/framework/src/main/scala/skinny/session/jdbc/SkinnySession.scala index b7d0fc42..3a7f0587 100644 --- a/framework/src/main/scala/skinny/session/jdbc/SkinnySession.scala +++ b/framework/src/main/scala/skinny/session/jdbc/SkinnySession.scala @@ -4,7 +4,7 @@ import skinny.orm._ import scalikejdbc._ import org.joda.time.DateTime import java.io._ -import skinny.logging.Logging +import skinny.logging.LoggerProvider /** * SkinnySession JDBC implmenetation. @@ -14,7 +14,7 @@ case class SkinnySession( createdAt: DateTime, expireAt: DateTime, servletSessions: Seq[ServletSession] = Nil, - attributes: Seq[SkinnySessionAttribute] = Nil) extends Logging { + attributes: Seq[SkinnySessionAttribute] = Nil) extends LoggerProvider { import SkinnySession._ @@ -97,7 +97,7 @@ case class SkinnySession( /** * SkinnySession JDBC implmenetation. */ -object SkinnySession extends SkinnyCRUDMapper[SkinnySession] with Logging { +object SkinnySession extends SkinnyCRUDMapper[SkinnySession] with LoggerProvider { sealed trait LastOperation case object Set extends LastOperation diff --git a/framework/src/main/scala/skinny/session/jdbc/SkinnySessionAttribute.scala b/framework/src/main/scala/skinny/session/jdbc/SkinnySessionAttribute.scala index 863d65cd..e18682f1 100644 --- a/framework/src/main/scala/skinny/session/jdbc/SkinnySessionAttribute.scala +++ b/framework/src/main/scala/skinny/session/jdbc/SkinnySessionAttribute.scala @@ -1,7 +1,7 @@ package skinny.session.jdbc import skinny.orm._ -import skinny.logging.Logging +import skinny.logging.LoggerProvider import scalikejdbc._ case class SkinnySessionAttribute(skinnySessionId: Long, name: String, value: Option[Any], session: Option[SkinnySession] = None) @@ -10,7 +10,7 @@ case class SkinnySessionAttribute(skinnySessionId: Long, name: String, value: Op def entityIdentity = (skinnySessionId, name) } -object SkinnySessionAttribute extends SkinnyTable[SkinnySessionAttribute] with Logging { +object SkinnySessionAttribute extends SkinnyTable[SkinnySessionAttribute] with LoggerProvider { override def tableName = "skinny_session_attributes" override def defaultAlias = createAlias("ska") override def defaultJoinColumnFieldName = "skinnySessionId" diff --git a/http-client/src/main/scala/skinny/http/HTTP.scala b/http-client/src/main/scala/skinny/http/HTTP.scala index cd1369dd..e8ab517b 100644 --- a/http-client/src/main/scala/skinny/http/HTTP.scala +++ b/http-client/src/main/scala/skinny/http/HTTP.scala @@ -22,13 +22,13 @@ import scala.collection.JavaConverters._ import scala.collection.mutable import scala.concurrent.{ Future, ExecutionContext } import scala.util.control.NonFatal -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.util.LoanPattern.using /** * HTTP/1.1 */ -object HTTP extends Logging { +object HTTP extends LoggerProvider { val DEFAULT_CHARSET = "UTF-8" private[this] val RESPONSE_CONTENT_TYPE_REGEXP = "[^;]+;\\s*charset=(.+)".r diff --git a/mailer/src/main/scala/skinny/mailer/JavaMailOps.scala b/mailer/src/main/scala/skinny/mailer/JavaMailOps.scala index c73776d0..359860f3 100644 --- a/mailer/src/main/scala/skinny/mailer/JavaMailOps.scala +++ b/mailer/src/main/scala/skinny/mailer/JavaMailOps.scala @@ -2,14 +2,13 @@ package skinny.mailer import javax.mail._ import javax.mail.internet.MimeMessage -import scala.io.Source import scala.collection.JavaConverters._ -import skinny.logging.Logging +import skinny.logging.LoggerProvider /** * Operations about javax.mail APIs. */ -object JavaMailOps extends Logging { +object JavaMailOps extends LoggerProvider { def loggingTransport(session: Session): Transport = { new Transport(session, null) { diff --git a/mailer/src/main/scala/skinny/mailer/RichMimeMessage.scala b/mailer/src/main/scala/skinny/mailer/RichMimeMessage.scala index 99d83a3d..8474ff61 100644 --- a/mailer/src/main/scala/skinny/mailer/RichMimeMessage.scala +++ b/mailer/src/main/scala/skinny/mailer/RichMimeMessage.scala @@ -6,12 +6,12 @@ import javax.mail.Message.RecipientType import javax.mail.internet.{ InternetAddress, MimeBodyPart, MimeMultipart, MimeMessage } import java.io.InputStream import org.joda.time.DateTime -import skinny.logging.Logging +import skinny.logging.LoggerProvider /** * Enriched MimeMessage . */ -trait RichMimeMessage extends Logging { +trait RichMimeMessage extends LoggerProvider { lazy val mimeMultipart = new MimeMultipart("mixed") diff --git a/mailer/src/main/scala/skinny/mailer/SkinnyMailerConfigBase.scala b/mailer/src/main/scala/skinny/mailer/SkinnyMailerConfigBase.scala index 4ce235d8..cba2c358 100644 --- a/mailer/src/main/scala/skinny/mailer/SkinnyMailerConfigBase.scala +++ b/mailer/src/main/scala/skinny/mailer/SkinnyMailerConfigBase.scala @@ -2,13 +2,13 @@ package skinny.mailer import com.typesafe.config.Config import skinny.SkinnyEnv -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.util.TypesafeConfigReader /** * Basic trait for SkinnyMailer configuration. */ -trait SkinnyMailerConfigBase extends Logging { +trait SkinnyMailerConfigBase extends LoggerProvider { /** * Name for this configuration which will be use in the namespace "{env}.mailer.{name}". diff --git a/mailer/src/main/scala/skinny/mailer/feature/JavaMailSessionFeature.scala b/mailer/src/main/scala/skinny/mailer/feature/JavaMailSessionFeature.scala index 67aa6dc1..1e04bc07 100644 --- a/mailer/src/main/scala/skinny/mailer/feature/JavaMailSessionFeature.scala +++ b/mailer/src/main/scala/skinny/mailer/feature/JavaMailSessionFeature.scala @@ -2,13 +2,13 @@ package skinny.mailer.feature import javax.mail._ import java.util.Properties -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.mailer.JavaMailOps /** * Provides Java Mail Session and Transport instance. */ -trait JavaMailSessionFeature extends Logging { +trait JavaMailSessionFeature extends LoggerProvider { self: ConfigFeature with SmtpConfigFeature with ExtraConfigFeature => diff --git a/oauth2/src/main/scala/skinny/oauth2/client/backlog/BacklogAPI.scala b/oauth2/src/main/scala/skinny/oauth2/client/backlog/BacklogAPI.scala index ae5a9b1a..3b7fc91f 100644 --- a/oauth2/src/main/scala/skinny/oauth2/client/backlog/BacklogAPI.scala +++ b/oauth2/src/main/scala/skinny/oauth2/client/backlog/BacklogAPI.scala @@ -1,12 +1,12 @@ package skinny.oauth2.client.backlog -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.oauth2.client.{ BearerRequest, OAuth2Client, OAuth2Token } import skinny.util.JSONStringOps import scala.util.control.NonFatal -case class BacklogAPI(spaceID: String) extends Logging { +case class BacklogAPI(spaceID: String) extends LoggerProvider { def myself(token: OAuth2Token): Option[BacklogUser] = { try { diff --git a/oauth2/src/main/scala/skinny/oauth2/client/backlog/BacklogJPAPI.scala b/oauth2/src/main/scala/skinny/oauth2/client/backlog/BacklogJPAPI.scala index 0cf4f716..a2247eb9 100644 --- a/oauth2/src/main/scala/skinny/oauth2/client/backlog/BacklogJPAPI.scala +++ b/oauth2/src/main/scala/skinny/oauth2/client/backlog/BacklogJPAPI.scala @@ -1,12 +1,12 @@ package skinny.oauth2.client.backlog -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.oauth2.client.{ BearerRequest, OAuth2Client, OAuth2Token } import skinny.util.JSONStringOps import scala.util.control.NonFatal -case class BacklogJPAPI(spaceID: String) extends Logging { +case class BacklogJPAPI(spaceID: String) extends LoggerProvider { def myself(token: OAuth2Token): Option[BacklogUser] = { try { diff --git a/oauth2/src/main/scala/skinny/oauth2/client/dropbox/DropboxAPI.scala b/oauth2/src/main/scala/skinny/oauth2/client/dropbox/DropboxAPI.scala index a2263a13..e0fb02ce 100644 --- a/oauth2/src/main/scala/skinny/oauth2/client/dropbox/DropboxAPI.scala +++ b/oauth2/src/main/scala/skinny/oauth2/client/dropbox/DropboxAPI.scala @@ -1,6 +1,6 @@ package skinny.oauth2.client.dropbox -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.oauth2.client._ import skinny.util.JSONStringOps import scala.util.control.NonFatal @@ -8,7 +8,7 @@ import scala.util.control.NonFatal /** * Dropbox API client. */ -trait DropboxAPI extends Logging { +trait DropboxAPI extends LoggerProvider { def accountInfo(token: OAuth2Token): Option[DropboxUser] = { try { diff --git a/oauth2/src/main/scala/skinny/oauth2/client/facebook/FacebookGraphAPI.scala b/oauth2/src/main/scala/skinny/oauth2/client/facebook/FacebookGraphAPI.scala index 7ce8994e..c852faaf 100644 --- a/oauth2/src/main/scala/skinny/oauth2/client/facebook/FacebookGraphAPI.scala +++ b/oauth2/src/main/scala/skinny/oauth2/client/facebook/FacebookGraphAPI.scala @@ -1,14 +1,14 @@ package skinny.oauth2.client.facebook import skinny.oauth2.client._ -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.util.JSONStringOps import scala.util.control.NonFatal /** * Facebook Graph API client. */ -trait FacebookGraphAPI extends Logging { +trait FacebookGraphAPI extends LoggerProvider { def me(token: OAuth2Token): Option[FacebookUser] = { try { diff --git a/oauth2/src/main/scala/skinny/oauth2/client/github/GitHubAPI.scala b/oauth2/src/main/scala/skinny/oauth2/client/github/GitHubAPI.scala index 8ff796aa..7e1d655a 100644 --- a/oauth2/src/main/scala/skinny/oauth2/client/github/GitHubAPI.scala +++ b/oauth2/src/main/scala/skinny/oauth2/client/github/GitHubAPI.scala @@ -1,6 +1,6 @@ package skinny.oauth2.client.github -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.oauth2.client._ import skinny.util.JSONStringOps import scala.util.control.NonFatal @@ -8,7 +8,7 @@ import scala.util.control.NonFatal /** * GitHub API client. */ -trait GitHubAPI extends Logging { +trait GitHubAPI extends LoggerProvider { def user(token: OAuth2Token): Option[GitHubUser] = { try { diff --git a/oauth2/src/main/scala/skinny/oauth2/client/google/GooglePlusAPI.scala b/oauth2/src/main/scala/skinny/oauth2/client/google/GooglePlusAPI.scala index 62955d9f..8f26ecfc 100644 --- a/oauth2/src/main/scala/skinny/oauth2/client/google/GooglePlusAPI.scala +++ b/oauth2/src/main/scala/skinny/oauth2/client/google/GooglePlusAPI.scala @@ -1,6 +1,6 @@ package skinny.oauth2.client.google -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.oauth2.client._ import skinny.util.JSONStringOps @@ -9,7 +9,7 @@ import scala.util.control.NonFatal /** * Google Plus API. */ -trait GooglePlusAPI extends Logging { +trait GooglePlusAPI extends LoggerProvider { def me(token: OAuth2Token): Option[GoogleUser] = { try { diff --git a/oauth2/src/main/scala/skinny/oauth2/client/typetalk/TypetalkAPI.scala b/oauth2/src/main/scala/skinny/oauth2/client/typetalk/TypetalkAPI.scala index 510454ce..b182b741 100644 --- a/oauth2/src/main/scala/skinny/oauth2/client/typetalk/TypetalkAPI.scala +++ b/oauth2/src/main/scala/skinny/oauth2/client/typetalk/TypetalkAPI.scala @@ -1,12 +1,12 @@ package skinny.oauth2.client.typetalk -import skinny.logging.Logging +import skinny.logging.LoggerProvider import skinny.oauth2.client.{ BearerRequest, OAuth2Client, OAuth2Token } import skinny.util.JSONStringOps import scala.util.control.NonFatal -trait TypetalkAPI extends Logging { +trait TypetalkAPI extends LoggerProvider { def profile(token: OAuth2Token): Option[TypetalkUser] = { try { diff --git a/orm/src/main/scala/skinny/orm/feature/AssociationsFeature.scala b/orm/src/main/scala/skinny/orm/feature/AssociationsFeature.scala index fab9d800..4627e919 100644 --- a/orm/src/main/scala/skinny/orm/feature/AssociationsFeature.scala +++ b/orm/src/main/scala/skinny/orm/feature/AssociationsFeature.scala @@ -1,8 +1,9 @@ package skinny.orm.feature +import skinny.logging.LoggerProvider + import scala.language.existentials -import skinny.logging.Logging import skinny.orm._ import skinny.orm.feature.includes.IncludesQueryRepository import skinny.orm.feature.associations._ @@ -48,7 +49,7 @@ trait AssociationsFeature[Entity] extends SkinnyMapperBase[Entity] with ConnectionPoolFeature with AutoSessionFeature - with Logging { self: SQLSyntaxSupport[Entity] => + with LoggerProvider { self: SQLSyntaxSupport[Entity] => import AssociationsFeature._ diff --git a/scaldi/src/main/scala/skinny/injection/SkinnyScaldi.scala b/scaldi/src/main/scala/skinny/injection/SkinnyScaldi.scala index f543ea7d..bde7039d 100644 --- a/scaldi/src/main/scala/skinny/injection/SkinnyScaldi.scala +++ b/scaldi/src/main/scala/skinny/injection/SkinnyScaldi.scala @@ -1,14 +1,14 @@ package skinny.injection import scaldi.{ Injector, MutableInjectorAggregation, Module } -import skinny.{ Logging, SkinnyConfig, SkinnyEnv } +import skinny.{ SkinnyConfig, SkinnyEnv } import scala.collection.concurrent.TrieMap import scala.util.control.NonFatal /** * The singleton holder of Scaldi components for SkinnyEnv. */ -object SkinnyScaldi extends SkinnyScaldi with Logging { +object SkinnyScaldi extends SkinnyScaldi { private[this] val scaldiInjectors: TrieMap[String, MutableInjectorAggregation] = TrieMap() diff --git a/test/src/main/scala/skinny/controller/SessionInjectorController.scala b/test/src/main/scala/skinny/controller/SessionInjectorController.scala index f27d5877..aa8d80d8 100644 --- a/test/src/main/scala/skinny/controller/SessionInjectorController.scala +++ b/test/src/main/scala/skinny/controller/SessionInjectorController.scala @@ -5,6 +5,7 @@ import java.io._ import skinny._ import skinny.util.LoanPattern._ import sun.misc.{ BASE64Decoder, BASE64Encoder } +import skinny.logging.LoggerProvider import scala.util.control.NonFatal @@ -19,7 +20,7 @@ private[skinny] object SessionInjectorController extends SessionInjectorControll /** * Session injector for testing & debugging. */ -trait SessionInjectorController extends SkinnyController with Logging { +trait SessionInjectorController extends SkinnyController with LoggerProvider { /** * Shows whole session attributes. diff --git a/test/src/main/scala/skinny/test/SkinnyTestSupport.scala b/test/src/main/scala/skinny/test/SkinnyTestSupport.scala index 8e0ef970..d302267f 100644 --- a/test/src/main/scala/skinny/test/SkinnyTestSupport.scala +++ b/test/src/main/scala/skinny/test/SkinnyTestSupport.scala @@ -3,12 +3,12 @@ package skinny.test import skinny.controller.{ SkinnySessionInjectorController, SessionInjectorController } import skinny.SkinnyEnv import skinny.engine.test.SkinnyEngineTests -import skinny.logging.Logging +import skinny.logging.LoggerProvider /** * Skinny framework testing support */ -trait SkinnyTestSupport extends Logging { self: SkinnyEngineTests => +trait SkinnyTestSupport extends LoggerProvider { self: SkinnyEngineTests => // set skinny.env as "test" System.setProperty(SkinnyEnv.PropertyKey, "test") diff --git a/worker/src/main/scala/skinny/worker/SkinnyWorker.scala b/worker/src/main/scala/skinny/worker/SkinnyWorker.scala index 754ed6d3..0a260c86 100644 --- a/worker/src/main/scala/skinny/worker/SkinnyWorker.scala +++ b/worker/src/main/scala/skinny/worker/SkinnyWorker.scala @@ -1,8 +1,8 @@ package skinny.worker -import skinny.logging.Logging +import skinny.logging.LoggerProvider -trait SkinnyWorker extends Runnable with Logging { +trait SkinnyWorker extends Runnable with LoggerProvider { def execute(): Unit