/*
* Copyright (c) 2016 Red Hat, Inc. and others. 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
*/
package org.opendaylight.yangtools.checkstyle;
import com.google.common.base.Preconditions;
import com.google.common.io.Files;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Check which extracts the content of Logger messages somewhere (e.g. a file).
*
* <p>This can be used to create a comprehensive list of all log messages.
*
* <p>It is a first step towards more formal tracking of all messages
* from a system with a unique ID, using e.g. a framework such
* as jboss-logging.
*
* <p>Does not actually Check anything, i.e. never emits any Checkstyle warnings.
*/
public class LogMessageExtractorCheck extends AbstractLogMessageCheck {
private static final Logger LOG = LoggerFactory.getLogger(LogMessageExtractorCheck.class);
static final File DEFAULT_REPORT_FILE = new File("target/logger-messages.txt");
private File logMessagesReportFile = DEFAULT_REPORT_FILE;
public void setLogMessagesReportFileName(String fileName) {
logMessagesReportFile = new File(fileName);
logMessagesReportFile.getParentFile().mkdirs();
}
public File getLogMessagesReportFile() {
return logMessagesReportFile;
}
@Override
protected void visitLogMessage(DetailAST ast, String logMessage) {
File file = new File(getFileContents().getFileName());
String fileName = FileNameUtil.getPathRelativeToMavenProjectRootIfPossible(file).getPath();
int lineNumber = ast.getLineNo();
LogMessageOccurence log = new LogMessageOccurence(fileName, lineNumber, logMessage);
updateMessagesReportFile(log);
}
protected void updateMessagesReportFile(LogMessageOccurence log) {
try {
final File file = getLogMessagesReportFile();
file.getParentFile().mkdirs();
if (file.exists()) {
Files.append(log.toString() + "\n", file, StandardCharsets.UTF_8);
} else {
Files.write(log.toString() + "\n", file, StandardCharsets.UTF_8);
}
} catch (IOException e) {
LOG.error("Failed to append to file: {}", logMessagesReportFile.getPath(), e);
}
}
public static class LogMessageOccurence {
// relative to current project root
public final String javaSourceFilePath;
public final int lineNumber;
public final String message;
public LogMessageOccurence(String javaSourceFilePath, int lineNumber, String message) {
this.javaSourceFilePath = Preconditions.checkNotNull(javaSourceFilePath, "javaSourceFilePath");
this.lineNumber = lineNumber;
this.message = Preconditions.checkNotNull(message, "message");
}
@Override
public String toString() {
return javaSourceFilePath + ":" + lineNumber + ":" + message;
}
}
}