2009-05-16 10:46:24 +02:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009 Scalable Solutions.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package se.scalablesolutions.akka.kernel.jersey
|
|
|
|
|
|
2009-07-12 23:08:17 +02:00
|
|
|
import kernel.Kernel
|
|
|
|
|
import config.ConfiguratorRepository
|
2009-07-26 19:12:22 +02:00
|
|
|
import util.Logging
|
2009-07-03 17:15:36 +02:00
|
|
|
|
2009-05-18 08:19:30 +02:00
|
|
|
import com.sun.jersey.api.core.{DefaultResourceConfig, ResourceConfig}
|
2009-05-16 10:46:24 +02:00
|
|
|
import com.sun.jersey.spi.container.servlet.ServletContainer
|
|
|
|
|
import com.sun.jersey.spi.container.WebApplication
|
2009-07-26 19:12:22 +02:00
|
|
|
|
|
|
|
|
import javax.servlet.{ServletConfig}
|
2009-07-27 20:28:44 +02:00
|
|
|
import javax.servlet.http.{HttpServletRequest,HttpServletResponse}
|
|
|
|
|
|
|
|
|
|
import org.atmosphere.cpr.{AtmosphereServlet,AtmosphereServletProcessor,AtmosphereEvent}
|
|
|
|
|
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}
|
2009-07-26 19:12:22 +02:00
|
|
|
import java.net.{URL,URLClassLoader}
|
2009-07-27 20:28:44 +02:00
|
|
|
import java.io.{InputStream}
|
|
|
|
|
|
|
|
|
|
import scala.collection.jcl.Conversions._
|
2009-07-03 17:15:36 +02:00
|
|
|
|
2009-07-26 19:12:22 +02:00
|
|
|
|
2009-07-27 20:28:44 +02:00
|
|
|
class AkkaServlet extends ServletContainer with AtmosphereServletProcessor with Logging {
|
2009-05-16 10:46:24 +02:00
|
|
|
|
|
|
|
|
override def initiate(rc: ResourceConfig, wa: WebApplication) = {
|
2009-07-25 21:35:47 +02:00
|
|
|
// super.initiate(rc, wa)
|
2009-07-27 22:21:01 +02:00
|
|
|
// log.info("Initializing akka servlet")
|
2009-07-12 23:08:17 +02:00
|
|
|
Kernel.boot // will boot if not already booted by 'main'
|
2009-07-27 20:28:44 +02:00
|
|
|
val configurators = ConfiguratorRepository.getConfiguratorsFor(getServletContext)
|
2009-05-18 08:19:30 +02:00
|
|
|
val set = new HashSet[Class[_]]
|
2009-07-03 17:15:36 +02:00
|
|
|
for {
|
|
|
|
|
conf <- configurators
|
|
|
|
|
clazz <- conf.getComponentInterfaces
|
|
|
|
|
} set.add(clazz)
|
2009-05-18 08:19:30 +02:00
|
|
|
|
|
|
|
|
wa.initiate(
|
|
|
|
|
new DefaultResourceConfig(set),
|
2009-07-25 21:35:47 +02:00
|
|
|
new ActorComponentProviderFactory(configurators))
|
2009-05-16 10:46:24 +02:00
|
|
|
}
|
2009-07-27 20:28:44 +02:00
|
|
|
|
|
|
|
|
override def onMessage(event : AtmosphereEvent[HttpServletRequest,HttpServletResponse]) : AtmosphereEvent[_,_] =
|
|
|
|
|
{
|
|
|
|
|
var isUsingStream = false
|
|
|
|
|
try {
|
|
|
|
|
event.getResponse.getWriter
|
|
|
|
|
} catch {
|
|
|
|
|
case e: IllegalStateException => isUsingStream = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isUsingStream){
|
|
|
|
|
event.getResponse.getOutputStream.write(event.getMessage.toString.getBytes);
|
|
|
|
|
event.getResponse.getOutputStream.flush
|
|
|
|
|
} else {
|
|
|
|
|
event.getResponse.getWriter.write(event.getMessage.toString)
|
|
|
|
|
event.getResponse.getWriter.flush
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
event
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override def onEvent(event : AtmosphereEvent[HttpServletRequest,HttpServletResponse]) : AtmosphereEvent[_,_] =
|
|
|
|
|
{
|
|
|
|
|
event.getRequest.setAttribute(classOf[org.atmosphere.cpr.AtmosphereEvent[_,_]].getName, event)
|
|
|
|
|
event.getRequest.setAttribute(classOf[AkkaServlet].getName, this)
|
2009-07-27 22:21:01 +02:00
|
|
|
|
2009-07-27 20:28:44 +02:00
|
|
|
service(event.getRequest, event.getResponse)
|
2009-07-27 22:21:01 +02:00
|
|
|
|
2009-07-27 20:28:44 +02:00
|
|
|
event
|
|
|
|
|
}
|
2009-07-26 19:12:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class AkkaCometServlet extends org.atmosphere.cpr.AtmosphereServlet with Logging
|
|
|
|
|
{
|
|
|
|
|
override def init(sconf : ServletConfig) = {
|
|
|
|
|
|
2009-07-27 20:28:44 +02:00
|
|
|
val cfg = new AtmosphereConfig
|
|
|
|
|
|
|
|
|
|
atmosphereHandlers.put("", new AtmosphereHandlerWrapper(new AkkaServlet,new JerseyBroadcaster()))
|
2009-07-26 19:12:22 +02:00
|
|
|
|
2009-07-27 20:28:44 +02:00
|
|
|
super.setCometSupport(new GrizzlyCometSupport(cfg))
|
|
|
|
|
getCometSupport.init(sconf)
|
|
|
|
|
|
2009-07-27 22:21:01 +02:00
|
|
|
//Would call super.initAtmosphereServletProcessor(sconf) if they'd let me, but they don't so I roll my own
|
2009-07-27 20:28:44 +02:00
|
|
|
for(e <- atmosphereHandlers.entrySet){
|
|
|
|
|
val h = e.getValue.atmosphereHandler
|
|
|
|
|
if(h.isInstanceOf[AtmosphereServletProcessor])
|
|
|
|
|
(h.asInstanceOf[AtmosphereServletProcessor]).init(sconf)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2009-07-26 19:12:22 +02:00
|
|
|
|
2009-07-27 22:21:01 +02:00
|
|
|
override def loadAtmosphereDotXml(is : InputStream, urlc :URLClassLoader) = () //Hide it
|
2009-07-26 19:12:22 +02:00
|
|
|
}
|