// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.java.decompiler.main; import org.jetbrains.java.decompiler.main.collectors.BytecodeSourceMapper; import org.jetbrains.java.decompiler.main.collectors.CounterContainer; import org.jetbrains.java.decompiler.main.collectors.ImportCollector; import org.jetbrains.java.decompiler.main.extern.IFernflowerLogger; import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences; import org.jetbrains.java.decompiler.modules.decompiler.vars.VarProcessor; import org.jetbrains.java.decompiler.modules.renamer.PoolInterceptor; import org.jetbrains.java.decompiler.struct.StructContext; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Objects; public class DecompilerContext { public static final String CURRENT_CLASS = "CURRENT_CLASS"; public static final String CURRENT_CLASS_WRAPPER = "CURRENT_CLASS_WRAPPER"; public static final String CURRENT_CLASS_NODE = "CURRENT_CLASS_NODE"; public static final String CURRENT_METHOD_WRAPPER = "CURRENT_METHOD_WRAPPER"; private static volatile DecompilerContext currentContext = null; private final Map properties; private final IFernflowerLogger logger; private final StructContext structContext; private final ClassesProcessor classProcessor; private final PoolInterceptor poolInterceptor; private ImportCollector importCollector; private VarProcessor varProcessor; private CounterContainer counterContainer; private BytecodeSourceMapper bytecodeSourceMapper; private DecompilerContext(Map properties, IFernflowerLogger logger, StructContext structContext, ClassesProcessor classProcessor, PoolInterceptor interceptor) { this.properties = properties; this.logger = logger; this.structContext = structContext; this.classProcessor = classProcessor; this.poolInterceptor = interceptor; this.counterContainer = new CounterContainer(); } // ***************************************************************************** // context setup and update // ***************************************************************************** public static void initContext(Map customProperties, IFernflowerLogger logger, StructContext structContext, ClassesProcessor classProcessor, PoolInterceptor interceptor) { Objects.requireNonNull(logger); Objects.requireNonNull(structContext); Objects.requireNonNull(classProcessor); Map properties = new HashMap<>(IFernflowerPreferences.DEFAULTS); if (customProperties != null) { properties.putAll(customProperties); } String level = (String)properties.get(IFernflowerPreferences.LOG_LEVEL); if (level != null) { try { logger.setSeverity(IFernflowerLogger.Severity.valueOf(level.toUpperCase(Locale.US))); } catch (IllegalArgumentException ignore) { } } currentContext = new DecompilerContext(properties, logger, structContext, classProcessor, interceptor); } public static void clearContext() { currentContext = null; } public static void setProperty(String key, Object value) { currentContext.properties.put(key, value); } public static void startClass(ImportCollector importCollector) { currentContext.importCollector = importCollector; currentContext.counterContainer = new CounterContainer(); currentContext.bytecodeSourceMapper = new BytecodeSourceMapper(); } public static void startMethod(VarProcessor varProcessor) { currentContext.varProcessor = varProcessor; currentContext.counterContainer = new CounterContainer(); } // ***************************************************************************** // context access // ***************************************************************************** public static Object getProperty(String key) { return currentContext.properties.get(key); } public static boolean getOption(String key) { return "1".equals(getProperty(key)); } public static String getNewLineSeparator() { return getOption(IFernflowerPreferences.NEW_LINE_SEPARATOR) ? IFernflowerPreferences.LINE_SEPARATOR_UNX : IFernflowerPreferences.LINE_SEPARATOR_WIN; } public static IFernflowerLogger getLogger() { return currentContext.logger; } public static StructContext getStructContext() { return currentContext.structContext; } public static ClassesProcessor getClassProcessor() { return currentContext.classProcessor; } public static PoolInterceptor getPoolInterceptor() { return currentContext.poolInterceptor; } public static ImportCollector getImportCollector() { return currentContext.importCollector; } public static VarProcessor getVarProcessor() { return currentContext.varProcessor; } public static CounterContainer getCounterContainer() { return currentContext.counterContainer; } public static BytecodeSourceMapper getBytecodeSourceMapper() { return currentContext.bytecodeSourceMapper; } }