1 10 11 package org.mmbase.applications.community.modules; 12 13 import java.util.*; 14 15 import org.mmbase.module.core.*; 16 import org.mmbase.module.core.TemporaryNodeManager; 17 18 import org.mmbase.util.logging.Logger; 19 import org.mmbase.util.logging.Logging; 20 21 31 32 public class RelationBreaker extends Thread { 33 34 private static Logger log = Logging.getLoggerInstance(RelationBreaker.class.getName()); 36 private Vector relations = new Vector(); 39 private long checkInterval = 10 * 60 * 1000; 41 private MMBase mmb; 43 private boolean shouldRun = false; 46 private TemporaryNodeManager tmpNodeManager; 48 49 50 57 public RelationBreaker(MMBase mmb, long checkInterval, TemporaryNodeManager tmpNodeManager) { 58 this.mmb = mmb; 59 this.checkInterval = checkInterval; 60 this.tmpNodeManager = tmpNodeManager; 61 } 62 63 69 public synchronized void add(String id, long expireTime) { 70 relations.add(new RelationHolder(id, expireTime)); 71 log.debug("add"); 72 if (!shouldRun) { 73 shouldRun = true; 74 start(); 75 } 76 } 77 78 83 public synchronized boolean update(String id, long expireTime) { 84 RelationHolder relationHolder = (RelationHolder)relations.elementAt(relations.indexOf(id)); 85 if (relationHolder != null) 86 { relationHolder.setExpireTime(expireTime); 87 return true; 88 } 89 return false; 90 } 91 92 98 public synchronized void remove(String id) { 99 String owner = id.substring(0, id.indexOf("_")); 100 String key = id.substring(id.indexOf("_") + 1); 101 int i = relations.indexOf(id); 103 if (i > 0) relations.remove(i); 104 tmpNodeManager.deleteTmpNode(owner, key); 105 } 106 107 114 public synchronized void remove(RelationHolder relationHolder, int i) { 115 log.debug(relationHolder.id); 117 String owner = relationHolder.id.substring(0, relationHolder.id.indexOf("_")); 118 String key = relationHolder.id.substring(relationHolder.id.indexOf("_") + 1); 119 tmpNodeManager.deleteTmpNode(owner, key); 120 } 121 122 125 public void run() { 126 mmb.getInsRel(); 127 long currentTime; 128 129 while (shouldRun) { 130 try { 131 sleep(checkInterval); 132 } catch(Exception e) { 133 log.error("run(): can't sleep."); 134 shouldRun = false; 135 return; 136 } 137 138 currentTime = System.currentTimeMillis(); 139 140 log.debug("search for expired"); 141 int i = 0; 142 while (i < relations.size()) { 143 RelationHolder relationHolder = (RelationHolder)relations.elementAt(i); 144 if (relationHolder.getExpireTime() < currentTime) 145 remove(relationHolder, i); 146 147 i++; 148 } 149 } 150 } 151 } 152 153 154 157 class RelationHolder { 158 public String id; 160 private long expireTime; 162 163 168 public RelationHolder(String id, long expireTime) { 169 this.id = id; 170 this.expireTime = expireTime; 171 } 172 173 177 public synchronized boolean equals(Object anObject) { 178 return (id.equals(anObject)); 179 } 180 181 182 185 public synchronized int hashCode() { 186 return id.hashCode(); 187 } 188 189 192 public synchronized void setExpireTime(long expireTime) { 193 this.expireTime = expireTime; 194 } 195 196 199 public synchronized long getExpireTime() { 200 return expireTime; 201 } 202 } 203 | Popular Tags |