001// Copyright 2011, 2012 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.commons.internal.util.LockSupport;
018import org.apache.tapestry5.commons.util.CollectionFactory;
019import org.apache.tapestry5.http.OptimizedSessionPersistedObject;
020
021import java.io.Serializable;
022import java.util.Iterator;
023import java.util.List;
024
025/**
026 * A stateless session object used to store Alerts between requests.
027 *
028 * @since 5.3
029 */
030public class AlertStorage extends LockSupport implements Serializable, OptimizedSessionPersistedObject
031{
032    private boolean dirty;
033
034    private final List<Alert> alerts = CollectionFactory.newList();
035
036    public boolean checkAndResetDirtyMarker()
037    {
038        try
039        {
040            takeWriteLock();
041
042            return dirty;
043        } finally
044        {
045            dirty = false;
046
047            releaseWriteLock();
048        }
049    }
050
051
052    public void add(Alert alert)
053    {
054        assert alert != null;
055
056        try
057        {
058            takeWriteLock();
059
060            alerts.add(alert);
061
062            dirty = true;
063        } finally
064        {
065            releaseWriteLock();
066        }
067    }
068
069    /**
070     * Dismisses all Alerts.
071     */
072    public void dismissAll()
073    {
074        try
075        {
076            takeWriteLock();
077
078            if (!alerts.isEmpty())
079            {
080                alerts.clear();
081                dirty = true;
082            }
083        } finally
084        {
085            releaseWriteLock();
086        }
087    }
088
089    /**
090     * Dismisses non-persistent Alerts; this is useful after rendering the {@link org.apache.tapestry5.corelib.components.Alerts}
091     * component.
092     */
093    public void dismissNonPersistent()
094    {
095        try
096        {
097            takeWriteLock();
098
099            Iterator<Alert> i = alerts.iterator();
100
101            while (i.hasNext())
102            {
103                if (!i.next().duration.persistent)
104                {
105                    dirty = true;
106                    i.remove();
107                }
108            }
109        } finally
110        {
111            releaseWriteLock();
112        }
113    }
114
115
116    /**
117     * Dismisses a single Alert, if present.
118     */
119    public void dismiss(long alertId)
120    {
121        try
122        {
123            takeWriteLock();
124
125            Iterator<Alert> i = alerts.iterator();
126
127            while (i.hasNext())
128            {
129                if (i.next().id == alertId)
130                {
131                    i.remove();
132                    dirty = true;
133                    return;
134                }
135            }
136        } finally
137        {
138            releaseWriteLock();
139        }
140    }
141
142
143    /**
144     * Returns all stored alerts.
145     *
146     * @return list of alerts (possibly empty)
147     */
148    public List<Alert> getAlerts()
149    {
150        try
151        {
152            acquireReadLock();
153
154            return alerts;
155        } finally
156        {
157            releaseReadLock();
158        }
159    }
160}