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
015 package org.apache.tapestry5.alerts;
016
017 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
018 import org.apache.tapestry5.json.JSONObject;
019
020 import java.io.Serializable;
021 import 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 */
030 public 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 }