2009-05-16 10:46:24 +02:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009 Scalable Solutions.
|
|
|
|
|
*/
|
|
|
|
|
|
2009-09-02 09:10:21 +02:00
|
|
|
package se.scalablesolutions.akka.rest
|
2009-05-16 10:46:24 +02:00
|
|
|
|
2009-10-08 19:01:04 +02:00
|
|
|
import se.scalablesolutions.akka.config.ConfiguratorRepository
|
|
|
|
|
import se.scalablesolutions.akka.util.Logging
|
2009-07-03 17:15:36 +02:00
|
|
|
|
2009-08-01 17:40:16 +02:00
|
|
|
import com.sun.jersey.api.core.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-08-01 17:40:16 +02:00
|
|
|
import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
|
2009-07-27 20:28:44 +02:00
|
|
|
|
2009-08-01 17:40:16 +02:00
|
|
|
import org.atmosphere.cpr.{AtmosphereServletProcessor, AtmosphereEvent}
|
2009-08-02 12:58:20 +02:00
|
|
|
import org.atmosphere.cpr.AtmosphereServlet.AtmosphereHandlerWrapper
|
2009-07-27 20:28:44 +02:00
|
|
|
import org.atmosphere.container.GrizzlyCometSupport
|
|
|
|
|
import org.atmosphere.handler.ReflectorServletProcessor
|
|
|
|
|
import org.atmosphere.core.{JerseyBroadcaster}
|
|
|
|
|
|
2009-08-01 17:40:16 +02:00
|
|
|
import java.net.URLClassLoader
|
|
|
|
|
import java.io.InputStream
|
2009-07-27 20:28:44 +02:00
|
|
|
|
|
|
|
|
import scala.collection.jcl.Conversions._
|
2009-07-03 17:15:36 +02:00
|
|
|
|
2009-08-02 12:33:42 +02:00
|
|
|
/**
|
|
|
|
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
|
|
|
*/
|
2009-07-27 20:28:44 +02:00
|
|
|
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) = {
|
2009-09-02 09:10:21 +02:00
|
|
|
akka.Kernel.boot // will boot if not already booted by 'main'
|
2009-09-03 11:02:21 +02:00
|
|
|
val configurators = ConfiguratorRepository.getConfigurators
|
2009-07-29 19:57:32 +02:00
|
|
|
|
2009-07-28 23:00:03 +02:00
|
|
|
rc.getClasses.addAll(configurators.flatMap(_.getComponentInterfaces))
|
2009-09-07 18:42:15 +02:00
|
|
|
rc.getProperties.put("com.sun.jersey.spi.container.ResourceFilters", akka.Config.config.getString("akka.rest.filters").getOrElse(""))
|
2009-07-28 23:00:03 +02:00
|
|
|
|
2009-08-01 17:40:16 +02:00
|
|
|
wa.initiate(rc, new ActorComponentProviderFactory(configurators))
|
|
|
|
|
}
|
|
|
|
|
|
2009-08-02 12:58:20 +02:00
|
|
|
// Borrowed from AbstractReflectorAtmosphereHandler
|
2009-08-01 17:40:16 +02:00
|
|
|
override def onMessage(event: AtmosphereEvent[HttpServletRequest, HttpServletResponse]): AtmosphereEvent[_, _] = {
|
2009-09-22 23:49:34 +02:00
|
|
|
|
|
|
|
|
val response = event.getResponse
|
2009-10-06 00:07:27 +02:00
|
|
|
val data = if(event.getMessage ne null) event.getMessage.toString else null
|
2009-09-22 23:49:34 +02:00
|
|
|
val isUsingStream = try {
|
2009-10-06 00:07:27 +02:00
|
|
|
response.getWriter
|
|
|
|
|
false
|
|
|
|
|
} catch { case e: IllegalStateException => true }
|
|
|
|
|
|
|
|
|
|
if (isUsingStream) {
|
|
|
|
|
if (data != null) response.getOutputStream.write(data.getBytes)
|
2009-09-22 23:49:34 +02:00
|
|
|
response.getOutputStream.flush
|
2009-10-06 00:07:27 +02:00
|
|
|
} else {
|
|
|
|
|
if (data != null) response.getWriter.write(data)
|
2009-09-22 23:49:34 +02:00
|
|
|
response.getWriter.flush
|
2009-10-06 00:07:27 +02:00
|
|
|
}
|
2009-08-01 17:40:16 +02:00
|
|
|
event
|
2009-05-16 10:46:24 +02:00
|
|
|
}
|
2009-07-27 20:28:44 +02:00
|
|
|
|
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
|
|
|
|
|
}
|
2009-07-26 19:12:22 +02:00
|
|
|
}
|
|
|
|
|
|
2009-08-01 17:40:16 +02:00
|
|
|
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 }
|
2009-09-22 23:49:34 +02:00
|
|
|
atmosphereHandlers.put("/*", new AtmosphereHandlerWrapper(servlet, new JerseyBroadcaster))
|
2009-08-01 17:40:16 +02:00
|
|
|
setCometSupport(new GrizzlyCometSupport(config))
|
|
|
|
|
getCometSupport.init(sconf)
|
|
|
|
|
servlet.init(sconf)
|
|
|
|
|
}
|
2009-07-26 19:12:22 +02:00
|
|
|
|
2009-08-01 17:40:16 +02:00
|
|
|
override def loadAtmosphereDotXml(is: InputStream, urlc: URLClassLoader) = () //Hide it
|
2009-07-28 23:00:03 +02:00
|
|
|
}
|