src/Pure/Tools/main.scala
author wenzelm
Thu, 01 Sep 2016 15:29:08 +0200
changeset 63749 4fe8cfaeb1fc
parent 62261 74dc98bd9f51
child 65875 12c90c0c4b32
permissions -rw-r--r--
clarified important directories;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50687
a8db4bf70e90 moved files;
wenzelm
parents: 48275
diff changeset
     1
/*  Title:      Pure/Tools/main.scala
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     3
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
     4
Main Isabelle application entry point.
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     5
*/
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     6
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     7
package isabelle
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
     8
53419
1c87e79bb838 main application entry point involves implicit Cygwin init, depending on "uninitialized" file indicator;
wenzelm
parents: 52675
diff changeset
     9
55618
995162143ef4 tuned imports;
wenzelm
parents: 54351
diff changeset
    10
import java.lang.{Class, ClassLoader}
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    11
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    12
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    13
object Main
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
    14
{
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    15
  /* main entry point */
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    16
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53449
diff changeset
    17
  def main(args: Array[String])
53449
913df2adc99c build session before start of jedit;
wenzelm
parents: 53445
diff changeset
    18
  {
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    19
    val start =
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    20
    {
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    21
      try {
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    22
        Isabelle_System.init()
61307
be3a5fee11e3 clarified init (again): isabelle.Main is responsible to provide basic JVM setup, jedit.jar picks this up (e.g. list of known fonts), plugin cannot be loaded in isolation without isabelle.Main;
wenzelm
parents: 61291
diff changeset
    23
        GUI.install_fonts()
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    24
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    25
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    26
        /* settings directory */
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    27
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    28
        val settings_dir = Path.explode("$JEDIT_SETTINGS")
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    29
        Isabelle_System.mkdirs(settings_dir + Path.explode("DockableWindowManager"))
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    30
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    31
        if (!(settings_dir + Path.explode("perspective.xml")).is_file) {
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    32
          File.write(settings_dir + Path.explode("DockableWindowManager/perspective-view0.xml"),
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    33
            """<DOCKING LEFT="" TOP="" RIGHT="isabelle-documentation" BOTTOM="" LEFT_POS="0" TOP_POS="0" RIGHT_POS="250" BOTTOM_POS="250" />""")
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    34
          File.write(settings_dir + Path.explode("perspective.xml"),
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    35
            """<?xml version="1.0" encoding="UTF-8" ?>
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    36
<!DOCTYPE PERSPECTIVE SYSTEM "perspective.dtd">
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    37
<PERSPECTIVE>
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    38
<VIEW PLAIN="FALSE">
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    39
<GEOMETRY X="0" Y="35" WIDTH="1072" HEIGHT="787" EXT_STATE="0" />
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    40
</VIEW>
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    41
</PERSPECTIVE>""")
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    42
        }
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    43
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    44
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    45
        /* args */
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    46
62036
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    47
        val jedit_settings =
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    48
          "-settings=" + File.platform_path(Path.explode("$JEDIT_SETTINGS"))
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    49
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    50
        val jedit_server =
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    51
          System.getProperty("isabelle.jedit_server") match {
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    52
            case null | "" => "-noserver"
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    53
            case name => "-server=" + name
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    54
          }
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    55
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    56
        val jedit_options =
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    57
          Isabelle_System.getenv_strict("JEDIT_OPTIONS").split(" +")
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    58
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    59
        val more_args =
61512
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
    60
        {
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
    61
          args.toList.dropWhile(arg => arg.startsWith("-") && arg != "--") match {
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
    62
            case Nil | List("--") =>
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
    63
              args ++ Array(File.platform_path(Path.explode("$USER_HOME/Scratch.thy")))
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
    64
            case List(":") => args.slice(0, args.size - 1)
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
    65
            case _ => args
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
    66
          }
933463440449 more uniform command-line for "isabelle jedit" and the isabelle.Main app wrapper;
wenzelm
parents: 61307
diff changeset
    67
        }
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    68
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    69
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    70
        /* main startup */
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    71
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    72
        update_environment()
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    73
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    74
        System.setProperty("jedit.home", File.platform_path(Path.explode("$JEDIT_HOME/dist")))
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    75
        System.setProperty("scala.home", File.platform_path(Path.explode("$SCALA_HOME")))
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    76
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    77
        val jedit =
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    78
          Class.forName("org.gjt.sp.jedit.jEdit", true, ClassLoader.getSystemClassLoader)
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    79
        val jedit_main = jedit.getMethod("main", classOf[Array[String]])
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    80
62036
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    81
        () => jedit_main.invoke(
773cb226738c provide server name uniformly on all platforms;
wenzelm
parents: 61512
diff changeset
    82
          null, Array(jedit_settings, jedit_server) ++ jedit_options ++ more_args)
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    83
      }
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    84
      catch {
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    85
        case exn: Throwable =>
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    86
          GUI.init_laf()
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    87
          GUI.dialog(null, "Isabelle", GUI.scrollable_text(Exn.message(exn)))
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    88
          sys.exit(2)
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    89
      }
61277
c9152a195899 build session within running jEdit;
wenzelm
parents: 61186
diff changeset
    90
    }
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    91
    start()
53445
811db2b751ed warm start of Isabelle/jEdit from Isabelle/Scala;
wenzelm
parents: 53423
diff changeset
    92
  }
53461
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    93
26c609ada983 clarified modules;
wenzelm
parents: 53460
diff changeset
    94
61282
3e578ddef85d clarified Isabelle_System.init;
wenzelm
parents: 61281
diff changeset
    95
  /* adhoc update of JVM environment variables */
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
    96
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
    97
  def update_environment()
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
    98
  {
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
    99
    val update =
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   100
    {
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   101
      val isabelle_home = Isabelle_System.getenv("ISABELLE_HOME")
54351
5cbe32533cdb more on file-system access;
wenzelm
parents: 53967
diff changeset
   102
      val isabelle_home_user = Isabelle_System.getenv("ISABELLE_HOME_USER")
63749
4fe8cfaeb1fc clarified important directories;
wenzelm
parents: 62261
diff changeset
   103
      val jedit_home = Isabelle_System.getenv("JEDIT_HOME")
4fe8cfaeb1fc clarified important directories;
wenzelm
parents: 62261
diff changeset
   104
      val jedit_settings = Isabelle_System.getenv("JEDIT_SETTINGS")
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   105
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   106
      (env0: Any) => {
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   107
        val env = env0.asInstanceOf[java.util.Map[String, String]]
60997
65cbc1abfc54 eliminated WinRun4J artifact;
wenzelm
parents: 60992
diff changeset
   108
        env.put("ISABELLE_HOME", File.platform_path(isabelle_home))
65cbc1abfc54 eliminated WinRun4J artifact;
wenzelm
parents: 60992
diff changeset
   109
        env.put("ISABELLE_HOME_USER", File.platform_path(isabelle_home_user))
63749
4fe8cfaeb1fc clarified important directories;
wenzelm
parents: 62261
diff changeset
   110
        env.put("JEDIT_HOME", File.platform_path(jedit_home))
4fe8cfaeb1fc clarified important directories;
wenzelm
parents: 62261
diff changeset
   111
        env.put("JEDIT_SETTINGS", File.platform_path(jedit_settings))
62261
74dc98bd9f51 suppress ISABELLE_ROOT after init, to avoid conflict with ISABELLE_HOME when folding file names in "isabelle jedit" command-line tool;
wenzelm
parents: 62036
diff changeset
   112
        env.remove("ISABELLE_ROOT")
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   113
      }
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   114
    }
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   115
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   116
    classOf[java.util.Collections].getDeclaredClasses
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   117
      .find(c => c.getName == "java.util.Collections$UnmodifiableMap") match
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   118
    {
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   119
      case Some(c) =>
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   120
        val m = c.getDeclaredField("m")
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   121
        m.setAccessible(true)
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   122
        update(m.get(System.getenv()))
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   123
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   124
        if (Platform.is_windows) {
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   125
          val ProcessEnvironment = Class.forName("java.lang.ProcessEnvironment")
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   126
          val field = ProcessEnvironment.getDeclaredField("theCaseInsensitiveEnvironment")
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   127
          field.setAccessible(true)
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   128
          update(field.get(null))
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   129
        }
53966
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   130
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   131
      case None =>
5a546a881f90 update second environment that is used for System.getenv(String);
wenzelm
parents: 53965
diff changeset
   132
        error("Failed to update JVM environment -- platform incompatibility")
53965
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   133
    }
cca95e9055ba adhoc update of JVM environment variables, which is relevant for cold start of jEdit;
wenzelm
parents: 53912
diff changeset
   134
  }
47663
20e0865ae9e7 default Isabelle application wrapper -- JVM entry point for Isabelle.exe;
wenzelm
parents:
diff changeset
   135
}