src/Pure/System/session_manager.scala
changeset 48413 3e730188f328
parent 48408 5493e67982ee
parent 48412 dbd75cbb84ba
child 48414 43875bab3a4c
equal deleted inserted replaced
48408:5493e67982ee 48413:3e730188f328
     1 /*  Title:      Pure/System/isabelle_manager.scala
       
     2     Author:     Makarius
       
     3 
       
     4 Isabelle session manager.
       
     5 */
       
     6 
       
     7 package isabelle
       
     8 
       
     9 
       
    10 import java.io.{File, FileFilter}
       
    11 
       
    12 
       
    13 class Session_Manager
       
    14 {
       
    15   val ROOT_NAME = "session.root"
       
    16 
       
    17   def is_session_file(file: File): Boolean =
       
    18     file.isFile && file.getName == ROOT_NAME
       
    19 
       
    20   def is_session_dir(dir: File): Boolean =
       
    21     dir.isDirectory && (new File(dir, ROOT_NAME)).isFile
       
    22 
       
    23 
       
    24   // FIXME handle (potentially cyclic) directory graph
       
    25   private def find_sessions(reverse_prefix: List[String], reverse_sessions: List[List[String]],
       
    26     dir: File): List[List[String]] =
       
    27   {
       
    28     val (reverse_prefix1, reverse_sessions1) =
       
    29       if (is_session_dir(dir)) {
       
    30         val name = dir.getName  // FIXME from root file
       
    31         val reverse_prefix1 = name :: reverse_prefix
       
    32         val reverse_sessions1 = reverse_prefix1.reverse :: reverse_sessions
       
    33         (reverse_prefix1, reverse_sessions1)
       
    34       }
       
    35       else (reverse_prefix, reverse_sessions)
       
    36 
       
    37     val subdirs =
       
    38       dir.listFiles(new FileFilter { def accept(entry: File) = entry.isDirectory })
       
    39     (reverse_sessions1 /: subdirs)(find_sessions(reverse_prefix1, _, _))
       
    40   }
       
    41 
       
    42   def component_sessions(): List[List[String]] =
       
    43   {
       
    44     val toplevel_sessions =
       
    45       Isabelle_System.components().map(Isabelle_System.platform_file).filter(is_session_dir)
       
    46     ((Nil: List[List[String]]) /: toplevel_sessions)(find_sessions(Nil, _, _)).reverse
       
    47   }
       
    48 }