blob: f792767c3375e8e167db87b78d575cc53d0d3c31 [file] [log] [blame]
/*
* Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
package org.eclipse.persistence.internal.jpa.modelgen;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.processing.Messager;
import javax.tools.Diagnostic;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.exceptions.ValidationException;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.internal.localization.LoggingLocalization;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.logging.SessionLog;
import org.eclipse.persistence.logging.SessionLogEntry;
/**
* This is a wrapper class for javax.annotation.processing.Messager.
* It is used when messages need to be logged through annotation processor.
*/
final class MessagerLog extends AbstractSessionLog {
/**
* Represents the Map that stores log levels per the name space strings. The
* keys are category names. The values are log levels.
*/
private final Map<String, Integer> categoryLogLevelMap;
private final Messager out;
private static final Writer NULL_WRITER = new Writer() {
//no-op
@Override public void write(char[] cbuf, int off, int len) throws IOException {}
@Override public void flush() throws IOException {}
@Override public void close() throws IOException {}
};
public MessagerLog(Messager out, Map<String, String> options) {
super();
this.out = out;
writer = NULL_WRITER;
categoryLogLevelMap = new HashMap<>(loggerCatagories.length);
for (String loggerCategory : loggerCatagories) {
categoryLogLevelMap.put(loggerCategory, null);
}
initOrUpdateLevels(options);
}
@Override
public void setLevel(int level, String category) {
if (category == null) {
this.level = level;
} else if (categoryLogLevelMap.containsKey(category)) {
categoryLogLevelMap.put(category, level);
} else {
log(SessionLog.WARNING, SessionLog.PROCESSOR,
"Unrecognized logger category: {0}",
category, false);
}
}
@Override
public int getLevel(String category) {
if (category != null) {
Integer lvl = categoryLogLevelMap.get(category);
if (lvl != null) {
return lvl;
}
}
return super.getLevel(category);
}
@Override
public boolean shouldPrintThread() {
if (shouldPrintThread == null) {
return getLevel() < FINER;
}
return shouldPrintThread;
}
@Override
public boolean shouldPrintDate() {
if (shouldPrintDate == null) {
return getLevel() < FINER;
}
return shouldPrintDate;
}
@Override
public boolean shouldPrintConnection() {
if (shouldPrintConnection == null) {
return getLevel() < FINER;
}
return shouldPrintConnection;
}
@Override
public boolean shouldLog(int level, String category) {
return (getLevel(category) <= level);
}
@Override
public void log(SessionLogEntry entry) {
if (!shouldLog(entry.getLevel(), entry.getNameSpace())) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append(getPrefixString(entry.getLevel(), entry.getNameSpace()));
sb.append(getSupplementDetailString(entry));
if (entry.hasMessage()) {
sb.append(formatMessage(entry));
sb.append(Helper.cr());
}
if (entry.hasException()) {
if (shouldLogExceptionStackTrace()) {
for (StackTraceElement stackTrace : entry.getException().getStackTrace()) {
sb.append(stackTrace);
sb.append(Helper.cr());
}
} else {
sb.append(entry.getException().toString());
}
sb.append(Helper.cr());
}
if (getWriter() == NULL_WRITER) {
out.printMessage(translateLevelToKind(entry.getLevel()), sb);
} else {
try {
getWriter().write(sb.toString());
getWriter().flush();
} catch (IOException ioe) {
throw ValidationException.logIOError(ioe);
}
}
}
private void initOrUpdateLevels(Map<String, String> settings) {
String logLevelString = settings.get(PersistenceUnitProperties.LOGGING_LEVEL);
if (logLevelString != null) {
setLevel(translateStringToLoggingLevel(logLevelString));
}
// category-specific logging level
for (Map.Entry<String, String> entry: settings.entrySet()) {
if (entry.getKey().startsWith(PersistenceUnitProperties.CATEGORY_LOGGING_LEVEL_)) {
String ctg = entry.getKey().substring(PersistenceUnitProperties.CATEGORY_LOGGING_LEVEL_.length());
setLevel(translateStringToLoggingLevel(entry.getValue()), ctg);
}
}
String tsString = settings.get(PersistenceUnitProperties.LOGGING_TIMESTAMP);
if (tsString != null) {
setShouldPrintDate(Boolean.parseBoolean(tsString));
}
String threadString = settings.get(PersistenceUnitProperties.LOGGING_THREAD);
if (threadString != null) {
setShouldPrintThread(Boolean.parseBoolean(threadString));
}
String sessionString = settings.get(PersistenceUnitProperties.LOGGING_SESSION);
if (sessionString != null) {
setShouldPrintSession(Boolean.parseBoolean(sessionString));
}
String connectionString = settings.get(PersistenceUnitProperties.LOGGING_CONNECTION);
if (connectionString != null) {
setShouldPrintConnection(Boolean.parseBoolean(connectionString));
}
String exString = settings.get(PersistenceUnitProperties.LOGGING_EXCEPTIONS);
if (exString != null) {
setShouldLogExceptionStackTrace(Boolean.parseBoolean(exString));
}
String displayData = settings.get(PersistenceUnitProperties.LOGGING_PARAMETERS);
if (displayData != null) {
setShouldDisplayData(Boolean.parseBoolean(displayData));
}
// Set logging file.
String loggingFileString = settings.get(PersistenceUnitProperties.LOGGING_FILE);
if (loggingFileString != null) {
if (!loggingFileString.trim().equals("")) {
try {
FileOutputStream fos = new FileOutputStream(loggingFileString);
setWriter(fos);
} catch (IOException e) {
throw ValidationException.invalidLoggingFile(loggingFileString, e);
}
} else {
throw ValidationException.invalidLoggingFile();
}
}
}
private CharSequence getPrefixString(int level, String category) {
StringBuilder sb = new StringBuilder();
switch (level) {
case SEVERE:
if (SEVERE_PREFIX == null) {
SEVERE_PREFIX = LoggingLocalization.buildMessage("toplink_severe");
}
sb.append(SEVERE_PREFIX);
break;
case WARNING:
if (WARNING_PREFIX == null) {
WARNING_PREFIX = LoggingLocalization.buildMessage("toplink_warning");
}
sb.append(WARNING_PREFIX);
break;
case INFO:
if (INFO_PREFIX == null) {
INFO_PREFIX = LoggingLocalization.buildMessage("toplink_info");
}
sb.append(INFO_PREFIX);
break;
case CONFIG:
if (CONFIG_PREFIX == null) {
CONFIG_PREFIX = LoggingLocalization.buildMessage("toplink_config");
}
sb.append(CONFIG_PREFIX);
break;
case FINE:
if (FINE_PREFIX == null) {
FINE_PREFIX = LoggingLocalization.buildMessage("toplink_fine");
}
sb.append(FINE_PREFIX);
break;
case FINER:
if (FINER_PREFIX == null) {
FINER_PREFIX = LoggingLocalization.buildMessage("toplink_finer");
}
sb.append(FINER_PREFIX);
break;
case FINEST:
if (FINEST_PREFIX == null) {
FINEST_PREFIX = LoggingLocalization.buildMessage("toplink_finest");
}
sb.append(FINEST_PREFIX);
break;
default:
if (TOPLINK_PREFIX == null) {
TOPLINK_PREFIX = LoggingLocalization.buildMessage("toplink");
}
sb.append(TOPLINK_PREFIX);
}
if (category != null) {
sb.append(category);
sb.append(": ");
}
return sb;
}
private Diagnostic.Kind translateLevelToKind(int level) {
switch (level) {
case SEVERE:
case WARNING:
return Diagnostic.Kind.WARNING;
case INFO:
return Diagnostic.Kind.NOTE;
default:
return Diagnostic.Kind.OTHER;
}
}
}