src/Pure/System/session.scala
changeset 38363 af7f41a8a0a8
parent 38360 53224a4d2f0e
child 38364 827b90f18ff4
equal deleted inserted replaced
38362:754ad6340055 38363:af7f41a8a0a8
    23 
    23 
    24 
    24 
    25 
    25 
    26   /* managed entities */
    26   /* managed entities */
    27 
    27 
    28   type Entity_ID = Long
       
    29 
       
    30   trait Entity
    28   trait Entity
    31   {
    29   {
    32     val id: Entity_ID
    30     val id: Document.ID
    33     def consume(message: XML.Tree, forward: Command => Unit): Unit
    31     def consume(message: XML.Tree, forward: Command => Unit): Unit
    34   }
    32   }
    35 }
    33 }
    36 
    34 
    37 
    35 
    58   val perspective = new Event_Bus[Session.Perspective.type]
    56   val perspective = new Event_Bus[Session.Perspective.type]
    59 
    57 
    60 
    58 
    61   /* unique ids */
    59   /* unique ids */
    62 
    60 
    63   private var id_count: Long = 0
    61   private var id_count: Document.ID = 0
    64   def create_id(): Session.Entity_ID = synchronized {
    62   def create_id(): Document.ID = synchronized {
    65     require(id_count > java.lang.Long.MIN_VALUE)
    63     require(id_count > java.lang.Long.MIN_VALUE)
    66     id_count -= 1
    64     id_count -= 1
    67     id_count
    65     id_count
    68   }
    66   }
    69 
    67 
    72   /** main actor **/
    70   /** main actor **/
    73 
    71 
    74   @volatile private var syntax = new Outer_Syntax(system.symbols)
    72   @volatile private var syntax = new Outer_Syntax(system.symbols)
    75   def current_syntax: Outer_Syntax = syntax
    73   def current_syntax: Outer_Syntax = syntax
    76 
    74 
    77   @volatile private var entities = Map[Session.Entity_ID, Session.Entity]()
    75   @volatile private var entities = Map[Document.ID, Session.Entity]()
    78   def lookup_entity(id: Session.Entity_ID): Option[Session.Entity] = entities.get(id)
    76   def lookup_entity(id: Document.ID): Option[Session.Entity] = entities.get(id)
    79   def lookup_command(id: Session.Entity_ID): Option[Command] =
    77   def lookup_command(id: Document.ID): Option[Command] =
    80     lookup_entity(id) match {
    78     lookup_entity(id) match {
    81       case Some(cmd: Command) => Some(cmd)
    79       case Some(cmd: Command) => Some(cmd)
    82       case _ => None
    80       case _ => None
    83     }
    81     }
    84 
    82 
   142     def handle_result(result: Isabelle_Process.Result)
   140     def handle_result(result: Isabelle_Process.Result)
   143     //{{{
   141     //{{{
   144     {
   142     {
   145       raw_results.event(result)
   143       raw_results.event(result)
   146 
   144 
   147       val target_id: Option[Session.Entity_ID] = Position.get_id(result.properties)
   145       val target_id: Option[Document.ID] = Position.get_id(result.properties)
   148       val target: Option[Session.Entity] =
   146       val target: Option[Session.Entity] =
   149         target_id match {
   147         target_id match {
   150           case None => None
   148           case None => None
   151           case Some(id) => lookup_entity(id)
   149           case Some(id) => lookup_entity(id)
   152         }
   150         }
   153       if (target.isDefined) target.get.consume(result.message, indicate_command_change)
   151       if (target.isDefined) target.get.consume(result.message, indicate_command_change)
   154       else if (result.is_status) {
   152       else if (result.is_status) {
   155         // global status message
   153         // global status message
   156         result.body match {
   154         result.body match {
   157 
   155 
   158           // document state assignment
   156           // execution assignment
   159           case List(Isar_Document.Assign(edits)) if target_id.isDefined =>
   157           case List(Isar_Document.Assign(edits)) if target_id.isDefined =>
   160             documents.get(target_id.get) match {
   158             documents.get(target_id.get) match {
   161               case Some(doc) =>
   159               case Some(doc) =>
   162                 val states =
   160                 val execs =
   163                   for {
   161                   for {
   164                     Isar_Document.Edit(cmd_id, state_id) <- edits
   162                     Isar_Document.Edit(cmd_id, exec_id) <- edits
   165                     cmd <- lookup_command(cmd_id)
   163                     cmd <- lookup_command(cmd_id)
   166                   } yield {
   164                   } yield {
   167                     val st = cmd.assign_state(state_id)
   165                     val st = cmd.assign_exec(exec_id)  // FIXME session state
   168                     register(st)
   166                     register(st)
   169                     (cmd, st)
   167                     (cmd, st)
   170                   }
   168                   }
   171                 doc.assign_states(states)
   169                 doc.assign_execs(execs)  // FIXME session state
   172               case None => bad_result(result)
   170               case None => bad_result(result)
   173             }
   171             }
   174 
   172 
   175           // keyword declarations
   173           // keyword declarations
   176           case List(Keyword.Command_Decl(name, kind)) => syntax += (name, kind)
   174           case List(Keyword.Command_Decl(name, kind)) => syntax += (name, kind)