/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2015 Neil C Smith. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 3 for more details. * * You should have received a copy of the GNU General Public License version 3 * along with this work; if not, see http://www.gnu.org/licenses/ * * * Please visit http://neilcsmith.net if you need additional information or * have any questions. */ package net.neilcsmith.praxis.live.logging; import java.util.HashMap; import java.util.Map; import net.neilcsmith.praxis.core.Argument; import net.neilcsmith.praxis.core.ComponentAddress; import net.neilcsmith.praxis.core.types.PError; import net.neilcsmith.praxis.live.core.api.LogHandler; import net.neilcsmith.praxis.logging.LogLevel; import org.openide.util.lookup.ServiceProvider; import org.openide.windows.FoldHandle; import org.openide.windows.IOFolding; import org.openide.windows.IOProvider; import org.openide.windows.InputOutput; import org.openide.windows.OutputWriter; /** * * @author Neil C Smith <http://neilcsmith.net> */ @ServiceProvider(service = LogHandler.class) public class OutputLogHandler extends LogHandler { private final Map<String, InputOutput> ioTabs; public OutputLogHandler() { ioTabs = new HashMap<String, InputOutput>(); } @Override public void log( ComponentAddress source, long time, LogLevel level, Argument arg) { if (!getLevel().isLoggable(level)) { return; } String rootID = source.getRootID(); InputOutput ioTab = findIOTab(rootID); OutputWriter writer; if (level == LogLevel.ERROR) { ioTab.select(); writer = ioTab.getErr(); } else { writer = ioTab.getOut(); } writer.print(level.name()); writer.print(" : "); writer.println(source.toString()); if (arg instanceof PError) { writePError(ioTab, writer, (PError) arg); } else { writer.println(arg.toString()); } } @Override public LogLevel getLevel() { return LogLevel.INFO; } @Override public void close() { for (InputOutput ioTab : ioTabs.values()) { ioTab.closeInputOutput(); } ioTabs.clear(); } private InputOutput findIOTab(String rootID) { InputOutput ioTab = ioTabs.get(rootID); if (ioTab == null) { ioTab = IOProvider.getDefault().getIO(rootID, false); ioTabs.put(rootID, ioTab); } return ioTab; } private void writePError(InputOutput ioTab, OutputWriter writer, PError err) { writer.print(err.getType().getSimpleName()); writer.print(" - "); writer.print(err.getMessage()); writer.println(); Exception ex = err.getWrappedException(); if (ex != null && IOFolding.isSupported(ioTab)) { FoldHandle fold = IOFolding.startFold(ioTab, false); ex.printStackTrace(writer); writer.println(); fold.finish(); } } }