/*
* 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.wicket.feedback;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.wicket.Component;
import org.apache.wicket.core.util.string.CssUtils;
import org.apache.wicket.model.IDetachable;
/**
* Represents a generic message meant for the end-user/ pages.
*
* @author Eelco Hillenius
* @author Jonathan Locke
*/
public class FeedbackMessage implements IDetachable
{
private static final long serialVersionUID = 1L;
public static final String UNDEFINED_CSS_CLASS_KEY = CssUtils.key(FeedbackMessage.class,
"undefined");
public static final String DEBUG_CSS_CLASS_KEY = CssUtils.key(FeedbackMessage.class, "debug");
public static final String INFO_CSS_CLASS_KEY = CssUtils.key(FeedbackMessage.class, "info");
public static final String SUCCESS_CSS_CLASS_KEY = CssUtils.key(FeedbackMessage.class,
"success");
public static final String WARNING_CSS_CLASS_KEY = CssUtils.key(FeedbackMessage.class,
"warning");
public static final String ERROR_CSS_CLASS_KEY = CssUtils.key(FeedbackMessage.class, "error");
public static final String FATAL_CSS_CLASS_KEY = CssUtils.key(FeedbackMessage.class, "fatal");
/**
* Constant for an undefined level; note that components might decide not to render anything
* when this level is used.
*/
public static final int UNDEFINED = 0;
/** Constant for debug level. */
public static final int DEBUG = 100;
/** Constant for info level. */
public static final int INFO = 200;
/** Constant for success level (it indicates the outcome of an operation) */
public static final int SUCCESS = 250;
/** Constant for warning level. */
public static final int WARNING = 300;
/** Constant for error level. */
public static final int ERROR = 400;
/** Constant for fatal level. */
public static final int FATAL = 500;
/** Levels as strings for debugging. */
private static final Map<Integer, String> levelStrings = new HashMap<>();
static
{
levelStrings.put(UNDEFINED, "UNDEFINED");
levelStrings.put(DEBUG, "DEBUG");
levelStrings.put(INFO, "INFO");
levelStrings.put(SUCCESS, "SUCCESS");
levelStrings.put(WARNING, "WARNING");
levelStrings.put(ERROR, "ERROR");
levelStrings.put(FATAL, "FATAL");
}
/**
* The message level; can be used by rendering components. Note that what actually happens with
* the level indication is totally up to the components that render messages like these. The
* default level is UNDEFINED.
*/
private final int level;
/** The actual message. */
private final Serializable message;
/** The reporting component. */
private Component reporter;
/** Whether or not this message has been rendered */
private boolean rendered = false;
/**
* Construct using fields.
*
* @param reporter
* The message reporter
* @param message
* The actual message. Must not be <code>null</code>.
* @param level
* The level of the message
*/
public FeedbackMessage(final Component reporter, final Serializable message, final int level)
{
if (message == null)
{
throw new IllegalArgumentException("Parameter message can't be null");
}
this.reporter = reporter;
this.message = message;
this.level = level;
}
/**
* Gets whether or not this message has been rendered
*
* @return true if this message has been rendered, false otherwise
*/
public final boolean isRendered()
{
return rendered;
}
/**
* Marks this message as rendered.
*/
public final void markRendered()
{
rendered = true;
}
/**
* Gets the message level; can be used by rendering components. Note that what actually happens
* with the level indication is totally up to the components that render feedback messages.
*
* @return The message level indicator.
*/
public final int getLevel()
{
return level;
}
/**
* Gets the current level as a String
*
* @return The current level as a String
*/
public String getLevelAsString()
{
return levelStrings.get(getLevel());
}
/**
* Gets the actual message.
*
* @return the message.
*/
public final Serializable getMessage()
{
return message;
}
/**
* Gets the reporting component.
*
* @return the reporting component.
*/
public final Component getReporter()
{
return reporter;
}
/**
* Gets whether the current level is DEBUG or up.
*
* @return whether the current level is DEBUG or up.
*/
public final boolean isDebug()
{
return isLevel(DEBUG);
}
/**
* Gets whether the current level is INFO or up.
*
* @return whether the current level is INFO or up.
*/
public final boolean isInfo()
{
return isLevel(INFO);
}
/**
* Gets whether the current level is SUCCESS or up.
*
* @return whether the current level is SUCCESS or up.
*/
public final boolean isSuccess()
{
return isLevel(SUCCESS);
}
/**
* Gets whether the current level is WARNING or up.
*
* @return whether the current level is WARNING or up.
*/
public final boolean isWarning()
{
return isLevel(WARNING);
}
/**
* Gets whether the current level is ERROR or up.
*
* @return whether the current level is ERROR or up.
*/
public final boolean isError()
{
return isLevel(ERROR);
}
/**
* Gets whether the current level is FATAL or up.
*
* @return whether the current level is FATAL or up.
*/
public final boolean isFatal()
{
return isLevel(FATAL);
}
/**
* Returns whether this level is greater than or equal to the given level.
*
* @param level
* the level
* @return whether this level is greater than or equal to the given level
*/
public final boolean isLevel(int level)
{
return (getLevel() >= level);
}
/**
* Gets whether the current level is UNDEFINED.
*
* @return whether the current level is UNDEFINED.
*/
public final boolean isUndefined()
{
return (getLevel() == UNDEFINED);
}
@Override
public String toString()
{
return "[FeedbackMessage message = \"" + getMessage() + "\", reporter = " +
((getReporter() == null) ? "null" : getReporter().getId()) + ", level = " +
getLevelAsString() + ']';
}
@Override
public void detach()
{
// no-op
}
}