001/*
002 * This is free and unencumbered software released into the public domain.
003 *
004 * Please see https://github.com/binkley/binkley/blob/master/LICENSE.md.
005 */
006
007package hm.binkley.util.logging;
008
009import com.google.common.annotations.Beta;
010import com.google.inject.assistedinject.Assisted;
011import org.slf4j.Logger;
012
013import javax.inject.Inject;
014import java.util.ResourceBundle;
015
016import static java.text.MessageFormat.format;
017
018/**
019 * {@code LogMessage} <b>needs documentation</b>.
020 *
021 * @author <a href="mailto:binkley@alumni.rice.edu">B. K. Oxley (binkley)</a>
022 * @todo Needs documentation.
023 */
024@Beta
025public final class LogMessage {
026    private final Level level;
027    private final String message;
028    private final Object[] parameters;
029
030    @SuppressWarnings("AssignmentToCollectionOrArrayFieldFromParameter")
031    @Inject
032    public LogMessage(final ResourceBundle bundle, @Assisted final String key,
033            @Assisted final Object... parameters) {
034        this.parameters = parameters;
035        level = Level.valueOf(bundle.getString(key + ".level"));
036        message = bundle.getString(key + ".message");
037    }
038
039    public void logTo(final Logger logger) {
040        logTo(logger, null, parameters);
041    }
042
043    public void logTo(final Logger logger, final Object... parameters) {
044        logTo(logger, null, parameters);
045    }
046
047    public void logTo(final Logger logger, final Throwable cause) {
048        logTo(logger, cause, parameters);
049    }
050
051    public void logTo(final Logger logger, final Throwable cause, final Object... parameters) {
052        level().log(logger, format(message(), parameters), cause);
053    }
054
055    public Level level() {
056        return level;
057    }
058
059    public String message() {
060        return message;
061    }
062
063    @Override
064    public String toString() {
065        return format(message, parameters);
066    }
067
068    @Beta
069    public interface Factory {
070        LogMessage create(final String key, final Object... parameters);
071    }
072}