src/Pure/System/session_manager.scala
author wenzelm
Mon, 04 Jul 2011 22:11:32 +0200
changeset 44532 39fdbd814c7f
parent 44479 e1a09c2a6248
child 44544 9d34288e9351
permissions -rw-r--r--
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
wenzelm@34172
     1
/*  Title:      Pure/System/isabelle_manager.scala
wenzelm@34172
     2
    Author:     Makarius
wenzelm@34172
     3
wenzelm@34172
     4
Isabelle session manager.
wenzelm@34172
     5
*/
wenzelm@34172
     6
wenzelm@34172
     7
package isabelle
wenzelm@34172
     8
wenzelm@34172
     9
wenzelm@34172
    10
import java.io.{File, FileFilter}
wenzelm@34172
    11
wenzelm@34172
    12
wenzelm@44532
    13
class Session_Manager
wenzelm@34172
    14
{
wenzelm@34172
    15
  val ROOT_NAME = "session.root"
wenzelm@34172
    16
wenzelm@34172
    17
  def is_session_file(file: File): Boolean =
wenzelm@34172
    18
    file.isFile && file.getName == ROOT_NAME
wenzelm@34172
    19
wenzelm@34172
    20
  def is_session_dir(dir: File): Boolean =
wenzelm@34172
    21
    dir.isDirectory && (new File(dir, ROOT_NAME)).isFile
wenzelm@34172
    22
wenzelm@34172
    23
wenzelm@34172
    24
  // FIXME handle (potentially cyclic) directory graph
wenzelm@37112
    25
  private def find_sessions(reverse_prefix: List[String], reverse_sessions: List[List[String]],
wenzelm@34172
    26
    dir: File): List[List[String]] =
wenzelm@34172
    27
  {
wenzelm@37112
    28
    val (reverse_prefix1, reverse_sessions1) =
wenzelm@34172
    29
      if (is_session_dir(dir)) {
wenzelm@34172
    30
        val name = dir.getName  // FIXME from root file
wenzelm@37112
    31
        val reverse_prefix1 = name :: reverse_prefix
wenzelm@37112
    32
        val reverse_sessions1 = reverse_prefix1.reverse :: reverse_sessions
wenzelm@37112
    33
        (reverse_prefix1, reverse_sessions1)
wenzelm@34172
    34
      }
wenzelm@37112
    35
      else (reverse_prefix, reverse_sessions)
wenzelm@34172
    36
wenzelm@34172
    37
    val subdirs =
wenzelm@34172
    38
      dir.listFiles(new FileFilter { def accept(entry: File) = entry.isDirectory })
wenzelm@37112
    39
    (reverse_sessions1 /: subdirs)(find_sessions(reverse_prefix1, _, _))
wenzelm@34172
    40
  }
wenzelm@34172
    41
wenzelm@34172
    42
  def component_sessions(): List[List[String]] =
wenzelm@34172
    43
  {
wenzelm@34172
    44
    val toplevel_sessions =
wenzelm@44532
    45
      Isabelle_System.components().map(s =>
wenzelm@44532
    46
        Isabelle_System.platform_file(Path.explode(s))).filter(is_session_dir)
wenzelm@34172
    47
    ((Nil: List[List[String]]) /: toplevel_sessions)(find_sessions(Nil, _, _)).reverse
wenzelm@34172
    48
  }
wenzelm@34172
    49
}