org.apache.logging.log4j.message.DefaultFlowMessageFactory Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.logging.log4j.message;
import java.io.Serializable;
/**
* Default factory for flow messages.
*
* @since 2.6
*/
public class DefaultFlowMessageFactory implements FlowMessageFactory, Serializable {
private static final String EXIT_DEFAULT_PREFIX = "Exit";
private static final String ENTRY_DEFAULT_PREFIX = "Enter";
private static final long serialVersionUID = 8578655591131397576L;
private final String entryText;
private final String exitText;
/**
* Constructs a message factory with {@code "Enter"} and {@code "Exit"} as the default flow strings.
*/
public DefaultFlowMessageFactory() {
this(ENTRY_DEFAULT_PREFIX, EXIT_DEFAULT_PREFIX);
}
/**
* Constructs a message factory with the given entry and exit strings.
* @param entryText the text to use for trace entry, like {@code "Enter"}.
* @param exitText the text to use for trace exit, like {@code "Exit"}.
*/
public DefaultFlowMessageFactory(final String entryText, final String exitText) {
super();
this.entryText = entryText;
this.exitText = exitText;
}
private static class AbstractFlowMessage implements FlowMessage {
private static final long serialVersionUID = 1L;
private final Message message;
private final String text;
AbstractFlowMessage(final String text, final Message message) {
this.message = message;
this.text = text;
}
@Override
public String getFormattedMessage() {
if (message != null) {
return text + " " + message.getFormattedMessage();
}
return text;
}
@Override
public String getFormat() {
if (message != null) {
return text + ": " + message.getFormat();
}
return text;
}
@Override
public Object[] getParameters() {
if (message != null) {
return message.getParameters();
}
return null;
}
@Override
public Throwable getThrowable() {
if (message != null) {
return message.getThrowable();
}
return null;
}
@Override
public Message getMessage() {
return message;
}
@Override
public String getText() {
return text;
}
}
private static final class SimpleEntryMessage extends AbstractFlowMessage implements EntryMessage {
private static final long serialVersionUID = 1L;
SimpleEntryMessage(final String entryText, final Message message) {
super(entryText, message);
}
}
private static final class SimpleExitMessage extends AbstractFlowMessage implements ExitMessage {
private static final long serialVersionUID = 1L;
private final Object result;
private final boolean isVoid;
SimpleExitMessage(final String exitText, final EntryMessage message) {
super(exitText, message.getMessage());
this.result = null;
isVoid = true;
}
SimpleExitMessage(final String exitText, final Object result, final EntryMessage message) {
super(exitText, message.getMessage());
this.result = result;
isVoid = false;
}
SimpleExitMessage(final String exitText, final Object result, final Message message) {
super(exitText, message);
this.result = result;
isVoid = false;
}
@Override
public String getFormattedMessage() {
final String formattedMessage = super.getFormattedMessage();
if (isVoid) {
return formattedMessage;
}
return formattedMessage + ": " + result;
}
}
/**
* Gets the entry text.
* @return the entry text.
*/
public String getEntryText() {
return entryText;
}
/**
* Gets the exit text.
* @return the exit text.
*/
public String getExitText() {
return exitText;
}
/*
* (non-Javadoc)
*
* @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(org.apache.logging.log4j.message.Message)
*/
@Override
public EntryMessage newEntryMessage(final Message message) {
return new SimpleEntryMessage(entryText, makeImmutable(message));
}
private Message makeImmutable(final Message message) {
if (!(message instanceof ReusableMessage)) {
return message;
}
return new SimpleMessage(message.getFormattedMessage());
}
/*
* (non-Javadoc)
*
* @see org.apache.logging.log4j.message.FlowMessageFactory#newExitMessage(org.apache.logging.log4j.message.EntryMessage)
*/
@Override
public ExitMessage newExitMessage(final EntryMessage message) {
return new SimpleExitMessage(exitText, message);
}
/*
* (non-Javadoc)
*
* @see org.apache.logging.log4j.message.FlowMessageFactory#newExitMessage(java.lang.Object, org.apache.logging.log4j.message.EntryMessage)
*/
@Override
public ExitMessage newExitMessage(final Object result, final EntryMessage message) {
return new SimpleExitMessage(exitText, result, message);
}
/*
* (non-Javadoc)
*
* @see org.apache.logging.log4j.message.FlowMessageFactory#newExitMessage(java.lang.Object, org.apache.logging.log4j.message.Message)
*/
@Override
public ExitMessage newExitMessage(final Object result, final Message message) {
return new SimpleExitMessage(exitText, result, message);
}
}