/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 flex2.compiler.util; //import flash.localization.LocalizationManager; import flash.localization.LocalizationManager; import flex2.compiler.ILocalizableMessage; import flex2.compiler.Logger; import flex2.compiler.Source; import flex2.compiler.common.PathResolver; import flex2.compiler.io.VirtualFile; import flex2.compiler.mxml.lang.StandardDefs; import flex2.tools.oem.ProgressMeter; import java.util.HashMap; import java.util.Map; /** * A utility class that contains all the thread local variables used * by the compiler. These are mostly conveniences so that the * variables don't have to be passed around to all the corners of the * compiler via method parameters. These represent potential memory * leaks, though. All the variables should be cleared at the end of a * compilation. Otherwise, if the thread used for compilation * changes, lots of memory will be leaked with the old thread. * * @author Clement Wong */ public final class ThreadLocalToolkit { private static ThreadLocal<Logger> logger = new ThreadLocal<Logger>(); private static ThreadLocal<PathResolver> resolver = new ThreadLocal<PathResolver>(); private static ThreadLocal<Map<String, VirtualFile>> resolved = new ThreadLocal<Map<String, VirtualFile>>(); private static ThreadLocal<Benchmark> stopWatch = new ThreadLocal<Benchmark>(); private static ThreadLocal<LocalizationManager> localization = new ThreadLocal<LocalizationManager>(); private static ThreadLocal<MimeMappings> mimeMappings = new ThreadLocal<MimeMappings>(); private static ThreadLocal<ProgressMeter> progressMeter = new ThreadLocal<ProgressMeter>(); private static ThreadLocal<CompilerControl> compilerControl = new ThreadLocal<CompilerControl>(); private static ThreadLocal<StandardDefs> standardDefs = new ThreadLocal<StandardDefs>(); private static ThreadLocal<Integer> compatibilityVersion = new ThreadLocal<Integer>(); //---------------------- // LocalizationManager //---------------------- public static LocalizationManager getLocalizationManager() { return localization.get(); } public static void setLocalizationManager(LocalizationManager mgr) { localization.set( mgr ); } //--------------- // PathResolver //--------------- public static void setPathResolver(PathResolver r) { resolver.set(r); } public static void resetResolvedPaths() { resolved.set(null); } public static PathResolver getPathResolver() { return resolver.get(); } public static void addResolvedPath(String path, VirtualFile virtualFile) { Map<String, VirtualFile> resolvedMap = resolved.get(); if (resolvedMap == null) { resolvedMap = new HashMap<String, VirtualFile>(); resolved.set(resolvedMap); } resolvedMap.put(path, virtualFile); } public static VirtualFile getResolvedPath(String path) { Map<String, VirtualFile> resolvedMap = resolved.get(); assert resolvedMap != null; return (VirtualFile) resolvedMap.get(path); } //--------------- // Benchmarking //--------------- public static void setBenchmark(Benchmark b) { stopWatch.set(b); } public static Benchmark getBenchmark() { return stopWatch.get(); } public static void resetBenchmark() { Benchmark b = stopWatch.get(); if (b != null) { //b.start(); } } //--------------- // MimeMappings //--------------- public static void setMimeMappings(MimeMappings mappings) { mimeMappings.set(mappings); } static MimeMappings getMimeMappings() { return mimeMappings.get(); } //---------------- // ProgressMeter //---------------- public static void setProgressMeter(ProgressMeter meter) { progressMeter.set(meter); } public static ProgressMeter getProgressMeter() { return progressMeter.get(); } //------------------- // Compiler Control //------------------- public static void setCompilerControl(CompilerControl cc) { compilerControl.set(cc); } public static CompilerControl getCompilerControl() { return compilerControl.get(); } //---------------- // Standard Defs //---------------- public static void setStandardDefs(StandardDefs defs) { standardDefs.set(defs); } public static StandardDefs getStandardDefs() { StandardDefs defs = standardDefs.get(); if (defs == null) { defs = StandardDefs.getStandardDefs("halo"); setStandardDefs(defs); } return defs; } //--------- // Logger //--------- public static void setLogger(Logger logger) { ThreadLocalToolkit.logger.set(logger); if (logger != null) { //logger.setLocalizationManager( getLocalizationManager() ); } } public static Logger getLogger() { return logger.get(); } //--------- // CompatibilityVersion //--------- public static void setCompatibilityVersion(Integer compatibilityVersion) { ThreadLocalToolkit.compatibilityVersion.set(compatibilityVersion); } public static Integer getCompatibilityVersion() { assert compatibilityVersion.get() != null : "Entry point missing setCompatibilityVersion()"; return compatibilityVersion.get(); } //-------------------------------------------------------------------------- // // Logging Methods // //-------------------------------------------------------------------------- public static int errorCount() { Logger l = logger.get(); if (l != null) { return l.errorCount(); } else { return 0; } } public static int warningCount() { Logger l = logger.get(); if (l != null) { return l.warningCount(); } else { return 0; } } public static void logInfo(String info) { Logger l = logger.get(); if (l != null) { l.logInfo(info); } else { System.out.println(info); } } public static void logDebug(String debug) { Logger l = logger.get(); if (l != null) { l.logDebug(debug); } else { System.err.println(debug); } } public static void logWarning(String warning) { Logger l = logger.get(); if (l != null) { l.logWarning(warning); } else { System.err.println(warning); } } public static void logError(String error) { Logger l = logger.get(); if (l != null) { l.logError(error); } else { System.err.println(error); } } public static void logInfo(String path, String info) { Logger l = logger.get(); if (l != null) { l.logInfo(path, info); } else { System.out.println(path + ":" + info); } } public static void logDebug(String path, String debug) { Logger l = logger.get(); if (l != null) { l.logDebug(path, debug); } else { System.err.println(path + ":" + debug); } } public static void logWarning(String path, String warning) { Logger l = logger.get(); if (l != null) { l.logWarning(path, warning); } else { System.err.println(path + ":" + warning); } } public static void logWarning(String path, String warning, int errorCode) { Logger l = logger.get(); if (l != null) { l.logWarning(path, warning, errorCode); } else { System.err.println(path + ":" + warning); } } public static void logError(String path, String error) { Logger l = logger.get(); if (l != null) { l.logError(path, error); } else { System.err.println(path + ":" + error); } } public static void logError(String path, String error, int errorCode) { Logger l = logger.get(); if (l != null) { l.logError(path, error, errorCode); } else { System.err.println(path + ":" + error); } } public static void logInfo(String path, int line, String info) { Logger l = logger.get(); if (l != null) { l.logInfo(path, line, info); } else { System.out.println(path + ": line " + line + " - " + info); } } public static void logDebug(String path, int line, String debug) { Logger l = logger.get(); if (l != null) { l.logDebug(path, line, debug); } else { System.err.println(path + ": line " + line + " - " + debug); } } public static void logWarning(String path, int line, String warning) { Logger l = logger.get(); if (l != null) { l.logWarning(path, line, warning); } else { System.err.println(path + ": line " + line + " - " + warning); } } public static void logError(String path, int line, String error) { Logger l = logger.get(); if (l != null) { l.logError(path, line, error); } else { System.err.println(path + ": line " + line + " - " + error); } } public static void logInfo(String path, int line, int col, String info) { Logger l = logger.get(); if (l != null) { l.logInfo(path, line, col, info); } else { System.out.println(path + ": line " + line + ", col " + col + " - " + info); } } public static void logDebug(String path, int line, int col, String debug) { Logger l = logger.get(); if (l != null) { l.logDebug(path, line, col, debug); } else { System.err.println(path + ": line " + line + ", col " + col + " - " + debug); } } public static void logWarning(String path, int line, int col, String warning) { Logger l = logger.get(); if (l != null) { l.logWarning(path, line, col, warning); } else { System.err.println(path + ": line " + line + ", col " + col + " - " + warning); } } public static void logError(String path, int line, int col, String error) { Logger l = logger.get(); if (l != null) { l.logError(path, line, col, error); } else { System.err.println(path + ": line " + line + ", col " + col + " - " + error); } } public static void logWarning(String path, int line, int col, String warning, String source) { Logger l = logger.get(); if (l != null) { l.logWarning(path, line, col, warning, source); } else { System.err.println(path + ": line " + line + ", col " + col + " - " + warning); System.err.println(source); } } public static void logWarning(String path, int line, int col, String warning, String source, int errorCode) { Logger l = logger.get(); if (l != null) { l.logWarning(path, line, col, warning, source, errorCode); } else { System.err.println(path + ": line " + line + ", col " + col + " - " + warning); System.err.println(source); } } public static void logError(String path, int line, int col, String error, String source) { Logger l = logger.get(); if (l != null) { l.logError(path, line, col, error, source); } else { System.err.println(path + ": line " + line + ", col " + col + " - " + error); System.err.println(source); } } public static void logError(String path, int line, int col, String error, String source, int errorCode) { Logger l = logger.get(); if (l != null) { l.logError(path, line, col, error, source, errorCode); } else { System.err.println(path + ": line " + line + ", col " + col + " - " + error); System.err.println(source); } } /** * avoid passthrough ctors in CompilerMessages */ public static void log(CompilerMessage m, String path, int line, int column) { m.path = path; m.line = line; m.column = column; log(m); } public static void log(CompilerMessage m, String path, int line, int column, String source) { m.path = path; m.line = line; m.column = column; log((ILocalizableMessage) m, source); } /** * */ public static void log(CompilerMessage m, String path, int line) { log(m, path, line, -1); } public static void log(CompilerMessage m, String path) { log(m, path, -1, -1); } public static void log(CompilerMessage m, Source s, int line) { m.path = s.getNameForReporting(); m.line = line; log(m); } public static void log(CompilerMessage m, Source s, int line, int column) { m.path = s.getNameForReporting(); m.line = line; m.column = column; log(m); } public static void log(CompilerMessage m, Source s) { m.path = s.getNameForReporting(); log(m); } public static void log( ILocalizableMessage m ) { Logger logger = getLogger(); if (logger != null) { logger.log( m ); } } public static void log( ILocalizableMessage m, String source) { Logger logger = getLogger(); if (logger != null) { logger.log( m, source ); } } }