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    
015    package org.apache.tapestry5.alerts;
016    
017    import org.apache.tapestry5.OptimizedSessionPersistedObject;
018    import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
019    import org.apache.tapestry5.ioc.internal.util.LockSupport;
020    
021    import java.io.Serializable;
022    import java.util.Iterator;
023    import java.util.List;
024    
025    /**
026     * A stateless session object used to store Alerts between requests.
027     *
028     * @since 5.3
029     */
030    public 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    }