pekko/kernel/src/main/scala/jersey/AkkaServlet.scala

87 lines
3.3 KiB
Scala
Raw Normal View History

/**
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.kernel.jersey
import kernel.Kernel
import config.ConfiguratorRepository
import util.Logging
import com.sun.jersey.api.core.ResourceConfig
import com.sun.jersey.spi.container.servlet.ServletContainer
import com.sun.jersey.spi.container.WebApplication
import javax.servlet.{ServletConfig}
import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
import org.atmosphere.cpr.{AtmosphereServletProcessor, AtmosphereEvent}
2009-08-02 12:58:20 +02:00
import org.atmosphere.cpr.AtmosphereServlet.AtmosphereHandlerWrapper
import org.atmosphere.container.GrizzlyCometSupport
import org.atmosphere.handler.ReflectorServletProcessor
import org.atmosphere.core.{JerseyBroadcaster}
import java.net.URLClassLoader
import java.io.InputStream
import scala.collection.jcl.Conversions._
2009-08-02 12:33:42 +02:00
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class AkkaServlet extends ServletContainer with AtmosphereServletProcessor with Logging {
2009-07-28 23:00:03 +02:00
2009-08-02 12:58:20 +02:00
override def initiate(rc: ResourceConfig, wa: WebApplication) = {
Kernel.boot // will boot if not already booted by 'main'
val configurators = ConfiguratorRepository.getConfiguratorsFor(getServletContext)
2009-07-29 19:57:32 +02:00
2009-07-28 23:00:03 +02:00
rc.getClasses.addAll(configurators.flatMap(_.getComponentInterfaces))
2009-08-02 12:33:42 +02:00
log.info("Starting AkkaServlet with ResourceFilters: " + rc.getProperty("com.sun.jersey.spi.container.ResourceFilters"));
2009-08-02 12:58:20 +02:00
rc.getProperties.put("com.sun.jersey.spi.container.ResourceFilters", "org.atmosphere.core.AtmosphereFilter")
2009-07-28 23:00:03 +02:00
//rc.getFeatures.put("com.sun.jersey.config.feature.Redirect", true)
//rc.getFeatures.put("com.sun.jersey.config.feature.ImplicitViewables",true)
wa.initiate(rc, new ActorComponentProviderFactory(configurators))
}
2009-08-02 12:58:20 +02:00
// Borrowed from AbstractReflectorAtmosphereHandler
override def onMessage(event: AtmosphereEvent[HttpServletRequest, HttpServletResponse]): AtmosphereEvent[_, _] = {
if (event.getMessage ne null) {
2009-08-02 12:58:20 +02:00
val isUsingStream = try {
event.getResponse.getWriter
2009-08-02 12:58:20 +02:00
false
} catch {case e: IllegalStateException => true}
val data = event.getMessage.toString
if (isUsingStream) {
if (data != null) event.getResponse.getOutputStream.write(data.getBytes)
event.getResponse.getOutputStream.flush
} else {
event.getResponse.getWriter.write(data)
event.getResponse.getWriter.flush
}
2009-08-02 12:58:20 +02:00
} else log.info("Null event message :/ req[%s] res[%s]", event.getRequest, event.getResponse)
event
}
2009-08-02 12:58:20 +02:00
override def onEvent(event: AtmosphereEvent[HttpServletRequest, HttpServletResponse]): AtmosphereEvent[_, _] = {
event.getRequest.setAttribute(ReflectorServletProcessor.ATMOSPHERE_EVENT, event)
event.getRequest.setAttribute(ReflectorServletProcessor.ATMOSPHERE_HANDLER, this)
service(event.getRequest, event.getResponse)
event
}
}
class AkkaCometServlet extends org.atmosphere.cpr.AtmosphereServlet {
override def init(sconf: ServletConfig) = {
val servlet = new AkkaServlet
2009-08-02 12:58:20 +02:00
config = new AtmosphereConfig { ah = servlet }
atmosphereHandlers.put("", new AtmosphereHandlerWrapper(servlet, new JerseyBroadcaster))
setCometSupport(new GrizzlyCometSupport(config))
getCometSupport.init(sconf)
servlet.init(sconf)
}
override def loadAtmosphereDotXml(is: InputStream, urlc: URLClassLoader) = () //Hide it
2009-07-28 23:00:03 +02:00
}