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}