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 @Override 037 public boolean checkAndResetDirtyMarker() 038 { 039 try 040 { 041 takeWriteLock(); 042 043 return dirty; 044 } finally 045 { 046 dirty = false; 047 048 releaseWriteLock(); 049 } 050 } 051 052 053 public void add(Alert alert) 054 { 055 assert alert != null; 056 057 try 058 { 059 takeWriteLock(); 060 061 alerts.add(alert); 062 063 dirty = true; 064 } finally 065 { 066 releaseWriteLock(); 067 } 068 } 069 070 /** 071 * Dismisses all Alerts. 072 */ 073 public void dismissAll() 074 { 075 try 076 { 077 takeWriteLock(); 078 079 if (!alerts.isEmpty()) 080 { 081 alerts.clear(); 082 dirty = true; 083 } 084 } finally 085 { 086 releaseWriteLock(); 087 } 088 } 089 090 /** 091 * Dismisses non-persistent Alerts; this is useful after rendering the {@link org.apache.tapestry5.corelib.components.Alerts} 092 * component. 093 */ 094 public void dismissNonPersistent() 095 { 096 try 097 { 098 takeWriteLock(); 099 100 Iterator<Alert> i = alerts.iterator(); 101 102 while (i.hasNext()) 103 { 104 if (!i.next().duration.persistent) 105 { 106 dirty = true; 107 i.remove(); 108 } 109 } 110 } finally 111 { 112 releaseWriteLock(); 113 } 114 } 115 116 117 /** 118 * Dismisses a single Alert, if present. 119 */ 120 public void dismiss(long alertId) 121 { 122 try 123 { 124 takeWriteLock(); 125 126 Iterator<Alert> i = alerts.iterator(); 127 128 while (i.hasNext()) 129 { 130 if (i.next().id == alertId) 131 { 132 i.remove(); 133 dirty = true; 134 return; 135 } 136 } 137 } finally 138 { 139 releaseWriteLock(); 140 } 141 } 142 143 144 /** 145 * Returns all stored alerts. 146 * 147 * @return list of alerts (possibly empty) 148 */ 149 public List<Alert> getAlerts() 150 { 151 try 152 { 153 acquireReadLock(); 154 155 return alerts; 156 } finally 157 { 158 releaseReadLock(); 159 } 160 } 161 }