/* * Copyright 2016 the original author or authors. * * 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 org.gradle.internal.logging.console; import org.gradle.api.logging.LogLevel; import org.gradle.internal.logging.events.BatchOutputEventListener; import org.gradle.internal.logging.events.LogLevelChangeEvent; import org.gradle.internal.logging.events.OutputEvent; import org.gradle.internal.logging.events.RenderableOutputEvent; import org.gradle.internal.logging.text.AbstractLineChoppingStyledTextOutput; import org.gradle.internal.logging.text.StyledTextOutput; import java.text.SimpleDateFormat; import java.util.Date; import static org.gradle.internal.logging.text.StyledTextOutput.Style.Error; import static org.gradle.internal.logging.text.StyledTextOutput.Style.Normal; public class StyledTextOutputBackedRenderer extends BatchOutputEventListener { private final OutputEventTextOutputImpl textOutput; private boolean debugOutput; private SimpleDateFormat dateFormat; private RenderableOutputEvent lastEvent; public StyledTextOutputBackedRenderer(StyledTextOutput textOutput) { this.textOutput = new OutputEventTextOutputImpl(textOutput); } public void onOutput(OutputEvent event) { if (event instanceof LogLevelChangeEvent) { LogLevelChangeEvent changeEvent = (LogLevelChangeEvent) event; debugOutput = changeEvent.getNewLogLevel() == LogLevel.DEBUG; if (debugOutput && dateFormat == null) { dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); } } if (event instanceof RenderableOutputEvent) { RenderableOutputEvent outputEvent = (RenderableOutputEvent) event; textOutput.style(outputEvent.getLogLevel() == LogLevel.ERROR ? Error : Normal); if (debugOutput && (textOutput.atEndOfLine || lastEvent == null || !lastEvent.getCategory().equals(outputEvent.getCategory()))) { if (!textOutput.atEndOfLine) { textOutput.println(); } textOutput.text(dateFormat.format(new Date(outputEvent.getTimestamp()))); textOutput.text(" ["); textOutput.text(outputEvent.getLogLevel()); textOutput.text("] ["); textOutput.text(outputEvent.getCategory()); textOutput.text("] "); } outputEvent.render(textOutput); lastEvent = outputEvent; textOutput.style(Normal); } } private class OutputEventTextOutputImpl extends AbstractLineChoppingStyledTextOutput { private final StyledTextOutput textOutput; private boolean atEndOfLine = true; public OutputEventTextOutputImpl(StyledTextOutput textOutput) { this.textOutput = textOutput; } @Override protected void doStyleChange(Style style) { textOutput.style(style); } @Override protected void doLineText(CharSequence text) { textOutput.text(text); atEndOfLine = false; } @Override protected void doEndLine(CharSequence endOfLine) { textOutput.text(endOfLine); atEndOfLine = true; } } }