src/Pure/Tools/server.scala
changeset 69458 5655af3ea5bd
parent 69451 387894c2fb2c
child 69460 5ffe7e17f770
equal deleted inserted replaced
69457:bea49e443909 69458:5655af3ea5bd
   236     }
   236     }
   237 
   237 
   238     def remove_task(task: Task): Unit =
   238     def remove_task(task: Task): Unit =
   239       _tasks.change(_ - task)
   239       _tasks.change(_ - task)
   240 
   240 
   241     def cancel_task(id: UUID): Unit =
   241     def cancel_task(id: UUID.T): Unit =
   242       _tasks.change(tasks => { tasks.find(task => task.id == id).foreach(_.cancel); tasks })
   242       _tasks.change(tasks => { tasks.find(task => task.id == id).foreach(_.cancel); tasks })
   243 
   243 
   244     def close()
   244     def close()
   245     {
   245     {
   246       while(_tasks.change_result(tasks => { tasks.foreach(_.cancel); (tasks.nonEmpty, tasks) }))
   246       while(_tasks.change_result(tasks => { tasks.foreach(_.cancel); (tasks.nonEmpty, tasks) }))
   280 
   280 
   281   class Task private[Server](val context: Context, body: Task => JSON.Object.T)
   281   class Task private[Server](val context: Context, body: Task => JSON.Object.T)
   282   {
   282   {
   283     task =>
   283     task =>
   284 
   284 
   285     val id: UUID = UUID()
   285     val id: UUID.T = UUID.random()
   286     val ident: JSON.Object.Entry = ("task" -> id.toString)
   286     val ident: JSON.Object.Entry = ("task" -> id.toString)
   287 
   287 
   288     val progress: Connection_Progress = context.progress(ident)
   288     val progress: Connection_Progress = context.progress(ident)
   289     def cancel { progress.stop }
   289     def cancel { progress.stop }
   290 
   290 
   490 {
   490 {
   491   server =>
   491   server =>
   492 
   492 
   493   private val server_socket = new ServerSocket(_port, 50, InetAddress.getByName("127.0.0.1"))
   493   private val server_socket = new ServerSocket(_port, 50, InetAddress.getByName("127.0.0.1"))
   494 
   494 
   495   private val _sessions = Synchronized(Map.empty[UUID, Headless.Session])
   495   private val _sessions = Synchronized(Map.empty[UUID.T, Headless.Session])
   496   def err_session(id: UUID): Nothing = error("No session " + Library.single_quote(id.toString))
   496   def err_session(id: UUID.T): Nothing = error("No session " + Library.single_quote(id.toString))
   497   def the_session(id: UUID): Headless.Session = _sessions.value.get(id) getOrElse err_session(id)
   497   def the_session(id: UUID.T): Headless.Session = _sessions.value.get(id) getOrElse err_session(id)
   498   def add_session(entry: (UUID, Headless.Session)) { _sessions.change(_ + entry) }
   498   def add_session(entry: (UUID.T, Headless.Session)) { _sessions.change(_ + entry) }
   499   def remove_session(id: UUID): Headless.Session =
   499   def remove_session(id: UUID.T): Headless.Session =
   500   {
   500   {
   501     _sessions.change_result(sessions =>
   501     _sessions.change_result(sessions =>
   502       sessions.get(id) match {
   502       sessions.get(id) match {
   503         case Some(session) => (session, sessions - id)
   503         case Some(session) => (session, sessions - id)
   504         case None => err_session(id)
   504         case None => err_session(id)
   518       catch { case ERROR(msg) => log("Session shutdown failed: " + msg) }
   518       catch { case ERROR(msg) => log("Session shutdown failed: " + msg) }
   519     }
   519     }
   520   }
   520   }
   521 
   521 
   522   def port: Int = server_socket.getLocalPort
   522   def port: Int = server_socket.getLocalPort
   523   val password: String = UUID().toString
   523   val password: String = UUID.random_string()
   524 
   524 
   525   override def toString: String = Server.print(port, password)
   525   override def toString: String = Server.print(port, password)
   526 
   526 
   527   private def handle(connection: Server.Connection)
   527   private def handle(connection: Server.Connection)
   528   {
   528   {