All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.micromata.mgc.javafx.logging.LoggingController Maven / Gradle / Ivy

There is a newer version: 3.1.3
Show newest version
//
// Copyright (C) 2010-2016 Micromata GmbH
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

package de.micromata.mgc.javafx.logging;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.ResourceBundle;

import org.apache.commons.io.IOUtils;
import org.w3c.dom.Document;

import de.micromata.genome.logging.GLog;
import de.micromata.genome.logging.LogExceptionAttribute;
import de.micromata.genome.logging.LogWriteEntry;
import de.micromata.genome.logging.LoggingServiceManager;
import de.micromata.genome.logging.events.LoggingEventListenerRegistryService;
import de.micromata.genome.logging.loghtmlwindow.LogHtmlWindowServlet;
import de.micromata.genome.util.runtime.RuntimeIOException;
import de.micromata.genome.util.validation.ValMessage;
import de.micromata.genome.util.validation.ValState;
import de.micromata.mgc.javafx.launcher.MgcLauncher;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import netscape.javascript.JSObject;

/**
 * Logging for GLog.
 * 
 * @author Roger Rene Kommer ([email protected])
 *
 */
public class LoggingController implements Initializable
{
  private static LoggingController INSTANCE = null;

  @FXML
  private WebView htmlView;

  /**
   * The queue.
   */

  LoggingLogViewAdapter loggingAdapter = new LoggingLogViewAdapter();

  public static LoggingController getInstance()
  {
    return INSTANCE;
  }

  public LoggingController()
  {

  }

