From 4cf3ca93d6e26c7434259fcf38b4d9db3c681a6f Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Sat, 24 Sep 2016 00:30:33 +0300 Subject: [PATCH] Changing existing log4j logging to use slf4j Removed org.simantics.utils.logging.{Logger,LogManager}. Anybody using those should just switch to using slf4j. Removed their use from org.simantics.spreadsheet.graph. Also changed org.simantics.utils.FileUtils to use slf4j instead of log4j. Also added .keep to org.simantics.logback.configuration/src folder to help it compile properly. refs #6705 Change-Id: Ib6d78ee964e0a05aedb332167456aee4eea2a4d7 Signed-off-by: Tuukka Lehtonen --- .../META-INF/MANIFEST.MF | 4 +- .../src/.keep | 0 .../META-INF/MANIFEST.MF | 1 - .../spreadsheet/common/logging/Logger.java | 43 ----- .../META-INF/MANIFEST.MF | 3 +- .../spreadsheet/graph/CellValue.java | 15 +- .../simantics/spreadsheet/graph/GraphUI.java | 27 ++-- .../graph.tg | Bin 16548 -> 16546 bytes .../org.simantics.utils/META-INF/MANIFEST.MF | 4 +- .../src/org/simantics/utils/FileUtils.java | 30 ++-- .../simantics/utils/logging/LogManager.java | 151 ------------------ .../org/simantics/utils/logging/Logger.java | 108 ------------- .../META-INF/MANIFEST.MF | 4 +- bundles/org.simantics/META-INF/MANIFEST.MF | 4 +- 14 files changed, 50 insertions(+), 344 deletions(-) create mode 100644 bundles/org.simantics.logback.configuration/src/.keep delete mode 100644 bundles/org.simantics.spreadsheet.common/src/org/simantics/spreadsheet/common/logging/Logger.java delete mode 100644 bundles/org.simantics.utils/src/org/simantics/utils/logging/LogManager.java delete mode 100644 bundles/org.simantics.utils/src/org/simantics/utils/logging/Logger.java diff --git a/bundles/org.simantics.logback.configuration/META-INF/MANIFEST.MF b/bundles/org.simantics.logback.configuration/META-INF/MANIFEST.MF index 504d772e2..ae85b8ace 100644 --- a/bundles/org.simantics.logback.configuration/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.logback.configuration/META-INF/MANIFEST.MF @@ -1,7 +1,9 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 -Bundle-Name: Configuration +Bundle-Name: Simantics Logback Configuration Bundle-SymbolicName: org.simantics.logback.configuration Bundle-Version: 1.0.0.qualifier Fragment-Host: ch.qos.logback.classic;bundle-version="1.1.7" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: ch.qos.logback.core;bundle-version="1.1.7" +Bundle-Vendor: Semantum Oy diff --git a/bundles/org.simantics.logback.configuration/src/.keep b/bundles/org.simantics.logback.configuration/src/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/bundles/org.simantics.spreadsheet.common/META-INF/MANIFEST.MF b/bundles/org.simantics.spreadsheet.common/META-INF/MANIFEST.MF index f76f025c3..ff08ff65d 100644 --- a/bundles/org.simantics.spreadsheet.common/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.spreadsheet.common/META-INF/MANIFEST.MF @@ -23,7 +23,6 @@ Export-Package: org.simantics.spreadsheet.common, org.simantics.spreadsheet.common.expression.lexer, org.simantics.spreadsheet.common.expression.node, org.simantics.spreadsheet.common.expression.parser, - org.simantics.spreadsheet.common.logging, org.simantics.spreadsheet.common.matrix, org.simantics.spreadsheet.util Bundle-Vendor: VTT Technical Research Centre of Finland diff --git a/bundles/org.simantics.spreadsheet.common/src/org/simantics/spreadsheet/common/logging/Logger.java b/bundles/org.simantics.spreadsheet.common/src/org/simantics/spreadsheet/common/logging/Logger.java deleted file mode 100644 index 87cbaa141..000000000 --- a/bundles/org.simantics.spreadsheet.common/src/org/simantics/spreadsheet/common/logging/Logger.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management - * in Industry THTH ry. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.spreadsheet.common.logging; - -import org.simantics.spreadsheet.common.Activator; -import org.simantics.utils.logging.LogManager; - -public class Logger extends org.simantics.utils.logging.Logger { - - private static final Logger INSTANCE = new Logger(); - - Logger() { - super(new LogManager( - defaultProperties("log4j.appender.default.File", "spreadsheet.log", - "log4j.appender.default.append", "true", - "log4j.appender.default.layout", "org.apache.log4j.PatternLayout", - "log4j.appender.default.layout.ConversionPattern", "%d{ISO8601} %-6r [%15.15t] %-5p %30.30c - %m%n", - "log4j.appender.default.File", Activator.LOG_FILE_NAME - )).getLogger(LogManager.class)); - } - - public static void defaultLogError(String message, Throwable exception) { - INSTANCE.logError(message, exception); - } - - public static void defaultLogError(Throwable exception) { - INSTANCE.logError("Unexpected exception", exception); - } - - public static void defaultLogWarning(String message, Throwable exception) { - INSTANCE.logWarning(message, exception); - } - -} diff --git a/bundles/org.simantics.spreadsheet.graph/META-INF/MANIFEST.MF b/bundles/org.simantics.spreadsheet.graph/META-INF/MANIFEST.MF index a5eef2fb2..a61255e1c 100644 --- a/bundles/org.simantics.spreadsheet.graph/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.spreadsheet.graph/META-INF/MANIFEST.MF @@ -30,7 +30,8 @@ Require-Bundle: org.simantics.layer0.utils, org.simantics.modeling;bundle-version="1.1.1", org.eclipse.e4.core.contexts, org.eclipse.e4.ui.di, - org.simantics.browsing.ui.swt + org.simantics.browsing.ui.swt, + org.slf4j.api;bundle-version="1.7.20" Export-Package: org.apache.commons.math3.stat.regression, org.simantics.spreadsheet.graph, org.simantics.spreadsheet.graph.adapter, diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/CellValue.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/CellValue.java index 1236f8a3d..990b23f08 100644 --- a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/CellValue.java +++ b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/CellValue.java @@ -8,10 +8,13 @@ import org.simantics.db.ReadGraph; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.request.VariableRead; import org.simantics.db.layer0.variable.Variable; -import org.simantics.spreadsheet.common.logging.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class CellValue extends VariableRead { + private static final Logger LOGGER = LoggerFactory.getLogger(CellValue.class); + public CellValue(Variable variable) { super(variable); } @@ -38,8 +41,9 @@ public class CellValue extends VariableRead { Binding binding = Bindings.getBinding( value2.getClass() ); return new Variant(binding, value2); } catch (BindingConstructionException e) { - Logger.defaultLogError(e); - return Variant.ofInstance("Unsupported content " + value2 + " from " + var.getURI(graph)); + String msg = "Unsupported content " + value2 + " from " + var.getURI(graph); + LOGGER.error(msg, e); + return Variant.ofInstance(msg); } } } @@ -48,8 +52,9 @@ public class CellValue extends VariableRead { Binding binding = Bindings.getBinding( value.getClass() ); return new Variant(binding, value); } catch (BindingConstructionException e) { - Logger.defaultLogError(e); - return Variant.ofInstance("Unsupported content " + value + " at " + variable.getURI(graph)); + String msg = "Unsupported content " + value + " at " + variable.getURI(graph); + LOGGER.error(msg, e); + return Variant.ofInstance(msg); } } } diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/GraphUI.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/GraphUI.java index 9a3e87326..b2fc404f2 100644 --- a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/GraphUI.java +++ b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/GraphUI.java @@ -61,7 +61,6 @@ import org.simantics.spreadsheet.CellEditor; import org.simantics.spreadsheet.ClientModel; import org.simantics.spreadsheet.ClientModel.OperationMode; import org.simantics.spreadsheet.SheetCommands; -import org.simantics.spreadsheet.common.logging.Logger; import org.simantics.spreadsheet.event.model.RemoveCellHandler; import org.simantics.spreadsheet.resource.SpreadsheetResource; import org.simantics.ui.selection.WorkbenchSelectionUtils; @@ -69,6 +68,8 @@ import org.simantics.utils.datastructures.Pair; import org.simantics.utils.strings.AlphanumComparator; import org.simantics.utils.threads.logger.ITask; import org.simantics.utils.threads.logger.ThreadLogger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import gnu.trove.map.hash.THashMap; import gnu.trove.map.hash.TObjectIntHashMap; @@ -102,6 +103,8 @@ class FilteredVariableProperties extends UnaryRead(variable) { + this.cellEditor = processor.sync(new VariableRead>(variable) { @Override - public CellEditor perform(ReadGraph graph) throws DatabaseException { + public CellEditor perform(ReadGraph graph) throws DatabaseException { SpreadsheetResource SHEET = SpreadsheetResource.getInstance(graph); return variable.getPropertyValue(graph, SHEET.cellEditor); } @@ -338,6 +341,8 @@ public class GraphUI implements Adaptable, ListenerSupport, AsyncListenerSupport private static class PropertyListener extends SingleSetSyncListenerDelegate> { + private static final Logger LOGGER = LoggerFactory.getLogger(PropertyListener.class); + private ClientModel client; private String childName; private boolean listenerDisposed; @@ -370,7 +375,7 @@ public class GraphUI implements Adaptable, ListenerSupport, AsyncListenerSupport @Override public void exception(ReadGraph graph, Throwable throwable) throws DatabaseException { - Logger.defaultLogError(throwable); + LOGGER.error("PropertyListener.exception", throwable); String propertyName = property.first; if("content".equals(propertyName)) { @@ -492,7 +497,7 @@ public class GraphUI implements Adaptable, ListenerSupport, AsyncListenerSupport return (T)new CellEditor() { @Override - public void edit(Transaction transaction, String location, String property, T value, Binding binding, Consumer callback) { + public void edit(Transaction transaction, String location, String property, E value, Binding binding, Consumer callback) { if (ClientModel.ITERATION_ENABLED.equals(location)) { Simantics.getSession().asyncRequest(new ReadRequest() { @@ -539,7 +544,7 @@ public class GraphUI implements Adaptable, ListenerSupport, AsyncListenerSupport load(newContext, client); return; } catch (DatabaseException e) { - Logger.defaultLogError(e); + LOGGER.error("edit failed for model key '" + ClientModel.CONTEXT_CURRENT + "'", e); } } } @@ -564,7 +569,7 @@ public class GraphUI implements Adaptable, ListenerSupport, AsyncListenerSupport load(newInput, client); return; } catch (DatabaseException e) { - Logger.defaultLogError(e); + LOGGER.error("edit failed for model key '" + ClientModel.SHEETS_CURRENT + "'", e); } } } @@ -610,7 +615,7 @@ public class GraphUI implements Adaptable, ListenerSupport, AsyncListenerSupport // fullSynchronize(); return; } catch (DatabaseException e) { - Logger.defaultLogError(e); + LOGGER.error("edit failed for model key '" + ClientModel.STATES_CURRENT + "'", e); } } } @@ -664,7 +669,7 @@ public class GraphUI implements Adaptable, ListenerSupport, AsyncListenerSupport } } catch (DatabaseException e) { - Logger.defaultLogError(e); + LOGGER.error("edit failed for model key '" + ClientModel.SOURCES_CURRENT + "'", e); } } return; @@ -796,12 +801,12 @@ public class GraphUI implements Adaptable, ListenerSupport, AsyncListenerSupport @Override public void exception(AsyncReadGraph graph, Throwable t) { - Logger.defaultLogError("Failed to read properties.", t); + LOGGER.error("Failed to read properties.", t); } @Override public void exception(ReadGraph graph, Throwable t) { - Logger.defaultLogError("Failed to read properties.", t); + LOGGER.error("Failed to read properties.", t); } public void dispose() { diff --git a/bundles/org.simantics.structural.ontology/graph.tg b/bundles/org.simantics.structural.ontology/graph.tg index fbe043eabb42745f08acf3d0de55a72a1e04defd..5bfaa39d4da84879f7a224c6845ca07fe50c3c08 100644 GIT binary patch delta 24 fcmZ3|$hfGHaf6N(W7lL|E4|4vRx+C_t+d$yYp@6K delta 28 jcmZ3~$hf4Daf6N(W6xw=D?LWu$false if some or all failed to be deleted */ public static boolean deleteDir(File dir) { - Logger myLogger = Logger.getLogger(FileUtils.class); - myLogger.debug("Deleting directory "+dir); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Deleting directory "+dir); boolean result = true; if (!dir.isDirectory()) return false; @@ -555,8 +558,8 @@ public class FileUtils { } public static String deleteDirs(File dir) { - Logger myLogger = Logger.getLogger(FileUtils.class); - myLogger.debug("Deleting directory "+dir); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Deleting directory "+dir); boolean result = true; if (!dir.isDirectory()) @@ -795,10 +798,8 @@ public class FileUtils { } public static void compressZip(String sourcePath, String zipDir) throws IOException { - Logger myLogger = Logger.getLogger(FileUtils.class); - myLogger.debug("Compressing file " + sourcePath + " to zip " + zipDir + "."); - - System.out.println("Compressing file " + sourcePath + " to zip " + zipDir + "."); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Compressing file " + sourcePath + " to zip " + zipDir + "."); File filesource = new File(sourcePath); URI base = filesource.toURI(); @@ -821,8 +822,7 @@ public class FileUtils { } } } finally { - myLogger.debug("Filecompression done."); - System.out.println("Filecompression done."); + LOGGER.debug("Filecompression done."); } } @@ -840,8 +840,8 @@ public class FileUtils { * @throws IOException */ public static void extractZip(File zipFile, File dst) throws IOException { - Logger myLogger = Logger.getLogger(FileUtils.class); - myLogger.debug("Extracting zip "+zipFile); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Extracting zip "+zipFile); try (FileInputStream fis = new FileInputStream(zipFile)) { extractZip(fis, dst); } @@ -855,7 +855,6 @@ public class FileUtils { * @throws IOException */ public static void extractZip(InputStream zipInput, File dst) throws IOException { - Logger myLogger = Logger.getLogger(FileUtils.class); byte[] buf = new byte[8192]; ZipInputStream zis = new ZipInputStream(zipInput); ZipEntry entry; @@ -864,7 +863,8 @@ public class FileUtils { while (entry != null) { // for each entry to be extracted String name = entry.getName(); - myLogger.debug("Extracting "+name); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Extracting "+name); File file = new File(dst, name); if (entry.isDirectory()) diff --git a/bundles/org.simantics.utils/src/org/simantics/utils/logging/LogManager.java b/bundles/org.simantics.utils/src/org/simantics/utils/logging/LogManager.java deleted file mode 100644 index 1ee88a32a..000000000 --- a/bundles/org.simantics.utils/src/org/simantics/utils/logging/LogManager.java +++ /dev/null @@ -1,151 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management - * in Industry THTH ry. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.utils.logging; - -import java.util.Properties; - -import org.apache.log4j.Hierarchy; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.spi.LoggerFactory; -import org.apache.log4j.spi.RootLogger; - -/** - * This class encapsulates a Log4J Hierarchy and centralizes all Logger access. - */ -public class LogManager { - - private Hierarchy hierarchy; - - /** - * Creates a new LogManager. Saves the log and state location. - * Creates a new Hierarchy and add a new EventListener to it. - * Configure the hierarchy with the properties passed. Add this object to - * the list of active log managers. - * - * @param properties log configuration properties - */ - public LogManager(Properties properties) { - this.hierarchy = new Hierarchy(new RootLogger(Level.DEBUG)); - new PropertyConfigurator().doConfigure(properties, this.hierarchy); - } - - /** - * Checks if this PluginLogManager is disabled for this level. - * - * @param level level value - * @return boolean true if it is disabled - */ - public boolean isDisabled(int level) { - return this.hierarchy.isDisabled(level); - } - - /** - * Enable logging for logging requests with level l or higher. By default - * all levels are enabled. - * - * @param level level object - */ - public void setThreshold(Level level) { - this.hierarchy.setThreshold(level); - } - - /** - * The string version of setThreshold(Level level) - * - * @param level level string - */ - public void setThreshold(String level) { - this.hierarchy.setThreshold(level); - } - - /** - * Get the repository-wide threshold. - * - * @return Level - */ - public Level getThreshold() { - return this.hierarchy.getThreshold(); - } - - /** - * Returns a new logger instance named as the first parameter using the - * default factory. If a logger of that name already exists, then it will be - * returned. Otherwise, a new logger will be instantiated and then linked - * with its existing ancestors as well as children. - * - * @param clazz the class to get the logger for - * @return Logger - */ - public Logger getLogger(Class clazz) { - return this.hierarchy.getLogger(clazz.getName()); - } - - /** - * Returns a new logger instance named as the first parameter using the - * default factory. If a logger of that name already exists, then it will be - * returned. Otherwise, a new logger will be instantiated and then linked - * with its existing ancestors as well as children. - * - * @param name logger name - * @return Logger - */ - public Logger getLogger(String name) { - return this.hierarchy.getLogger(name); - } - - /** - * The same as getLogger(String name) but using a factory instance instead - * of a default factory. - * - * @param name logger name - * @param factory factory instance - * @return Logger - */ - public Logger getLogger(String name, LoggerFactory factory) { - return this.hierarchy.getLogger(name, factory); - } - - /** - * Returns the root of this hierarchy. - * - * @return Logger - */ - public Logger getRootLogger() { - return this.hierarchy.getRootLogger(); - } - - /** - * Checks if this logger exists. - * - * @return Logger - */ - public Logger exists(String name) { - return this.hierarchy.exists(name); - } - - /** - * Disposes the logger hierarchy - */ - public void shutdown() { - this.hierarchy.shutdown(); - } - - /** - * Resets configuration values to its defaults. - */ - public void resetConfiguration() { - this.hierarchy.resetConfiguration(); - } - -} \ No newline at end of file diff --git a/bundles/org.simantics.utils/src/org/simantics/utils/logging/Logger.java b/bundles/org.simantics.utils/src/org/simantics/utils/logging/Logger.java deleted file mode 100644 index 472f66c7d..000000000 --- a/bundles/org.simantics.utils/src/org/simantics/utils/logging/Logger.java +++ /dev/null @@ -1,108 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management - * in Industry THTH ry. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.utils.logging; - -import java.util.Properties; - -abstract public class Logger { - - public static final boolean ECHO = false; - - protected static final Properties defaultProperties(String ... keyValuePairs) { - - assert(keyValuePairs.length % 2 == 0); - - Properties defaultProperties = new Properties(); - defaultProperties.put("log4j.rootCategory", "ERROR, default"); - defaultProperties.put("log4j.appender.default", "org.apache.log4j.FileAppender"); - defaultProperties.put("log4j.appender.default.append", "false"); - defaultProperties.put("log4j.appender.default.layout", "org.apache.log4j.PatternLayout"); - defaultProperties.put("log4j.appender.default.layout.ConversionPattern", "%-6r [%15.15t] %-5p %30.30c - %m%n"); - - for(int i=0;inull - */ - public void logTrace(String message, Throwable exception) { - // Errors are much more useful with a stack trace! - if (exception == null) { - exception = new RuntimeException(); - } - getLogger().trace(message, exception); - } - - /** - * Log an info event. - * - * @param message message of the info - * @param exception the exception, or null - */ - public void logInfo(String message, Throwable exception) { - // Errors are much more useful with a stack trace! - if (exception == null) { - exception = new RuntimeException(); - } - getLogger().info(message, exception); - } - - /** - * Log an error event. - * - * @param message message of the error - * @param exception the exception, or null - */ - public void logError(String message, Throwable exception) { - - // Errors are much more useful with a stack trace! - if (exception == null) { - exception = new RuntimeException(); - } - getLogger().error(message, exception); - } - - /** - * Log an error event. - * - * @param message message of the error - * @param exception the exception, or null - */ - public void logWarning(String message, Throwable exception) { - // Errors are much more useful with a stack trace! - if (exception == null) { - exception = new RuntimeException(); - } - getLogger().error(message, exception); - } - -} diff --git a/bundles/org.simantics.workbench/META-INF/MANIFEST.MF b/bundles/org.simantics.workbench/META-INF/MANIFEST.MF index 887f49377..363faa7c9 100644 --- a/bundles/org.simantics.workbench/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.workbench/META-INF/MANIFEST.MF @@ -45,9 +45,7 @@ Require-Bundle: com.ibm.icu, org.eclipse.e4.ui.di;bundle-version="1.1.0", org.eclipse.e4.core.contexts, org.eclipse.e4.ui.services, - org.slf4j.api;bundle-version="1.7.20", - ch.qos.logback.classic;bundle-version="1.1.7", - ch.qos.logback.core;bundle-version="1.1.7" + org.slf4j.api;bundle-version="1.7.20" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/bundles/org.simantics/META-INF/MANIFEST.MF b/bundles/org.simantics/META-INF/MANIFEST.MF index d5f1ee27a..90161d598 100644 --- a/bundles/org.simantics/META-INF/MANIFEST.MF +++ b/bundles/org.simantics/META-INF/MANIFEST.MF @@ -20,9 +20,7 @@ Require-Bundle: org.eclipse.core.runtime;visibility:=reexport, org.simantics.scl.compiler;bundle-version="0.4.0", org.simantics.platform.ui.ontology;bundle-version="1.0.0", org.simantics.db.procore;bundle-version="1.1.0", - org.slf4j.api, - ch.qos.logback.classic, - ch.qos.logback.core + org.slf4j.api Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.simantics, -- 2.43.2