/*
* Copyright 2003-2017 JetBrains s.r.o.
*
* 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 jetbrains.mps.make;
import jetbrains.mps.logging.Log4jUtil;
import jetbrains.mps.messages.IMessageHandler;
import jetbrains.mps.messages.Message;
import jetbrains.mps.messages.MessageKind;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Satisfies needs of a code that reports both end-user tailored messages and low-level debug messages.
* We could have used log4j.Logger if it's an interface to implement. It's also similar to {@link jetbrains.mps.logging.Logger}.
*
* Created by apyshkin on 5/25/16.
*/
public class MessageSender {
private final IMessageHandler myHandler;
private final Logger myTraceHandler;
private final Object mySender;
private final Level myLevel; // only this kind and higher
/**
* @param endUserHandler handler to accept end-user tailored message of level info and higher, but not lower than the {@code level} specified.
* @param lowLevelHandler receives all messages (i.e. from trace to error), with respect to specified {@code level}.
* @param sender designation of a message source, could be {@code null}. Its {@link Object#toString()} value matters.
* @param level minimum level of a message we'd like to see in our handlers.
*/
MessageSender(@NotNull IMessageHandler endUserHandler, @NotNull Logger lowLevelHandler, Object sender, Level level) {
myHandler = endUserHandler;
myTraceHandler = lowLevelHandler;
mySender = sender == null ? "" : sender;
myLevel = level;
}
/**
* Copy cons that updates message source designation.
*/
public MessageSender(@NotNull MessageSender anotherSender, Object sender) {
myHandler = anotherSender.myHandler;
myTraceHandler = anotherSender.myTraceHandler;
myLevel = anotherSender.myLevel;
mySender = sender == null ? "" : sender;
}
public void error(@NotNull String msg) {
error(msg, null);
}
public void error(@NotNull String msg, @Nullable Throwable ex) {
if (isLevelEnabled(Level.ERROR)) {
myHandler.handle(Message.createMessage(MessageKind.ERROR, mySender.toString(), msg, ex));
Log4jUtil.error(myTraceHandler, msg, ex, null);
}
}
public void error(@NotNull String msg, @Nullable Object hintObject) {
if (isLevelEnabled(Level.ERROR)) {
myHandler.handle(Message.createMessage(MessageKind.ERROR, mySender.toString(), msg, hintObject));
Log4jUtil.error(myTraceHandler, msg, null, hintObject);
}
}
public void warn(@NotNull String msg, @Nullable Object hintObject) {
if (isLevelEnabled(Level.WARN)) {
myHandler.handle(Message.createMessage(MessageKind.WARNING, mySender.toString(), msg, hintObject));
Log4jUtil.warning(myTraceHandler, msg, null, hintObject);
}
}
public void info(@NotNull String msg) {
if (isLevelEnabled(Level.INFO)) {
myHandler.handle(Message.createMessage(MessageKind.INFORMATION, mySender.toString(), msg));
Log4jUtil.info(myTraceHandler, msg, null, null);
}
}
public void debug(@NotNull String msg) {
if (isLevelEnabled(Level.DEBUG)) {
myTraceHandler.debug(msg);
}
}
public void trace(@NotNull String msg) {
if (isLevelEnabled(Level.TRACE)) {
myTraceHandler.trace(msg);
}
}
private boolean isLevelEnabled(Level level) {
return level.isGreaterOrEqual(myLevel);
}
}