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

107 lines
3.7 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
2009-07-28 23:00:03 +02:00
import com.sun.jersey.api.core.{DefaultResourceConfig, ResourceConfig,ClasspathResourceConfig}
import com.sun.jersey.spi.container.servlet.ServletContainer
import com.sun.jersey.spi.container.WebApplication
2009-07-28 23:00:03 +02:00
import com.sun.jersey.server.impl.component.{IoCResourceFactory}
import javax.servlet.{ServletConfig}
import javax.servlet.http.{HttpServletRequest,HttpServletResponse}
2009-07-28 23:00:03 +02:00
import org.atmosphere.cpr.{AtmosphereServlet,AtmosphereServletProcessor,AtmosphereEvent,DefaultBroadcaster}
import org.atmosphere.cpr.AtmosphereServlet.{AtmosphereHandlerWrapper}
import org.atmosphere.container.GrizzlyCometSupport
import org.atmosphere.handler.ReflectorServletProcessor
import org.atmosphere.core.{JerseyBroadcaster}
import java.util.{HashSet, HashMap}
import java.net.{URL,URLClassLoader}
import java.io.{InputStream}
import scala.collection.jcl.Conversions._
class AkkaServlet extends ServletContainer with AtmosphereServletProcessor with Logging {
override def initiate(rc: ResourceConfig, wa: WebApplication) = {
2009-07-28 23:00:03 +02:00
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))
rc.getProperties.put("com.sun.jersey.spi.container.ResourceFilters","org.atmosphere.core.AtmosphereFilter")
//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-07-29 00:10:53 +02:00
//Borrowed from AbstractReflectorAtmosphereHandler
override def onMessage(event : AtmosphereEvent[HttpServletRequest,HttpServletResponse]) : AtmosphereEvent[_,_] =
{
2009-07-28 23:00:03 +02:00
//log.info("onMessage: " + event.getMessage.toString)
2009-07-29 19:57:32 +02:00
if(event.getMessage ne null)
2009-07-28 23:00:03 +02:00
{
var isUsingStream = false
try {
event.getResponse.getWriter
} catch {
case e: IllegalStateException => isUsingStream = true
}
2009-07-29 00:10:53 +02:00
val data = event.getMessage.toString
2009-07-28 23:00:03 +02:00
if (isUsingStream){
2009-07-29 00:10:53 +02:00
if(data != null)
event.getResponse.getOutputStream.write(data.getBytes)
2009-07-28 23:00:03 +02:00
event.getResponse.getOutputStream.flush
} else {
2009-07-29 00:10:53 +02:00
event.getResponse.getWriter.write(data)
2009-07-28 23:00:03 +02:00
event.getResponse.getWriter.flush
}
}
2009-07-28 23:00:03 +02:00
else
2009-07-29 00:10:53 +02:00
log.info("Null event message :/ req[ " + event.getRequest + "] res[" +event.getResponse + "]")
event
}
override def onEvent(event : AtmosphereEvent[HttpServletRequest,HttpServletResponse]) : AtmosphereEvent[_,_] =
{
2009-07-28 23:00:03 +02:00
//log.info("onEvent: " + event.getMessage)
event.getRequest.setAttribute(ReflectorServletProcessor.ATMOSPHERE_EVENT, event)
event.getRequest.setAttribute(ReflectorServletProcessor.ATMOSPHERE_HANDLER, this)
2009-07-27 22:21:01 +02:00
service(event.getRequest, event.getResponse)
2009-07-27 22:21:01 +02:00
event
}
}
2009-07-29 00:10:53 +02:00
class AkkaCometServlet extends org.atmosphere.cpr.AtmosphereServlet
2009-07-28 23:00:03 +02:00
{
override def init(sconf : ServletConfig) = {
2009-07-28 23:00:03 +02:00
val servlet = new AkkaServlet
2009-07-29 19:57:32 +02:00
this.config = new AtmosphereConfig { ah = servlet }
2009-07-29 20:17:40 +02:00
atmosphereHandlers.put("", new AtmosphereHandlerWrapper(servlet,new JerseyBroadcaster))
2009-07-29 00:10:53 +02:00
setCometSupport(new GrizzlyCometSupport(config))
getCometSupport.init(sconf)
2009-07-28 23:00:03 +02:00
servlet.init(sconf)
}
2009-07-27 22:21:01 +02:00
override def loadAtmosphereDotXml(is : InputStream, urlc :URLClassLoader) = () //Hide it
2009-07-28 23:00:03 +02:00
}