Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

711
LINES

< > BotCompany Repo | #1034637 // GazelleHost + Stem [backup before multiple databases]

JavaX (incomplete)

1  
lib 1400521 // FlatLAF
2  
3  
set flag PingV3.
4  
set flag NotifyingPrintLog.
5  
set flag SymbolAsString.
6  
7  
// Do the JavaX init
8  
svoid standaloneInit {
9  
  __javax = x30.class;
10  
  x30.__javax = x30.class; // for hotwire
11  
  x30_pkg.x30_util.__setJavaX(x30.class);
12  
  x30.cleanKillMsg = "";
13  
  callOnLoadMethods(mc());
14  
}
15  
16  
concept PrintLogModule > DynPrintLog {
17  
  start { setModuleName("Log"); }
18  
  
19  
  S getPrintLog() {
20  
    ret printLog();
21  
  }
22  
  
23  
  bool useErrorHandling() { false; }
24  
}
25  
26  
concept Stem {
27  
  transient GazelleHost host;
28  
  DynModule module;
29  
  Rect frameRect;
30  
  bool minimized, maximized, alwaysOnTop, autoUpdate, minimizeToTray;
31  
  
32  
  LS fieldsToShareBetweenDatabases() {
33  
    ret identifiers("frameRect, minimized, maximized, alwaysOnTop, autoUpdate, minimizeToTray");
34  
  }
35  
  
36  
  transient JFrame window;
37  
  transient JButton btnMax;
38  
  transient JLabel titleComponent;
39  
  transient gettable JButton compileButton;
40  
  //transient bool autoUpdateDisabled;
41  
  
42  
  *() {}
43  
  *(GazelleHost *host) {}
44  
  *(GazelleHost *host, DynModule *module) {}
45  
  
46  
  Rect getFrameRect() {
47  
    ret toRect(getBounds(window));
48  
  }
49  
  
50  
  void saveFrameRect {
51  
    setField(frameRect := getFrameRect());
52  
  }
53  
  
54  
  void setAlwaysOnTop(bool alwaysOnTop) {
55  
    this.alwaysOnTop = alwaysOnTop;
56  
    change();
57  
    alwaysOnTop(window, alwaysOnTop);
58  
  }
59  
  
60  
  void setMinimizeToTray(bool minimizeToTray) {
61  
    cset(this, +minimizeToTray);
62  
  }
63  
64  
  void setWindow(JFrame window) {  
65  
    this.window = window;
66  
    if (frameRect != null)  
67  
      setBounds(window, frameRect);
68  
    //onWindowClosing(window, -> host.cleanExit());
69  
    onBoundsChange(window, r saveFrameRect);
70  
    alwaysOnTop(window, alwaysOnTop);
71  
  }
72  
  
73  
  void activateWindow {
74  
    activateFrame_v3(window);
75  
  }
76  
  
77  
  bool isMain() { ret this == host.stem; }
78  
  
79  
  void minimize {
80  
    cset(this, minimized := true);
81  
    if (!minimizeToTray || host.trayIcon == null || !isMain())
82  
      minimizeWindow(window);
83  
    else
84  
      hideWindow(window);
85  
  }
86  
  
87  
  void deleteMe {
88  
    printAlsoToSystemOut = true;
89  
    print("deleteMe " + isMain());
90  
    if (isMain()) {
91  
      host.cleanExit();
92  
    } else {
93  
      cleanMeUp();
94  
    }
95  
  }
96  
  
97  
  void cleanMeUp {
98  
    disposeWindow(window);
99  
    dispose module;
100  
    cdelete(this);
101  
  }
102  
  
103  
  void grabWindowState {
104  
    setField(maximized := !isExtendedStateNormal(window));
105  
  }
106  
  
107  
  void updateBtnMax {
108  
    if (!isShowing(btnMax)) ret;
109  
    grabWindowState();
110  
    setText(btnMax, maximized ? "NORM" : "MAX");
111  
  }
112  
  
113  
  JComponent makeWindowBorderAndTitle(JComponent contents, S title) {
114  
    //ret jCenteredSection_fontSizePlus(10, title, vis);
115  
    
116  
    var icons = jline();
117  
    if (host.allowFrameMaximization) {
118  
      icons.add(btnMax = jbutton("", rThread {
119  
        maximizeOrRestoreFrame(window);
120  
        updateBtnMax();
121  
      }));
122  
      onFirstShowing(btnMax, r updateBtnMax);
123  
    }
124  
    
125  
    icons.add(toolTip("Minimize this window", jbutton("MIN", r minimize)));
126  
    
127  
    if (isMain())
128  
      icons.add(toolTip("Exit Gazelle", jbutton("QUIT", rThread {
129  
        if (swingConfirm(window, "Really quit Gazelle?"))
130  
          deleteMe();
131  
      })));
132  
    else
133  
      icons.add(toolTip("Close this window", jbutton("X", rThread deleteMe)));
134  
      
135  
    //setHorizontalMarginForAllButtons(icons, 4);
136  
    icons.add(jPopDownButton_noText(flattenToList(
137  
              
138  
      // always on top
139  
      
140  
      jCheckBoxMenuItem_dyn("Always on top",
141  
        -> alwaysOnTop,
142  
        alwaysOnTop -> setAlwaysOnTop(alwaysOnTop)),
143  
        
144  
      // restart + update
145  
      
146  
      "---",
147  
      "Restart", rThread { host.restart() },
148  
      "Update Gazelle", rThread { host.upgradeGazelle() },
149  
      !isMain() ? null : jCheckBoxMenuItem_dyn("Auto-Update",
150  
        -> autoUpdate,
151  
        b -> cset(Stem.this, autoUpdate := b)),
152  
153  
      // debugging + screenshooting gazelle
154  
      
155  
      "---",
156  
      !isMain() ? null : ll(
157  
        "Screenshoot this window", rThread shootWindow,
158  
        "Dump threads", rThread { showText("User threads", renderUserThreadsWithStackTraces()); },
159  
        !isMain() ? null : "Log", !isMain() ? null : r { host.showPrintLog() },
160  
        !isMain() ? null : "Copy log to clipboard", !isMain() ? null : rThread {
161  
          copyToClipboard(printLog());
162  
          infoBox("Copied log to clipboard");
163  
        },
164  
      ),
165  
      
166  
      ccallOpt(module, "popDownItems")
167  
    )));
168  
    
169  
    JComponent actualTitle = titleComponent = fontSizePlus(7, jCenteredLabel(title));
170  
    installWindowDragger(actualTitle);
171  
    
172  
    if (/*isMain() &&*/ haveMuricaPassword())
173  
      actualTitle = centerAndEastWithMargin(actualTitle,
174  
        jline(
175  
          compileButton = makeCompileButton(),
176  
          jLiveValueLabel(host.lvComputerCount())
177  
        ));
178  
    
179  
    var spacer = gazelle_wavySpacer();
180  
    var titleBarMain = setOpaqueBackground(host.color1,
181  
      jtransparent_recursive(westCenterAndEastWithMargin(
182  
        jImage_scaledToHeight(24, host.trayIconImageID),
183  
        actualTitle,
184  
        setOpaqueBackground(host.color2, spacer)));
185  
    
186  
    installWindowDragger(spacer);
187  
    
188  
    var titleBar = setBackground(host.color2, centerAndEast(
189  
      titleBarMain,
190  
      icons));
191  
    
192  
    var border =
193  
      // createBevelBorder();
194  
      BorderFactory.createLineBorder(host.color1, host.borderSize);
195  
      
196  
    var outerPanel = withBorder(border,
197  
      northAndCenter(titleBar, contents));
198  
      
199  
    installWindowResizeDraggerOnBorder(outerPanel);
200  
    ret outerPanel;
201  
  }
202  
  
203  
  JButton makeCompileButton() {
204  
    var gears = resizeImageIcon(imageIcon(#1103061), 16);
205  
206  
    var btn = jimageButtonScaledToWidth(16, #1101268, "Compile & update",
207  
      rThread { host.compile() });
208  
    //enableComponentAccordingToVar(host.compileButtonEnabled, btn);
209  
    
210  
    componentPopupMenuItem(btn, "Compile main library", rThread { host.compileUtils() });
211  
    
212  
    ret btn;
213  
  }
214  
  
215  
  void startAndShow() {
216  
    module._host = this;
217  
    setOpt_raw(module, +threadPool); // only if the field exists
218  
    setOpt_raw(module, concepts := host.concepts);
219  
    setOpt_raw(module, g22utils := host.g22utils);
220  
    copyLocalLog(module, mc());
221  
  
222  
    var vis, title = unpair makeVisAndTitle();
223  
    printWithMS("Show frame");
224  
225  
    JFrame frame = makeUndecoratedFrame(title, vis);
226  
    setFrameIcon(frame, host.trayIconImageID);
227  
    setWindow(frame);
228  
    
229  
    frame.addPropertyChangeListener("title", evt ->
230  
      setText(titleComponent, frame.getTitle()));
231  
    
232  
    if (minimized) minimize();
233  
    onWindowDeiconified(frame, -> cset(this, minimized := false));
234  
    
235  
    showWindow(window);
236  
    if (maximized && host.allowFrameMaximization) maximizeFrame(window);
237  
  }
238  
  
239  
  Pair<JComponent, S> makeVisAndTitle() {
240  
    JComponent vis;
241  
    {
242  
      printWithMS("Starting " + module);
243  
      temp module.enter();
244  
      module.start();
245  
    
246  
      printWithMS("Visualize");
247  
      vis = swing(-> {
248  
        temp module.enter();
249  
        ret module.visualize();
250  
      });
251  
    }
252  
    
253  
    S title = host.windowTitle;
254  
    if (!isMain())
255  
      // title += appendWithColon(module.moduleName());
256  
      title = unnull(module.moduleName());
257  
    vis = makeWindowBorderAndTitle(vis, title);
258  
    ret pair(vis, title);
259  
  }
260  
  
261  
  void revisualize {
262  
    if (window == null) ret;
263  
    
264  
    pcall {
265  
      module.unvisualize();
266  
    }
267  
    
268  
    var vis, title = unpair makeVisAndTitle();
269  
    setFrameContents(window, vis);
270  
  }
271  
  
272  
  void shootWindow {
273  
    var img = renderComponentToImage(window);
274  
    copyImageToClipboard(img);
275  
    saveInImageDirectoryWithCounter(gazelle22_imagesSubDirName() + "/Gazelle", img);
276  
  }
277  
} // end of Stem
278  
279  
// This replaces the Stefan's OS main class. It is not persisted
280  
transient sclass GazelleHost is G22MasterStuff {
281  
  Stem stem;
282  
  DynModule gazelle;
283  
  
284  
  transient S windowTitle = "November Gazelle v1";
285  
  transient S trayIconImageID = #1103047;
286  
  transient int borderSize = 5;
287  
  transient Color color1 = awtColor("ADD8E6");
288  
  transient Color color2 = awtColor("EEEEEE");
289  
  transient Color color3 = awtColor("A3C0AA");
290  
  transient IF0<DynModule> moduleMaker;
291  
  transient ThreadPool threadPool;
292  
  
293  
  transient TrayIcon trayIcon;
294  
  transient TrayIconLastPosition trayIconLastPosition;
295  
  
296  
  transient Set<S> argsSet;
297  
  transient bool incrementalDownloads = true;
298  
  
299  
  transient Concepts concepts;
300  
  
301  
  // This caused problems, disabled for now
302  
  transient bool allowFrameMaximization;
303  
  
304  
  transient StefansOS_ConnectToServer serverConnector;
305  
  transient ComputerCountListener computerCount;
306  
  
307  
  transient Q systemQ = startQ("System Q");
308  
  
309  
  //transient BoolVarWithNotify compileButtonEnabled = new(true);
310  
  
311  
  transient new G22Utils g22utils;
312  
  
313  
  transient MapSO importedFieldsForMainStem;
314  
  
315  
  *(ThreadPool *threadPool, IF0<DynModule> *moduleMaker) {}
316  
317  
  void trayIconLeftClick {
318  
    activateFrame_v3(mainWindow());
319  
  }
320  
  
321  
  void makeTrayIcon {
322  
    pcall-short {
323  
      trayIcon_imageAutoSize = false;
324  
      trayIcon = installTrayIcon(trayIconImageID, windowTitle,
325  
        r trayIconLeftClick,
326  
        "Show Gazelle", r trayIconLeftClick,
327  
        "Exit Gazelle", r cleanExit
328  
      );
329  
      trayIconLastPosition = new TrayIconLastPosition(trayIcon);
330  
    }
331  
  }
332  
  
333  
  void run(S[] args) {
334  
    try {
335  
      run2(args);
336  
    } catch print e {
337  
      //messageBox(e);
338  
      hideTrayIcon(trayIcon);
339  
      onWindowClosing(-> systemExit(1), getWindow(
340  
        showText_fast_noWrap("Gazelle Error", renderStackTrace(e))));
341  
      //AutoVMExit.install();
342  
    }
343  
  }
344  
  
345  
  void run2(S[] args) {
346  
    argsSet = asSet(args);
347  
    
348  
    if (!argsSet.contains("noflatlaf"))
349  
      com.formdev.flatlaf.FlatLightLaf.setup();
350  
    
351  
    if (contains(args, "profile"))
352  
      profileToConsole(() -> actualMain(args));
353  
    else
354  
      actualMain(args);
355  
      
356  
    if (argsSet.contains("brexit")) System.exit(0);
357  
  }
358  
  
359  
  void actualMain(S... args) {
360  
    vm_generalMap_put(stefansOS := this);
361  
    
362  
    System.out.println(hmsWithColonsAndMS() + ": Init");
363  
    //x30.coreInit();
364  
    
365  
    // Ready to roll
366  
    
367  
    printJavaVersion();
368  
    
369  
    if (contains(argsSet, "profile"))
370  
      doEvery(1.0, r printRunningThreads);
371  
    
372  
    if (containsOneOf(argsSet, "upgrade", "update"))
373  
      ret with upgradeGazelle();
374  
      
375  
    g22utils.masterStuff = this;
376  
  
377  
    makeTrayIcon();
378  
    
379  
    initAutoUpdate();
380  
    
381  
    IF1<S, Class> classFinder = makeClassFinder();
382  
    
383  
    // Start DB
384  
    
385  
    S dbName = g22utils.dbToOpen();
386  
    File conceptsFile = newFile(newFile(g22utils.databasesMotherDir(), dbName), conceptsFileName());
387  
    concepts = newConceptsWithClassFinder(conceptsFile, classFinder);
388  
    startDBAndModules();
389  
  }
390  
  
391  
  void startDBAndModules {
392  
    concepts.makeStructureData = -> {
393  
      structure_Data data = concepts.makeStructureData_base();
394  
      data.mcDollar = mcDollar();
395  
      ret data;
396  
    };
397  
    try {
398  
      concepts.fileLock().lockOrFail();
399  
    } catch print e {
400  
      if (cic(str(e), "Couldn't aquire lock")) {
401  
        infoBox("Gazelle is still running, please exit it first!", 10.0);
402  
        sleepSeconds(10);
403  
        System.exit(1);
404  
      }
405  
      
406  
    }
407  
    concepts.fileLock().deleteOnExit();
408  
    concepts.persist();
409  
    
410  
    //db_setMainConcepts(concepts);
411  
    
412  
    //print("Concepts loaded: " + map className(allConcepts(concepts));
413  
    
414  
    var stems = findConcepts(concepts, Stem);
415  
    print("Stems in DB: " + l(stems));
416  
    stem = first(stems);
417  
    if (stem == null) {
418  
      print("Starting new module");
419  
      makeModule();
420  
      stem = registerConcept(concepts, new Stem(this, gazelle));
421  
    }
422  
    gazelle = stem.module;
423  
    
424  
    print(+importedFieldsForMainStem);
425  
    csetAll(stem, importedFieldsForMainStem);
426  
    importedFieldsForMainStem = null;
427  
428  
    for (stem : list Stem(concepts)) {
429  
      stem.host = this;
430  
      stem.startAndShow();
431  
    }
432  
    
433  
    printWithMS("Dudadoneski");
434  
  }
435  
  
436  
  void showPrintLog {
437  
    systemQ.add(-> {
438  
      var logModule = firstThat(list(concepts, Stem),
439  
        stem -> stem.module instanceof PrintLogModule);
440  
      if (logModule != null)
441  
        logModule.activateWindow();
442  
      else
443  
        registerConcept(concepts, new Stem(this, new PrintLogModule)).startAndShow();
444  
    });
445  
  }
446  
  
447  
  JFrame mainWindow() {
448  
    ret stem?.window;
449  
  }
450  
  
451  
  O dm_getStem(O moduleOrID) {
452  
    ret stem;
453  
  }
454  
  
455  
  O resolveModule(O moduleOrID) { ret moduleOrID == stem ? gazelle : moduleOrID; }
456  
  
457  
  void cleanExit {
458  
    // e.g. JPaintTool does clean-up when removed (through bindToComponent)
459  
    /*print("Removing all components");
460  
    for (window : allWindows())
461  
      setWindowContents(window, jcenteredlabel("Exiting..."));*/
462  
    
463  
    print("Saving DB for exit");
464  
    dispose concepts;
465  
    System.exit(0);
466  
  }
467  
  
468  
  File myJar() { ret getBytecodePathForClass(this); }
469  
  
470  
  AutoCloseable tempDisableCompileButtons() {
471  
    ret tempDisableButtons(compileButtons());
472  
  }
473  
  
474  
  void upgradeGazelle {
475  
    try {
476  
      printAlsoToSystemOut = true;
477  
      
478  
      // Show an infoBox to make sure the code for infoBox is loaded
479  
      temp tempInfoBox("Updating Gazelle...");
480  
      
481  
      //temp tempSetBoolVar(compileButtonEnabled, false);
482  
      temp tempDisableCompileButtons();
483  
      for (f : allJFrames()) setFrameTitle(f, "Updating...");
484  
      
485  
      File myJar = myJar();
486  
      print(+myJar);
487  
      
488  
      S existingFilesComp = !incrementalDownloads ? null
489  
        : existingFilesInfo();
490  
      
491  
      S date = ymdMinusHMS();
492  
      File f = javaxCodeDir("Downloaded Updates/" + "gazelle-" + date + ".jar");
493  
      temp progress = tempProgressBar_addToWindowIfPossible(mainWindow(), "Updating Gazelle");
494  
495  
      progress.setText("Downloading Update...");
496  
      time "Downloading zip" {
497  
        postBinaryPageToFile(downloadURL(), f, +existingFilesComp);
498  
      }
499  
      printFileInfo(f);
500  
      if (!isNonEmptySingleZip_byMagicHeader(f))
501  
        ret with infoBox("Bad file downloaded... :(");
502  
        
503  
      bool replaced;
504  
      if (isFile(myJar)) {
505  
        // load all my classes to be sure (TODO: could do this in parallel to downloading)
506  
        //print("Loaded " + nClasses(loadAllClassesInByteCodePath(myJar)));
507  
        
508  
        progress.setText("Replacing with new version: " + renderFileInfo(myJar));
509  
        File myJarSaved = fileInSubDir("old-code",
510  
          appendToBaseName(myJar, ".bak." + date));
511  
        File myJarNew = appendToFileName(myJar, ".new");
512  
          
513  
        Set<S> toKeep = asSet(tlft(loadTextFileFromZip(f, "to-keep")));
514  
        if (nempty(toKeep)) {
515  
          progress.setText("Keeping " + nFiles(toKeep));
516  
          int have = countFilesInZip(myJar);
517  
          if (l(toKeep) == have && countFilesInZip(f) == 1) {
518  
            infoBox("Nothing to update - will just restart");
519  
            deleteFile(myJarNew);
520  
            sleepSeconds(1);
521  
            restart();
522  
          }
523  
          
524  
          /*
525  
          temp ZipOutputStream out = zipOutputStream(myJar);
526  
          zip2zip_withPredicate(myJarSaved, out, name -> toKeep.contains(name));
527  
          progress.setText("Adding new files");
528  
          int n = zip2zip_withPredicate(f, out, name -> !eq(name, "to-keep"));
529  
          progress.setText("Added " + nFiles(n));
530  
          */
531  
          
532  
          temp Zip4j_MergeZipFilesWithFilter merger = new(myJarNew);
533  
          merger.addZipFile(myJar, name -> contains(toKeep, name));
534  
          merger.addZipFile(f, name -> !eq(name, "to-keep"));
535  
          merger.finish();
536  
        } else
537  
          myJarNew = f;
538  
539  
        if (isWindows()) {
540  
          copyFileVerbose(myJar, myJarSaved);
541  
          copyFileVerbose(myJarNew, myJar);
542  
          deleteFileVerbose_assertSuccess(myJarNew);
543  
        } else {
544  
          renameFileVerbose_assertSuccess(myJar, myJarSaved);
545  
          renameFileVerbose_assertSuccess(myJarNew, myJar);
546  
        }
547  
548  
        printFileInfo(myJar);
549  
        set replaced;
550  
      }
551  
        
552  
      progress.setText("Done");
553  
      
554  
      if (replaced)
555  
        infoBox("Installed update, replaced " + f2s(myJar) + " - now starting");
556  
      else
557  
        infoBox("Updated but could not replace originally downloaded jar");
558  
        
559  
      restart(replaced ? myJar : f);
560  
    } on fail e { printStackTrace(e); }
561  
  }
562  
  
563  
  void restart(File jar default myJar()) {
564  
    S javaCmd = or2(currentProcessCommand(), "java");
565  
    S cmd = pqO(javaCmd) + " -jar " + pqO(jar);
566  
    print(cmd);
567  
    nohup(cmd);
568  
    cleanExit();
569  
  }
570  
  
571  
  void makeModule() {
572  
    if (gazelle == null)
573  
      gazelle = callF(moduleMaker);
574  
  }
575  
  
576  
  void reloadModuleInBackground(Stem mod) {
577  
    restart();
578  
  }
579  
580  
  void initAutoUpdate {  
581  
    print("Making server connection for updates.");
582  
    serverConnector = snippetUpdateConnector(/*verbose := true*/);
583  
    //serverConnector.verbose = true;
584  
    
585  
    vmBus_onMessage snippetUpdate(voidfunc(L l) {
586  
      S uri = getString(l, 1);
587  
      new Matches m;
588  
      if (swic(uri, "/transpileOK/", m))
589  
        if (sameSnippetID(programID(), firstIntAsString(m.rest()))) {
590  
          if (stem.autoUpdate /*&& autoUpdateDisabled*/)
591  
            upgradeGazelle();
592  
          //infoBox("Gazelle can be updated!");
593  
        }
594  
    });
595  
    
596  
    pcall {
597  
      computerCount = new ComputerCountListener(serverConnector);
598  
      computerCount.init();
599  
    }
600  
  }
601  
  
602  
  S downloadURL() {
603  
    ret "https://botcompany.de/jar/" 
604  
      + psI(programID()) + "?withLibs=1&withX30=1"
605  
      + "&mainClassForManifest=Starter"
606  
      + (!downloadJarWithSrc() ? "&noSrc=1" : "")
607  
      + (downloadUncompressedJAR() ? "&uncompressed=1" : "");
608  
  }
609  
  
610  
  bool downloadJarWithSrc() { false; }
611  
  bool downloadUncompressedJAR() { false; }
612  
  
613  
  // called by DynModule
614  
  void revisualizeModule(Stem stem) {
615  
    stem.revisualize();
616  
  }
617  
  
618  
  Int computerCount() { ret computerCount == null ? (Int) 0 : computerCount!; }
619  
  LiveValue<Int> lvComputerCount() { ret computerCount.liveValue(); }
620  
  
621  
  L<JButton> compileButtons() { ret mapNonNulls(list(Stem), s -> s.compileButton()); }
622  
  
623  
  // compile main program
624  
  void compile {
625  
    compile(programID, null);
626  
  }
627  
  
628  
  void compileUtils {
629  
    compile(utilsSnippetID(), l0 compile);
630  
  }
631  
  
632  
  void compile(S snippetID, Runnable onSuccess) {
633  
    print("Compiling " + snippetID);
634  
    
635  
    var gears = resizeImageIcon(imageIcon(#1103061), 16);
636  
    
637  
    temp tempDisableCompileButtons();
638  
    temp tempSetButtonImages(compileButtons(), gears);
639  
    
640  
    thread { existingFilesInfo(); } // precompute
641  
          
642  
    transpileOnServerWithErrorWindow(snippetID, true, onSuccess);
643  
    
644  
    print("Done transpilation of " + snippetID);
645  
  }
646  
  
647  
  public void switchDatabase(File conceptsDir) {
648  
    printAlsoToSystemOut = true;
649  
    
650  
    temp tempInfoBoxNoHide("Switching database...");
651  
    
652  
    // copy some things that should really be global
653  
    // like auto-update flag and main window position
654  
    
655  
    importedFieldsForMainStem = cgetAll(stem, stem.fieldsToShareBetweenDatabases());
656  
    print(+importedFieldsForMainStem);
657  
    
658  
    File newConceptsFile = newFile(conceptsDir, conceptsFileName());
659  
    if (!fileExists(newConceptsFile))
660  
      fail(infoBox("Database not found: " + newConceptsFile));
661  
      
662  
    print("Cleaning up concepts");
663  
    
664  
    for (Concept c : allConcepts(concepts))
665  
      cleanUp(c);
666  
      
667  
    print("Releasing DB");
668  
    gazelle = null;
669  
    dispose concepts;
670  
671  
    //print("Safety sleep (1s)");
672  
    //sleepSeconds(1);
673  
    
674  
    var classFinder = makeClassFinder();
675  
    
676  
    print("Loading new DB: " + f2s(newConceptsFile));
677  
    concepts = newConceptsWithClassFinder(newConceptsFile, classFinder);
678  
    startDBAndModules();
679  
    
680  
    g22utils.openedDB(conceptsDir);
681  
    
682  
    print("Database switch complete, stopping System.out");
683  
    printAlsoToSystemOut = false;
684  
  }
685  
686  
  IF1<S, Class> makeClassFinder() {  
687  
    IF1<S, Class> defaultClassFinder = toIF1(_defaultClassFinder());
688  
    IF1<S, Class> classFinder = name -> {
689  
      // class migration
690  
      if (eq(name, "main$G22RecognizerScript")) {
691  
        S newName = "main$G22Analyzer";
692  
        print("Migrating legacy class " + name + " to " + newName);
693  
        name = newName;
694  
      }
695  
      ret defaultClassFinder.get(name);
696  
    };
697  
    
698  
    // Test classFinder sanity
699  
    
700  
    assertEquals(callF(classFinder, "main$Stem"), Stem.class);
701  
    
702  
    ret classFinder;
703  
  }
704  
  
705  
  transient cached S existingFilesInfo() {
706  
    L<Map> fingerprints =  zipFileToJSONFingerprint_md5(myJar());
707  
    S s = base64encode(gzipString(jsonEncode(fingerprints)));
708  
    print(existingFilesInfo := nBytes(l(s)));
709  
    ret s;
710  
  }
711  
} // end of GazelleHost

Author comment

Began life as a copy of #1033891

download  show line numbers  debug dex  old transpilations   

Travelled to 2 computer(s): bhatertpkbcr, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1034637
Snippet name: GazelleHost + Stem [backup before multiple databases]
Eternal ID of this version: #1034637/1
Text MD5: 37065f8a6fb74a1468991d51fdaaedf5
Author: stefan
Category: javax / gazelle v
Type: JavaX (incomplete)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-02-25 21:24:49
Source code size: 20888 bytes / 711 lines
Pitched / IR pitched: No / No
Views / Downloads: 156 / 171
Referenced in: [show references]