  @Override
  public void initialize(URL location, ResourceBundle resources)
  {

    WebEngine engine = htmlView.getEngine();
    engine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
      if (newState == javafx.concurrent.Worker.State.SUCCEEDED) {
        Document doc = engine.getDocument();
        //        if (guiWriteBuffer.isEmpty() == false) {
        //          List copy = new ArrayList<>(guiWriteBuffer);
        //          guiWriteBuffer.clear();
        //          addToGuiInGui(copy);
        //        }
      }
    });
    engine.setJavaScriptEnabled(true);

    StringBuilder html = new StringBuilder();

    String init = "  var logCounter = 0; \r\n" +
        "var loggingAdapter;\n" +
        "function ALogCallback(callback) { \n"
        + " this.callback = callback;\n"
        + " this.doCallback = function(entries) {this.callback(entries); }\n"
        + "};" +
        "function LogConsoleBackend(logViewer) {\r\n" +
        "  this.supportsPoll = false;\r\n" +
        "  this.supportsSearch = false;\r\n" +
        "  this.init = function(logViewer) {\r\n" +
        "  this.logViewer = logViewer;\n" +
        "   loggingAdapter.init(this);\n" +
        "  }\r\n" +
        "  this.logPoll = function(lastTime, callback) {\r\n" +
        "    loggingAdapter.logPoll(lastTime, new ALogCallback(callback));\r\n" +
        "  }\r\n" +
        "  this.getLoggingConfiguration = function() {\n" +
        "    return loggingAdapter.getLoggingConfiguration();\n" +
        "  };" +
        "  this.logSelect = function(logFormData, callback) {\r\n" +
        "    //console.debug('LogConsoleBackend.logSelect');\n" +
        "    loggingAdapter.logSelect(logFormData, new ALogCallback(callback));\n" +
        "  };\n" +
        "  this.logSelectAttributes = function(logId, callback) {\n" +
        "    loggingAdapter.logSelectAttributes(logId, new ALogCallback(callback));\n" +
        "  }\n" +
        "}" +
        "  function logProvider() {\r\n" +
        "    var item = {\r\n" +
        "      logTime : '2006-01-01 12:12',\r\n" +
        "      logLevel : 'Note',\r\n" +
        "      logMessage : 'Hello ' + ++logCounter,\r\n" +
        "      logAttributes : [ {\r\n" +
        "        typeName : \"AKey\",\r\n" +
        "        value : 'A value'\r\n" +
        "      }, {\r\n" +
        "        typeName : \"BKey\",\r\n" +
        "        value : 'B value'\r\n" +
        "      } ]\r\n" +
        "    };\r\n" +
        "    return [ item ];\r\n" +
        "  }\r\n" +

        "var logViewer = new GLogViewer({\r\n" +
        "    logListId : 'glogentries',\r\n" +
        "    formId : 'glogform',\r\n" +
        "    maxItems: 100,\r\n" +
        "    logPollTimeout: 1000,\r\n" +
        "    enableEmbeddedDebugger: false\n" +
        "\r\n" +
        "  });\n" +
        "window.logViewer = logViewer;\n";

    html.append("").append(getHtmlHeader())

        .append("\n\n")
        .append("").append("\r\n");
    html.append(LogHtmlWindowServlet.getGLogHtmlForm());
    html.append("");

    engine.loadContent(html.toString());
    engine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
      try {

        JSObject window = (JSObject) engine.executeScript("window");
        window.setMember("loggingAdapter", loggingAdapter);

        engine.executeScript("console.debug = function(message){ loggingAdapter.jsdebug(message); };\n" +
            "console.warn = function(message){ loggingAdapter.jswarn(message); };\n" +
            "console.error = function(message){ loggingAdapter.jserror(message); }; console.debug('console redirect initialized');\n");
        //        JSObject logViewer = (JSObject) engine.executeScript("logViewer");
        //        logViewer.call("setBackend", loggingAdapter);
        engine.executeScript("logViewer.setBackend(new LogConsoleBackend());");
      } catch (RuntimeException ex) {
        ex.printStackTrace();
      }

    });
    INSTANCE = this;
    LoggingEventListenerRegistryService listenerRegisterService = LoggingServiceManager.get()
        .getLoggingEventListenerRegistryService();

    listenerRegisterService.registerListener(FxLogconsoleLogWriteEntryEventListener.class);
    listenerRegisterService.registerListener(FxLogconsoleLogRegisteredCategoryChangedEventListener.class);
    listenerRegisterService.registerListener(FxLogconsoleLogRegisteredLogAttributesChangedEventListener.class);
  }

  String loadCpResource(String name)
  {
    try (InputStream is = getClass().getResourceAsStream(name)) {
      return IOUtils.toString(is, Charset.defaultCharset());
    } catch (IOException ex) {
      throw new RuntimeIOException(ex);
    }
  }

  protected String getHtmlHeader()
  {
    StringBuilder sb = new StringBuilder();
    try (InputStream is = LoggingController.class.getResourceAsStream("/loggingweb.css")) {
      String css = IOUtils.toString(is, Charset.defaultCharset());
      sb.append("\n\n");
    } catch (IOException ex) {
      throw new RuntimeIOException(ex);
    }
    sb.append("\n\n");
    //    String url = getClass().getResource("/js/hello.js").toString();
    //    sb.append("\n");

    return sb.toString();
  }

  public void error(String message, Exception ex)
  {
    doLog(new ValMessage(ValState.Error, message, ex));
  }

  public void error(String message)
  {
    doLog(new ValMessage(ValState.Error, message));
  }

  public void warn(String message)
  {
    doLog(new ValMessage(ValState.Warning, message));

  }

  public void info(String message)
  {
    doLog(new ValMessage(ValState.Info, message));

  }

  public void doLog(ValMessage item)
  {
    LogWriteEntry lwe = new LogWriteEntry();
    lwe.setCategory("Launcher");
    lwe.setAttributes(new ArrayList<>());
    lwe.setLevel(GLog.valStateToLogLevel(item.getValState()));
    String message = item.getTranslatedMessage(MgcLauncher.get().getApplication().getTranslateService());
    lwe.setMessage(message);
    if (item.getException() != null) {
      lwe.getAttributes().add(new LogExceptionAttribute(item.getException()));
    }
    lwe.setTimestamp(System.currentTimeMillis());
    doLogImpl(lwe);
  }

  private String getLogClass(LogWriteEntry lwe)
  {
    switch (lwe.getLevel()) {
      case Fatal:
      case Error:
        return " leerror";
      case Warn:
        return " lewarn";
      default:
        return "";
    }
  }

  public void doLogImpl(LogWriteEntry lwe)
  {
    if (lwe.getTimestamp() == 0) {
      lwe.setTimestamp(System.currentTimeMillis());
    }
    loggingAdapter.addLogEntry(lwe);
  }

  public void adjustWidth(double with)
  {
    double oldWidth = htmlView.getWidth();

    htmlView.setPrefWidth(with - 5);
  }

  public void adjustHeight(double heigth)
  {
    htmlView.setPrefHeight(heigth - 5);
  }

  public void refreshLogConfiguration()
  {
    loggingAdapter.refreshLogConfiguration();
    Platform.runLater(() -> {
      WebEngine engine = htmlView.getEngine();
      engine.executeScript("logViewer.refreshForm();");
    });

  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy