1 package org.columba.calendar.store; 19 20 import java.awt.event.ActionEvent ; 21 import java.awt.event.ActionListener ; 22 import java.util.ArrayList ; 23 import java.util.Collections ; 24 import java.util.List ; 25 import java.util.logging.Logger ; 26 27 import javax.swing.Timer ; 28 29 import org.columba.calendar.model.api.IComponent; 30 import org.columba.calendar.model.api.IComponentInfo; 31 import org.columba.calendar.model.api.IEvent; 32 import org.columba.calendar.model.api.IEventInfo; 33 import org.columba.calendar.store.api.ICalendarStore; 34 import org.columba.calendar.store.api.IStoreListener; 35 import org.columba.calendar.store.api.StoreEvent; 36 import org.columba.calendar.store.api.StoreException; 37 import org.columba.calendar.ui.base.CalendarHelper; 38 import org.columba.core.base.Mutex; 39 40 import com.miginfocom.calendar.activity.Activity; 41 import com.miginfocom.calendar.activity.ActivityDepository; 42 import com.miginfocom.calendar.category.CategoryStructureEvent; 43 44 48 public class StoreEventDelegator implements IStoreListener, ActionListener { 49 50 51 private static final Logger LOG = Logger 52 .getLogger("org.columba.calendar.store.event"); 53 private static final int UPDATE_DELAY = 50; 54 private static StoreEventDelegator instance; 55 private Timer timer; 56 private Mutex mutex; 57 private int swap = 0; 58 private List [] itemRemovedList; 59 private List [] itemChangedList; 60 private List [] itemAddedList; 61 62 65 public StoreEventDelegator() { 66 super(); 67 68 itemRemovedList = new List [] { new ArrayList (500), new ArrayList (500) }; 69 itemChangedList = new List [] { new ArrayList (500), new ArrayList (500) }; 70 itemAddedList = new List [] { new ArrayList (500), new ArrayList (500) }; 71 72 mutex = new Mutex(); 73 74 timer = new Timer (UPDATE_DELAY, this); 75 timer.start(); 76 } 77 78 82 public static StoreEventDelegator getInstance() { 83 if (instance == null) 84 instance = new StoreEventDelegator(); 85 86 return instance; 87 } 88 89 92 private void clearAllLists() { 93 itemAddedList[swap].clear(); 94 itemRemovedList[swap].clear(); 95 itemChangedList[swap].clear(); 96 } 97 98 101 public void processCalendarEvents() { 102 StoreEventComparator instance2 = StoreEventComparator 103 .getInstance(); 104 StoreEventComparator storeEventComparator = instance2; 105 StoreEventComparator storeEventComparator2 = storeEventComparator; 106 List list = itemAddedList[swap]; 107 if (list.size() > 0) { 108 LOG.info("process item added calendar events"); 109 110 Collections.sort(list, storeEventComparator2); 111 112 for (int i = 0; i < list.size(); i++) { 114 StoreEvent next = (StoreEvent) list.get(i); 115 116 ICalendarStore store = (ICalendarStore) next.getSource(); 117 try { 118 IComponentInfo model = store.get(next.getChanges()); 119 if (model.getType() == IComponent.TYPE.EVENT) { 121 Activity act = CalendarHelper 122 .createActivity((IEventInfo) model); 123 124 ActivityDepository.getInstance().addBrokedActivity(act, 125 this, CategoryStructureEvent.ADDED_CREATED); 126 } 127 } catch (StoreException e) { 128 e.printStackTrace(); 130 } 131 } 132 } 133 if (itemRemovedList[swap].size() > 0) { 134 Collections.sort(itemRemovedList[swap], storeEventComparator2); 135 136 for (int i = 0; i < itemRemovedList[swap].size(); i++) { 138 StoreEvent next = (StoreEvent) itemRemovedList[swap].get(i); 139 String activityId = (String ) next.getChanges(); 141 142 ActivityDepository.getInstance().removeBrokedActivityById( 144 activityId); 145 } 146 } 147 if (itemChangedList[swap].size() > 0) { 148 Collections.sort(itemChangedList[swap], storeEventComparator2); 149 150 for (int i = 0; i < itemChangedList[swap].size(); i++) { 152 StoreEvent next = (StoreEvent) itemChangedList[swap].get(i); 153 154 ICalendarStore store = (ICalendarStore) next.getSource(); 155 try { 156 IComponentInfo model = store.get(next.getChanges()); 157 if (model.getType() == IComponent.TYPE.EVENT) { 159 160 String activityId = model.getId(); 161 ActivityDepository.getInstance() 163 .removeBrokedActivityById(activityId); 164 165 Activity act = CalendarHelper 167 .createActivity((IEventInfo) model); 168 ActivityDepository.getInstance().addBrokedActivity(act, 169 this, CategoryStructureEvent.ADDED_CREATED); 170 } 171 } catch (StoreException e) { 172 e.printStackTrace(); 174 } 175 } 176 } 177 } 178 179 182 public void itemAdded(StoreEvent e) { 183 LOG.info(e.toString()); 184 185 mutex.lock(); 186 187 itemAddedList[1 - swap].add(e); 188 189 mutex.release(); 190 } 191 192 195 public void itemRemoved(StoreEvent e) { 196 LOG.info(e.toString()); 197 198 mutex.lock(); 199 200 itemRemovedList[1 - swap].add(e); 201 202 mutex.release(); 203 } 204 205 208 public void itemChanged(StoreEvent e) { 209 LOG.info(e.toString()); 210 211 mutex.lock(); 212 213 itemChangedList[1 - swap].add(e); 214 215 mutex.release(); 216 } 217 218 221 public void actionPerformed(ActionEvent e) { 222 223 mutex.lock(); 225 226 swap = 1 - swap; 227 228 mutex.release(); 229 230 processCalendarEvents(); 231 232 clearAllLists(); 233 } 234 } 235 | Popular Tags |