1 17 package org.apache.geronimo.kernel.config; 18 19 import java.util.LinkedHashSet ; 20 import java.util.Iterator ; 21 import java.util.Set ; 22 23 import org.apache.geronimo.kernel.repository.Artifact; 24 25 28 public class ConfigurationStatus { 29 private Artifact configurationId; 30 private final Set loadParents = new LinkedHashSet (); 31 private final Set startParents = new LinkedHashSet (); 32 private final LinkedHashSet loadChildren = new LinkedHashSet (); 33 private final LinkedHashSet startChildren = new LinkedHashSet (); 34 private boolean loaded = false; 35 private boolean started = false; 36 private boolean userLoaded = false; 37 private boolean userStarted = false; 38 39 public ConfigurationStatus(Artifact configId, Set loadParents, Set startParents) { 40 if (configId == null) throw new NullPointerException ("configId is null"); 41 if (loadParents == null) throw new NullPointerException ("loadParents is null"); 42 if (startParents == null) throw new NullPointerException ("startParents is null"); 43 if (!loadParents.containsAll(startParents)) { 44 throw new IllegalArgumentException ("loadParents must contain all startParents"); 45 } 46 this.configurationId = configId; 47 this.loadParents.addAll(loadParents); 48 this.startParents.addAll(startParents); 49 50 for (Iterator iterator = loadParents.iterator(); iterator.hasNext();) { 51 ConfigurationStatus loadParent = (ConfigurationStatus) iterator.next(); 52 loadParent.loadChildren.add(this); 53 } 54 55 for (Iterator iterator = startParents.iterator(); iterator.hasNext();) { 56 ConfigurationStatus startParent = (ConfigurationStatus) iterator.next(); 57 startParent.startChildren.add(this); 58 } 59 } 60 61 public void destroy() { 62 if (started) { 63 throw new IllegalStateException ("Configuration " + configurationId + " is still running"); 64 } 65 if (loaded) { 66 throw new IllegalStateException ("Configuration " + configurationId + " is still loaded"); 67 } 68 if (loadChildren.size() > 0 || startChildren.size() > 0) { 69 throw new IllegalStateException ("Configuration " + configurationId + " still has children"); 70 } 71 72 for (Iterator iterator = loadParents.iterator(); iterator.hasNext();) { 73 ConfigurationStatus loadParent = (ConfigurationStatus) iterator.next(); 74 loadParent.loadChildren.remove(this); 75 } 76 loadParents.clear(); 77 78 for (Iterator iterator = startParents.iterator(); iterator.hasNext();) { 79 ConfigurationStatus startParent = (ConfigurationStatus) iterator.next(); 80 startParent.startChildren.remove(this); 81 } 82 startChildren.clear(); 83 } 84 85 public Artifact getConfigurationId() { 86 return configurationId; 87 } 88 89 public boolean isLoaded() { 90 return loaded; 91 } 92 93 public boolean isStarted() { 94 return started; 95 } 96 97 public boolean isUserLoaded() { 98 return userLoaded; 99 } 100 101 public boolean isUserStarted() { 102 return userStarted; 103 } 104 105 106 public void upgrade(Artifact newId, Set newLoadParents, Set newStartParents) { 107 this.configurationId = newId; 108 109 for (Iterator iterator = loadParents.iterator(); iterator.hasNext();) { 113 ConfigurationStatus loadParent = (ConfigurationStatus) iterator.next(); 114 loadParent.loadChildren.remove(this); 115 } 116 loadParents.clear(); 117 118 for (Iterator iterator = startParents.iterator(); iterator.hasNext();) { 119 ConfigurationStatus startParent = (ConfigurationStatus) iterator.next(); 120 startParent.startChildren.remove(this); 121 } 122 startChildren.clear(); 123 124 this.loadParents.addAll(newLoadParents); 128 this.startParents.addAll(newStartParents); 129 130 for (Iterator iterator = loadParents.iterator(); iterator.hasNext();) { 131 ConfigurationStatus loadParent = (ConfigurationStatus) iterator.next(); 132 loadParent.loadChildren.add(this); 133 } 134 135 for (Iterator iterator = startParents.iterator(); iterator.hasNext();) { 136 ConfigurationStatus startParent = (ConfigurationStatus) iterator.next(); 137 startParent.startChildren.add(this); 138 } 139 } 140 141 public LinkedHashSet load() { 142 LinkedHashSet loadList = new LinkedHashSet (); 143 loadInternal(loadList); 144 userLoaded = true; 145 return loadList; 146 } 147 148 private void loadInternal(LinkedHashSet loadList) { 149 for (Iterator iterator = loadParents.iterator(); iterator.hasNext();) { 151 ConfigurationStatus parent = (ConfigurationStatus) iterator.next(); 152 if (!parent.isLoaded()) { 153 parent.loadInternal(loadList); 154 } 155 } 156 157 if (!loaded) { 158 loadList.add(configurationId); 159 loaded = true; 160 } 161 } 162 163 164 public LinkedHashSet start() { 165 if (!loaded) { 166 throw new IllegalStateException (configurationId + " is not loaded"); 167 } 168 LinkedHashSet startList = new LinkedHashSet (); 169 startInternal(startList); 170 userLoaded = true; 171 userStarted = true; 172 return startList; 173 } 174 175 private void startInternal(LinkedHashSet startList) { 176 for (Iterator iterator = startParents.iterator(); iterator.hasNext();) { 178 ConfigurationStatus parent = (ConfigurationStatus) iterator.next(); 179 if (!parent.isStarted()) { 180 parent.startInternal(startList); 181 } 182 } 183 184 if (!started) { 185 startList.add(configurationId); 186 started = true; 187 } 188 } 189 190 194 public LinkedHashSet stop(boolean gc) { 195 LinkedHashSet stopStatuses = new LinkedHashSet (); 196 stopInternal(stopStatuses, gc); 197 198 LinkedHashSet stopIds = new LinkedHashSet (stopStatuses.size()); 199 for (Iterator iterator = stopStatuses.iterator(); iterator.hasNext();) { 200 ConfigurationStatus configurationStatus = (ConfigurationStatus) iterator.next(); 201 stopIds.add(configurationStatus.configurationId); 202 } 203 204 return stopIds; 205 } 206 207 private void stopInternal(LinkedHashSet stopList, boolean gc) { 208 if (!started) { 210 return; 211 } 212 213 for (Iterator iterator = startChildren.iterator(); iterator.hasNext();) { 215 ConfigurationStatus child = (ConfigurationStatus) iterator.next(); 216 if (child.isStarted()) { 217 child.stopInternal(stopList, gc); 218 } 219 } 220 221 if (started) { 223 started = false; 224 userStarted = false; 225 stopList.add(this); 226 227 if (gc) { 229 for (Iterator iterator = startParents.iterator(); iterator.hasNext();) { 231 ConfigurationStatus parent = (ConfigurationStatus) iterator.next(); 232 if (!parent.isUserStarted() && stopList.containsAll(parent.startChildren)) { 233 parent.stopInternal(stopList, gc); 234 } 235 } 236 } 237 } 238 } 239 240 public LinkedHashSet restart() { 241 if (!started) { 242 throw new IllegalStateException (configurationId + " is not started"); 243 } 244 245 LinkedHashSet restartStatuses = new LinkedHashSet (); 246 restartInternal(restartStatuses); 247 248 LinkedHashSet restartIds = new LinkedHashSet (restartStatuses.size()); 249 for (Iterator iterator = restartStatuses.iterator(); iterator.hasNext();) { 250 ConfigurationStatus configurationStatus = (ConfigurationStatus) iterator.next(); 251 restartIds.add(configurationStatus.configurationId); 252 } 253 254 userLoaded = true; 255 userStarted = true; 256 return restartIds; 257 } 258 259 private void restartInternal(LinkedHashSet restartList) { 260 if (!started) { 262 return; 263 } 264 265 for (Iterator iterator = startChildren.iterator(); iterator.hasNext();) { 267 ConfigurationStatus child = (ConfigurationStatus) iterator.next(); 268 if (child.isStarted()) { 269 child.restartInternal(restartList); 270 } 271 } 272 273 restartList.add(this); 275 } 276 277 281 public LinkedHashSet unload(boolean gc) { 282 283 LinkedHashSet unloadStatuses = new LinkedHashSet (); 284 unloadInternal(unloadStatuses, gc); 285 286 LinkedHashSet unloadIds = new LinkedHashSet (unloadStatuses.size()); 287 for (Iterator iterator = unloadStatuses.iterator(); iterator.hasNext();) { 288 ConfigurationStatus configurationStatus = (ConfigurationStatus) iterator.next(); 289 unloadIds.add(configurationStatus.configurationId); 290 } 291 292 return unloadIds; 293 } 294 295 private void unloadInternal(LinkedHashSet unloadList, boolean gc) { 296 if (!loaded) { 298 return; 299 } 300 301 for (Iterator iterator = loadChildren.iterator(); iterator.hasNext();) { 303 ConfigurationStatus child = (ConfigurationStatus) iterator.next(); 304 if (child.isLoaded()) { 305 child.unloadInternal(unloadList, gc); 306 } 307 } 308 309 if (loaded) { 311 started = false; 312 userStarted = false; 313 loaded = false; 314 userLoaded = false; 315 unloadList.add(this); 316 317 if (gc) { 319 for (Iterator iterator = loadParents.iterator(); iterator.hasNext();) { 321 ConfigurationStatus parent = (ConfigurationStatus) iterator.next(); 322 if (!parent.isUserLoaded() && unloadList.containsAll(parent.loadChildren)) { 323 parent.unloadInternal(unloadList, gc); 324 } 325 } 326 } 327 } 328 } 329 330 public LinkedHashSet reload() { 331 if (!loaded) { 332 throw new IllegalStateException (configurationId + " is not loaded"); 333 } 334 335 LinkedHashSet reloadStatuses = new LinkedHashSet (); 336 reloadInternal(reloadStatuses); 337 338 LinkedHashSet reloadIds = new LinkedHashSet (reloadStatuses.size()); 339 for (Iterator iterator = reloadStatuses.iterator(); iterator.hasNext();) { 340 ConfigurationStatus configurationStatus = (ConfigurationStatus) iterator.next(); 341 reloadIds.add(configurationStatus.configurationId); 342 } 343 344 userLoaded = true; 345 return reloadIds; 346 } 347 348 private void reloadInternal(LinkedHashSet reloadList) { 349 if (!loaded) { 351 return; 352 } 353 354 for (Iterator iterator = loadChildren.iterator(); iterator.hasNext();) { 356 ConfigurationStatus child = (ConfigurationStatus) iterator.next(); 357 if (child.isLoaded()) { 358 child.reloadInternal(reloadList); 359 } 360 } 361 362 reloadList.add(this); 364 } 365 366 public String toString() { 367 String load; 368 if (userLoaded) { 369 load = "user-loaded"; 370 } else if (loaded) { 371 load = "loaded"; 372 } else { 373 load = "not-loaded"; 374 } 375 String start; 376 if (userLoaded) { 377 start = "user-started"; 378 } else if (loaded) { 379 start = "started"; 380 } else { 381 start = "not-started"; 382 } 383 return "[" + configurationId + " " + load + " " + start + "]"; 384 } 385 } 386 | Popular Tags |