001// Copyright 2011 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry5.alerts;
016
017import org.apache.tapestry5.ioc.internal.util.InternalUtils;
018import org.apache.tapestry5.json.JSONObject;
019
020import java.io.Serializable;
021import java.util.concurrent.atomic.AtomicLong;
022
023/**
024 * An Alert that may be presented to the user. The Alert has a message, but also includes
025 * a severity (that controls how it is presented to the user), and a duration (that controls how long
026 * it is presented to the user).
027 *
028 * @since 5.3
029 */
030public class Alert implements Serializable
031{
032    private static final AtomicLong idSource = new AtomicLong(System.currentTimeMillis());
033
034    /**
035     * A unique id (unique within this JVM and execution), used to identify an alert (used primarily
036     * when individually dismissing an alert).
037     */
038    public final long id = idSource.getAndIncrement();
039
040    public final Duration duration;
041
042    public final Severity severity;
043
044    public final String message;
045
046    /**
047     * Alert with default duration of {@link Duration#SINGLE} and default severity
048     * of {@link Severity#INFO}.
049     */
050    public Alert(String message)
051    {
052        this(Severity.INFO, message);
053    }
054
055    /**
056     * Alert with default duration of {@link Duration#SINGLE}.
057     */
058    public Alert(Severity severity, String message)
059    {
060        this(Duration.SINGLE, severity, message);
061    }
062
063    public Alert(Duration duration, Severity severity, String message)
064    {
065        assert duration != null;
066        assert severity != null;
067        assert InternalUtils.isNonBlank(message);
068
069        this.duration = duration;
070        this.severity = severity;
071        this.message = message;
072    }
073
074    public String toString()
075    {
076        return String.format("Alert[%s %s %s]",
077                duration.name(),
078                severity.name(),
079                message);
080    }
081
082    public JSONObject toJSON()
083    {
084        JSONObject result = new JSONObject("message", message, "class", severity.cssClass);
085
086        if (duration == Duration.TRANSIENT)
087        {
088            result.put("transient", true);
089        }
090
091        if (duration.persistent)
092        {
093            result.put("id", id);
094        }
095
096        return result;
097    }
098}