    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}